Last updated: 5. 3.1998, 7:41
<*/NOWARN:F*>
IMPLEMENTATION MODULE StrStuff;
(*------------------------------------------------
STRLIB.C --- Library module for STRPROG program
(c) Charles Petzold, 1996
StrLib.mod --- Translation to Stony Brook Modula-2
(c) Peter Stadler, 1998
------------------------------------------------*)
IMPORT WINUSER;
IMPORT SYSTEM;
IMPORT WIN32;
IMPORT WINGDI;
IMPORT WINX;
IMPORT Str;
(*
#pragma data_seg ("shared")
*)
VAR
pszStrings : ARRAY[0..MAX_STRINGS-1] OF WIN32.PSTR; (* = NIL *)
iTotal : INTEGER = 0;
(*
#pragma data_seg ()
*)
<*/PUSH*>
%IF WIN32 %THEN
<*/CALLS:WIN32SYSTEM*>
%ELSE
<*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE AddString (pStringIn : WIN32.PSTR) : WIN32.BOOL [EXPORT];
(**********************************************************************)
VAR
hString : WIN32.HANDLE;
pString : WIN32.PSTR;
i : INTEGER;
iLength : INTEGER;
iCompare : INTEGER;
BEGIN
IF (iTotal = MAX_STRINGS - 1) THEN
RETURN FALSE;
END;
iLength := LENGTH(pStringIn^);
IF (iLength = 0) THEN
RETURN FALSE;
END;
hString := WIN32.CreateFileMapping (SYSTEM.CAST(WIN32.HANDLE, -1), WINX.NIL_SECURITY_ATTRIBUTES, WIN32.PAGE_READWRITE,
0, 1 + iLength, "");
IF (hString = NIL) THEN
RETURN FALSE;
END;
pString := SYSTEM.CAST(WIN32.PSTR,WIN32.MapViewOfFile (hString, WIN32.FILE_MAP_WRITE, 0, 0, 0));
Str.Copy(pString^, pStringIn^);
WINUSER.AnsiUpper (pString^);
i := iTotal;
LOOP
(* should be a comparison of lower-case Strings *)
iCompare := Str.Compare(pStringIn^, pszStrings[i - 1]^);
IF (iCompare >= 0) THEN
EXIT;
END;
pszStrings[i] := pszStrings[i - 1];
DEC(i);
IF(i<=0) THEN
EXIT;
END;
END;
pszStrings[i] := pString;
INC(iTotal);
RETURN TRUE;
END AddString;
<*/POP*>
<*/PUSH*>
%IF WIN32 %THEN
<*/CALLS:WIN32SYSTEM*>
%ELSE
<*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE DeleteString (pStringIn : WIN32.PSTR) : WIN32.BOOL [EXPORT];
(**********************************************************************)
VAR
i : INTEGER;
j : INTEGER;
iCompare : INTEGER;
BEGIN
IF (LENGTH(pStringIn^)=0) THEN
RETURN FALSE;
END;
i := 0;
LOOP
(* should be a comparison of lower-case Strings *)
iCompare := Str.Compare(pszStrings[i]^, pStringIn^);
IF (iCompare = 0) THEN
EXIT;
END;
INC(i);
IF(i>= iTotal) THEN
EXIT;
END;
END;
(* If given string not in list, RETURN without taking action *)
IF (i = iTotal) THEN
RETURN FALSE;
END;
(* Else free memory occupied by the string and adjust list downward *)
WIN32.UnmapViewOfFile (pszStrings[i]);
FOR j := i TO iTotal-1 DO
pszStrings[j] := pszStrings[j + 1];
END;
DEC(iTotal);
pszStrings[iTotal] := NIL; (* Destroy unused pointer *)
RETURN TRUE;
END DeleteString;
<*/POP*>
<*/PUSH*>
%IF WIN32 %THEN
<*/CALLS:WIN32SYSTEM*>
%ELSE
<*/CALLS:WINSYSTEM*>
%END
(*++++*****************************************************************)
PROCEDURE GetStrings(pfnGetStrCallBack : PSTRCB; pParam : WIN32.PVOID) : INTEGER [EXPORT];
(**********************************************************************)
VAR
bReturn : BOOLEAN;
i : INTEGER;
BEGIN
FOR i := 0 TO iTotal-1 DO
bReturn := pfnGetStrCallBack (pszStrings[i], pParam);
IF (bReturn = FALSE) THEN
RETURN i + 1;
END;
END;
RETURN iTotal;
END GetStrings;
<*/POP*>
(*
int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)
*)
VAR
i : INTEGER;
fdwReason : WIN32.DWORD;
BEGIN
CASE (fdwReason) OF
(* Nothing to do when process (or thread) begins *)
| WIN32.DLL_PROCESS_ATTACH :
| WIN32.DLL_THREAD_ATTACH :
| WIN32.DLL_THREAD_DETACH :
(* When process terminates, free any remaining blocks *)
| WIN32.DLL_PROCESS_DETACH :
FOR i := 0 TO iTotal-1 DO
WIN32.UnmapViewOfFile (pszStrings[i]);
END;
ELSE
END;
END StrStuff.