home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol076 / ed4.c < prev    next >
Encoding:
C/C++ Source or Header  |  1984-04-29  |  7.6 KB  |  544 lines

  1. /* ED4.C */
  2.  
  3. #include ed0.c
  4. #include ed1.ccc
  5. char    editbuf[MAXLEN];
  6. int    editp;
  7. int    editpmax;
  8. int    edcflag;
  9. edabt()
  10. {
  11.     edgetln();
  12.     edredraw();
  13.     edbegin();
  14.     edcflag=NO;
  15. }
  16. edbegin()
  17. {
  18.     editp=0;
  19.     outxy(0,outyget());
  20. }
  21. ederase()    /* new: erase from cursor to end of line */
  22. {
  23.     if (editp==editpmax) {
  24.         return;
  25.     }
  26.     edcflag=YES;
  27.     editpmax=editp;
  28.     edredraw();
  29. }
  30. edhome()    /* new: home cursor.  subsequent calls alternate */
  31. {        /* cursor to top and bottom of screen */
  32. int ypos;
  33.     if (edrepl()!=OK){
  34.         return;
  35.     }
  36.     if ((ypos=outyget())<SCRNL3) {
  37.         while((ypos<SCRNL1)&&(!bufnrbot())){
  38.             if (bufdn()!=OK){
  39.                 return(ERR);
  40.             }
  41.             ypos++;
  42.         }
  43.     }
  44.     else {
  45.         while((ypos>1)&&(!bufattop())){
  46.             if (bufup()!=OK){
  47.                 return(ERR);
  48.             }
  49.             ypos--;
  50.         }
  51.     }
  52.     edgetln();
  53.     outxy(edxpos(),ypos);
  54. }
  55. edchng(c) char c;
  56. {
  57. char oldc;
  58. int k;
  59.     if (editp>=editpmax) {
  60.         edins(c);
  61.         return;
  62.     }
  63.     oldc=editbuf[editp];
  64.     editbuf[editp]=c;
  65.     fmtadj(editbuf,editp,editpmax);
  66.     k=fmtlen(editbuf,editpmax);
  67.     if (k>SCRNW1) {
  68.         editbuf[editp]=oldc;
  69.         fmtadj(editbuf,editp,editpmax);
  70.     }
  71.     else {
  72.         edcflag=YES;
  73.         editp++;
  74.         edredraw();
  75.     }
  76. }
  77. edldel()   /* deletes character before cursor */
  78. /* eddel() in original version: no change in code */
  79. {
  80. int k;
  81.     if(edxpos() < outxget()) {
  82.         outxy(outxget()-1, outyget());
  83.         return;
  84.     }
  85.     if (editp==0) {
  86.         return;
  87.     }
  88.     edcflag=YES;
  89.     k=editp;
  90.     while (k<editpmax) {
  91.         editbuf[k-1]=editbuf[k];
  92.         k++;
  93.     }
  94.     editp--;
  95.     editpmax--;
  96.     edredraw();
  97. }
  98. edcdel()   /* deletes character at cursor */
  99. {
  100. int k;
  101.     if(edxpos() < outxget()) {
  102.         outxy(outxget()-1, outyget());
  103.         return;
  104.     }
  105.     edcflag=YES;
  106.     if (editp == editpmax)    {
  107.         if (editp==0) {
  108.             return;
  109.         }
  110.         editp--;
  111.         editpmax--;
  112.         edredraw();
  113.         return;
  114.     }
  115.     k=editp;
  116.     while (k<(editpmax-1)) {
  117.         editbuf[k]=editbuf[k+1];
  118.         k++;
  119.     }
  120.     editpmax--;
  121.     edredraw();
  122. }
  123. eddn()
  124. {
  125. int oldx;
  126.     oldx=outxget();
  127.     if (edrepl()!=OK) {
  128.         return(ERR);
  129.     }
  130.     if (bufnrbot()) {
  131.         return(OK);
  132.     }
  133.     if (bufdn()!=OK) {
  134.         return(ERR);
  135.     }
  136.     edgetln();
  137.     editp=edscan(oldx);
  138.     if (edatbot()) {
  139.         edsup(bufln()-SCRNL2);
  140.         outxy(oldx,SCRNL1);
  141.     }
  142.     else {
  143.         outxy(oldx,outyget()+1);
  144.     }
  145.     return(OK);
  146. }
  147. edend()
  148. {
  149.     editp=editpmax;
  150.     outxy(edxpos(),outyget());
  151. }
  152. edgo(n, p) int n, p;
  153. {
  154.     if (edrepl()==ERR) {
  155.         return(ERR);
  156.     }
  157.     if (bufgo(n)==ERR) {
  158.         return(ERR);
  159.     }
  160.     if (bufatbot()) {
  161.         if (bufup()==ERR) {
  162.             return(ERR);
  163.         }
  164.     }
  165.     bufout(bufln(),1,SCRNL1);
  166.     edgetln();
  167.     editp=min(p,editpmax);
  168.     outxy(edxpos(),1);
  169.     return(OK);
  170. }
  171. edins(c) char c;
  172. {
  173. int k;
  174.     if (editpmax>=MAXLEN){
  175.         return;
  176.     }
  177.     if ((editp==editpmax) & (edxpos()<outxget())) {
  178.         k=outxget() - edxpos();
  179.         editpmax=editpmax+k;
  180.         while (k-- > 0) {
  181.             editbuf [editp++] = ' ';
  182.         }
  183.         editp=editpmax;
  184.     }
  185.     k=editpmax;
  186.     while (k>editp) {
  187.         editbuf[k]=editbuf[k-1];
  188.         k--;
  189.     }
  190.     editbuf[editp]=c;
  191.     editp++;
  192.     editpmax++;
  193.     fmtadj(editbuf,editp-1,editpmax);
  194.     k=fmtlen(editbuf,editpmax);
  195.     if (k>SCRNW1) {
  196.         edldel();
  197.     }
  198.     else {
  199.         edcflag=YES;
  200.         edredraw();
  201.     }
  202. }
  203. edjoin()
  204. {
  205. int k;
  206.     if (bufattop()) {
  207.         return;
  208.     }
  209.     if (edrepl()!=OK) {
  210.         return;
  211.     }
  212.     if (bufup()!=OK) {
  213.         return;
  214.     }
  215.     k = bufgetln(editbuf,MAXLEN);
  216.     if (bufdn()!=OK) {
  217.         return;
  218.     }
  219.     k=k+bufgetln(editbuf+k,MAXLEN-k);
  220.     if (k>SCRNW1) {
  221.         bufgetln(editbuf,MAXLEN);
  222.         return;
  223.     }
  224.     if (bufup()!=OK) {
  225.         return;
  226.     }
  227.     editpmax=k;
  228.     edcflag=YES;
  229.     if (edrepl()!=OK) {
  230.         return;
  231.     }
  232.     if (bufdn()!=OK) {
  233.         return;
  234.     }
  235.     if (bufdel()!=OK) {
  236.         return;
  237.     }
  238.     if (bufup()!=OK) {
  239.         return;
  240.     }
  241.     if (edattop()) {
  242.         edredraw();
  243.     }
  244.     else {
  245.         k=outyget()-1;
  246.         bufout(bufln(),k,SCRNL-k);
  247.         outxy(0,k);
  248.         edredraw();
  249.     }
  250. }
  251. edkill(c) char c;
  252. {
  253. int k,p;
  254.     if (editp==editpmax) {
  255.         return;
  256.     }
  257.     edcflag=YES;
  258.     k=1;
  259.     while ((editp+k)<editpmax) {
  260.         if (editbuf[editp+k]==c){
  261.             break;
  262.         }
  263.         else {
  264.             k++;
  265.         }
  266.     }
  267.     p=editp+k;
  268.     while (p<editpmax) {
  269.         editbuf[p-k]=editbuf[p];
  270.         p++;
  271.     }
  272.     editpmax=editpmax-k;
  273.     edredraw();
  274. }
  275. edleft()
  276. {
  277. int k;
  278.     if (edxpos()<outxget()){
  279.         outxy(max(0,outxget()-1),outyget());
  280.     }
  281.     else if (editp!=0){
  282.         editp--;
  283.         outxy(edxpos(),outyget());
  284.     }
  285. }
  286. ednewdn()
  287. {
  288. int k;
  289.     if (bufatbot()){
  290.         if (bufins(editbuf,editpmax)!=OK){
  291.             return;
  292.         }
  293.     }
  294.     else if (edrepl()!=OK){
  295.             return;
  296.     }
  297.     if (bufdn()!=OK){
  298.         return;
  299.     }
  300.     if (bufins(editbuf,0)!=OK){
  301.         return;
  302.     }
  303.     edgetln();
  304.     if (edatbot()){
  305.         edsup(bufln()-SCRNL2);
  306.         outxy(edxpos(),SCRNL1);
  307.     }
  308.     else {
  309.         k=outyget();
  310.         bufout(bufln(),k+1,SCRNL1-k);
  311.         outxy(edxpos(),k+1);
  312.     }
  313. }
  314. ednewup()
  315. {
  316. int k;
  317.     if (edrepl()!=OK) {
  318.         return;
  319.     }
  320.     if (bufins(editbuf,0)!=OK){
  321.         return;
  322.     }
  323.     edgetln();
  324.     if (edattop()){
  325.         edsdn(bufln());
  326.         outxy(edxpos(),1);
  327.     }
  328.     else {
  329.         k=outyget();
  330.         bufout(bufln(),k,SCRNL-k);
  331.         outxy(edxpos(),k);
  332.     }
  333. }
  334. edright()
  335. {
  336.     if (edxpos()<outxget()){
  337.         outxy(min(SCRNW1,outxget()+1),outyget());
  338.     }
  339.     else if (edxpos()>outxget()){
  340.         outxy(edxpos(),outyget());
  341.     }
  342.     else if (editp<editpmax){
  343.         editp++;
  344.         outxy(edxpos(),outyget());
  345.     }
  346.     else {
  347.         outxy(min(SCRNW1,outxget()+1),outyget());
  348.     }
  349. }
  350. edsplit()
  351. {
  352. int p,q;
  353. int k;
  354.     edcflag = NO;
  355.     if (bufatbot()){
  356.         if (bufins(editbuf,editp)!=OK){
  357.             return;
  358.         }
  359.     }
  360.     else {
  361.         if (bufrepl(editbuf,editp)!=OK){
  362.             return;
  363.         }
  364.     }
  365.     p=editpmax;
  366.     q=editp;
  367.     editpmax=editp;
  368.     editp=0;
  369.     edredraw();
  370.     editp=0;
  371.     while (q<p){
  372.         editbuf[editp++] = editbuf[q++];
  373.     }
  374.     editpmax=editp;
  375.     editp=0;
  376.     if (bufdn()!=OK){
  377.         return;
  378.     }
  379.     if (bufins(editbuf,editpmax)!=OK) {
  380.         return;
  381.     }
  382.     if (edatbot()) {
  383.         edsup(bufln()-SCRNL2);
  384.         outxy(1,SCRNL1);
  385.         edredraw();
  386.     }
  387.     else {
  388.         k=outyget();
  389.         bufout(bufln(),k+1,SCRNL1-k);
  390.         outxy(1,k+1);
  391.         edredraw();
  392.     }
  393. }
  394. edsrch(c) char c;
  395. {
  396.     if (editp==editpmax){
  397.         return;
  398.     }
  399.     editp++;
  400.     while (editp<editpmax) {
  401.         if (editbuf[editp]==c) {
  402.             break;
  403.         }
  404.         else {
  405.             editp++;
  406.         }
  407.     }
  408.     outxy(edxpos(),outyget());
  409. }
  410. edup()
  411. {
  412. int oldx;
  413.     oldx=outxget();
  414.     if (edrepl()!=OK) {
  415.         return(ERR);
  416.     }
  417.     if (bufattop()) {
  418.         return(OK);
  419.     }
  420.     if (bufup()!=OK){
  421.         return(ERR);
  422.     }
  423.     edgetln();
  424.     editp=edscan(oldx);
  425.     if (edattop()) {
  426.         edsdn(bufln());
  427.         outxy(oldx,1);
  428.     }
  429.     else {
  430.         outxy(oldx,outyget()-1);
  431.     }
  432.     return(OK);
  433. }
  434. edzap()
  435. {
  436. int k;
  437.     if (bufdel()!=OK){
  438.         return;
  439.     }
  440.     if (bufatbot()){
  441.         if (bufup()!=OK){
  442.             return;
  443.         }
  444.         edgetln();
  445.         if (edattop()) {
  446.             edredraw();
  447.         }
  448.         else {
  449.             outdelln();
  450.             outxy(0,outyget()-1);
  451.         }
  452.         return;
  453.     }
  454.     edgetln();
  455.     if (edattop()) {
  456.         edsup (bufln());
  457.         outxy(0,1);
  458.     }
  459.     else {
  460.         k=outyget();
  461.         bufout(bufln(),k,SCRNL-k);
  462.         outxy(0,k);
  463.     }
  464. }
  465. edatbot()
  466. {
  467.     return(outyget()==SCRNL1);
  468. }
  469. edattop()
  470. {
  471.     return(outyget()==1);
  472. }
  473. edredraw()
  474. {
  475.     fmtadj(editbuf,0,editpmax);
  476.     fmtsubs(editbuf,max(0,editp-1),editpmax);
  477.     outxy(edxpos(),outyget());
  478. }
  479. edxpos()
  480. {
  481.     return(min(SCRNW1,fmtlen(editbuf,editp)));
  482. }
  483. edgetln()
  484. {
  485. int k;
  486.     editp=0;
  487.     edcflag=NO;
  488.     k=bufgetln(editbuf,MAXLEN);
  489.     if (k>MAXLEN) {
  490.         error("line truncated");
  491.         editpmax=MAXLEN;
  492.     }
  493.     else {
  494.         editpmax=k;
  495.     }
  496.     fmtadj(editbuf,0,editpmax);
  497. }
  498. edrepl()
  499. {
  500.     if (edcflag==NO) {
  501.         return(OK);
  502.     }
  503.     edcflag=NO;
  504.     if (bufatbot()){
  505.         return(bufins(editbuf,editpmax));
  506.     }
  507.     else {
  508.         return(bufrepl(editbuf,editpmax));
  509.     }
  510. }
  511. edscan(xpos) int xpos;
  512. {
  513.     editp=0;
  514.     while (editp<editpmax){
  515.         if (fmtlen(editbuf,editp)<xpos){
  516.             editp++;
  517.         }
  518.         else {
  519.             break;
  520.         }
  521.     }
  522.     return(editp);
  523. }
  524. edsup(topline) int topline;
  525. {
  526.     if (outuphas()==YES){
  527.         outsup();
  528.         bufout(topline+SCRNL2,SCRNL1,1);
  529.     }
  530.     else {
  531.         bufout(topline,1,SCRNL1);
  532.     }
  533. }
  534. edsdn(topline) int topline;
  535. {
  536.     if (outdnhas()==YES) {
  537.         outsdn();
  538.         bufout(topline,1,1);
  539.     }
  540.     else {
  541.         bufout(topline,1,SCRNL1);
  542.     }
  543. }
  544.