home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 189.img / TCS120S.ZIP / GENSUBS.PAS < prev    next >
Pascal/Delphi Source File  |  1989-02-24  |  6KB  |  293 lines

  1. {$R-,S-,I-,D-,F+,V-,B-,N-,L+ }
  2. {$M 65500,0,0 }
  3.  
  4. unit gensubs;
  5.  
  6. interface
  7.  
  8. uses dos,gentypes;
  9.  
  10. function strr (n:integer):mstr;
  11. function streal (r:real):mstr;
  12. function strlong (l:longint):mstr;
  13. function valu (q:mstr):integer;
  14. function addrstr (p:pointer):sstr;
  15. procedure parse3 (s:lstr; var a,b,c:word);
  16. function packtime (var dt:datetime):longint;
  17.     { Replaces Turbo's procedural version }
  18. function now:longint;
  19. function timestr (time:longint):sstr;
  20. function timeval (q:sstr):longint;
  21. function timepart (time:longint):longint;
  22. function datestr (time:longint):sstr;
  23. function dateval (q:sstr):longint;
  24. function datepart (time:longint):longint;
  25. function upstring (s:anystr):anystr;
  26. function match (s1,s2:anystr):boolean;
  27. function devicename (name:lstr):boolean;
  28. function exist (n:lstr):boolean;
  29. procedure appendfile (name:lstr; var q:text);
  30. procedure addexitproc (p:pointer);
  31. procedure doneexitproc;
  32.  
  33. implementation
  34.  
  35. const maxexitprocs=25;
  36.  
  37. var exitstack:array [1..maxexitprocs] of pointer;
  38.     exitstackptr:integer;
  39.  
  40. type packedtimerec=record
  41.        date,time:word
  42.      end;
  43.  
  44. function strr (n:integer):mstr;
  45. var q:mstr;
  46. begin
  47.   str (n,q);
  48.   strr:=q
  49. end;
  50.  
  51. function streal (r:real):mstr;
  52. var q:mstr;
  53. begin
  54.   str (r:0:0,q);
  55.   streal:=q
  56. end;
  57.  
  58. function strlong (l:longint):mstr;
  59. var q:mstr;
  60. begin
  61.   str (l,q);
  62.   strlong:=q
  63. end;
  64.  
  65. function valu (q:mstr):integer;
  66. var i,s,pu:integer;
  67.     r:real;
  68. begin
  69.   valu:=-1;
  70.   if length(q)=0 then exit;
  71.   if not (q[1] in ['0'..'9','-']) then exit;
  72.   if length(q)>5 then exit;
  73.   val (q,r,s);
  74.   if s<>0 then exit;
  75.   if (r<=32767.0) and (r>=-32767.0)
  76.     then valu:=round(r)
  77. end;
  78.  
  79. function addrstr (p:pointer):sstr;
  80.  
  81.   function hexstr (n:integer):sstr;
  82.  
  83.     function hexbytestr (b:byte):sstr;
  84.     const hexchars:array[0..15] of char='0123456789ABCDEF';
  85.     begin
  86.       hexbytestr:=hexchars[b shr 4]+hexchars[b and 15]
  87.     end;
  88.  
  89.   begin
  90.     hexstr:=hexbytestr (hi(n))+hexbytestr(lo(n))
  91.   end;
  92.  
  93. begin
  94.   addrstr:=hexstr(seg(p^))+':'+hexstr(ofs(p^))
  95. end;
  96.  
  97. procedure parse3 (s:lstr; var a,b,c:word);
  98. var p:integer;
  99.  
  100.   procedure parse1 (var n:word);
  101.   var ns:lstr;
  102.   begin
  103.     ns[0]:=#0;
  104.     while (p<=length(s)) and (s[p] in ['0'..'9']) do begin
  105.       ns:=ns+s[p];
  106.       p:=p+1
  107.     end;
  108.     if length(ns)=0
  109.       then n:=0
  110.       else n:=valu(ns);
  111.     if p<length(s) then p:=p+1
  112.   end;
  113.  
  114. begin
  115.   p:=1;
  116.   parse1 (a);
  117.   parse1 (b);
  118.   parse1 (c)
  119. end;
  120.  
  121. function packtime (var dt:datetime):longint;
  122. var l:longint;
  123. begin
  124.   dos.packtime (dt,l);
  125.   packtime:=l
  126. end;
  127.  
  128. function now:longint;
  129. var dt:datetime;
  130.     t:word;
  131.     l:longint;
  132. begin
  133.   gettime (dt.hour,dt.min,dt.sec,t);
  134.   getdate (dt.year,dt.month,dt.day,t);
  135.   l:=packtime (dt);
  136.   now:=l
  137. end;
  138.  
  139. function timestr (time:longint):sstr;
  140. var h1:integer;
  141.     ms:sstr;
  142.     dt:datetime;
  143. const ampmstr:array [false..true] of string[2]=('am','pm');
  144. begin
  145.   unpacktime (time,dt);
  146.   h1:=dt.hour;
  147.   if h1=0
  148.     then h1:=12
  149.     else if h1>12
  150.       then h1:=h1-12;
  151.   ms:=strr(dt.min);
  152.   if dt.min<10 then ms:='0'+ms;
  153.   timestr:=strr(h1)+':'+ms+' '+ampmstr[dt.hour>11]
  154. end;
  155.  
  156. function datestr (time:longint):sstr;
  157. var dt:datetime;
  158. begin
  159.   unpacktime (time,dt);
  160.   datestr:=strr(dt.month)+'/'+strr(dt.day)+'/'+strr(dt.year-1900)
  161. end;
  162.  
  163. function timepart (time:longint):longint;
  164. begin
  165.   timepart:=time and $0000ffff;
  166. end;
  167.  
  168. function datepart (time:longint):longint;
  169. begin
  170.   datepart:=time and $ffff0000;
  171. end;
  172.  
  173. procedure cleardatetime (var dt:datetime);
  174. begin
  175.   unpacktime (0,dt)
  176. end;
  177.  
  178. function timeval (q:sstr):longint;
  179. var h1,t:word;
  180.     k:char;
  181.     dt:datetime;
  182. begin
  183.   cleardatetime (dt);
  184.   parse3 (q,h1,dt.min,t);
  185.   k:=upcase(q[length(q)-1]);
  186.   if h1 in [1..11]
  187.     then
  188.       begin
  189.         dt.hour:=h1;
  190.         if k='P' then dt.hour:=dt.hour+12
  191.       end
  192.     else
  193.       if k='P'
  194.         then dt.hour:=12
  195.         else dt.hour:=0;
  196.   timeval:=timepart(packtime(dt))
  197. end;
  198.  
  199. function dateval (q:sstr):longint;
  200. var dt:datetime;
  201. begin
  202.   cleardatetime (dt);
  203.   parse3 (q,dt.month,dt.day,dt.year);
  204.   if dt.year<100 then dt.year:=dt.year+1900;
  205.   dateval:=datepart(packtime(dt))
  206. end;
  207.  
  208. function upstring (s:anystr):anystr;
  209. var cnt:integer;
  210. begin
  211.   for cnt:=1 to length(s) do s[cnt]:=upcase(s[cnt]);
  212.   upstring:=s
  213. end;
  214.  
  215. function match (s1,s2:anystr):boolean;
  216. var cnt:integer;
  217. begin
  218.   match:=false;
  219.   if length(s1)<>length(s2) then exit;
  220.   for cnt:=1 to length(s1) do
  221.     if upcase(s1[cnt])<>upcase(s2[cnt])
  222.       then exit;
  223.   match:=true
  224. end;
  225.  
  226. function devicename (name:lstr):boolean;
  227. var f:file;
  228.     n:integer absolute f;
  229.     r:registers;
  230. begin
  231.   devicename:=false;
  232.   assign (f,name);
  233.   reset (f);
  234.   if ioresult<>0 then exit;
  235.   r.bx:=n;
  236.   r.ax:=$4400;
  237.   intr ($21,r);
  238.   devicename:=(r.dx and 128)=128;
  239.   close (f)
  240. end;
  241.  
  242. function exist (n:lstr):boolean;
  243. var f:file;
  244.     i:integer;
  245. begin
  246.   assign (f,n);
  247.   reset (f);
  248.   i:=ioresult;
  249.   exist:=i=0;
  250.   close (f);
  251.   i:=ioresult
  252. end;
  253.  
  254. procedure appendfile (name:lstr; var q:text);
  255. var n:integer;
  256.     b:boolean;
  257.     f:file of char;
  258. begin
  259.   close (q);
  260.   n:=ioresult;
  261.   assign (q,name);
  262.   assign (f,name);
  263.   reset (f);
  264.   b:=(ioresult<>0) or (filesize(f)=0);
  265.   close (f);
  266.   n:=ioresult;
  267.   if b
  268.     then rewrite (q)
  269.     else append (q)
  270. end;
  271.  
  272. procedure addexitproc (p:pointer);
  273. begin
  274.   inc (exitstackptr);
  275.   if exitstackptr>maxexitprocs then begin
  276.     writeln ('Too many exit procedures');
  277.     halt (255)
  278.   end else begin
  279.     exitstack[exitstackptr]:=exitproc;
  280.     exitproc:=p
  281.   end
  282. end;
  283.  
  284. procedure doneexitproc;
  285. begin
  286.   exitproc:=exitstack[exitstackptr];
  287.   dec (exitstackptr)
  288. end;
  289.  
  290. begin
  291.   exitstackptr:=0
  292. end.
  293.