home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-385-Vol-1of3.iso / f / faq-s.zip / GENSUBS.PAS < prev    next >
Pascal/Delphi Source File  |  1991-05-04  |  6KB  |  322 lines

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