home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / SYSPC22.ZIP / LINEEDIT.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1987-12-13  |  8.3 KB  |  369 lines

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