home *** CD-ROM | disk | FTP | other *** search
- /* Input-output for Ed
- Copyright C.T.Stretch 1990
- Thu,21 Jun 1990
- */
-
- #include "EdHdr.h"
- #include <ctype.h>
-
- #define NICcase 1
- #define NICline 2
- #define NICfn 4
- #define NICcn 5
-
-
- char noname[]="Untitled";
-
- void file_setmod(doc *d)
- { wind *w;
- char mn[FNAMELEN+2];
- sprintf(mn,"%s *",d->name);
- for(w=d->list;w;w=w->next) win_settitle(w->hand,mn);
- d->mod=TRUE;
- }
-
- static void dropblanks(doc *d)
- { line *l,*m;
- for(l=d->line;l->next;l=l->next);
- while(TRUE)
- { if(l->fold)
- { for(m=l->fold;m->next;m=m->next);
- while(!m->len&&m!=d->mark)
- { m=m->prev;
- if(!m) { mem_unlink(&(l->fold));break;}
- mem_unlink(m);
- }
- }
- if(l->fold||l->len||l==cline||l==d->mark||!l->prev) break;
- l=l->prev;
- mem_unlink(l);
- d->len--;
- }
- disp_setde(d);
- }
-
- static BOOL sline(line *l,FILE *file)
- { if(l->col>=NCOL) return TRUE;
- if(fwrite(l->text,1,l->len,file)!=l->len)
- { fclose(file);
- return FALSE;
- }
- fputc('\n',file);
- return TRUE;
- }
-
- BOOL file_savedoc(char *fname,void *h)
- { doc *d=h;
- line *l,*m;
- wind *w;
- FILE *file=fopen(fname,"w");
- if(!file) return FALSE;
- dropblanks(d);
- for(l=d->line;l;l=l->next)
- { if(!sline(l,file)) return FALSE;
- for(m=l->fold;m;m=m->next) if(!sline(m,file)) return FALSE;
- }
- fclose(file);
- if(strcmp(fname,"printer:"))
- { d->mod=FALSE;
- strncpy(d->name,fname,FNAMELEN-1);
- for(w=d->list;w;w=w->next)
- win_settitle(w->hand,d->name);
- }
- return TRUE;
- }
-
- BOOL file_saveline(char *fname,void *h)
- { line *l=h,*m;
- FILE *file=fopen(fname,"w");
- if(!file) return FALSE;
- if(!sline(l,file)) return FALSE;
- for(m=l->fold;m;m=m->next) if(!sline(m,file)) return FALSE;
- fclose(file);
- return TRUE;
- }
-
- void file_runline(BOOL loadit)
- { line *l=cline,*m;
- FILE *file;
- char fn[FNAMELEN+40],dn[FNAMELEN];
- os_read_var_val("EdTemp$Dir",dn,FNAMELEN);
- sprintf(fn,"%s.ToDo",dn);
- file=fopen(fn,"w");
- if(file)
- { if(!sline(l,file)) return;
- for(m=l->fold;m;m=m->next) if(!sline(m,file)) return;
- fclose(file);
- if(loadit) sprintf(fn,"obey %s.ToDo { > %s.Output }\n",dn,dn);
- else sprintf(fn,"obey %s.ToDo",dn);
- wimp_starttask(fn);
- if(loadit)
- { sprintf(fn,"%s.Output",dn);
- bar_newdocname(fn);
- }
- }
- }
-
-
- int file_readf(FILE *file,line *l,int p)
- { int c,n=l->len-p,n13=1,n10=1,s=0;
- if(!mem_getline(l)) return s;s++;
- if(n>0)
- { memcpy(l->next->text,l->text+p,n);
- l->len=p;l->next->len=n;
- }
- while(EOF!=(c=fgetc(file)))
- { if(c==9)c=32;
- if(l->len>=MAXC)
- { if(!mem_getline(l)) return s;s++;
- l=l->next;n13=0;n10=0;
- }
- if(c==13 && n13)
- { if(!mem_getline(l)) return s;s++;
- l=l->next;n10=0;
- }
- if(c==10 && n10)
- { if(!mem_getline(l)) return s;s++;
- l=l->next;n13=0;
- }
- if(c>31 && c<127)
- { l->text[l->len++]=(char)c;
- n10=1;n13=1;
- }
- }
- return s;
- }
-
- static void noteline(doc *d,int n,char *fn,BOOL lin)
- { line *l;
- int k=0;
- char *c,*t;
- for(l=(line*)&(d->line);l->next&&n>k;l=l->next)
- { if(l->next->col<NCOL) k++;
- if(lin)
- { c=l->next->text;t=c+l->next->len;
- while(*c==' '&&c<t) c++;
- if(c<t&&*c=='#')
- { c++;while(*c==' '&&c<t) c++;
- if(c<t&&!memcmp("line",c,4)) k=atoi(c+4);
- }
- }
- }
- for(;l->next&&l->next->col>=NCOL;l=l->next);
- if(!mem_getline(l)) return;
- d->len++;
- l=l->next;
- l->col=NCOL;
- l->len=strlen(fn)-1;
- memcpy(l->text,fn,l->len);
- }
-
- static void readerr(doc *d,char *fn,char *cn,BOOL cas,BOOL linedir)
- { FILE *file;
- int l=strlen(cn);
- char *c=fn+l;
- int n;
- file=fopen(fn,"r");
- if(!file) return;
- fold_unfoldall();
- while(fgets(fn,FNAMELEN,file))
- { if(!cas) for(n=0;n<l;n++)
- { fn[n]=(char)tolower(fn[n]);
- cn[n]=(char)tolower(cn[n]);
- }
- if(strstr(fn,cn)==fn)
- { n=atoi(c);
- noteline(d,n,fn,linedir);
- }
- }
- fclose(file);
- disp_setde(d);
- disp_fred(d);
- }
-
- void file_notebox(doc *dk)
- { dbox d=dbox_new("note");
- char fn[FNAMELEN],cn[FNAMELEN],*c;
- strncpy(fn,dk->name,FNAMELEN-1);
- if(fn[strlen(fn)-1]=='*') fn[strlen(fn)-2]=0;
- for(c=fn+strlen(fn)-1;c>fn;c--) if(*c=='.') break;
- c--;
- if(c<=fn)
- { *fn=0;*cn=0;
- }
- else
- { sprintf(cn,"\"%s\", line",c);
- *c='l';
- }
- if(d)
- { dbox_setfield(d,NICfn,fn);
- dbox_setfield(d,NICcn,cn);
- dbox_show(d);
- if(dbox_fillin(d)==0)
- { dbox_hide(d);
- dbox_getfield(d,NICfn,fn,FNAMELEN);
- dbox_getfield(d,NICcn,cn,FNAMELEN);
- readerr(dk,fn,cn,dbox_getnumeric(d,NICcase),dbox_getnumeric(d,NICline));
- }
- dbox_dispose(&d);
- }
- }
-
- void file_savereq(doc *d,char h)
- { char str[FNAMELEN+16],st[FNAMELEN+2];
- int n;
- strcpy(st,d->name);
- n=strlen(st);
- if(st[n-1]=='*'&&n>1) st[n-2]=0;
- if(h) saveas(d->type,st,bar_docsize(d),file_savedoc,0,0,d);
- else
- if(strcmp(st,noname))
- { file_savedoc(st,d);
- sprintf(str,"settype %s %x",st,d->type);
- system(str);
- }
- }
-