home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / FORUM25C.ZIP / TEXTRET.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1988-12-27  |  5.3 KB  |  247 lines

  1. {$R-,S-,I-,D-,V-,B-,N-,L- }
  2. {$O+}
  3.  
  4. unit textret;
  5.  
  6.  
  7. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  8.  
  9. interface
  10.  
  11. uses gentypes,gensubs,subs1;
  12.  
  13. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  14.  
  15.  
  16. Procedure reloadtext (sector:integer; VAR q:message);
  17. Procedure deletetext (sector:integer);
  18. Function maketext (VAR q:message):integer;
  19. Function copytext (sector:integer):integer;
  20. Procedure printtext (sector:integer);
  21.  
  22.  
  23. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  24.  
  25. implementation
  26.  
  27. {/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\}
  28.  
  29.  
  30. Procedure reloadtext (sector:integer; VAR q:message);
  31. VAR k:char;
  32.     sectorptr,tmp,n:integer;
  33.     buff:buffer;
  34.     x:boolean;
  35.  
  36.   Procedure setbam (sector,val:integer);
  37.   begin
  38.     seek (mapfile,sector);
  39.     write (mapfile,val)
  40.   end;
  41.  
  42.   Procedure chk;
  43.   begin
  44.     iocode:=ioresult;
  45.     if iocode<>0 then writeln (usr,'(Error ',iocode,' reading message)')
  46.   end;
  47.  
  48. begin
  49.   sectorptr:=32767;
  50.   n:=1;
  51.   q.text[1]:='';
  52.   repeat
  53.     if sectorptr>sectorsize then begin
  54.       if sector<0 then exit;
  55.       seek (tfile,sector); chk;
  56.       read (tfile,buff); chk;
  57.       seek (mapfile,sector); chk;
  58.       read (mapfile,tmp); chk;
  59.       if tmp=-2 then begin
  60.         tmp:=-1;
  61.         seek (mapfile,sector); chk;
  62.         write (mapfile,tmp); chk;
  63.       end;
  64.       sector:=tmp;
  65.       sectorptr:=1
  66.     end;
  67.     k:=buff[sectorptr];
  68.     case k of
  69.       #0,#10:;
  70.       #13:if n>=maxmessagesize
  71.             then k:=#0
  72.             else begin
  73.               n:=n+1;
  74.               q.text[n]:=''
  75.             end
  76.       else q.text[n]:=q.text[n]+k
  77.     end;
  78.     sectorptr:=sectorptr+1
  79.   until k=#0;
  80.   q.numlines:=n;
  81.   chk
  82. end;
  83.  
  84. Procedure deletetext (sector:integer);
  85. VAR next:integer;
  86.  
  87.   Procedure setbam (sector,val:integer);
  88.   begin
  89.     seek (mapfile,sector);
  90.     write (mapfile,val)
  91.   end;
  92.  
  93. begin
  94.   while sector>=0 do begin
  95.     seek (mapfile,sector);
  96.     read (mapfile,next);
  97.     setbam (sector,-2);
  98.     sector:=next
  99.   end
  100. end;
  101.  
  102. Function maketext (VAR q:message):integer;
  103. VAR line,pos,sector,prev:integer;
  104.     bufptr:integer;
  105.     curline:anystr;
  106.     k:char;
  107.     buff:buffer;
  108.  
  109.   Procedure setbam (sector,val:integer);
  110.   begin
  111.     seek (mapfile,sector);
  112.     write (mapfile,val)
  113.   end;
  114.  
  115.   Function nextblank (first:integer; linkit:boolean):integer;
  116.   VAR cnt,i,blank:integer;
  117.   begin
  118.     nextblank:=-1;
  119.     if first<-1 then first:=-1;
  120.     if first>=numsectors then exit;
  121.     seek (mapfile,first+1);
  122.     for cnt:=first+1 to numsectors do begin
  123.       read (mapfile,i);
  124.       if i=-2 then begin
  125.         blank:=cnt;
  126.         if (first>=0) and linkit then setbam (first,blank);
  127.         nextblank:=blank;
  128.         exit
  129.       end
  130.     end
  131.   end;
  132.  
  133.   Function firstblank:integer;
  134.   begin
  135.     firstblank:=nextblank (-1,false)
  136.   end;
  137.  
  138.   Procedure ensuretfilesize (sector:integer);
  139.   VAR cnt:integer;
  140.       buff:buffer;
  141.   begin
  142.     if sector<filesize(tfile) then exit;
  143.     if (sector<0) or (sector>numsectors) then exit;
  144.     fillchar (buff,sizeof(buff),'*');
  145.     seek (tfile,filesize(tfile));
  146.     for cnt:=filesize(tfile) to sector do write (tfile,buff);
  147.     fillchar (buff,sizeof(buff),'!')
  148.   end;
  149.  
  150.   Procedure writesector (sector:integer; VAR q:buffer);
  151.   VAR n:integer;
  152.   begin
  153.     if (sector<0) or (sector>numsectors) then exit;
  154.     seek (mapfile,sector);
  155.     read (mapfile,n);
  156.     if n<>-2 then begin
  157.       error ('Overwrite error sector=%1!','',strr(sector));
  158.       exit
  159.     end;
  160.     ensuretfilesize (sector);
  161.     seek (tfile,sector);
  162.     write (tfile,q)
  163.   end;
  164.  
  165.   Procedure flushbuf;
  166.   begin
  167.     writesector (sector,buff);
  168.     prev:=sector;
  169.     sector:=nextblank(prev,true);
  170.     bufptr:=1;
  171.   end;
  172.  
  173.   Procedure outofroom;
  174.   begin
  175.     writeln (^B'Sorry, out of room!');
  176.     maketext:=-1
  177.   end;
  178.  
  179. begin
  180.   if q.numlines=0 then begin
  181.     writeln (^B'Message blank!');
  182.     maketext:=-1;
  183.     exit
  184.   end;
  185.   if firstfree>=0 then begin
  186.     sector:=firstfree;
  187.     seek (mapfile,sector);
  188.     read (mapfile,prev)
  189.   end else prev:=-1;
  190.   if prev<>-2 then begin
  191.     firstfree:=firstblank;
  192.     sector:=firstfree
  193.   end;
  194.   maketext:=sector;
  195.   if sector=-1 then begin
  196.     outofroom;
  197.     exit
  198.   end;
  199.   bufptr:=1;
  200.   for line:=1 to q.numlines do begin
  201.     curline:=q.text[line]+^M;
  202.     if line=q.numlines then curline:=curline+chr(0);
  203.     for pos:=1 to length(curline) do begin
  204.       k:=curline[pos];
  205.       buff[bufptr]:=k;
  206.       bufptr:=bufptr+1;
  207.       if bufptr>sectorsize then begin
  208.         flushbuf;
  209.         if sector=-1 then begin
  210.           outofroom;
  211.           exit
  212.         end
  213.       end
  214.     end
  215.   end;
  216.   if bufptr>1 then flushbuf;
  217.   setbam (prev,-1);
  218.   firstfree:=nextblank(firstfree,false);
  219.   if firstfree=-1 then firstfree:=firstblank
  220. end;
  221.  
  222. Function copytext (sector:integer):integer;
  223. VAR me:message;
  224. begin
  225.   reloadtext (sector,me);
  226.   copytext:=maketext (me)
  227. end;
  228.  
  229. Procedure printtext (sector:integer);
  230. VAR q:message;
  231.     x,b:boolean;
  232.     n:integer;
  233. begin
  234.   reloadtext (sector,q);
  235.   writeln (^B);
  236.   n:=1;
  237.   repeat
  238.     writeln (q.text[n]);
  239.     n:=n+1
  240.   until break or (n>q.numlines) or hungupon;
  241.   x:=xpressed; b:=break;
  242.   writeln (^B^M);
  243.   xpressed:=x; break:=b
  244. end;
  245.  
  246. end.
  247.