home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 276.img / FORUM21S.ZIP / LINEEDIT.PAS < prev    next >
Pascal/Delphi Source File  |  1988-02-13  |  9KB  |  387 lines

  1. {$R-,S-,I-,D-,T-,F-,V-,B-,N-,L+ }
  2. {$M 65500,0,0 }
  3.  
  4. unit lineedit;
  5.  
  6. interface
  7.  
  8. uses gentypes,configrt,gensubs,subs1,subs2;
  9.  
  10. function linereedit (var m:message; gettitle:boolean):boolean;
  11.  
  12. implementation
  13.  
  14. function linereedit (var m:message; gettitle:boolean):boolean;
  15. var done,editmode:boolean;
  16.     curline,r1,r2,cols:integer;
  17.  
  18.   procedure init;
  19.   begin
  20.     if eightycols in urec.config
  21.       then cols:=79
  22.       else cols:=39;
  23.     linereedit:=false;
  24.     done:=false;
  25.     editmode:=false;
  26.     curline:=1;
  27.     if m.numlines=0
  28.       then writeln (^B^M'Enter text, ',maxmessagesize,' lines at most')
  29.       else begin
  30.         writeln (^B^M'Re-editing message.');
  31.         writeln ('Current size: '^S,m.numlines);
  32.         writeln ('Note: Inserting before line 1.');
  33.         writeln ('/A will abort changes.'^M)
  34.       end;
  35.     writeln ('Enter /? for help on / commands'^B^M)
  36.   end;
  37.  
  38.   procedure setbreak;
  39.   begin
  40.     clearbreak;
  41.     nobreak:=true;
  42.     dontstop:=true;
  43.     wordwrap:=true;
  44.     linecount:=0
  45.   end;
  46.  
  47.   function msgisblank:boolean;
  48.   begin
  49.     if m.numlines>0 then msgisblank:=false else begin
  50.       writestr ('Sorry, message blank!');
  51.       msgisblank:=true
  52.     end
  53.   end;
  54.  
  55.   function getrange:boolean;
  56.   begin
  57.     parserange (m.numlines,r1,r2);
  58.     getrange:=r1<>0
  59.   end;
  60.  
  61.   function getlinenum (txt:mstr):boolean;
  62.   begin
  63.     writestr ('Line number to '+txt+':');
  64.     r1:=valu(input);
  65.     r2:=r1;
  66.     if (r1>=1) and (r1<=m.numlines)
  67.       then getlinenum:=true
  68.       else begin
  69.         getlinenum:=false;
  70.         writeln (^R'Invalid line!')
  71.       end
  72.   end;
  73.  
  74.   procedure inslines (r1,r2:integer);
  75.   var n,cnt:integer;
  76.   begin
  77.     n:=r2-r1+1;
  78.     m.numlines:=m.numlines+n;
  79.     for cnt:=m.numlines downto r2+1 do m.text[cnt]:=m.text[cnt-n]
  80.   end;
  81.  
  82.   procedure dellines (r1,r2:integer);
  83.   var n,cnt:integer;
  84.   begin
  85.     n:=r2-r1+1;
  86.     m.numlines:=m.numlines-n;
  87.     for cnt:=r1 to m.numlines do m.text[cnt]:=m.text[cnt+n]
  88.   end;
  89.  
  90.   procedure insertline;
  91.   var cnt:integer;
  92.   begin
  93.     if m.numlines=maxmessagesize then exit;
  94.     inslines (curline,curline);
  95.     m.text[curline]:=input;
  96.     curline:=curline+1
  97.   end;
  98.  
  99.   function iseditcommand:boolean;
  100.   begin
  101.     iseditcommand:=(input[1]='/') and (length(input)>0)
  102.   end;
  103.  
  104.   function userissure:boolean;
  105.   begin
  106.     writestr ('Warning!  Message will be erased!');
  107.     writestr ('Confirm [y/n]:');
  108.     userissure:=yes
  109.   end;
  110.  
  111.   procedure topofmsg;
  112.   begin
  113.     writeln (^R'--Top of msg--')
  114.   end;
  115.  
  116.   procedure abortmes;
  117.   begin
  118.     done:=userissure
  119.   end;
  120.  
  121.   procedure backline;
  122.   begin
  123.     if m.numlines<1 then begin
  124.       topofmsg;
  125.       exit
  126.     end;
  127.     writeln (^R'<Correct previous line>');
  128.     curline:=curline-1;
  129.     dellines (curline,curline)
  130.   end;
  131.  
  132.   procedure continuemes;
  133.   begin
  134.     writeln (^B^R^M'Continue your message...');
  135.     curline:=m.numlines+1;
  136.     editmode:=false
  137.   end;
  138.  
  139.   procedure deletelines;
  140.   begin
  141.     if not getrange then exit;
  142.     if (r1=1) and (r2=m.numlines) then begin
  143.       writestr ('Delete whole message? *');
  144.       if not yes then exit
  145.     end;
  146.     dellines (r1,r2)
  147.   end;
  148.  
  149.   procedure seteditmode;
  150.   begin
  151.     if editmode
  152.       then writestr ('You are already in edit mode!')
  153.       else editmode:=true
  154.   end;
  155.  
  156.   procedure fixline;
  157.   var tmp:lstr;
  158.   begin
  159.     if not getlinenum ('fix') then exit;
  160.     setbreak;
  161.     writeln ('Line currently reads:');
  162.     writeln (m.text[r1],^M);
  163.     wordwrap:=false;
  164.     buflen:=cols;
  165.     beginwithspacesok:=true;
  166.     writestr ('Enter new line:'^M'*');
  167.     if length(input)<>0 then m.text[r1]:=input;
  168.     continuemes
  169.   end;
  170.  
  171.   procedure insertlines;
  172.   begin
  173.     if not getlinenum ('insert before') then continuemes;
  174.     curline:=r1
  175.   end;
  176.  
  177.   procedure listmes;
  178.   var cnt,r1,r2:integer;
  179.       linenum:boolean;
  180.   begin
  181.     if msgisblank then exit;
  182.     parserange (m.numlines,r1,r2);
  183.     if r1=0 then exit;
  184.     writestr ('Line numbers? *');
  185.     linenum:=yes;
  186.     write (^R);
  187.     for cnt:=r1 to r2 do begin
  188.       if linenum then writeln (cnt,':');
  189.       writeln (m.text[cnt]);
  190.       if break then exit
  191.     end
  192.   end;
  193.  
  194.   procedure centerline;
  195.   var spaces:lstr;
  196.   begin
  197.     fillchar (spaces[1],80,32);
  198.     if editmode then begin
  199.       setbreak;
  200.       buflen:=cols;
  201.       wordwrap:=false;
  202.       writestr ('Enter line to center:'^M'*')
  203.     end else delete(input,1,1);
  204.     while (length(input)>0) and (input[1]=' ') do delete (input,1,1);
  205.     if length(input)=0 then exit;
  206.     spaces[0]:=chr((cols-length(input)) div 2);
  207.     input:=spaces+input;
  208.     insertline
  209.   end;
  210.  
  211.   procedure clearmes;
  212.   begin
  213.     if userissure then begin
  214.       writestr ('Starting message over...');
  215.       m.numlines:=0;
  216.       curline:=1
  217.     end
  218.   end;
  219.  
  220.   procedure searchandreplace;
  221.   var sfor,repw:lstr;
  222.       l:^lstr;
  223.       ask:boolean;
  224.       cl,cp,sl,max:integer;
  225.  
  226.     procedure replace;
  227.     var new,old:lstr;
  228.     begin
  229.       old:=copy (l^,cp,sl);
  230.       new:=repw;
  231.       if length(new)>0 then
  232.         if old[1] in ['A'..'Z']
  233.           then new[1]:=upcase(new[1]);
  234.       delete (l^,cp,sl);
  235.       while length(l^)+length(new)>cols do l^[0]:=pred(l^[0]);
  236.       insert (new,l^,cp);
  237.       cp:=cp+length(new)-1
  238.     end;
  239.  
  240.     procedure maybereplace;
  241.     var cnt:integer;
  242.     begin
  243.       if ask then begin
  244.         writeln (^B^M,cl,':'^M,l^);
  245.         for cnt:=1 to cp-1 do write (' ');
  246.         for cnt:=1 to sl do write ('^');
  247.         writeln;
  248.         writestr ('Replace [Y/N]:');
  249.         if not yes then exit
  250.       end;
  251.       replace
  252.     end;
  253.  
  254.   begin
  255.     if msgisblank then exit;
  256.     writestr ('Search for:');
  257.     if length(input)=0 then exit;
  258.     sfor:=upstring(input);
  259.     sl:=length(input);
  260.     writestr ('Replace with:');
  261.     repw:=input;
  262.     writestr ('Ask each time? *');
  263.     ask:=yes;
  264.     max:=length(l^)-sl+1;
  265.     for cl:=1 to m.numlines do begin
  266.       l:=addr(m.text[cl]);
  267.       max:=length(l^)-sl+1;
  268.       cp:=0;
  269.       while cp<max do begin
  270.         cp:=cp+1;
  271.         if match(sfor,copy(l^,cp,sl)) then maybereplace;
  272.         max:=length(l^)-sl+1
  273.       end
  274.     end;
  275.     writeln (^B^M'Search and replace complete')
  276.   end;
  277.  
  278.   procedure savemes;
  279.   begin
  280.     done:=true;
  281.     if m.numlines=0
  282.       then writestr ('Message blank!')
  283.       else begin
  284.         writestr ('Saving..');
  285.         linereedit:=true
  286.       end
  287.   end;
  288.  
  289.   procedure retitle;
  290.   begin
  291.     if gettitle then begin
  292.       writeln (^R'Title is: '^S+m.title);
  293.       writestr ('Enter new title: &');
  294.       if length(input)>0 then m.title:=input
  295.     end else writestr ('This message can''t have a title.')
  296.   end;
  297.  
  298.   procedure edithelp;
  299.   begin
  300.     printfile (textfiledir+'Edithelp.');
  301.     editmode:=true
  302.   end;
  303.  
  304.   procedure editcommand;
  305.   var k:char;
  306.   begin
  307.     while iseditcommand and (length(input)>0) do delete (input,1,1);
  308.     if length(input)=0 then begin
  309.       editmode:=true;
  310.       exit
  311.     end;
  312.     k:=upcase(input[1]);
  313.     case k of
  314.       'A':abortmes;
  315.       'B':backline;
  316.       'C':continuemes;
  317.       'D':deletelines;
  318.       'E':seteditmode;
  319.       'F':fixline;
  320.       'I':insertlines;
  321.       'L':listmes;
  322.       'M':centerline;
  323.       'N':clearmes;
  324.       'R':searchandreplace;
  325.       'S':savemes;
  326.       'T':retitle
  327.       else edithelp
  328.     end
  329.   end;
  330.  
  331.   procedure editcommands;
  332.   begin
  333.     editcommand;
  334.     while editmode and not done do begin
  335.       writestr (^M'Edit command [?=help]:');
  336.       if hungupon then done:=true else editcommand
  337.     end
  338.   end;
  339.  
  340.   procedure getline;
  341.   begin
  342.     setbreak;
  343.     input:='/E';
  344.     if m.numlines=maxmessagesize then begin
  345.       writeln ('Sorry, message is full!');
  346.       exit
  347.     end;
  348.     if hungupon then exit;
  349.     if m.numlines=maxmessagesize-3 then writeln ('3 lines left!');
  350.     if curline>m.numlines+1 then curline:=m.numlines+1;
  351.     lastprompt:='Continue your message...'^M;
  352.     buflen:=cols;
  353.     getstr;
  354.     if input=^H
  355.       then if curline>1
  356.         then
  357.           begin
  358.             writeln ('--Back--');
  359.             curline:=curline-1;
  360.             chainstr:=m.text[curline];
  361.             dellines (curline,curline)
  362.           end
  363.         else topofmsg
  364.       else if not iseditcommand then insertline
  365.   end;
  366.  
  367.   procedure getlines;
  368.   begin
  369.     repeat
  370.       getline
  371.     until hungupon or iseditcommand or (m.numlines=maxmessagesize);
  372.     if not iseditcommand then input:='/'
  373.   end;
  374.  
  375. begin
  376.   init;
  377.   repeat
  378.     getlines;
  379.     editcommands
  380.   until done;
  381.   writeln (^B^M^M)
  382. end;
  383.  
  384. begin
  385. end.
  386.  
  387.