unit general; interface uses dos,modem,types; function strr (n:integer):mstr; function streal (r:real):mstr; function strlong (l:longint):mstr; function valu (q:mstr):integer; function addrstr (p:pointer):sstr; procedure parse3 (s:lstr; var a,b,c:word); function packtime (var dt:datetime):longint; { Replaces Turbo's procedural version } function now:longint; function timestr (time:longint):sstr; function timeval (q:sstr):longint; function timepart (time:longint):longint; function datestr (time:longint):sstr; function dateval (q:sstr):longint; function datepart (time:longint):longint; function upstring (s:anystr):anystr; function match (s1,s2:anystr):boolean; function devicename (name:lstr):boolean; function exist (n:lstr):boolean; procedure appendfile (name:lstr; var q:text); procedure addexitproc (p:pointer); procedure doneexitproc; implementation const maxexitprocs=25; var exitstack:array [1..maxexitprocs] of pointer; exitstackptr:integer; type packedtimerec=record date,time:word end; function strr (n:integer):mstr; var q:mstr; begin str (n,q); strr:=q end; function streal (r:real):mstr; var q:mstr; begin str (r:0:0,q); streal:=q end; function strlong (l:longint):mstr; var q:mstr; begin str (l,q); strlong:=q end; function valu (q:mstr):integer; var i,s,pu:integer; r:real; begin valu:=0; if length(q)=0 then exit; if not (q[1] in ['0'..'9','-']) then exit; if length(q)>5 then exit; val (q,r,s); if s<>0 then exit; if (r<=32767.0) and (r>=-32767.0) then valu:=round(r) end; function addrstr (p:pointer):sstr; function hexstr (n:integer):sstr; function hexbytestr (b:byte):sstr; const hexchars:array[0..15] of char='0123456789ABCDEF'; begin hexbytestr:=hexchars[b shr 4]+hexchars[b and 15] end; begin hexstr:=hexbytestr (hi(n))+hexbytestr(lo(n)) end; begin addrstr:=hexstr(seg(p^))+':'+hexstr(ofs(p^)) end; procedure parse3 (s:lstr; var a,b,c:word); var p:integer; procedure parse1 (var n:word); var ns:lstr; begin ns[0]:=#0; while (p<=length(s)) and (s[p] in ['0'..'9']) do begin ns:=ns+s[p]; p:=p+1 end; if length(ns)=0 then n:=0 else n:=valu(ns); if p12 then h1:=h1-12; ms:=strr(dt.min); if dt.min<10 then ms:='0'+ms; timestr:=strr(h1)+':'+ms+' '+ampmstr[dt.hour>11] end; function datestr (time:longint):sstr; var dt:datetime; begin unpacktime (time,dt); datestr:=strr(dt.month)+'/'+strr(dt.day)+'/'+strr(dt.year-1900) end; function timepart (time:longint):longint; begin timepart:=time and $0000ffff; end; function datepart (time:longint):longint; begin datepart:=time and $ffff0000; end; procedure cleardatetime (var dt:datetime); begin unpacktime (0,dt) end; function timeval (q:sstr):longint; var h1,t:word; k:char; dt:datetime; begin cleardatetime (dt); parse3 (q,h1,dt.min,t); k:=upcase(q[length(q)-1]); if h1 in [1..11] then begin dt.hour:=h1; if k='P' then dt.hour:=dt.hour+12 end else if k='P' then dt.hour:=12 else dt.hour:=0; timeval:=timepart(packtime(dt)) end; function dateval (q:sstr):longint; var dt:datetime; begin cleardatetime (dt); parse3 (q,dt.month,dt.day,dt.year); if dt.year<100 then dt.year:=dt.year+1900; dateval:=datepart(packtime(dt)) end; function upstring (s:anystr):anystr; var cnt:integer; begin for cnt:=1 to length(s) do s[cnt]:=upcase(s[cnt]); upstring:=s end; function match (s1,s2:anystr):boolean; var cnt:integer; begin match:=false; if length(s1)<>length(s2) then exit; for cnt:=1 to length(s1) do if upcase(s1[cnt])<>upcase(s2[cnt]) then exit; match:=true end; function devicename (name:lstr):boolean; var f:file; n:integer absolute f; r:registers; begin devicename:=false; assign (f,name); reset (f); if ioresult<>0 then exit; r.bx:=n; r.ax:=$4400; intr ($21,r); devicename:=(r.dx and 128)=128; close (f) end; function exist (n:lstr):boolean; var f:file; i:integer; begin assign (f,n); reset (f); i:=ioresult; exist:=i=0; close (f); i:=ioresult end; procedure appendfile (name:lstr; var q:text); var n:integer; b:boolean; f:file of char; begin close (q); n:=ioresult; assign (q,name); assign (f,name); reset (f); b:=(ioresult<>0) or (filesize(f)=0); close (f); n:=ioresult; if b then rewrite (q) else append (q) end; procedure addexitproc (p:pointer); begin inc (exitstackptr); if exitstackptr>maxexitprocs then begin writeln ('Too many exit procedures'); halt (255) end else begin exitstack[exitstackptr]:=exitproc; exitproc:=p end end; procedure doneexitproc; begin exitproc:=exitstack[exitstackptr]; dec (exitstackptr) end; begin exitstackptr:=0 end.