This is procedit.m in view mode; [Download] [Up]
#include "logo.h" #include <signal.h> #ifdef NEXT extern char *ibufptr; extern const char *homeval; extern const char *syslibdir; extern const char *helpdir; #endif NEXT extern int nullfn(); extern int errrec(); extern int ehand2(),ehand3(); extern char *token(); extern char *getenv(); extern char titlebuf[],editfile[]; extern int letflag; #ifndef NOTURTLE extern int turtdes,textmode; extern struct display *mydpy; #endif chkproc(str,prim,obj) register char *str; char *prim; struct object *obj; { register char ch; if (((ch = *str)<'a') || (ch>'z')) ungood(prim,obj); if (memb('/',str)) ungood(prim,obj); if (strlen(str)>NAMELEN) ungood(prim,obj); } stedit(ednobj,flag) struct object *ednobj; int flag; { register char *edname; register struct object *rest; char fnam[200]; char edline[100]; FILDES edfd; if (ednobj==0) ungood("Edit",ednobj); if (flag==0) unlink(editfile); switch (ednobj->obtype) { case INT: case DUB: ungood("Edit",ednobj); case CONS: for (rest=ednobj; rest; rest=rest->obcdr) stedit(localize(rest->obcar),1); break; default: /* STRING */ edname = token(ednobj->obstr); chkproc(edname,"Edit",ednobj); #ifndef NEXT cpystr(fnam,edname,EXTEN,NULL); #else NEXT if (homeval == NULL) cpystr(fnam,LOCALLIB,edname,EXTEN,NULL); else cpystr(fnam,homeval,edname,EXTEN,NULL); #endif NEXT if ((edfd=open(fnam,READ,0))<0) { #ifdef NEXT if (syslibdir == NULL) cpystr(fnam,LIBLOGO,edname,EXTEN,NULL); else cpystr(fnam,syslibdir,edname,EXTEN,NULL); #else NEXT cpystr(fnam,LIBLOGO,edname,EXTEN,NULL); #endif NEXT if ((edfd=open(fnam,READ,0)) < 0) { #ifndef NEXT cpystr(fnam,edname,EXTEN,NULL); #else NEXT if (homeval == NULL) cpystr(fnam,LOCALLIB,edname,EXTEN,NULL); else cpystr(fnam,homeval,edname,EXTEN,NULL); #endif NEXT edfd = creat(fnam,0666); if (edfd < 0) { printf("Can't write %s.\n",fnam); printf("Can't write %s.\n",edname); mfree(ednobj); errhand(); } onintr(ehand3,edfd); write(edfd,"to ",3); write(edfd,edname,strlen(edname)); write(edfd,"\n\nend\n",6); } } close(edfd); onintr(errrec,1); sprintf(edline,"cat %s >> %s",fnam,editfile); system(edline); sprintf(edline,LIBNL,editfile); system(edline); } mfree(ednobj); if (flag==0) doedit(); } doedit() { register char ch,*cp; FILE *fd,*ofd; int pid,status; char *name,*envedit; char fname[200]; char line[200]; static char binname[25] = ""; static char usrbinname[30]; static char editname[20]; static char *editor; if (binname[0] == '\0') { editor = getenv("EDITOR"); envedit = editor ? editor : EDT; /* default editor */ strcpy(binname,"/bin/"); strcat(binname,envedit); strcpy(usrbinname,"/usr/bin/"); strcat(usrbinname,envedit); strcpy(editname,envedit); } #ifndef NOTURTLE if (turtdes<0) { (*mydpy->state)('t'); textmode++; } #endif fflush(stdout); signal(SIGINT,SIG_IGN); signal(SIGQUIT,SIG_IGN); switch (pid=fork()) { case -1: printf("Can't fork to editor.\n"); errhand(); case 0: /*if (editor) */ execl(editname,editname,editfile,0); /* Only try bare name if really user-specified. */ execl(binname,editname,editfile,0); execl(usrbinname,editname,editfile,0); printf("Can't find editor.\n"); exit(2); default: while (wait(&status) != pid) ; } if (status&0177400) { printf("Redefinition aborted.\n"); errhand(); } if ((fd=fopen(editfile,"r"))==NULL) { printf("Can't reread edits!\n"); errhand(); } onintr(ehand2,fd); while (fgets(line,200,fd)) { for (cp = line; (ch = *cp)==' ' || ch=='\t'; cp++) ; if (ch == '\n') continue; if (strcmp(token(cp),"to")) { printf("Edited file includes non-procedure.\n"); ehand2(fd); } for (cp += 2; (ch = *cp)==' ' || ch=='\t'; cp++) ; name = token(cp); printf("Defining %s\n",name); #ifndef NEXT sprintf(fname,"%s%s",name,EXTEN); #else NEXT if (homeval == NULL) sprintf(fname,"%s%s%s",LOCALLIB,name,EXTEN); else sprintf(fname,"%s%s%s",homeval,name,EXTEN); #endif NEXT ofd = fopen(fname,"w"); if (ofd==NULL) { printf("Can't write %s\n",fname); ehand2(fd); } fprintf(ofd,"%s",line); while (fgets(line,200,fd)) { fprintf(ofd,"%s",line); for (cp = line; (ch = *cp)==' ' || ch=='\t'; cp++) ; if (!strcmp(token(cp),"end")) break; } fclose(ofd); } fclose(fd); onintr(errrec,1); } struct object *cmedit(arg) struct object *arg; { stedit(arg,0); return ((struct object *)(-1)); } struct object *erase(name) /* delete a procedure from directory */ register struct object *name; { register struct object *rest; char temp[200]; if (name==0) ungood("Erase",name); switch(name->obtype) { case STRING: #ifndef NEXT cpystr(temp,name->obstr,EXTEN,NULL); #else NEXT if (homeval == NULL) cpystr(temp,LOCALLIB,name->obstr,EXTEN,NULL); else cpystr(temp,homeval,name->obstr,EXTEN,NULL); #endif NEXT if (unlink(temp)<0) { /* undefined procedure */ nputs("You haven't defined "); puts(name->obstr); errhand(); } break; case CONS: for (rest = name; rest; rest = rest->obcdr) erase(localize(rest->obcar)); break; default: /* number */ ungood("Erase",name); } mfree(name); return ((struct object *)(-1)); } addlines(edfd) /* read text of procedure, simple TO style */ int edfd; { register char *lintem; int oldlet; static char tstack[IBUFSIZ]; int brak,brace,ch; /* BH 1/7/82 */ oldlet=letflag; letflag=1; /* read rest of line verbatim */ loop: #ifndef NEXT putchar('>'); fflush(stdout); #endif NEXT lintem=tstack; brace = brak = 0; /* BH 1/7/82 count square brackets */ do { #ifdef NEXT if(ibufptr == NULL) { printf("The 'to' procedure can only be used\n"); printf("if the whole input command is a\n"); printf("full to procedure. To input multiple\n"); printf("lines in a TextField object, press the\n"); printf("<alt> and <return> keys together.\n"); printf("This allows for the entry of a line\n"); printf("feed into the TextField object.\n\n"); break; } #endif NEXT while ((ch=getchar())!='\n') { if (lintem >= &tstack[IBUFSIZ-2]) { printf("Line too long."); goto loop; } *lintem++ = ch; if (ch == '\\') *lintem++ = getchar(); else if (ch == '[') brak++; else if (ch == ']') --brak; else if (brak == 0) { if (ch == '{' || ch == '(') brace++; else if (ch == '}' || ch == ')') --brace; } } if (brak > 0) { *lintem++ = ' '; printf("[: "); fflush(stdout); } else if (brace > 0) { *lintem++ = ' '; printf("{(: "); fflush(stdout); } } while (brace+brak > 0); *lintem++='\n'; *lintem='\0'; write(edfd,tstack,lintem-tstack); for (lintem = tstack; memb(*lintem++," \t") ; ) ; --lintem; #ifdef NEXT if (strcmp(token(lintem),"end") && ibufptr != NULL) goto loop; /* write(edfd,"\nend\n",6); */ #else NEXT if (strcmp(token(lintem),"end")) goto loop; #endif NEXT close(edfd); letflag=oldlet; } struct object *show(nameob) register struct object *nameob; { register struct object *rest; register char *name; FILE *sbuf; char temp[200]; if (nameob==0) ungood("Show",nameob); switch(nameob->obtype) { case STRING: name = nameob->obstr; #ifndef NEXT cpystr(temp,name,EXTEN,NULL); #else NEXT if (homeval == NULL) cpystr(temp,LOCALLIB,name,EXTEN,NULL); else cpystr(temp,homeval,name,EXTEN,NULL); #endif NEXT if (!(sbuf=fopen(temp,"r"))) { #ifdef NEXT if (syslibdir == NULL) cpystr(temp,LIBLOGO,name,EXTEN,NULL); else cpystr(temp,syslibdir,name,EXTEN,NULL); #else NEXT cpystr(temp,LIBLOGO,name,EXTEN,NULL); #endif NEXT if (!(sbuf = fopen(temp,"r"))) { printf("You haven't defined %s\n",name); errhand(); } } onintr(ehand2,sbuf); while (putch(getc(sbuf))!=EOF) ; fclose(sbuf); onintr(errrec,1); break; case CONS: for (rest = nameob; rest; rest = rest->obcdr) { show(localize(rest->obcar)); putchar('\n'); } break; default: /* number */ ungood("Show",nameob); } mfree(nameob); return ((struct object *)(-1)); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.