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

  1. {$R-,S-,I-,D-,F+,V-,B-,N-,L+ }
  2. {$M 65500,0,0 }
  3.  
  4. unit textret;
  5.  
  6. interface
  7.  
  8. uses crt,gentypes,configrt,gensubs,subs1,statret,modem;
  9.  
  10. procedure reloadtext (sector:integer; var q:message);
  11. procedure deletetext (sector:integer);
  12. function maketext (var q:message):integer;
  13. function copytext (sector:integer):integer;
  14. procedure printtext (sector:integer);
  15.  
  16. implementation
  17.  
  18. procedure reloadtext (sector:integer; var q:message);
  19. var k:char;
  20.     sectorptr,tmp,n:integer;
  21.     buff:buffer;
  22.     x:boolean;
  23.  
  24.   procedure setbam (sector,val:integer);
  25.   begin
  26.     seek (mapfile,sector);
  27.     write (mapfile,val)
  28.   end;
  29.  
  30.   procedure chk;
  31.   begin
  32.     iocode:=ioresult;
  33.     if iocode<>0 then writeln (usr,'(Error ',iocode,' reading message)')
  34.   end;
  35.  
  36. begin
  37.   sectorptr:=32767;
  38.   n:=1;
  39.   q.text[1]:='';
  40.   repeat
  41.     if sectorptr>sectorsize then begin
  42.       if sector<0 then exit;
  43.       seek (tfile,sector); chk;
  44.       read (tfile,buff); chk;
  45.       seek (mapfile,sector); chk;
  46.       read (mapfile,tmp); chk;
  47.       if tmp=-2 then begin
  48.         tmp:=-1;
  49.         seek (mapfile,sector); chk;
  50.         write (mapfile,tmp); chk;
  51.       end;
  52.       sector:=tmp;
  53.       sectorptr:=1
  54.     end;
  55.     k:=buff[sectorptr];
  56.     case k of
  57.       #0,#10:;
  58.       #13:if n>=maxmessagesize
  59.             then k:=#0
  60.             else begin
  61.               n:=n+1;
  62.               q.text[n]:=''
  63.             end
  64.       else q.text[n]:=q.text[n]+k
  65.     end;
  66.     sectorptr:=sectorptr+1
  67.   until k=#0;
  68.   q.numlines:=n;
  69.   chk
  70. end;
  71.  
  72. procedure deletetext (sector:integer);
  73. var next:integer;
  74.  
  75.   procedure setbam (sector,val:integer);
  76.   begin
  77.     seek (mapfile,sector);
  78.     write (mapfile,val)
  79.   end;
  80.  
  81. begin
  82.   while sector>=0 do begin
  83.     seek (mapfile,sector);
  84.     read (mapfile,next);
  85.     setbam (sector,-2);
  86.     sector:=next
  87.   end
  88. end;
  89.  
  90. function maketext (var q:message):integer;
  91. var line,pos,sector,prev:integer;
  92.     bufptr:integer;
  93.     curline:anystr;
  94.     k:char;
  95.     buff:buffer;
  96.  
  97.   procedure setbam (sector,val:integer);
  98.   begin
  99.     seek (mapfile,sector);
  100.     write (mapfile,val)
  101.   end;
  102.  
  103.   function nextblank (first:integer; linkit:boolean):integer;
  104.   var cnt,i,blank:integer;
  105.   begin
  106.     nextblank:=-1;
  107.     if first<-1 then first:=-1;
  108.     if first>=numsectors then exit;
  109.     seek (mapfile,first+1);
  110.     for cnt:=first+1 to numsectors do begin
  111.       read (mapfile,i);
  112.       if i=-2 then begin
  113.         blank:=cnt;
  114.         if (first>=0) and linkit then setbam (first,blank);
  115.         nextblank:=blank;
  116.         exit
  117.       end
  118.     end
  119.   end;
  120.  
  121.   function firstblank:integer;
  122.   begin
  123.     firstblank:=nextblank (-1,false)
  124.   end;
  125.  
  126.   procedure ensuretfilesize (sector:integer);
  127.   var cnt:integer;
  128.       buff:buffer;
  129.   begin
  130.     if sector<filesize(tfile) then exit;
  131.     if (sector<0) or (sector>numsectors) then exit;
  132.     fillchar (buff,sizeof(buff),'*');
  133.     seek (tfile,filesize(tfile));
  134.     for cnt:=filesize(tfile) to sector do write (tfile,buff);
  135.     fillchar (buff,sizeof(buff),'!')
  136.   end;
  137.  
  138.   procedure writesector (sector:integer; var q:buffer);
  139.   var n:integer;
  140.   begin
  141.     if (sector<0) or (sector>numsectors) then exit;
  142.     seek (mapfile,sector);
  143.     read (mapfile,n);
  144.     if n<>-2 then begin
  145.       error ('Overwrite error sector=%1!','',strr(sector));
  146.       exit
  147.     end;
  148.     ensuretfilesize (sector);
  149.     seek (tfile,sector);
  150.     write (tfile,q)
  151.   end;
  152.  
  153.   procedure flushbuf;
  154.   begin
  155.     writesector (sector,buff);
  156.     prev:=sector;
  157.     sector:=nextblank(prev,true);
  158.     bufptr:=1;
  159.   end;
  160.  
  161.   procedure outofroom;
  162.   begin
  163.     writeln (^B'Sorry, out of room!');
  164.     maketext:=-1
  165.   end;
  166.  
  167. begin
  168.   if q.numlines=0 then begin
  169.     writeln (^B'Message blank!');
  170.     maketext:=-1;
  171.     exit
  172.   end;
  173.   if firstfree>=0 then begin
  174.     sector:=firstfree;
  175.     seek (mapfile,sector);
  176.     read (mapfile,prev)
  177.   end else prev:=-1;
  178.   if prev<>-2 then begin
  179.     firstfree:=firstblank;
  180.     sector:=firstfree
  181.   end;
  182.   maketext:=sector;
  183.   if sector=-1 then begin
  184.     outofroom;
  185.     exit
  186.   end;
  187.   bufptr:=1;
  188.   for line:=1 to q.numlines do begin
  189.     curline:=q.text[line]+^M;
  190.     if line=q.numlines then curline:=curline+chr(0);
  191.     for pos:=1 to length(curline) do begin
  192.       k:=curline[pos];
  193.       buff[bufptr]:=k;
  194.       bufptr:=bufptr+1;
  195.       if bufptr>sectorsize then begin
  196.         flushbuf;
  197.         if sector=-1 then begin
  198.           outofroom;
  199.           exit
  200.         end
  201.       end
  202.     end
  203.   end;
  204.   if bufptr>1 then flushbuf;
  205.   setbam (prev,-1);
  206.   firstfree:=nextblank(firstfree,false);
  207.   if firstfree=-1 then firstfree:=firstblank
  208. end;
  209.  
  210. function copytext (sector:integer):integer;
  211. var me:message;
  212. begin
  213.   reloadtext (sector,me);
  214.   copytext:=maketext (me)
  215. end;
  216.  
  217. function charhit:boolean;
  218. var k:char;
  219. begin
  220.   if modeminlock then while numchars>0 do k:=getchar;
  221.   if hungupon or keyhit
  222.     then charhit:=true
  223.     else if online
  224.       then charhit:=(not modeminlock) and (numchars>0)
  225.       else charhit:=false
  226. end;
  227.  
  228. procedure printtext (sector:integer);
  229. var q:message;
  230.     x,bub,done:boolean;
  231.     n,m,t,w,b,y,mm,i,apexiscool,e:integer;
  232.     p:byte;
  233.     s,a,cornerstone,sunbane:string;
  234.     cs,css,keithmillerisafag:char;
  235.     kay,thegog:char;
  236. begin
  237.   reloadtext (sector,q);
  238.   writeln (^B);
  239.   n:=1;
  240.   repeat
  241.    mm:=0;
  242.    repeat
  243.     if length(q.text[n])>0 then begin
  244.     p:=0;
  245.     mm:=mm+1;
  246.     s:=copy(q.text[n],mm,1);
  247.     if s='|' then p:=mm
  248.      else p:=0;
  249.     if p>0 then begin
  250.      cornerstone:=copy(q.text[n],p+1,1);
  251.      sunbane:=copy(q.text[n],p+2,1);
  252.      a:=(upcase(cornerstone[1]))+(upcase(sunbane[1]));
  253.      if
  254.       (a='00') or (a='01') or (a='02') or (a='03') or (a='04') or (a='05') or
  255.       (a='06') or (a='07') or (a='08') or (a='09') or (a='10') or (a='11') or
  256.       (a='12') or (a='13') or (a='14') or (a='15') or (a='16') or (a='17') or
  257.       (a='18') or (a='19') or (a='20') or (a='21') or (a='22') or (a='23') or
  258.       (a='KE') or (a='UN') or (a='CL') or (a='TI') or (a='DA'){ or (a='B0') or
  259.       (a='B1') or (a='B2') or (a='B3') or (a='B4') or (a='B5') or (a='B6') or
  260.       (a='B7')} or ((a[1]='P') and (valu(a[2])>0))
  261.       then begin
  262.       if
  263.       (a='00') or (a='01') or (a='02') or (a='03') or (a='04') or (a='05') or
  264.       (a='06') or (a='07') or (a='08') or (a='09') or (a='10') or (a='11') or
  265.       (a='12') or (a='13') or (a='14') or (a='15') or (a='16') or (a='17') or
  266.       (a='18') or (a='19') or (a='20') or (a='21') or (a='22') or (a='23') then
  267.      begin
  268.       delete (q.text[n],p+1,2);
  269.       b:=valu(a);
  270.       case b of
  271.        16:case curattrib of
  272.            0..15:b:=curattrib;
  273.            16..31:b:=curattrib-16;
  274.            32..47:b:=curattrib-32;
  275.            48..63:b:=curattrib-48;
  276.            64..79:b:=curattrib-64;
  277.            80..95:b:=curattrib-80;
  278.            96..111:b:=curattrib-96;
  279.            112..127:b:=curattrib-111;
  280.           end;
  281.        17:case curattrib of
  282.            0..15:b:=curattrib+16;
  283.            16..31:b:=curattrib;
  284.            32..47:b:=curattrib-16;
  285.            48..63:b:=curattrib-32;
  286.            64..79:b:=curattrib-48;
  287.            80..95:b:=curattrib-64;
  288.            96..111:b:=curattrib-80;
  289.            112..127:b:=curattrib-96;
  290.           end;
  291.        18:case curattrib of
  292.            0..15:b:=curattrib+32;
  293.            16..31:b:=curattrib+16;
  294.            32..47:b:=curattrib;
  295.            48..63:b:=curattrib-16;
  296.            64..79:b:=curattrib-32;
  297.            80..95:b:=curattrib-48;
  298.            96..111:b:=curattrib-64;
  299.            112..127:b:=curattrib-80;
  300.           end;
  301.        19:case curattrib of
  302.            0..15:b:=curattrib+48;
  303.            16..31:b:=curattrib+32;
  304.            32..47:b:=curattrib+16;
  305.            48..63:b:=curattrib;
  306.            64..79:b:=curattrib-16;
  307.            80..95:b:=curattrib-32;
  308.            96..111:b:=curattrib-48;
  309.            112..127:b:=curattrib-64;
  310.           end;
  311.        20:case curattrib of
  312.            0..15:b:=curattrib+64;
  313.            16..31:b:=curattrib+48;
  314.            32..47:b:=curattrib+32;
  315.            48..63:b:=curattrib+16;
  316.            64..79:b:=curattrib;
  317.            80..95:b:=curattrib-16;
  318.            96..111:b:=curattrib-32;
  319.            112..127:b:=curattrib-48;
  320.           end;
  321.        21:case curattrib of
  322.            0..15:b:=curattrib+80;
  323.            16..31:b:=curattrib+64;
  324.            32..47:b:=curattrib+48;
  325.            48..63:b:=curattrib+32;
  326.            64..79:b:=curattrib+16;
  327.            80..95:b:=curattrib;
  328.            96..111:b:=curattrib-16;
  329.            112..127:b:=curattrib-32;
  330.           end;
  331.        22:case curattrib of
  332.            0..15:b:=curattrib+96;
  333.            16..31:b:=curattrib+80;
  334.            32..47:b:=curattrib+64;
  335.            48..63:b:=curattrib+48;
  336.            64..79:b:=curattrib+32;
  337.            80..95:b:=curattrib+16;
  338.            96..111:b:=curattrib;
  339.            112..127:b:=curattrib-16;
  340.           end;
  341.        23:case curattrib of
  342.            0..15:b:=curattrib+111;
  343.            16..31:b:=curattrib+96;
  344.            32..47:b:=curattrib+80;
  345.            48..63:b:=curattrib+64;
  346.            64..79:b:=curattrib+48;
  347.            80..95:b:=curattrib+32;
  348.            96..111:b:=curattrib+16;
  349.            112..127:b:=curattrib;
  350.           end;
  351.         end;
  352.       if b=0 then begin
  353.        ansicolor (0);
  354.       end else
  355.       ansicolor (b);
  356.      end;
  357.      end;
  358.      if a='KE' then
  359.      begin
  360.       delete (q.text[n],p+1,1);
  361.       delete (q.text[n],p+1,1);
  362.       write ('*');
  363.       done:=false;
  364.       repeat
  365.        {BETA}done:=true;{BETA}
  366.       until done;
  367.      end;
  368.      if a='UN' then
  369.      begin
  370.       delete (q.text[n],p+1,1);
  371.       delete (q.text[n],p+1,1);
  372.       write (urec.handle);
  373.      end;
  374.      if a='TI' then
  375.      begin
  376.       delete (q.text[n],p+1,1);
  377.       delete (q.text[n],p+1,1);
  378.       write (timestr(now));
  379.      end;
  380.      if a='DA' then
  381.      begin
  382.       delete (q.text[n],p+1,1);
  383.       delete (q.text[n],p+1,1);
  384.       write (datestr(now));
  385.      end;
  386.      if a='CL' then
  387.      begin
  388.       delete (q.text[n],p+1,1);
  389.       delete (q.text[n],p+1,1);
  390.       if (ansigraphics in urec.config) then write (#27+'[2J') else
  391.        write (^L);
  392.      end;
  393.      if ((a[1]='P') and (valu(a[2])>0)) then
  394.      begin
  395.       apexiscool:=valu(a[2]);
  396.       delay (apexiscool*1000);
  397.      end;
  398.    end else write (s);
  399.   end;
  400.   until mm=length(q.text[n]);
  401.    writeln;
  402.    n:=n+1;
  403.   until break or (n>q.numlines) or hungupon;
  404.   x:=xpressed; bub:=break;
  405.   writeln (^B^M);
  406.   xpressed:=x; break:=bub;
  407.   ansicolor (urec.regularcolor)
  408. end;
  409.  
  410. begin
  411. end.
  412.