home *** CD-ROM | disk | FTP | other *** search
/ ARM Club 1 / ARM_CLUB_CD.iso / contents / apps / program / d / ed / !Ed / c / EdFile < prev    next >
Encoding:
Text File  |  1990-06-21  |  4.8 KB  |  226 lines

  1. /* Input-output for Ed
  2.    Copyright C.T.Stretch 1990
  3.    Thu,21 Jun 1990
  4. */
  5.  
  6. #include "EdHdr.h"
  7. #include <ctype.h>
  8.  
  9. #define NICcase 1
  10. #define NICline 2
  11. #define NICfn   4
  12. #define NICcn   5
  13.  
  14.  
  15. char noname[]="Untitled";
  16.  
  17. void file_setmod(doc *d)
  18. { wind *w;
  19.   char mn[FNAMELEN+2];
  20.   sprintf(mn,"%s *",d->name);
  21.   for(w=d->list;w;w=w->next) win_settitle(w->hand,mn);
  22.   d->mod=TRUE;
  23. }
  24.  
  25. static void dropblanks(doc *d)
  26. { line *l,*m;
  27.   for(l=d->line;l->next;l=l->next);
  28.   while(TRUE)
  29.   { if(l->fold)
  30.     { for(m=l->fold;m->next;m=m->next);
  31.       while(!m->len&&m!=d->mark)
  32.       { m=m->prev;
  33.         if(!m) { mem_unlink(&(l->fold));break;}
  34.         mem_unlink(m);
  35.       }
  36.     }
  37.     if(l->fold||l->len||l==cline||l==d->mark||!l->prev) break;
  38.     l=l->prev;
  39.     mem_unlink(l);
  40.     d->len--;
  41.   }
  42.   disp_setde(d);
  43. }
  44.  
  45. static BOOL sline(line *l,FILE *file)
  46. { if(l->col>=NCOL) return TRUE;
  47.   if(fwrite(l->text,1,l->len,file)!=l->len)
  48.   { fclose(file);
  49.     return FALSE;
  50.   }
  51.   fputc('\n',file);
  52.   return TRUE;
  53. }
  54.  
  55. BOOL file_savedoc(char *fname,void *h)
  56. { doc *d=h;
  57.   line *l,*m;
  58.   wind *w;
  59.   FILE *file=fopen(fname,"w");
  60.   if(!file) return FALSE;
  61.   dropblanks(d);
  62.   for(l=d->line;l;l=l->next)
  63.   { if(!sline(l,file)) return FALSE;
  64.     for(m=l->fold;m;m=m->next) if(!sline(m,file)) return FALSE;
  65.   }
  66.   fclose(file);
  67.   if(strcmp(fname,"printer:"))
  68.   { d->mod=FALSE;
  69.     strncpy(d->name,fname,FNAMELEN-1);
  70.     for(w=d->list;w;w=w->next)
  71.     win_settitle(w->hand,d->name);
  72.   }
  73.   return TRUE;
  74. }
  75.  
  76. BOOL file_saveline(char *fname,void *h)
  77. { line *l=h,*m;
  78.   FILE *file=fopen(fname,"w");
  79.   if(!file) return FALSE;
  80.   if(!sline(l,file)) return FALSE;
  81.   for(m=l->fold;m;m=m->next) if(!sline(m,file)) return FALSE;
  82.   fclose(file);
  83.   return TRUE;
  84. }
  85.  
  86. void file_runline(BOOL loadit)
  87. { line *l=cline,*m;
  88.   FILE *file;
  89.   char fn[FNAMELEN+40],dn[FNAMELEN];
  90.   os_read_var_val("EdTemp$Dir",dn,FNAMELEN);
  91.   sprintf(fn,"%s.ToDo",dn);
  92.   file=fopen(fn,"w");
  93.   if(file)
  94.   { if(!sline(l,file)) return;
  95.     for(m=l->fold;m;m=m->next) if(!sline(m,file)) return;
  96.     fclose(file);
  97.     if(loadit) sprintf(fn,"obey %s.ToDo { > %s.Output }\n",dn,dn);
  98.     else sprintf(fn,"obey %s.ToDo",dn);
  99.     wimp_starttask(fn);
  100.     if(loadit)
  101.     { sprintf(fn,"%s.Output",dn);
  102.       bar_newdocname(fn);
  103.     }
  104.   }
  105. }
  106.  
  107.  
  108. int file_readf(FILE *file,line *l,int p)
  109. { int c,n=l->len-p,n13=1,n10=1,s=0;
  110.   if(!mem_getline(l)) return s;s++;
  111.   if(n>0)
  112.   { memcpy(l->next->text,l->text+p,n);
  113.     l->len=p;l->next->len=n;
  114.   }
  115.   while(EOF!=(c=fgetc(file)))
  116.   { if(c==9)c=32;
  117.     if(l->len>=MAXC)
  118.     { if(!mem_getline(l)) return s;s++;
  119.       l=l->next;n13=0;n10=0;
  120.     }
  121.     if(c==13 && n13)
  122.     { if(!mem_getline(l)) return s;s++;
  123.       l=l->next;n10=0;
  124.     }
  125.     if(c==10 && n10)
  126.     { if(!mem_getline(l)) return s;s++;
  127.       l=l->next;n13=0;
  128.     }
  129.     if(c>31 && c<127)
  130.     { l->text[l->len++]=(char)c;
  131.       n10=1;n13=1;
  132.     }
  133.   }
  134.   return s;
  135. }
  136.  
  137. static void noteline(doc *d,int n,char *fn,BOOL lin)
  138. { line *l;
  139.   int k=0;
  140.   char *c,*t;
  141.   for(l=(line*)&(d->line);l->next&&n>k;l=l->next)
  142.   { if(l->next->col<NCOL) k++;
  143.     if(lin)
  144.     { c=l->next->text;t=c+l->next->len;
  145.       while(*c==' '&&c<t) c++;
  146.       if(c<t&&*c=='#')
  147.       { c++;while(*c==' '&&c<t) c++;
  148.         if(c<t&&!memcmp("line",c,4)) k=atoi(c+4);
  149.       }
  150.     }
  151.   }
  152.   for(;l->next&&l->next->col>=NCOL;l=l->next);
  153.   if(!mem_getline(l)) return;
  154.   d->len++;
  155.   l=l->next;
  156.   l->col=NCOL;
  157.   l->len=strlen(fn)-1;
  158.   memcpy(l->text,fn,l->len);
  159. }
  160.  
  161. static void readerr(doc *d,char *fn,char *cn,BOOL cas,BOOL linedir)
  162. { FILE *file;
  163.   int l=strlen(cn);
  164.   char *c=fn+l;
  165.   int n;
  166.   file=fopen(fn,"r");
  167.   if(!file) return;
  168.   fold_unfoldall();
  169.   while(fgets(fn,FNAMELEN,file))
  170.   { if(!cas) for(n=0;n<l;n++)
  171.     { fn[n]=(char)tolower(fn[n]);
  172.       cn[n]=(char)tolower(cn[n]);
  173.     }
  174.     if(strstr(fn,cn)==fn)
  175.     { n=atoi(c);
  176.       noteline(d,n,fn,linedir);
  177.     }
  178.   }
  179.   fclose(file);
  180.   disp_setde(d);
  181.   disp_fred(d);
  182. }
  183.  
  184. void file_notebox(doc *dk)
  185. { dbox d=dbox_new("note");
  186.   char fn[FNAMELEN],cn[FNAMELEN],*c;
  187.   strncpy(fn,dk->name,FNAMELEN-1);
  188.   if(fn[strlen(fn)-1]=='*') fn[strlen(fn)-2]=0;
  189.   for(c=fn+strlen(fn)-1;c>fn;c--) if(*c=='.') break;
  190.   c--;
  191.   if(c<=fn)
  192.   { *fn=0;*cn=0;
  193.   }
  194.   else
  195.   { sprintf(cn,"\"%s\", line",c);
  196.     *c='l';
  197.   }
  198.   if(d)
  199.   { dbox_setfield(d,NICfn,fn);
  200.     dbox_setfield(d,NICcn,cn);
  201.     dbox_show(d);
  202.     if(dbox_fillin(d)==0)
  203.     { dbox_hide(d);
  204.       dbox_getfield(d,NICfn,fn,FNAMELEN);
  205.       dbox_getfield(d,NICcn,cn,FNAMELEN);
  206.       readerr(dk,fn,cn,dbox_getnumeric(d,NICcase),dbox_getnumeric(d,NICline));
  207.     }
  208.     dbox_dispose(&d);
  209.   }
  210. }
  211.  
  212. void file_savereq(doc *d,char h)
  213. { char str[FNAMELEN+16],st[FNAMELEN+2];
  214.   int n;
  215.   strcpy(st,d->name);
  216.   n=strlen(st);
  217.   if(st[n-1]=='*'&&n>1) st[n-2]=0;
  218.   if(h)  saveas(d->type,st,bar_docsize(d),file_savedoc,0,0,d);
  219.   else
  220.   if(strcmp(st,noname))
  221.   { file_savedoc(st,d);
  222.     sprintf(str,"settype %s %x",st,d->type);
  223.     system(str);
  224.   }
  225. }
  226.