Annotation of researchv10no/cmd/mk/src/bquote.c, revision 1.1.1.1

1.1       root        1: #include       "mk.h"
                      2: 
                      3: bquote(fd, src, dest)
                      4:        register char *src, *dest;
                      5: {
                      6:        int childin[2], childout[2], pid, i;
                      7:        int quotedone = 1;
                      8:        char *ldest, *t;
                      9:        char *newline = "\n";
                     10:        int wearedone = 0;
                     11:        int initdone = 0;
                     12:        extern char **environ;
                     13: 
                     14:        while(wearedone == 0)
                     15:                switch(*src)
                     16:                {
                     17:                default:
                     18:                        *dest++ = *src++;
                     19:                        break;
                     20:                case 0:
                     21:                        if(quotedone)
                     22:                                wearedone = 1;
                     23:                        else {
                     24:                                if(t = Frdline(fd)){
                     25:                                        inline++;
                     26:                                        *dest++ = '\n'|EBIT;
                     27:                                        strcpy(src, t);
                     28:                                        continue;
                     29:                                } else {
                     30:                                        SYNERR(-1); Fprint(2, "missing closing `\n");
                     31:                                        break;
                     32:                                }
                     33:                        }
                     34:                        break;
                     35:                case '\\':
                     36:                        if(*src)
                     37:                                *dest++ = *src++;
                     38:                        else
                     39:                                if(t = Frdline(fd)){
                     40:                                        inline++;
                     41:                                        strcpy(src, t);
                     42:                                }
                     43:                        break;
                     44:                case '`':
                     45:                        if(quotedone = 1-quotedone){
                     46:                                if(initdone == 0){
                     47:                                        execinit();
                     48:                                        initdone = 1;
                     49:                                }
                     50:                                Fflush(1);
                     51:                                Fflush(2);
                     52:                                if(pipe(childin) < 0){
                     53:                                        SYNERR(-1); perror("pipe1");
                     54:                                        Exit();
                     55:                                }
                     56:                                if(pipe(childout) < 0){
                     57:                                        SYNERR(-1); perror("pipe2");
                     58:                                        Exit();
                     59:                                }
                     60:                                if((pid = fork()) < 0){
                     61:                                        SYNERR(-1); perror("fork");
                     62:                                        Exit();
                     63:                                }
                     64:                                if(pid){        /* parent */
                     65:                                        close(childin[0]);
                     66:                                        close(childout[1]);
                     67:                                        if(ldest < dest){
                     68:                                                writeout(childin[1], ldest, dest);
                     69:                                                writeout(childin[1], newline, newline+1);
                     70:                                        }
                     71:                                        close(childin[1]);
                     72:                                        dest = ldest;
                     73:                                        while((i = read(childout[0], dest, 512)) > 0)
                     74:                                                dest += i;
                     75:                                        if((dest > ldest) && (dest[-1] == '\n'))
                     76:                                                dest--;
                     77:                                        close(childout[0]);
                     78:                                } else {
                     79:                                        dup2(childin[0], 0);
                     80:                                        dup2(childout[1], 1);
                     81:                                        close(childin[0]);
                     82:                                        close(childin[1]);
                     83:                                        close(childout[0]);
                     84:                                        close(childout[1]);
                     85:                                        if(execle(SHELL, "sh", (char *)0, environ) < 0)
                     86:                                                perror("exec");
                     87:                                        _exit(1);
                     88:                                }
                     89:                        } else
                     90:                                ldest = dest;
                     91:                        src++;
                     92:                        break;
                     93:                }
                     94:        *dest = 0;
                     95: }
                     96: 
                     97: writeout(fd, b, e)
                     98:        register char *b, *e;
                     99: {
                    100:        char buf[BIGBLOCK];
                    101:        register char *s;
                    102: 
                    103:        for(s = buf; b < e;){
                    104:                if(s >= &buf[BIGBLOCK-1]){
                    105:                        SYNERR(-1); Fprint(2, "too much text (%d chars) for `expr`\n", s-buf);
                    106:                        Exit();
                    107:                }
                    108:                if(*b&EBIT){
                    109:                        *s++ = '\\';
                    110:                        *s++ = (~EBIT) & *b++;
                    111:                } else
                    112:                        *s++ = *b++;
                    113:        }
                    114:        write(fd, buf, s-buf);
                    115: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.