Unit Funcs; (* previously All_Func.Inc *) (* 05/02/1988 J Tal Rollins Medical/Dental Systems Public Domain *) Interface Uses Dos,Crt; TYPE st255 = string[255]; Function Word_Int(r: REAL) : INTEGER; Function Word_Real(i: INTEGER) : REAL; Function Real_Mod(a,b: REAL) : REAL; (* modulus for two real numbers Real_Mod(15.0,2.0) = 1.0 *) function lowcase(c : char) : char; (* opposite of upcase lowcase('A') = 'a' lowcase('b') = 'b' *) function f_buf_conv( x : st255) : st255; (* convert a file buffer into a string *) procedure prog_chain(prog : st255); (* dummy *) function spaces(num : integer) : st255; (* like basic space$ spaces(10) = ' ' *) function bakfile( name : st255) : st255; (* takes filename and returns .BAK version of that name bakfile('test.dat') = 'test.bak' *) function bool(x : boolean) : integer; (* True becomes -1, False becomes 0 bool(true) = -1 bool(false) = 0 *) function center ( line : st255) : integer; (* returns x location to print the line/string at to center it center('HELP') = 38 gotoxy(center(message),y); write(message); *) function fill(n,char : integer) : st255; (* fill string to n characters with chr(char) like basic string$ fill(10,65) = 'AAAAAAAAAA' *) function fnline( curline : st255) : st255; (* isolate leading number from a line fnline('255 IF X = 255 THEN GOTO') = 255 *) function fnmax(a,b : integer) : integer; (* max of two integers fnmax(4,5) = 5 *) function fnmin(a,b : integer) : integer; (* min of two integers fnmin(-9,5) = -9 *) function lpad(ch : st255; num : integer) : st255; (* left pad the string ch with spaces to num length lpad('HELP',10) = ' HELP' *) function ltrm ( curline : st255) : st255; (* remove leading spaces from curline ltrm(' HELP') = 'HELP' *) function peek(seg,ofs : integer) : integer; (* like basic peek x := peek(segment,offset); *) procedure poke(seg,ofs,v : integer); (* like basic poke poke(screen_seg,ofs,character) *) function power(x,n : integer) : integer; (* x^n power(2,4) = 16 *) function rpad(ch : st255; num : integer) : st255; (* right pad ch to num length with spaces rpad('THIS',10) = 'THIS ' *) function rpt(num,ch : integer) : st255; (* like basic string$ rpt(10,67) = 'CCCCCCCCCC' *) function rtrm(ch : st255) : st255; (* remove trailing spaces from string ch rtrm('ROYAL ') = 'ROYAL' *) function srep(ch,dh,eh : st255): st255; (* srep=string replace replace all occurances of string dh with eh in string ch srep('THE CAT','CAT','FAT') = 'THE FAT' *) procedure s_swap(var a1,a2 : st255); (* string swap, swap a1 & a2 a1 = 'MAMA' a2 = 'DADDY' s_swap(a1,a2) a1 = 'DADDY' a2 = 'MAMA' *) function fnxtrm( s : st255) : st255; (* if string s is all blanks, then returns '' null string fnxtrm(' g ') = ' ' fnxtrm(' ') = '' *) function fnval( curline : st255) : integer; (* converts string representation of number to integer fnval('123 ') = 123 *) function fns ( a1 : integer) : st255; (* converts integer to string representation fns(1234) = '1234' *) function left_str( curline : st255; i : integer) : st255; (* take i characters from curline starting at the left left_str('THE QUICK BROWN',9) = 'THE QUICK' *) function right_str( curline : st255; i : integer) : st255; (* take i characters from curline starting at the right right_str('THE QUICK BROWN',9) = 'ICK BROWN' *) procedure mid_str_assign( var modify_string : st255; s_start,s_len : integer; ins_string : st255); (* mid string assignment mid_str_assign('flemish',1,2,'bl') = 'blemish'; ^ starting a character 1 ^ for a length of two ^ make those chars 'bl' mid_str_assign('abcdefg',2,2,'BC') = 'aBCdefg' *) function hex_str(hex: INTEGER) : st255; (* hexadecimal string representation of decimal integer hex_str(123) = '7B' *) function hex_val(hex: st255) : INTEGER; (* reverse of hex_str, integer representation of hexadecimal string hex_val('7B') = 123 *) function bin_str(bin: INTEGER) : st255; (* binary string representation of integer bin_str(123) = '1111011'; *) FUNCTION InKey(VAR Special : BOOLEAN; VAR Keychar : CHAR) : BOOLEAN; (* checks for keypressed, returns type and character *) function fnzero (num : st255 ; places : integer) : st255; (* left '0' pad a number into a string fnzero('123',10) = '0000000123' *) function fns_z(n : integer) : st255; (* left '0' pad a number into a 2 digit string fns_z(1) = '01' fns_z(45) = '45' *) Function bit_blast(bit_stream: st255) : INTEGER; (* reverse of bin_str, integer representation of binary string bit_blast('1110001') = 113 *) Function printusing (mask : st255; number : real) : st255; (* printusing('###,###.##',19.95) = ' 19.95' printusing('###,###.##CR,-19.95) = ' 19.95CR' *) Procedure UpStr(VAR a: st255); (* Upcase a whole string UpStr('The cat Mildred') = 'THE CAT MILDRED' *) Implementation Function Word_Int; (* (r: REAL) : INTEGER; *) BEGIN IF r > 32767.0 THEN Word_int := Trunc(r - 65536.0) ELSE Word_int := Trunc(r); END; Function Word_Real; (* (i: INTEGER) : REAL; *) BEGIN IF i < 0 THEN Word_Real := i + 32767.0 ELSE Word_Real := i; END; Function Real_Mod; (* (a,b: REAL) : REAL; *) BEGIN WHILE a > b DO begin a := a - b; END; Real_Mod := a; END; (* Real_Mod *) function lowcase; (* (c : char) : char; *) var c1 : integer; begin c1 := ord(c); if (c1 > 64) and (c1 < 91) {only change A-Z to a-z} then c1 := c1 + 32; lowcase := chr(c1); end; function f_buf_conv; (* ( x : st255) : st255; *) var i : integer; temp : st255; begin temp := ''; temp := x[0] + copy(x,1,length(x)); f_buf_conv := temp; end; procedure prog_chain; (* (prog : st255); *) (* dummy *) begin halt; end; function spaces; (* (num : integer) : st255; *) var sp1 : integer; space : st255; begin space := ''; for sp1 := 1 to num do space := space + ' '; spaces := space; end; { ------------------- } function bakfile; (* ( name : st255) : st255; *) var a1 : integer; begin a1 := pos('.',name); if a1 = 0 then bakfile := name + '.BAK' else bakfile := copy(name,1,a1) + 'BAK'; end; { ------------------- } function bool; (* (x : boolean) : integer; *) begin if x then bool := -1 else bool := 0 end; { ------------------- } function center; (* ( line : st255) : integer; *) var a1 : integer; begin a1 := length(line); center := trunc(39-(a1 div 2)); end; { ------------------- } function fill; (* (n,char : integer) : st255; *) var i : integer; begin for i := 1 to n do fill[i] := chr(char) end; { ------------------- } function fnline; (* ( curline : st255) : st255; *) var a1 : integer; a1s : st255; begin a1 := pos(' ',curline); a1s := copy(curline,1,a1); fnline := a1s; end; { ------------------- } function fnmax; (* (a,b : integer) : integer; *) begin fnmax := a-bool(b>a)*(b-a) end; { ------------------- } function fnmin; (* (a,b : integer) : integer; *) begin fnmin := a+bool(a>b)*(a-b) end; { ------------------- } function lpad; (* (ch : st255; num : integer) : st255; *) var sp1 : integer; sp2 : integer; begin sp1 := length(ch); sp2 := num - sp1; lpad := spaces(sp2) + ch; end; { ------------------- } function ltrm; (* ( curline : st255) : st255; *) begin while curline[1] = ' ' do curline := copy(curline,2,255); ltrm := curline; end; { ------------------- } function peek; (* (seg,ofs : integer) : integer; *) begin peek := mem[seg:ofs]; end; { ------------------- } procedure poke; (* (seg,ofs,v : integer); *) begin mem[seg:ofs] := v; end; { ------------------- } function power; (* (x,n : integer) : integer; *) begin if n = 1 then power := x else power := x*power(x,n-1) end; { ------------------- } function rpad; (* (ch : st255; num : integer) : st255; *) begin rpad := copy(ch + spaces(num),1,num); end; { ------------------- } function rpt; (* (num,ch : integer) : st255; *) var sp1 : integer; space : st255; begin space := ''; for sp1 := 1 to num do space := space + chr(ch); rpt := space; end; { ------------------- } function rtrm; (* (ch : st255) : st255; *) var sp1 : integer; sp2 : integer; begin sp1 := length(ch); sp2 := sp1; while (ch[sp2] = ' ') and (sp2 <> 0) do sp2 := sp2 - 1; rtrm := copy(ch,1,sp2); end; { ------------------- } function srep; (* (ch,dh,eh : st255): st255; *) var sp1 : integer; sp2 : integer; sp3 : integer; sp4 : integer; sp5 : integer; atemp : st255; btemp : st255; ctemp : st255; begin sp1 := length(ch); sp2 := length(dh); sp3 := length(eh); while pos(dh,ch) <> 0 do begin sp4 := pos(dh,ch); sp5 := sp1 - (sp4 + sp2) + 1; atemp := copy(ch,1,sp4-1); btemp := copy(ch,sp4+sp2,sp5); ctemp := atemp + eh + btemp; ch := ctemp; end; srep := ch; end; { ------------------- } procedure s_swap; (* (var a1,a2 : st255); *) var temp : st255; begin temp := a1; a1 := a2; a2 := temp; end; { ------------------- } function fnxtrm; (* ( s : st255) : st255; *) begin fnxtrm := spaces(1+bool(s = spaces(length(s)))) end; { ------------------- } function fnval; (* ( curline : st255) : integer; *) var err,a1 : integer; begin while copy(curline,1,1) = '' do curline := copy(curline,2,255); val(curline,a1,err); fnval := a1; end; { ------------------- } function fns; (* ( a1 : integer) : st255; *) var a1s : st255; begin str(a1,a1s); fns := a1s; end; function left_str; (* ( curline : st255; i : integer) : st255; *) begin left_str := copy(curline,1,i); end; { ------------------- } function right_str; (* ( curline : st255; i : integer) : st255; *) var l : integer; begin l := length(curline); right_str := copy(curline,l-i+1,i); end; { ------------------- } { format for mid_str_assign basic - mid$(s$,12,12) = mid$(f$,4,12) pascal - mid_str_assign(s_str,12,12,copy(f_str,4,12)); or mid_str_assign(s_str,12,12,'123456789012'); } { ------------------- } procedure mid_str_assign; (* ( var modify_string : st255; s_start,s_len : integer; ins_string : st255); *) begin delete(modify_string,s_start,s_len); insert(ins_string,modify_string,s_start); end; { ------------------- } function hex_str(hex: INTEGER) : st255; VAR hex_out: st255; hex_temp: INTEGER; hex_mas: st255; BEGIN hex_mas := '0123456789ABCDEF'; hex_out := ''; WHILE hex > 0 DO begin hex_temp := hex AND 15; hex_out := hex_mas[hex_temp+1] + hex_out; hex := hex DIV 16; END; FOR hex_temp := 1 to 2 DO begin IF length(hex_out) < 2 then hex_out := '0' + hex_out; END; hex_str := hex_out; END; { ------------------- } function hex_val; (* (hex: st255) : INTEGER; *) VAR hex_out: INTEGER; hex_temp: INTEGER; hex_mas: st255; BEGIN hex_mas := '0123456789ABCDEF'; hex_out := 0; WHILE length(hex) > 0 DO begin hex_temp := Pos(hex[1],hex_mas); hex_out := hex_out * 16 + (hex_temp)-1; hex := copy(hex,2,255); END; hex_val := hex_out; END; { ----------------- } function bin_str; (* (bin: INTEGER) : st255; *) VAR bin_out: st255; bin_temp: INTEGER; BEGIN bin_out := ''; WHILE bin <> 0 DO begin bin_temp := bin AND 1; IF bin_temp = 1 THEN bin_out := '1' + bin_out ELSE bin_out := '0' + bin_out; bin := bin shr 1; END; bin_str := bin_out; END; { ------------------- } FUNCTION InKey; (* (VAR Special : BOOLEAN; VAR Keychar : CHAR) : BOOLEAN; *) VAR Dosrec : Dos.Registers; BEGIN IF Crt.KeyPressed THEN begin Dosrec.AX := $0800; MSDOS(DosRec); KEYCHAR := CHR(LO(DOSREC.AX)); INKEY := TRUE; IF ORD(KEYCHAR) = 0 THEN BEGIN SPECIAL := TRUE; DOSREC.AX := $0800; MSDOS(DosRec); KEYCHAR := CHR(LO(DOSREC.AX)); END ELSE SPECIAL := FALSE; END ELSE BEGIN INKEY := FALSE; SPECIAL := FALSE; END; END; { ------------------- } function fnzero; (* (num : st255 ; places : integer) : st255; *) var a1s : st255; a1 : integer; begin a1 := length(num); a1s := rpt(places-a1,48) + num; fnzero := a1s; end; { ------------------- } function fns_z; (* (n : integer) : st255; *) var c : st255; begin c := fns(n); if length(c) = 1 then c := '0' + c; fns_z := c; end; { ------------------- } Function bit_blast; (* (bit_stream: st255) : INTEGER; *) (* convert string representation of bits into integer: '1001' becomes 9 *) VAR i,bit_box : INTEGER; BEGIN bit_box := 0; FOR i := Length(bit_stream) DOwnTO 1 DO BEGIN IF bit_stream[i] = '1' THEN begin bit_box := bit_box + (1 shl ((Length(bit_stream) - i))); END; END; bit_blast := bit_box; END; { ------------------- } Function printusing; (* (mask : st255; number : real) : st255; *) const comma : char = ','; point : char = '.'; minussign : char = '-'; VAR fieldwidth, IntegerLength, i, j, places,pointposition : INTEGER; usingcommas, decimal, negative : boolean; outstring, IntegerString : string[80]; BEGIN negative := number < 0; number := abs(number); places := 0; if pos('CR',mask) = 0 then fieldwidth := length(mask) else fieldwidth := length(mask) - 2; usingcommas := pos(comma,mask) > 0; decimal := pos(point,mask) > 0; if decimal then BEGIN pointposition := pos(point,mask); places := fieldwidth - pointposition END; str( number : 0 : places, outstring); if usingcommas then BEGIN j := 0; IntegerString := copy(outstring, 1, length( outstring ) - places ); IntegerLength := length( IntegerString ); if decimal then IntegerLength := IntegerLength -1; FOR i := IntegerLength DOwnto 2 DO BEGIN j := j + 1; if j mod 3 = 0 then insert ( comma, outstring, i ) end END; if length(outstring) < fieldwidth then outstring := spaces(fieldwidth - length(outstring)) + outstring; if (negative) then if (pos('CR',mask) <> 0) then outstring := outstring + 'CR' else outstring := minussign + outstring; printusing := outstring; END; (* printusing *) Procedure UpStr; VAR i : Integer; BEGIN For i := 1 TO Length(a) DO a[i] := UpCase(a[i]); END; END.