/************************************************\ * * * REGEXP.DDL Interface module * * Copyright (c) 1992 by Borland International * * * \************************************************/ /* This module defines the exported interface functions * provided by REGEXP.DLL. It provides the multi client * support managment by managing regular expression * handles. */ #define STRICT #include #include #include #include #include #include #include #include "regexp.h" #include "_regexp.h" HINSTANCE Instance; // Instance handle // Handle managment ------------------------------------------------ #define MAX_HANDLES 128 int FreeList = 1; regexp *Handles[MAX_HANDLES]; void InitializeHandles(void) { int i; for (i = 0; i < MAX_HANDLES - 1; i++) { Handles[i] = (regexp *)(i + 1); } Handles[i] = NULL; } #define UCHARAT(p) ((int)*(unsigned char *)(p)) BOOL VerifyHandle(HREGEXP reg) { return reg && (int)reg < MAX_HANDLES && Handles[(int) reg] != NULL && UCHARAT(Handles[(int) reg]->program) == MAGIC; } HREGEXP AllocateHandle(void) { if ( FreeList ) { HREGEXP Handle = (HREGEXP) FreeList; FreeList = (int)Handles[FreeList]; return Handle; } else return (HREGEXP) 0; } void FreeHandle(HREGEXP Handle) { Handles[(int) Handle] = (regexp *)FreeList; FreeList = (int) Handle; } // Exported function ----------------------------------------------- HREGEXP _export FAR PASCAL RegComp(const char *pattern, int *error) { HREGEXP Handle = AllocateHandle(); if ( Handle ) { Handles[(int) Handle] = regcomp(pattern); if ( Handles[(int) Handle] == NULL ) { *error = regerror; FreeHandle(Handle); return (HREGEXP) 0; } } else *error = RE_OUTOFMEMORY; return Handle; } int _export FAR PASCAL RegExec(HREGEXP reg, const char *string, regmatch *match) { if ( VerifyHandle(reg) ) { regexp *preg = Handles[(int) reg]; regerror = 0; if ( regexec(preg, string) ) { match->start = preg->startp[0] - (char *)string; match->stop = preg->endp[0] - (char *)string; return 0; } else return regerror != 0 ? regerror : RE_NOTFOUND; } else return RE_INVALIDPARAMETER; } #pragma argsused size_t _export FAR PASCAL RegError(HREGEXP reg, int errcode, char *errbuf, size_t errbuf_size) { // "reg" could be used to provide more information about // the error. LoadString(Instance, errcode, errbuf, errbuf_size); return 0; } void _export FAR PASCAL RegFree(HREGEXP reg) { if ( VerifyHandle(reg) ) { free(Handles[(int) reg]); FreeHandle(reg); } } // DLL initialization and shutdown --------------------------------- #pragma argsused int FAR PASCAL LibMain(HINSTANCE hInstance, WORD wDataSegment, WORD wHeapSize, LPSTR lpszCmdLine) { // Initialize the handle table InitializeHandles(); Instance = hInstance; return 1; // Indicate that the DLL was initialized successfully. } #pragma argsused int FAR PASCAL WEP ( int bSystemExit ) { return 1; }