home *** CD-ROM | disk | FTP | other *** search
/ Jason Aller Floppy Collection / 270.img / FORUM25C.ZIP / LINEEDIT.PAS < prev    next >
Pascal/Delphi Source File  |  1988-12-27  |  9KB  |  398 lines

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