home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-30 | 9.3 KB | 417 lines | [TEXT/PJMM] |
- unit MyStrings;
-
- interface
-
- {$IFC undefined THINK_Pascal}
- uses
- Types;
- {$ENDC}
-
- procedure LeftP (var s: str255; len: integer);
- function Left (var s: str255; len: integer): str255;
- procedure LeftAssignP (var s: str255; len: integer; var rhs: str255);
- function LeftAssign (var s: str255; len: integer; var rhs: str255): str255;
- procedure RightP (var s: str255; len: integer);
- function Right (var s: str255; len: integer): str255;
- procedure RightAssignP (var s: str255; len: integer; var rhs: str255);
- function RightAssign (var s: str255; len: integer; var rhs: str255): str255;
- procedure MidP (var s: str255; p, len: integer);
- function Mid (var s: str255; p, len: integer): str255;
- procedure MidAssignP (var s: str255; p, len: integer; var rhs: str255);
- function MidAssign (var s: str255; p, len: integer; var rhs: str255): str255;
- procedure HandleToString (h: univ handle; var s: str255);
- function HandleToStr (h: univ handle): str255;
- procedure StringToHandle (var s: str255; h: univ handle);
- function Trim (s: string): string;
- procedure SplitBy (s: str255; ch: char; var left, right: str255);
- function UpCaseChar (ch: char): char;
- function UpCase (ch: char): char;
- inline
- $301F, $0C00, $0061, $6500, $000E, $0C00, $007B, $6400, $0006, $0400, $0020, $3E80;
- procedure UpCaseString (var s: string);
- function UpCaseStr (s: string): string;
- { procedure SPrintS5V (var dst: str255;var src,s1, s2, s3, s4, s5: str255);}
- procedure SPrintS5 (var dst: str255; src, s1, s2, s3, s4, s5: str255);
- procedure SPrintS3 (var dst: str255; src, s1, s2, s3: str255);
- function Split (sub, s: str255; var s1, s2: str255): boolean;
- function PosRight (sub, s: str255): integer;
- function SplitRight (sub, s: str255; var s1, s2: str255): boolean;
- function TPcopy (source: string; start, count: integer): string;
- function TPpos (sub, str: string): integer;
- function Match (pattern, name: str255): boolean;
- procedure LimitStringLength (var s: string; len: integer; delimiter: char);
- function StringToOSType(s:str255):OSType;
-
- implementation
-
- uses
- {$IFC undefined THINK_Pascal}
- Memory, OSUtils,
- {$ENDC}
- MyTypes, MyMathUtils;
-
-
- procedure LeftP (var s: str255; len: integer);
- begin
- s := TPcopy(s, 1, len);
- end;
-
- function Left (var s: str255; len: integer): str255;
- begin
- Left := TPcopy(s, 1, len);
- end;
-
- procedure LeftAssignP (var s: str255; len: integer; var rhs: str255);
- begin
- s := concat(rhs, TPcopy(s, len + 1, 255));
- end;
-
- function LeftAssign (var s: str255; len: integer; var rhs: str255): str255;
- begin
- LeftAssign := concat(rhs, TPcopy(s, len + 1, 255));
- end;
-
- procedure RightP (var s: str255; len: integer);
- var
- p: integer;
- begin
- p := Length(s) - len;
- if p < 1 then
- p := 1;
- s := TPcopy(s, p, 255);
- end;
-
- function Right (var s: str255; len: integer): str255;
- var
- p: integer;
- begin
- p := Length(s) - len;
- if p < 1 then
- p := 1;
- Right := TPcopy(s, p, 255);
- end;
-
- procedure RightAssignP (var s: str255; len: integer; var rhs: str255);
- begin
- s := concat(TPcopy(s, 1, Length(s) - len), rhs);
- end;
-
- function RightAssign (var s: str255; len: integer; var rhs: str255): str255;
- begin
- RightAssign := concat(TPcopy(s, 1, Length(s) - len), rhs);
- end;
-
- procedure MidP (var s: str255; p, len: integer);
- begin
- s := TPcopy(s, p, len);
- end;
-
- function Mid (var s: str255; p, len: integer): str255;
- begin
- Mid := TPcopy(s, p, len);
- end;
-
- procedure MidAssignP (var s: str255; p, len: integer; var rhs: str255);
- begin
- s := concat(TPcopy(s, 1, p - 1), rhs, TPcopy(s, p + len + 1, 255));
- end;
-
- function MidAssign (var s: str255; p, len: integer; var rhs: str255): str255;
- begin
- MidAssign := concat(TPcopy(s, 1, p - 1), rhs, TPcopy(s, p + len + 1, 255));
- end;
-
- {$PUSH}
- {$R-}
- procedure HandleToString (h: univ handle; var s: str255);
- var
- len: longInt;
- begin
- len := GetHandleSize(h);
- if len > 255 then
- len := 255;
- s[0] := chr(len);
- BlockMove(h^, @s[1], len);
- end;
- {$POP}
-
- function HandleToStr (h: univ handle): str255;
- var
- s: str255;
- begin
- HandleToString(h, s);
- HandleToStr := s;
- end;
-
- {$PUSH}
- {$R-}
- procedure StringToHandle (var s: str255; h: univ handle);
- begin
- SetHandleSize(h, length(s));
- BlockMove(@s[1], h^, length(s));
- end;
- {$POP}
-
- function Trim (s: string): string;
- begin
- while (length(s) > 0) and (s[1] in [spc, tab]) do
- Delete(s, 1, 1);
- while (length(s) > 0) and (s[length(s)] in [spc, tab]) do
- Delete(s, length(s), 1);
- Trim := s;
- end;
-
- procedure UpCaseString (var s: string);
- var
- i: integer;
- begin
- for i := 1 to length(s) do begin
- s[i] := UpCase(s[i]);
- end;
- end;
-
- function UpCaseStr (s: string): string;
- var
- i: integer;
- begin
- for i := 1 to length(s) do
- s[i] := UpCase(s[i]);
- UpCaseStr := s;
- end;
-
- function UpCaseChar (ch: char): char;
- begin
- if ('a' <= ch) & (ch <= 'z') then
- UpCaseChar := chr(ord(ch) - $20)
- else
- UpCaseChar := ch;
- end;
-
- function TPpos (sub, str: string): integer;
- var
- i, ret: integer;
- begin
- if length(sub) = 1 then begin
- ret := 0;
- for i := 1 to length(str) do begin
- if str[i] = sub[1] then begin
- ret := i;
- leave;
- end;
- end;
- end
- else begin
- ret := Pos(sub, str);
- end;
- TPpos := ret;
- end;
-
- procedure DoSub (var dst: str255; n: integer; var s: str255);
- var
- p: integer;
- begin
- p := TPpos(concat('^', chr(n + 48)), dst);
- if p > 0 then begin
- Delete(dst, p, 2);
- Insert(s, dst, p);
- end;
- end;
-
- {$Z+}
- procedure SPrintS5V (var dst: str255; var src, s1, s2, s3, s4, s5: str255);
- begin
- dst := src;
- DoSub(dst, 5, s5);
- DoSub(dst, 4, s4);
- DoSub(dst, 3, s3);
- DoSub(dst, 2, s2);
- DoSub(dst, 1, s1);
- end;
- {$Z-}
-
- procedure SPrintS5 (var dst: str255; src, s1, s2, s3, s4, s5: str255);
- begin
- SPrintS5V(dst, src, s1, s2, s3, s4, s5);
- end;
-
- procedure SPrintS3 (var dst: str255; src, s1, s2, s3: str255);
- begin
- dst := src;
- DoSub(dst, 3, s3);
- DoSub(dst, 2, s2);
- DoSub(dst, 1, s1);
- end;
-
- procedure SplitBy (s: str255; ch: char; var left, right: str255);
- var
- p: integer;
- begin
- p := TPpos(ch, s);
- if p <= 0 then begin
- left := s;
- right := '';
- end
- else begin
- left := TPcopy(s, 1, p - 1);
- right := TPcopy(s, p + 1, 255);
- end;
- end;
-
- function Split (sub, s: str255; var s1, s2: str255): boolean;
- var
- p: integer;
- begin
- p := TPpos(sub, s);
- if p > 0 then begin
- s1 := TPcopy(s, 1, p - 1);
- s2 := TPcopy(s, p + length(sub), 255);
- end;
- Split := p > 0;
- end;
-
- function PosRight (sub, s: str255): integer;
- var
- p, q: integer;
- begin
- p := TPpos(sub, s);
- if p > 0 then begin
- q := length(s) - length(sub) + 1;
- while q > p do begin
- if TPcopy(s, q, length(sub)) = sub then begin
- p := q;
- end
- else begin
- q := q - 1;
- end;
- end;
- end;
- PosRight := p;
- end;
-
- function SplitRight (sub, s: str255; var s1, s2: str255): boolean;
- var
- p: integer;
- begin
- p := PosRight(sub, s);
- if p > 0 then begin
- s1 := TPcopy(s, 1, p - 1);
- s2 := TPcopy(s, p + length(sub), 255);
- end;
- SplitRight := p > 0;
- end;
-
- function TPcopy (source: string; start, count: integer): string;
- var
- i: integer;
- begin
- if (start < 1) then begin
- count := count - (1 - start);
- start := 1;
- end;
- if start + count > length(source) then begin
- count := length(source) - start + 1;
- end;
- if count < 0 then begin
- count := 0;
- end;
- source[0] := chr(count);
- BlockMove(@source[start], @source[1], count);
- TPcopy := source;
- end;
-
- function Match (pattern, name: str255): boolean;
- function M (p, n: integer): boolean;
- var
- state: (searching, failed, success);
- begin
- state := searching;
- while state = searching do begin
- case ord(p <= length(pattern)) * 2 + ord(n <= length(name)) of
- 0: begin
- state := success;
- end;
- 1: begin
- state := failed;
- end;
- 2: begin
- state := success;
- while p <= length(pattern) do begin
- if pattern[p] <> '*' then begin
- state := failed;
- leave;
- end;
- p := p + 1;
- end;
- end;
- 3: begin
- case pattern[p] of
- '?': begin
- p := p + 1;
- n := n + 1;
- end;
- '*': begin
- p := p + 1;
- if p > length(pattern) then begin { short circuit the * at the end case }
- state := success;
- end
- else begin
- state := failed;
- while n <= length(name) do begin
- if M(p, n) then begin
- state := success;
- leave;
- end;
- n := n + 1;
- end;
- end;
- end;
- otherwise begin
- if name[n] <> pattern[p] then begin
- state := failed;
- end;
- n := n + 1;
- p := p + 1;
- end;
- end;
- end;
- end;
- end;
- M := state = success;
- end;
- begin
- UprString(pattern, false);
- UprString(name, false);
- Match := M(1, 1);
- end;
-
- procedure LimitStringLength (var s: string; len: integer; delimiter: char);
- var
- p, n, before, after: integer;
- begin
- if length(s) > len then begin
- p := TPpos(delimiter, s);
- if p <= 0 then begin
- p := length(s) div 2 + 1;
- Insert(delimiter, s, p);
- end;
- while length(s) > len do begin
- if p > len div 2 + 1 then begin
- Delete(s, p - 1, 1);
- p := p - 1;
- end
- else begin
- Delete(s, p + 1, 1);
- end;
- end;
- end;
- end;
-
- function StringToOSType(s:str255):OSType;
- var
- t:OSType;
- begin
- s:=concat(s,nul,nul,nul,nul);
- BlockMove(@s[1],@t,4);
- StringToOSType:=t;
- end;
- end.