home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 January / usenetsourcesnewsgroupsinfomagicjanuary1994.iso / sources / unix / volume10 / logo / part02 / procedit.c < prev    next >
Encoding:
C/C++ Source or Header  |  1987-06-23  |  6.1 KB  |  285 lines

  1.  
  2. #include "logo.h"
  3. #include <signal.h>
  4.  
  5. extern int nullfn();
  6. extern int errrec();
  7. extern int ehand2(),ehand3();
  8. extern char *token();
  9. extern char *getenv();
  10. extern char titlebuf[],editfile[];
  11. extern int letflag;
  12. #ifndef NOTURTLE
  13. extern int turtdes,textmode;
  14. extern struct display *mydpy;
  15. #endif
  16.  
  17. chkproc(str,prim,obj)
  18. register char *str;
  19. char *prim;
  20. struct object *obj;
  21. {
  22.     register char ch;
  23.  
  24.     if (((ch = *str)<'a') || (ch>'z')) ungood(prim,obj);
  25.     if (memb('/',str)) ungood(prim,obj);
  26.     if (strlen(str)>NAMELEN) ungood(prim,obj);
  27. }
  28.  
  29. stedit(ednobj,flag)
  30. struct object *ednobj;
  31. int flag;
  32. {
  33.     register char *edname;
  34.     register struct object *rest;
  35.     char fnam[40];
  36.     char edline[100];
  37.     FILDES edfd;
  38.  
  39.     if (ednobj==0) ungood("Edit",ednobj);
  40.     if (flag==0) unlink(editfile);
  41.     switch (ednobj->obtype) {
  42.         case INT:
  43.         case DUB:
  44.             ungood("Edit",ednobj);
  45.         case CONS:
  46.             for (rest=ednobj; rest; rest=rest->obcdr)
  47.                 stedit(localize(rest->obcar),1);
  48.             break;
  49.         default: /* STRING */
  50.             edname = token(ednobj->obstr);
  51.             chkproc(edname,"Edit",ednobj);
  52.             cpystr(fnam,edname,EXTEN,NULL);
  53.             if ((edfd=open(fnam,READ,0))<0) {
  54.                 cpystr(fnam,LIBLOGO,edname,EXTEN,NULL);
  55.                 if ((edfd=open(fnam,READ,0)) < 0) {
  56.                     cpystr(fnam,edname,EXTEN,NULL);
  57.                     edfd = creat(fnam,0666);
  58.                     if (edfd < 0) {
  59.                         printf("Can't write %s.\n",edname);
  60.                         mfree(ednobj);
  61.                         errhand();
  62.                     }
  63.                     onintr(ehand3,edfd);
  64.                     write(edfd,"to ",3);
  65.                     write(edfd,edname,strlen(edname));
  66.                     write(edfd,"\n\nend\n",6);
  67.                 }
  68.             }
  69.             close(edfd);
  70.             onintr(errrec,1);
  71.             sprintf(edline,"cat %s >> %s",fnam,editfile);
  72.             system(edline);
  73.             sprintf(edline,LIBNL,editfile);
  74.             system(edline);
  75.     }
  76.     mfree(ednobj);
  77.     if (flag==0) doedit();
  78. }
  79.  
  80. doedit() {
  81.     register char ch,*cp;
  82.     FILE *fd,*ofd;
  83.     int pid,status;
  84.     char *name,*envedit;
  85.     char fname[30];
  86.     char line[200];
  87.     static char binname[25] = "";
  88.     static char usrbinname[30];
  89.     static char editname[20];
  90.     static char *editor;
  91.  
  92.     if (binname[0] == '\0') {
  93.         editor = getenv("EDITOR");
  94.         envedit = editor ? editor : EDT;    /* default editor */
  95.         strcpy(binname,"/bin/");
  96.         strcat(binname,envedit);
  97.         strcpy(usrbinname,"/usr/bin/");
  98.         strcat(usrbinname,envedit);
  99.         strcpy(editname,envedit);
  100.     }
  101.  
  102. #ifndef NOTURTLE
  103.     if (turtdes<0) {
  104.         (*mydpy->state)('t');
  105.         textmode++;
  106.     }
  107. #endif
  108.     fflush(stdout);
  109.     signal(SIGINT,SIG_IGN);
  110.     signal(SIGQUIT,SIG_IGN);
  111.     switch (pid=fork()) {
  112.         case -1:
  113.             printf("Can't fork to editor.\n");
  114.             errhand();
  115.         case 0:
  116.             /*if (editor) */ execl(editname,editname,editfile,0);
  117.             /* Only try bare name if really user-specified. */
  118.             execl(binname,editname,editfile,0);
  119.             execl(usrbinname,editname,editfile,0);
  120.             printf("Can't find editor.\n");
  121.             exit(2);
  122.         default:
  123.             while (wait(&status) != pid) ;
  124.     }
  125.     if (status&0177400) {
  126.         printf("Redefinition aborted.\n");
  127.         errhand();
  128.     }
  129.     if ((fd=fopen(editfile,"r"))==NULL) {
  130.         printf("Can't reread edits!\n");
  131.         errhand();
  132.     }
  133.     onintr(ehand2,fd);
  134.     while (fgets(line,200,fd)) {
  135.         for (cp = line; (ch = *cp)==' ' || ch=='\t'; cp++) ;
  136.         if (ch == '\n') continue;
  137.         if (strcmp(token(cp),"to")) {
  138.             printf("Edited file includes non-procedure.\n");
  139.             ehand2(fd);
  140.         }
  141.         for (cp += 2; (ch = *cp)==' ' || ch=='\t'; cp++) ;
  142.         name = token(cp);
  143.         printf("Defining %s\n",name);
  144.         sprintf(fname,"%s%s",name,EXTEN);
  145.         ofd = fopen(fname,"w");
  146.         if (ofd==NULL) {
  147.             printf("Can't write %s\n",fname);
  148.             ehand2(fd);
  149.         }
  150.         fprintf(ofd,"%s",line);
  151.         while (fgets(line,200,fd)) {
  152.             fprintf(ofd,"%s",line);
  153.             for (cp = line; (ch = *cp)==' ' || ch=='\t'; cp++) ;
  154.             if (!strcmp(token(cp),"end")) break;
  155.         }
  156.         fclose(ofd);
  157.     }
  158.     fclose(fd);
  159.     onintr(errrec,1);
  160. }
  161.  
  162. struct object *cmedit(arg)
  163. struct object *arg;
  164. {
  165.     stedit(arg,0);
  166.     return ((struct object *)(-1));
  167. }
  168.  
  169. struct object *erase(name)    /* delete a procedure from directory */
  170. register struct object *name;
  171. {
  172.     register struct object *rest;
  173.     char temp[16];
  174.  
  175.     if (name==0) ungood("Erase",name);
  176.     switch(name->obtype) {
  177.         case STRING:
  178.             cpystr(temp,name->obstr,EXTEN,NULL);
  179.             if (unlink(temp)<0) {    /* undefined procedure */
  180.                 nputs("You haven't defined ");
  181.                 puts(name->obstr);
  182.                 errhand();
  183.             }
  184.             break;
  185.         case CONS:
  186.             for (rest = name; rest; rest = rest->obcdr)
  187.                 erase(localize(rest->obcar));
  188.             break;
  189.         default:    /* number */
  190.             ungood("Erase",name);
  191.     }
  192.     mfree(name);
  193.     return ((struct object *)(-1));
  194. }
  195.  
  196. addlines(edfd)    /* read text of procedure, simple TO style */
  197. int edfd;
  198. {
  199.     register char *lintem;
  200.     int oldlet;
  201.     static char tstack[IBUFSIZ];
  202.     int brak,brace,ch;    /* BH 1/7/82 */
  203.  
  204.     oldlet=letflag;
  205.     letflag=1;    /* read rest of line verbatim */
  206. loop:
  207.     putchar('>');
  208.     fflush(stdout);
  209.     lintem=tstack;
  210.     brace = brak = 0;    /* BH 1/7/82 count square brackets */
  211.     do {
  212.         while ((ch=getchar())!='\n') {
  213.             if (lintem >= &tstack[IBUFSIZ-2]) {
  214.                 printf("Line too long.");
  215.                 goto loop;
  216.             }
  217.             *lintem++ = ch;
  218.             if (ch == '\\') *lintem++ = getchar();
  219.             else if (ch == '[') brak++;
  220.             else if (ch == ']') --brak;
  221.             else if (brak == 0) {
  222.                 if (ch == '{' || ch == '(') brace++;
  223.                 else if (ch == '}' || ch == ')') --brace;
  224.             }
  225.         }
  226.         if (brak > 0) {
  227.             *lintem++ = ' ';
  228.             printf("[: ");
  229.             fflush(stdout);
  230.         } else if (brace > 0) {
  231.             *lintem++ = ' ';
  232.             printf("{(: ");
  233.             fflush(stdout);
  234.         }
  235.     } while (brace+brak > 0);
  236.     *lintem++='\n';
  237.     *lintem='\0';
  238.     write(edfd,tstack,lintem-tstack);
  239.     for (lintem = tstack; memb(*lintem++," \t") ; ) ;
  240.     --lintem;
  241.     if (strcmp(token(lintem),"end")) goto loop;
  242.     letflag=oldlet;
  243.     close(edfd);
  244. }
  245.  
  246. struct object *show(nameob)
  247. register struct object *nameob;
  248. {
  249.     register struct object *rest;
  250.     register char *name;
  251.     FILE *sbuf;
  252.     char temp[100];
  253.  
  254.     if (nameob==0) ungood("Show",nameob);
  255.     switch(nameob->obtype) {
  256.         case STRING:
  257.             name = nameob->obstr;
  258.             cpystr(temp,name,EXTEN,NULL);
  259.             if (!(sbuf=fopen(temp,"r"))) {
  260.                 cpystr(temp,LIBLOGO,name,EXTEN,NULL);
  261.                 if (!(sbuf = fopen(temp,"r"))) {
  262.                     printf("You haven't defined %s\n",name);
  263.                     errhand();
  264.                 }
  265.             }
  266.             onintr(ehand2,sbuf);
  267.             while (putch(getc(sbuf))!=EOF)
  268.                 ;
  269.             fclose(sbuf);
  270.             onintr(errrec,1);
  271.             break;
  272.         case CONS:
  273.             for (rest = nameob; rest; rest = rest->obcdr) {
  274.                 show(localize(rest->obcar));
  275.                 putchar('\n');
  276.             }
  277.             break;
  278.         default:    /* number */
  279.             ungood("Show",nameob);
  280.     }
  281.     mfree(nameob);
  282.     return ((struct object *)(-1));
  283. }
  284.  
  285.