home *** CD-ROM | disk | FTP | other *** search
- (**************************************************************************)
- (* *)
- (* 1) General Purpose String *)
- (* *)
- (* *)
- (**************************************************************************)
-
-
- FUNCTION RJS (Source : STRING; Size : BYTE) : STRING;
- VAR
- Temp : STRING;
- Temp2 : STRING;
- BEGIN
- Temp2 := Source;
- IF Length (Temp2) > Size THEN
- Temp2 := COPY (Temp2, Length(Temp2)-Size+1, Size);
- FillChar (Temp [1], MaxStrLen, ' ');
- MOVE (Temp2 [1], Temp [Size-Length(Temp2)+1], Length(Temp2));
- Temp [0] := CHR(Size);
- IF Length (Source) > Size THEN Temp [1] := '^';
- RJS := Temp;
- END;
-
- FUNCTION LJS (Source : STRING; Size : BYTE) : STRING;
- VAR
- Temp : STRING;
- BEGIN
- FillChar (Temp [1], MaxStrLen, ' ');
- Temp := Source;
- Temp [0] := CHR(Size);
- IF (Length (Source) > Size) AND (Size > 0) THEN Temp [Size] := '^';
- LJS := Temp;
- END;
-
- FUNCTION CJS (Source : STRING; Size : BYTE) : STRING;
- VAR
- Temp : STRING;
- Temp2 : STRING;
- BEGIN
- Temp2 := Source;
- IF Length (Temp2) > Size THEN
- Temp2 := COPY (Temp2, Length(Temp2)-Size+1, Size);
- FillChar (Temp [1], MaxStrLen, ' ');
- MOVE (Temp2 [1], Temp [((Size-Length(Temp2)) DIV 2)+1], Length(Temp2));
- Temp [0] := Chr (Size);
- IF Length (Source) > Size THEN Temp [1] := '^';
- CJS := Temp;
- END;
-
- FUNCTION Strip (Source : STRING; Code : BYTE) : STRING;
- CONST
- WhiteSpace : SET OF CHAR = [' ',#9];
- QuoteChars : SET OF CHAR = [#39,#34];
-
- { QuoteCheck Return a true if processing inside a quoted string. }
-
- FUNCTION QuoteCheck (VAR LastQuote : CHAR; Ch : CHAR) : BOOLEAN;
- BEGIN {QuoteCheck}
- IF (Ch IN QuoteChars) THEN BEGIN
- IF (Ch = LastQuote) THEN BEGIN { The quoted string is closed. }
- QuoteCheck := FALSE;
- LastQuote := ' ' { No current quoted string. }
- END
- ELSE IF (NOT (LastQuote IN QuoteChars)) THEN BEGIN { A new quoted }
- QuoteCheck := TRUE;
- LastQuote := Ch
- END
- END
- ELSE IF (LastQuote IN QuoteChars) THEN
- QuoteCheck := TRUE
- ELSE
- QuoteCheck := FALSE
- END; {QuoteCheck}
-
- VAR
- Target : STRING; { Converted string. }
- Quote : BOOLEAN; { True, when quotes checked. }
- QuoteOn : BOOLEAN; { True, when in a quoted string. }
- LastQuote : CHAR; { Quote char used. }
- DeleteOn : BOOLEAN; { True when blanks are reduced }
- I,J,Len : INTEGER;
- Ch : CHAR;
-
- BEGIN
- Target := Source;
- Quote := (Code AND 16) <> 0;
- QuoteOn := FALSE;
- LastQuote := ' ';
-
- { First discard all white space (blanks and tabs) }
-
- IF ((Code AND 1) <> 0) THEN BEGIN
- Len := Length (Source);
- I := 1;
- J := 0;
- WHILE (I <= Len) DO BEGIN
- Ch := Source[I];
- IF (Quote) THEN QuoteOn := QuoteCheck (LastQuote, Ch);
- IF ((NOT (Ch IN WhiteSpace)) OR QuoteOn) THEN BEGIN
- J := SUCC (J);
- Target [J] := Ch;
- END;
- I := SUCC (I);
- END;
- Target [0] := CHR(J)
- END;
-
- { Now remove all leading white space if requested. We count the }
- { white space characters until a non white space character is }
- { encountered; those characters are deleted. }
-
- IF ((Code AND 2) <> 0) THEN BEGIN
- Len := Length(Target);
- I := 1;
- J := 0; { Number of white space chars }
- WHILE ((I <= Len) AND (Target[I] in WhiteSpace)) DO BEGIN
- I := SUCC(I);
- J := SUCC(J);
- END;
- DELETE(Target,1,J) { Remove J white space characters}
- END;
-
- { Remove all trailing white space. The last non blank, non tabs }
- { character position is found and the preceding portion is copied. }
-
- IF ((Code AND 4) <> 0) THEN BEGIN
- Len := Length(Target);
- WHILE ((Len >= 1) AND (Target[Len] IN WhiteSpace)) DO
- Len := Len - 1;
- Target [0] := CHR (Len);
- END;
-
- { Reduce all blanks and tabs to a single blank. For each character }
- { in the string we check for a blank or tab. If it is the "first" }
- { one encountered, a boolean flag is set, and all subsequent ones }
- { are skipped. When a non blank, non tab is encountered the flag }
- { is reset. }
-
- IF ((Code AND 8) <> 0) THEN BEGIN
- DeleteOn := FALSE; { Not deleting blanks }
- LastQuote := ' ';
- Len := Length(Target);
- I := 1;
- J := 0;
- WHILE (I <= Len) DO BEGIN
- Ch := Target[I];
- IF (Quote) THEN QuoteOn := QuoteCheck(LastQuote,Ch);
- IF ((NOT (Ch IN WhiteSpace)) OR QuoteOn) THEN BEGIN
- J := Succ(J);
- Target[J] := Ch;
- DeleteOn := FALSE
- END
- ELSE IF NOT DeleteOn THEN BEGIN
- J := SUCC(J);
- Target[J] := ' ';
- DeleteOn := TRUE
- END;
- I := SUCC(I);
- end;
- Target[0] := CHR(J);
- END;
-
- Strip := Target;
- END;
-
-
- FUNCTION StrCase (Source : STRING; Code : BYTE) : STRING;
-
- CONST
- UpperCase : SET OF CHAR = ['A' .. 'Z'];
- LowerCase : SET OF CHAR = ['a' .. 'z'];
- QuoteChars : SET OF CHAR = [#39,#34];
-
- { QuoteCheck Return a true if processing inside a quoted string. }
-
- FUNCTION QuoteCheck (VAR LastQuote : CHAR; Ch : CHAR) : BOOLEAN;
- BEGIN {QuoteCheck}
- IF (Ch IN QuoteChars) THEN BEGIN
- IF (Ch = LastQuote) THEN BEGIN { The quoted string is closed. }
- QuoteCheck := FALSE;
- LastQuote := ' ' { No current quoted string. }
- END
- ELSE IF (NOT (LastQuote IN QuoteChars)) THEN BEGIN { A new quoted }
- QuoteCheck := TRUE;
- LastQuote := Ch
- END
- END
- ELSE IF (LastQuote IN QuoteChars) THEN
- QuoteCheck := TRUE
- ELSE
- QuoteCheck := FALSE
- END; {QuoteCheck}
-
- VAR
- Target : STRING; { Converted string. }
- Quote : BOOLEAN; { True, when quotes checked. }
- QuoteOn : BOOLEAN; { True, when in a quoted string. }
- LastQuote : CHAR; { Quote char used. }
- DeleteOn : BOOLEAN; { True when blanks are reduced }
- I,J,Len : INTEGER;
- Ch : CHAR;
-
- BEGIN
- Target := Source;
- Quote := (Code AND 16) <> 0; { Check for quoted strings? }
- QuoteOn := FALSE;
- LastQuote := ' ';
-
- { Convert lower case characters to upper case. If a character is }
- { in the set LowerCase, just subtract 32 from the ASCII code. }
-
- IF ((Code AND 32) <> 0) THEN BEGIN
- LastQuote := ' ';
- FOR I := 1 TO Length(Target) DO BEGIN
- Ch := Target[I];
- IF Quote THEN QuoteOn := QuoteCheck(LastQuote,Ch);
- IF ((Ch IN LowerCase) AND (NOT QuoteOn)) THEN
- Target[I] := CHR(ORD(Ch)-32)
- END;
- END;
-
- { Convert upper case characters to lower case. If a character is }
- { in the set UpperCase, just add 32 to the ASCII code. }
-
- IF ((Code AND 64) <> 0) THEN BEGIN
- LastQuote := ' ';
- FOR I := 1 TO Length(Target) DO BEGIN
- Ch := Target[I];
- IF Quote THEN QuoteOn := QuoteCheck(LastQuote,Ch);
- IF ((Ch IN UpperCase) AND (NOT QuoteOn)) THEN
- Target[I] := Chr(Ord(Ch) + 32)
- END;
- END;
-
- StrCase := Target
- END;
-
- FUNCTION StrField (Source : STRING; Delimiter : CHAR; Num : BYTE) : STRING;
- {the variable source is destroyed locally. do not change the variable
- to a VAR or it will be destroyed globally.}
- VAR
- I : INTEGER;
- J : INTEGER;
-
- BEGIN
- IF POS(Delimiter, Source) = 0 THEN
- IF Num = 1 THEN StrField := Source
- ELSE StrField := ''
- ELSE BEGIN
- FOR I := 1 TO Num - 1 DO BEGIN
- J := POS (Delimiter, Source);
- IF J > 0 THEN
- Source := COPY(Source,J+1,255)
- ELSE
- Source := '';
- END;
-
- IF POS(Delimiter,Source) > 0 THEN
- StrField := COPY(Source,1,POS(Delimiter,Source)-1)
- ELSE
- StrField := Source;
- END;
- END;
-
- FUNCTION StrFill (FillCh : CHAR; Num : BYTE) : STRING;
- VAR
- NewStr : STRING;
-
- BEGIN
- FillChar (NewStr[1], Num, FillCh);
- NewStr[0] := CHR(Num);
- StrFill := NewStr;
- END;
-
- FUNCTION StrPad (Source : STRING) : STRING;
- VAR
- BigBlank : STRING[MaxStrLen];
- BEGIN
- FILLCHAR(BigBlank[1],MaxStrLen,' ');
- BigBlank[0] := CHR(MaxStrLen);
- StrPad := Source + BigBlank;
- END;
-
- FUNCTION StrShiftLeft (Fld : STRING; Posit : BYTE) : STRING;
- BEGIN
- StrShiftLeft := COPY(Fld,1,Posit-1) + COPY(Fld,Posit+1,LENGTH(Fld));
- END;
-
- FUNCTION StrShiftRight (Fld : STRING; Posit : BYTE; Fill : CHAR) : STRING;
- BEGIN
- StrShiftRight := COPY(Fld,1,Posit-1) + Fill + COPY(Fld,Posit,LENGTH(Fld));
- END;
-
- {.PA}
-
- (**************************************************************************)
- (* *)
- (* 2) String Conversion *)
- (* *)
- (* *)
- (**************************************************************************)
-
- PROCEDURE S2C (Strg : STRING ; VAR CharA ; Len : BYTE);
-
- VAR
- GenPtr : POINTER;
-
- BEGIN
- Strg := LJS(Strg,Len);
- GenPtr := PTR(SEG(Strg),OFS(Strg)+1);
- MOVE(GenPtr^,CharA,Len);
- END;
-
- FUNCTION C2S (VAR CharA ; Len : BYTE) : STRING;
-
- VAR
- GenPtr : POINTER;
- Strg : STRING;
-
- BEGIN
- GenPtr := PTR(SEG(CharA),OFS(CharA));
- MOVE(GenPtr^,Strg[1],Len);
- Strg[0] := CHR(Len);
- Strg := Strip(Strg,S_Trailing);
- C2S := Strg;
- END;
-
- PROCEDURE S2Z (Strg : STRING ; VAR CharA);
-
- VAR
- GenPtr : POINTER;
- Zero : BYTE;
- CharADummy : ARRAY[1..256] OF CHAR ABSOLUTE CharA;
-
- BEGIN
- Zero := 0;
- GenPtr := PTR(SEG(Strg),OFS(Strg)+1);
- MOVE(GenPtr^,CharA,LENGTH(Strg));
- MOVE(Zero,CharADummy[LENGTH(Strg)+1],1);
- END;
-
- FUNCTION Z2S (VAR CharA) : STRING;
-
- VAR
- GenPtr : POINTER;
- CharADummy : ARRAY[1..256] OF CHAR ABSOLUTE CharA;
- Len : INTEGER;
- Strg : STRING;
-
- BEGIN
- Len := 0;
- REPEAT
- Len := SUCC(Len);
- UNTIL (CharADummy[Len] = CHR(0)) OR (Len = 256);
- Len := PRED(Len);
- GenPtr := PTR(SEG(CharA),OFS(CharA));
- MOVE(GenPtr^,Strg[1],Len);
- Strg[0] := CHR(Len);
- Z2S := Strg;
- END;
-