unit StrPlus; {---------------------------------------------------------------------------} { Extra string manipulation - by Michael Dales } { } { Defines a standard null terminated string, called cString and several } { manipulation functions. Nothing brilliant, but it all works. Using this } { along with the strings unit gives you just about all atring functions you } { could ever need. Just like christmas eh? :-) } { } { Email comments to: 9402198d@udcf.gla.ac.uk } { URL: http://www.gla.ac.uk/Clubs/WebSoc/~9402198d/index.html } {---------------------------------------------------------------------------} interface uses Strings; const StringSize = 512; {Size of string type} type cString = array[0..StringSize] of Char; {New string type} {BlankString - Empties a string} procedure BlankString(var S:cString); {IsLetter - Returns true if C is alphabetic} function IsLetter(C:Char):Boolean; {StripTo - Strip all characters in S up to C} procedure StripTo(C:Char; var S:cString); {StripFrom - Strip all characters in S from C} procedure StripFrom(C:Char; var S:cString); {RemoveFirstChar - Remove the first character from S} procedure RemoveFirstChar(var S:cString); {RemoveLeadingSpaces - Removes any spaces at the start of S} procedure RemoveLeadingSpaces(var S:cString); {GetFirstWord - Gets first all letter word from S} procedure GetFirstWord(S:cString;var Out:cString); {GetFirstBlock - Gets the first block of text (letters & symbols) from S} procedure GetFirstBlock(S:cString;var Out:cString); {RemoveFirstWord - Removes first word from S} procedure RemoveFirstWord(var S:cString); {RemoveFirstWord - Removes first block of text from S} procedure RemoveFirstBlock(var S:cString); {AddChar - Adds character C to the end of S} procedure AddChar(var S:cString; C:Char); {---------------------------------------------------------------------------} implementation {---------------------------------------------------------------------------} {IsLetter - Returns true if C is alphabetic} function IsLetter(C:Char):Boolean; begin IsLetter:=(UpCase(C)>='A') and (UpCase(C)<='Z'); end; {BlankString - Empties a string} procedure BlankString(var S:cString); begin FillChar(S,SizeOf(S),#0); end; {StripFrom - Strip all characters in S from C} procedure StripFrom(C:Char; var S:cString); var temp : cString; reslen : integer; begin if (StrLen(S)>0) and (StrRScan(S,C)<>nil) then begin StrCopy(temp,StrRScan(S,C)); reslen:=StrLen(S)-StrLen(temp); StrLCopy(temp,S,reslen); StrCopy(S,temp); end; end; {StripTo - Strip all characters in S up to C} procedure StripTo(C:Char; var S:cString); var pos : word; temp : cString; begin if (StrScan(S,C)<>nil) then {If we find C in S then} begin StrCopy(temp,StrScan(S,C)); {Get rest of string} StrCopy(S,temp); {Put it in S} end; end; {RemoveFirstChar - Remove the first character from S} procedure RemoveFirstChar(var S:cString); var temp : cString; begin if StrLen(S)>1 then {If data in string then} begin StrCopy(temp,S+1); {Get string from second character} StrCopy(S,temp); {Put string in S} end else if StrLen(S)=1 then begin S[0]:=#0; end; end; {RemoveLeadingSpaces - Removes any spaces at the start of S} procedure RemoveLeadingSpaces(var S:cString); begin while S[0]=' ' do RemoveFirstChar(S); end; {GetFirstWord - Gets first all letter word from S} procedure GetFirstWord(S:cString;var out:cString); var n : integer; temp : array[0..255] of char; begin RemoveLeadingSpaces(S); {Find start of word} n:=0; FillChar(temp,SizeOf(temp),#0); while IsLetter(S[n]) do {While still letters do} begin temp[n]:=S[n]; {Copy character} inc(n); end; StrCopy(out,temp); {Out set to word} end; {GetFirstBlock - Gets the first block of text (letters & symbols) from S} procedure GetFirstBlock(S:cString;var out:cString); var n,a : integer; temp : array[0..255] of char; isspace : boolean; begin IsSpace:=false; RemoveLeadingSpaces(S); if s[0]<>#0 then begin n:=0; repeat IsSpace:=s[n]=' '; inc(n); until IsSpace or (n=StrLen(s)); FillChar(temp,SizeOf(temp),#0); if IsSpace then n:=Pred(n); for a:=0 to Pred(n) do temp[a]:=s[a]; StrCopy(out,temp); end else BlankString(out); end; {RemoveFirstWord - Removes first word from S} procedure RemoveFirstWord(var S:cString); begin RemoveLeadingSpaces(S); {Get to word} while IsLetter(S[0]) do RemoveFirstChar(S); RemoveLeadingSpaces(S); end; {RemoveFirstWord - Removes first block of text from S} procedure RemoveFirstBlock(var S:cString); var temp : boolean; n : integer; begin RemoveLeadingSpaces(S); temp:=false; n:=0; repeat temp:=(s[n]=' '); inc(n); until temp or (pred(n)=StrLen(S)); if temp then StripTo(' ',S) else StrCopy(S,#0); RemoveLeadingSpaces(S); end; {AddChar - Adds character C to the end of S} procedure AddChar(var S:cString; C:Char); var temp : array[0..1] of char; begin temp[0]:=c; temp[1]:=#0; StrCat(S,temp); end; end.