home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / pascal / library / dos / bix / scantest.pas < prev    next >
Pascal/Delphi Source File  |  1986-08-04  |  2KB  |  80 lines

  1. {using 'scan' for fast access to program text not in code space}
  2. TITLE: 'Scan' example for reducing code size
  3.  
  4. Program extext;
  5. type anystring=string[255];
  6. var n,msglen:integer;
  7.     f:file;
  8.     p:^anystring;
  9.  
  10. {$I scan.pas}
  11.  
  12. procedure msgs;external 'extext.pas'; {text of this program in code seg}
  13.  
  14. function msg(n:integer):anystring;
  15. {return lines from within external procedure 'msgs'}
  16. var i,j,o:integer;
  17.     s:anystring;
  18. begin
  19.  msg:='';
  20.  o:=ofs(msgs);
  21.  i:=0;
  22.  if n>=0 then
  23.  repeat
  24.  j:=scan(msglen-i,13,mem[cseg:ofs(msgs)+i]);
  25.  if n=0 then
  26.   begin
  27.    s[0]:=chr(j);
  28.    if j>0 then move(mem[cseg:ofs(msgs)+i],s[1],j);
  29.    msg:=s
  30.   end;
  31.  i:=i+j+2;
  32.  n:=n-1
  33. until (n<0) or (i>msglen)
  34. end;
  35.  
  36. function dmsg(n:integer):anystring;
  37. {return lines from within varaiable p^ on heap}
  38. var ss,i,j,o:integer;
  39.     s:anystring;
  40. begin
  41.  dmsg:='';
  42.  ss:=seg(p^);
  43.  o:=ofs(p^);
  44.  i:=0;
  45.  if n>=0 then
  46.  repeat
  47.  j:=scan(msglen-i,13,mem[ss:ofs(p^)+i]);
  48.  if n=0 then
  49.   begin
  50.    s[0]:=chr(j);
  51.    if j>0 then move(mem[ss:ofs(p^)+i],s[1],j);
  52.    dmsg:=s
  53.   end;
  54.  i:=i+j+2;
  55.  n:=n-1
  56. until (n<0) or (i>msglen)
  57. end;
  58.  
  59.  
  60. begin
  61. {test for 'msg' routine, text in code space}
  62. msglen:=scan(32000,26,mem[cseg:ofs(msgs)]); {initialize,search for ^Z}
  63. repeat
  64. write('Line number?....');readln(n);
  65. writeln('Line #',n,'=<',msg(n),'>');
  66. until n<0;
  67.  
  68. {test for 'dmsg', text not in code space}
  69. assign(f,'extext.pas');
  70. reset(f);
  71. n:=filesize(f); {number of 128 byte blocks}
  72. getmem(p,128*n); {second approach, read text into variable}
  73. blockread(f,p^,n); {read in entire text file}
  74. msglen:=scan(128*n,26,p^); {initialize, search for ^Z}
  75. repeat
  76. write('Line number?....');readln(n);
  77. writeln('Line #',n,'=<',dmsg(n),'>');
  78. until n<0;
  79. end.
  80.