{ Unit for general string manipulation ver 1992-01-22 } UNIT strings; INTERFACE FUNCTION val(s: string): int; FUNCTION str(n,base,digits: int; zeros: boolean; var res: string); FUNCTION decstr(n: int; var res: string); FUNCTION hexstr(n: int; var res: string); { FUNCTION append(var s1: string; s2: string); FUNCTION scan(source: string; var dest: string; var pos: int); FUNCTION uppercase(var s: string); FUNCTION pad(s: string; n: int; var res: string); } IMPLEMENTATION FUNCTION digitVal(ch: char): int; var x : int; BEGIN if (ch >= '0') and (ch <= '9') then x := int(ch - '0') and 255; elsif (ch >= 'A') and (ch <= 'F') then x := 10 + int(ch - 'A') and 255; elsif (ch >= 'a') and (ch <= 'f') then x := 10 + int(ch - 'a') and 255; else x := 0; end; return x; END; { Convert decimal or hexadecimal string to int } FUNCTION val(s: string): int; var i,x,sum,base : int; BEGIN sum := 0; if s[1] = '$' then i := 2; base := 16; else i := 1; base := 10; end; while i <= length(s) loop sum := sum * base + digitVal(s[i]); inc(i); end loop; return sum; END val; const tab = "0123456789ABCDEF"; { Convert n to number string using base and digits, skip leading zeros if zeros is false. } FUNCTION str(n,base,digits: int; zeros: boolean; var res: string); var b,i,x : int; BEGIN i := 1; if base > 16 then base := 16; end; if base < 2 then base := 2; end; b := 1; while digits > 1 loop b := b * base; dec(digits); end; while b > 0 loop x := n / b; if x > 0 then zeros := true; end; if zeros or (b = 1) then res[i] := tab[x+1]; else res[i] := ' '; end; inc(i); n := n mod b; b := b / base; end; length(res) := i-1; END str; { Convert int to decimal string } FUNCTION decstr(n: int; var res: string); BEGIN str(n,10,5,false,res); END; { Convert int to hexadecimal string } FUNCTION hexstr(n: int; var res: string); BEGIN str(n,16,4,true,res); END; { FUNCTION append(var s1: string; s2: string); var i,j : int; BEGIN i := 1; j := length(s1) + 1; while (i <= length(s2)) and (j+1 < sizeof(string)) loop s1[j] := s2[i]; inc(i); inc(j); end loop; length(s1) := j-1; END append; FUNCTION scan(source: string; var dest: string; var pos: int); var len,i : int; BEGIN len := length(source); while (pos <= len) and (source[pos] = ' ') loop inc(pos); end loop; i := 1; while (pos <= len) and (source[pos] <> ' ') loop dest[i] := source[pos]; inc(i); inc(pos); end loop; length(dest) := i-1; END scan; FUNCTION uppercase(var s: string); var i : int; ch : char; BEGIN for i := 1 while i <= length(s) do inc(i) loop ch := s[i]; if (ch >= 'a') and (ch <= 'z') then s[i] := ch + 'A' - 'a'; end if; end loop; END uppercase; FUNCTION pad(s: string; n: int; var res: string); var i : int; BEGIN for i := 1 while i <= n do inc(i) loop if i <= length(s) then res[i] := s[i]; else res[i] := ' '; end; end loop; length(res) := n; END pad; } BEGIN END strings;