home *** CD-ROM | disk | FTP | other *** search
/ The Devil's Doorknob BBS Capture (1996-2003) / devilsdoorknobbbscapture1996-2003.iso / UTIL / WWIVE / TEDIT.C < prev    next >
Text File  |  1991-12-24  |  8KB  |  358 lines

  1. /*****************************************************************************
  2.  
  3.                 WWIV Version 4
  4.                     Copyright (C) 1988-1991 by Wayne Bell
  5.  
  6. Distribution of the source code for WWIV, in any form, modified or unmodified,
  7. without PRIOR, WRITTEN APPROVAL by the author, is expressly prohibited.
  8. Distribution of compiled versions of WWIV is limited to copies compiled BY
  9. THE AUTHOR.  Distribution of any copies of WWIV not compiled by the author
  10. is expressly prohibited.
  11.  
  12.  
  13. *****************************************************************************/
  14.  
  15.  
  16.  
  17. #include "vars.h"
  18.  
  19. #pragma hdrstop
  20.  
  21. #include <dir.h>
  22.  
  23.  
  24.  
  25. #define utoa(s,v,r) ultoa((unsigned long)(s),v,r)
  26.  
  27.  
  28. struct line *read_file(char *fn, int *numlines)
  29. {
  30.   char b[1024],s[160],s1[160];
  31.   int f,i,n,nb,cb,sp,oor;
  32.   struct line *l,*l1,*topline;
  33.  
  34.   *numlines=-1;
  35.   oor=0;
  36.   topline=NULL;
  37.   sprintf(s,"%s%s",syscfg.gfilesdir,fn);
  38.   f=open(s,O_RDWR | O_BINARY);
  39.   if (f<0) {
  40.     nl();
  41.     pl("File not found.");
  42.     nl();
  43.     return(NULL);
  44.   }
  45.   nb=read(f,(void *)b,1024);
  46.   cb=0;
  47.   sp=0;
  48.   *numlines=0;
  49.   while ((nb) && (!oor)) {
  50.     if (b[cb]==13) {
  51.       s[sp]=0;
  52.       sp=0;
  53.       if (farcoreleft()<10240) {
  54.         nl();
  55.         pl("Ran out of memory.  Not all of file read.");
  56.         nl();
  57.         oor=1;
  58.       } else {
  59.         l1=(struct line *)farmalloc((long) sizeof(struct line));
  60.         strcpy((l1->text),s);
  61.         l1->next=NULL;
  62.         l1->prev=NULL;
  63.         if (topline==NULL) {
  64.           topline=l1;
  65.           l=l1;
  66.         } else {
  67.           l->next=l1;
  68.           l1->prev=l;
  69.           l=l1;
  70.         }
  71.         ++(*numlines);
  72.       }
  73.     } else {
  74.       if (b[cb]!=10)
  75.         s[sp++]=b[cb];
  76.     }
  77.     ++cb;
  78.     if (cb==nb) {
  79.       nb=read(f,(void *)b,1024);
  80.       cb=0;
  81.     }
  82.   }
  83.   return(topline);
  84. }
  85.  
  86. void kill_file(struct line *topline)
  87. {
  88.   struct line *l,*l1;
  89.  
  90.   l=topline;
  91.   while (l!=NULL) {
  92.     l1=l->next;
  93.     farfree((void *)l);
  94.     l=l1;
  95.   }
  96. }
  97.  
  98. void save_file(char *fn, struct line *topline)
  99. {
  100.   int i,f;
  101.   char s[170];
  102.   struct line *l,*l1;
  103.  
  104.   nl();
  105.   pl("3Saving...");
  106.   sprintf(s,"%s%s",syscfg.gfilesdir,fn);
  107.   f=open(s,O_RDWR | O_BINARY | O_CREAT | O_TRUNC, S_IREAD | S_IWRITE);
  108.   l=topline;
  109.   while (l!=NULL) {
  110.     strcpy(s,(l->text));
  111.     strcat(s,"\r\n");
  112.     write(f,(void *)s,strlen(s));
  113.     l=l->next;
  114.   }
  115.   s[0]=26;
  116.   write(f,(void *)s,1);
  117.   close(f);
  118. }
  119.  
  120. int printl(int n, struct line *l)
  121. {
  122.   int abort;
  123.   char s[160];
  124.  
  125.   abort=0;
  126.   if (n<1)
  127.     strcpy(s,"     [TOP]");
  128.   else
  129.     if (l==NULL)
  130.       strcpy(s,"     [END]");
  131.     else
  132.       sprintf(s,"%3d: %s",n,(l->text));
  133.   pla(s,&abort);
  134.   if (abort)
  135.     nl();
  136.   return(abort);
  137. }
  138.  
  139.  
  140. void tedit(char *fn)
  141. {
  142.   struct line *topline,*l,*l1,*c,*bottomline;
  143.   int numlines,curline,i,i1,i2,done,save,abort;
  144.   char s[160],s1[160],rollover[160];
  145.  
  146.   rollover[0]=0;
  147.   thisuser.screenchars -= 5;
  148.   topline=NULL;
  149.   numlines=0;
  150.   curline=0;
  151.   topline=read_file(fn,&numlines);
  152.   npr("%d lines read in.\r\n",numlines);
  153.   nl();
  154.   done=0;
  155.   save=0;
  156.   if (numlines>0) {
  157.     curline=1;
  158.     bottomline=topline;
  159.     while ((bottomline->next)!=NULL)
  160.       bottomline=bottomline->next;
  161.   } else
  162.     curline=0;
  163.   if (numlines<1)
  164.     numlines=0;
  165.   c=topline;
  166.   printl(curline,c);
  167.   do {
  168.     outstr(":");
  169.     input(s,10);
  170.     i=atoi(s);
  171.     if ((s[0]>='0') && (s[0]<='9')) {
  172.       i-=curline;
  173.       if (i==0)
  174.         strcpy(s,"~");
  175.       else
  176.         if (i>0) {
  177.           s[0]='+';
  178.           itoa(i,&(s[1]),10);
  179.         } else {
  180.           itoa(i,s,10);
  181.         }
  182.     }
  183.     if (s[0]==0)
  184.       strcpy(s,"+");
  185.     switch(s[0]) {
  186.       case '?':
  187.         printmenu(11);
  188.         break;
  189.       case 'Q':
  190.         done=1;
  191.         save=0;
  192.         break;
  193.       case 'S':
  194.         done=1;
  195.         save=1;
  196.         break;
  197.       case 'L':
  198.         i=curline;
  199.         l=c;
  200.         while ((l!=NULL) && (printl(i,l)==0)) {
  201.           l=l->next;
  202.           ++i;
  203.         }
  204.         break;
  205.       case 'T':
  206.         c=topline;
  207.         if (topline==NULL)
  208.           curline=0;
  209.         else
  210.           curline=1;
  211.         printl(curline,c);
  212.         break;
  213.       case 'B':
  214.         c=NULL;
  215.         curline=numlines+1;
  216.         printl(curline,c);
  217.         break;
  218.       case '-':
  219.         if (curline) {
  220.           i=atoi(&(s[1]));
  221.           if (i==0)
  222.             i=1;
  223.           for (i1=0; (i1<i) && (curline); i1++) {
  224.             if (c==NULL)
  225.               c=bottomline;
  226.             else
  227.               c=c->prev;
  228.             --curline;
  229.           }
  230.         }
  231.         printl(curline,c);
  232.         break;
  233.       case '+':
  234.         if (curline!=numlines+1) {
  235.           i=atoi(&(s[1]));
  236.           if (i==0)
  237.             i=1;
  238.           for (i1=0; (i1<i) && (curline!=numlines+1); i1++) {
  239.             if (c==NULL)
  240.               c=topline;
  241.             else
  242.               c=c->next;
  243.             ++curline;
  244.           }
  245.         }
  246.         printl(curline,c);
  247.         break;
  248.       case 'D':
  249.         i=atoi(&(s[1]));
  250.         if (i==0)
  251.           i=1;
  252.         for (i1=0; (i1<i) && (c!=NULL); i1++) {
  253.           if (c->prev==NULL)
  254.             if (c->next==NULL) {
  255.               topline=NULL;
  256.               bottomline=NULL;
  257.             } else
  258.               topline=c->next;
  259.           else
  260.             if (c->next==NULL)
  261.               bottomline=c->prev;
  262.           l=c;
  263.           if (c->prev!=NULL)
  264.             c->prev->next=c->next;
  265.           if (c->next!=NULL)
  266.             c->next->prev=c->prev;
  267.           c=c->next;
  268.           farfree((void *)l);
  269.           --numlines;
  270.         }
  271.         printl(curline,c);
  272.         break;
  273.       case 'P':
  274.         printl(curline,c);
  275.         break;
  276.       case 'C':
  277.         nl();
  278.         prt(5,"Clear workspace? ");
  279.         if (yn()) {
  280.           kill_file(topline);
  281.           topline=NULL;
  282.           bottomline=NULL;
  283.           c=NULL;
  284.           numlines=0;
  285.           curline=0;
  286.           pl("File cleared.");
  287.         }
  288.         break;
  289.       case 'I':
  290.         nl();
  291.         pl("Enter '.' on its own line to exit insert mode.");
  292.         i1=0;
  293.         do {
  294.           if (farcoreleft()<10240) {
  295.             nl();
  296.             pl("Not enough memory left to insert anything.");
  297.             nl();
  298.             i1=1;
  299.           } else {
  300.             sprintf(s1,"%3d: ",curline);
  301.             if (curline<1)
  302.               strcpy(s1,"  1: ");
  303.             outstr(s1);
  304.             inli(s1,rollover,150,1);
  305.             if (strcmp(s1,".")==0)
  306.               i1=1;
  307.             else {
  308.               l=(struct line *)farmalloc(sizeof(struct line));
  309.               strcpy((l->text),s1);
  310.               if (c!=NULL) {
  311.                 l->next=c;
  312.                 if (c->prev!=NULL) {
  313.                   c->prev->next=l;
  314.                   l->prev=c->prev;
  315.                   c->prev=l;
  316.                 } else {
  317.                   c->prev=l;
  318.                   l->prev=NULL;
  319.                   topline=l;
  320.                 }
  321.               } else {
  322.                 if (topline==NULL) {
  323.                   l->prev=NULL;
  324.                   l->next=NULL;
  325.                   topline=l;
  326.                   bottomline=l;
  327.                   curline=1;
  328.                 } else
  329.                   if (curline==numlines+1) {
  330.                     l->prev=bottomline;
  331.                     bottomline->next=l;
  332.                     l->next=NULL;
  333.                     bottomline=l;
  334.                   } else {
  335.                     l->prev=NULL;
  336.                     l->next=topline;
  337.                     topline->prev=l;
  338.                     c=topline;
  339.                     topline=l;
  340.                     curline=1;
  341.                   }
  342.               }
  343.               ++numlines;
  344.               ++curline;
  345.             }
  346.           }
  347.         } while ((!i1) && (!hangup));
  348.         break;
  349.     }
  350.   } while ((!done) && (!hangup));
  351.   thisuser.screenchars += 5;
  352.   if (save)
  353.     save_file(fn,topline);
  354.   kill_file(topline);
  355. }
  356.  
  357.  
  358.