home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / MBUG / MBUG022.ARC / PASTOOLS.LBR / LIB.LIB < prev    next >
Text File  |  1979-12-31  |  6KB  |  241 lines

  1. {#name getarg}
  2. procedure getarg(var arg:stringarray);
  3. var
  4.   i:integer; name:stringtype;
  5.   comline:string[127] absolute $80;
  6.  
  7. function get_name:boolean;
  8. begin
  9.   while (comline[i] =' ') and (i<=length(comline)) do i:=i+1;
  10.   name:='';
  11.   while (comline[i]<>' ') and (i<=length(comline)) do
  12.     begin name:=name+comline[i]; i:=i+1 end;
  13.   get_name:=length(name)>0 
  14. end;
  15.  
  16. begin
  17.   i:=1; arg.number:=0;
  18.   while get_name and (arg.number<max_buf) do
  19.     begin
  20.       arg.number:=arg.number+1;
  21.       arg.name[arg.number]:=name
  22.     end
  23. end;
  24.  
  25. {#name store}
  26. procedure store(var pointer:integer; line:linetype);
  27. var i,j:integer;
  28. begin
  29.   i:=length(line)+1; j:=pointer+i;
  30.   if j<=max_buf then
  31.     begin move(line,buffer[pointer],i); pointer:=j end
  32.   else
  33.     begin writeln('buffer overflow'); halt end
  34. end;
  35.  
  36. {#name get}
  37. procedure get(var pointer:integer; var line:linetype);
  38. var i:integer;
  39. begin
  40.   i:=ord(buffer[pointer])+1;
  41.   move(buffer[pointer],line,i); pointer:=pointer+i
  42. end;
  43.  
  44. {#name set_buffer}
  45. {#external store}
  46. procedure set_buffer(var filename:stringtype; var pointer:integer);
  47. var line:linetype;
  48. begin
  49.   assign(infile,filename); {$I-} reset(infile); {$I+}
  50.   if ioresult=0 then
  51.     while not eof(infile) do
  52.       begin
  53.         readln(infile,line);
  54.         if pos('{#',line)=1 then store(pointer,line)
  55.       end
  56.   else
  57.     begin
  58.       writeln(filename,': can''t open file'); halt
  59.     end;
  60.   close(infile)
  61. end;
  62.  
  63. {#name interpret}
  64. function interpret(line:linetype; var string_:stringarray;
  65.                    var number:integer):symbol;
  66. const
  67.   eos=#0;
  68.   letters:set of char=['a'..'z','A'..'Z','0'..'9','_','.'];
  69. var i:integer; s:stringtype; command:symbol;
  70.  
  71. procedure skip;
  72. begin
  73.   while not (line[i] in (letters+[eos])) do i:=i+1
  74. end;
  75.  
  76. procedure extract(var s:stringtype);
  77. var l:linetype;
  78. begin
  79.   l:=''; s:='';
  80.   while line[i] in letters do
  81.     begin l:=l+upcase(line[i]); i:=i+1 end;
  82.   if length(l)>name_length thσn
  83. á   begin writeln(l,': too long name'); error:=true end
  84.   else s:=l;
  85.   skip
  86. end;
  87.  
  88. begin
  89.   line:=line+eos; number:=string_.number; i:=1;
  90.   skip; extract(s);
  91.   if      s='NAME'     then command:=namesym
  92.   else if s='EXTERNAL' then command:=externalsym
  93.   else if s='SCAN'     then command:=scansym
  94.   else                      command:=nosym;
  95.   while line[i]<>eos do
  96.     begin
  97.       number:=number+1;
  98.       if number<=max_name then extract(string_.name[number])
  99.       else begin writeln('table overflow'); halt end
  100.     end;
  101.   interpret:=command
  102. end;
  103.  
  104. {#name set_string}
  105. {#external get,interpret}
  106. procedure set_string(sym:symbol; var string_:stringarray);
  107. var number,pointer:integer; line:linetype;
  108. begin
  109.   string_.number:=0; pointer:=1;
  110.   while pointer<bufindex[0] do
  111.     begin
  112.       get(pointer,line);
  113.       if interpret(line,string_,number)=sym then
  114.         string_.number:=number
  115.     end
  116. end;
  117.  
  118. {#name get_external}
  119. {#external get,interpret}
  120. procedure get_external(var index:integer; var name:stringtype;
  121.                        var external_:stringarray);
  122. var exit:boolean; pointer,number:integer; command:symbol;
  123.     line:linetype;
  124. begin
  125.   exit:=false; index:=0;
  126.   external_.number:=0; pointer:=bufindex[0];
  127.   while (pointer<bufindex[scan_.number]) and not exit do
  128.     begin
  129.       get(pointer,line);
  130.       command:=interpret(line,external_,number);
  131.       if (index>0) and (command=externalsym) then
  132.         external_.number:=number;
  133.       if command=namesym then
  134.         if external_.name[number]=name then index:=pointer
  135.         else exit:=index>0
  136.     end;
  137.   if index=0 then
  138.     begin
  139.       writeln(name,' is not found'); error:=true
  140.     end
  141. end;
  142.  
  143. {#name expand}
  144. {#external get_external}
  145. {$A-}
  146. procedure expand(external_:stringarray; var p:link);
  147. var i,index:integer; external_next:stringarray;
  148. begin
  149.   for i:=1 to external_.number do
  150.     begin
  151.       get_external(index,external_.name[i],external_next);
  152.       expand(external_next,p);
  153.       p:=p^.next;
  154.       p^.name :=external_.name[i];
  155.       p^.index:=index
  156.     end;
  157.   new(p^.next)
  158. end;
  159. {$A+}
  160.  
  161. {#name condense}
  162. procedure condense;
  163. var p,q:link; name:stringtype;
  164. begin
  165.   p:=root;
  166.   while p^.next<>nil do
  167.     begin
  168.       p:=p^.next; name:=p^.name; q:=p;
  169.       while q^.next<>nil do
  170.         if q^.next^.name=name then q^.next:=q^.next^.next
  171.         else q:=q^.next
  172.     end
  173. end;
  174.  
  175. {#name make_table}
  176. {#external expand}
  177. procedure make_table(var external_:stringarray);
  178. var p:link;
  179. begin
  180.   p:=root; expand(external_,p); p^.next:=nil
  181. end;
  182.  
  183. {#name write_lib}
  184. {#external interpret}
  185. procedure write_lib(var filename,name:stringtype);
  186. var find:boolean; s_:stringarray; number:integer;
  187.     line:linetype;
  188.  
  189. function check:boolean;
  190. begin
  191.   if pos('{#',line)=1 then
  192.     check:=interpret(line,s_,number)=namesym
  193.   else check:=false
  194. end;
  195.  
  196. begin
  197.   assign(infile,filename); reset(infile);
  198.   find:=false; s_.number:=0;
  199.   while not eof(infile) and not find do
  200.     begin
  201.       readln(infile,line);
  202.       if check then find:=name=s_.name[number]
  203.     end;
  204.   while not eof(infile) and find do
  205.     begin
  206.       writeln(outfile,line); readln(infile,line);
  207.       find:=not check
  208.     end;
  209.   if find then writeln(outfile,line);
  210.   close(infile)
  211. end;
  212.  
  213. {#name make_library}
  214. {#external write_lib}
  215. procedure make_library;
  216. var p:link; i:integer;
  217. begin
  218.   writeln('making ',outfile_name);
  219.   assign(outfile,outfile_name); rewrite(outfile);
  220.   p:=root;
  221.   while p^.next<>nil do
  222.     begin
  223.       p:=p^.next; i:=0;
  224.       while p^.index>bufindex[i] do i:=i+1;
  225.       write_lib(scan_.name[i],p^.name)
  226.     end;
  227.   close(outfile)
  228. end;
  229.  
  230. {#name exist}
  231. function exist(var string_:stringarray; name:stringtype):boolean;
  232. var flag:boolean; i:integer;
  233. begin
  234.   flag:=false; i:=1;
  235.   while (i<=string_.number) and not flag do
  236.     begin
  237.       flag:=name=string_.name[i]; i:=i+1
  238.     end;
  239.   exist:=flag
  240. end;
  241.