Annotation of researchv10dc/cmd/omovie/host.c, revision 1.1.1.1

1.1       root        1: /*
                      2:        This is version 4.  The input language is:
                      3: 
                      4: Cmd    Abbrev  Operands / Comments
                      5: comment        #               only at start of line
                      6: blank  b       s <vnum>        start blanking; erase commands follow
                      7:                e <vnum>        end blanking current view
                      8: click  c       <clicknum>
                      9: define d       v <number> <viewname> xmin ymin xmax ymax
                     10:                c <number> <clickname>
                     11:                p e     pragma -- end of defs at front of file
                     12:                        Other possible ``pragmas'':                     ???
                     13:                                Number of views, clicks
                     14:                                Number of (lines, bytes) in file
                     15: erase  e       <line repeated here, except for leading g>
                     16:                        Object is deletable
                     17: geom   g       <slotn> l <vnum> <opts> <x1> <y1> <x2> <y2>     line
                     18:                        b <vnum> <opts> <x1> <y1> <x2> <y2>     box
                     19:                        c <vnum> <opts> <x> <y> <rad>           circle
                     20:                        t <vnum> <opts> <x> <y> <text string>   text
                     21:                                one separating blank; string unquoted
                     22:                            <opts> format: string of characters, in order
                     23:                            <slotn> == 0 => line never erased
                     24: 
                     25: At beginning of file:
                     26:        d v <number> <view name>
                     27:        d c <number> <click name>
                     28:        d p <various pragmas here>
                     29:        d p e
                     30: 
                     31:  */
                     32: 
                     33: #include <stdio.h>
                     34: #include "anim.h"
                     35: 
                     36: #define        sendpoint(p)    { sendint(p.x); sendint(p.y); }
                     37: #define        sendpair(x,y)   { sendint(x); sendint(y); }
                     38: #define        eq(s, t)        (strcmp(s,t) == 0)
                     39: #define        FATAL   1
                     40: 
                     41: char   *cmdname;
                     42: char   *emalloc();
                     43: 
                     44: #ifdef BLIT
                     45: long   memsize = 65000;        /* memory allocation */
                     46: #endif
                     47: #ifdef X11
                     48: long   memsize = 200000;       /* X11 memory allocation */
                     49: #endif
                     50: 
                     51: int    dbg     = 0;
                     52: int    lineno  = 1;    /* ? */
                     53: 
                     54: char   *zload  = "";   /* will be -z for load and hang on blit */
                     55: char   *termld = TERMLD;       /* will be "32ld" or "dmdld" */
                     56: int    nterm   = 0;    /* number of bytes needed in terminal */
                     57: 
                     58: main(argc, argv)
                     59:        char *argv[];
                     60: {
                     61:        FILE *fp;
                     62:        char *term_process = ANIMTERM;  /* typically "./animterm" */
                     63:        char buf[100];
                     64:        int i, c, bootstat;
                     65: 
                     66:        cmdname = argv[0];
                     67:        while (argc > 1 && argv[1][0] == '-') {
                     68:                switch (argv[1][1]) {
                     69:                case 'd':
                     70:                        dbg = !dbg;
                     71:                        break;
                     72:                case 'z':
                     73:                        zload = "-z";
                     74:                        break;
                     75:                case 't':
                     76:                        term_process = argv[2];
                     77:                        argc--;
                     78:                        argv++;
                     79:                        break;
                     80:                case 'm':
                     81:                        memsize = atoi(&argv[1][2]);
                     82:                        if (memsize <= 0) {
                     83:                                memsize = atoi(argv[2]);
                     84:                                if (memsize <= 0)
                     85:                                        error(FATAL, "memory size must be positive.  use -mN");
                     86:                                argc--;
                     87:                                argv++;
                     88:                        }
                     89:                        break;
                     90:                }
                     91:                argc--;
                     92:                argv++;
                     93:        }
                     94:        if (argc <= 1)
                     95:                error(FATAL, "no input file");
                     96:        if ((fp = fopen(argv[1], "r")) == NULL)
                     97:                error(FATAL, "can't open %s\n", argv[1]);
                     98:        if (!dbg) {
                     99:                bootstat = bootterm(term_process);
                    100:                set_tty();
                    101:        }
                    102:        if (bootstat || dbg)
                    103:                send_data(fp);
                    104:        if (dbg) {
                    105:                printf("\nterminal bytes needed: %d\n", nterm);
                    106:                exit(0);
                    107:        }
                    108:        while ((c = readchar()) != P_QUIT) {
                    109:                if (c == P_FILE) {      /* rest of line is a filename */
                    110:                        readstring(buf);
                    111:                        if ((fp = fopen(buf, "r")) == NULL)
                    112:                                send1char(P_ERROR);
                    113:                        else {
                    114:                                send1char(P_FILE);      /* ack */
                    115:                                send_data(fp);
                    116:                        }
                    117:                } else
                    118:                        send1char(P_ERROR);
                    119:        }
                    120:        reset_tty();
                    121: }
                    122: 
                    123: send_data(fp)
                    124:        FILE *fp;
                    125: {
                    126:        char text[100], buf[100], opts[100], *p;
                    127:        int c, x1, y1, x2, y2, i, v, slot;
                    128:        int ntext;
                    129: 
                    130:        sendint(memsize);
                    131:        send1char(P_INIT);
                    132:        send1char(P_PRINT);
                    133:        sendstring("here comes the data!");
                    134:        while ((c = getc(fp)) != EOF) {
                    135:                switch (c) {
                    136:                case ' ':
                    137:                case '\t':
                    138:                        break;
                    139:                case '\n':
                    140:                        lineno++;       /* this should be the only increment */
                    141:                        break;
                    142:                case '#':               /* comments */
                    143:                        skipline(fp);
                    144:                        break;
                    145:                case 'b':       /* blank.  ignore for now */
                    146:                        skipline(fp);
                    147:                        break;
                    148:                case 'c':               /* click */
                    149:                        if (fscanf(fp, "%d", &i) != 1)
                    150:                                return badfile(fp);
                    151:                        send1char(P_OBJECT);
                    152:                        send1char(c);
                    153:                        sendint(i);
                    154:                        skipline(fp);
                    155:                        nterm += 3;
                    156:                        break;
                    157:                case 'e':               /* erase */
                    158:                        if (fscanf(fp, "%d", &i) != 1)
                    159:                                return badfile(fp);
                    160:                        send1char(P_OBJECT);
                    161:                        send1char(c);
                    162:                        sendint(i);
                    163:                        skipline(fp);
                    164:                        nterm += 6;
                    165:                        break;
                    166:                case 'g':               /* geom:  draw line, box, circle, ... */
                    167:                        if (fscanf(fp, "%d", &slot) != 1)
                    168:                                return badfile(fp);
                    169:                        switch (c = skipbl(fp)) {
                    170:                        case 'l':
                    171:                        case 'b':
                    172:                                if (fscanf(fp, "%d %s %d %d %d %d", &v, opts, &x1, &y1, &x2, &y2) != 6)
                    173:                                        return badfile(fp);
                    174:                                send1char(P_OBJECT);
                    175:                                send1char(c);
                    176:                                sendint(slot);
                    177:                                sendint(v);
                    178:                                sendopt(c=='b' ? boxops : lineops, opts);
                    179:                                sendpair(x1, y1);
                    180:                                sendpair(x2, y2);
                    181:                                nterm += 12;
                    182:                                break;
                    183:                        case 'c':       /* circle */
                    184:                                if (fscanf(fp, "%d %s %d %d %d", &v, opts, &x1, &y1, &x2) != 5)
                    185:                                        return badfile(fp);;
                    186:                                send1char(P_OBJECT);
                    187:                                send1char('o'); /* 'o' is for circle */
                    188:                                sendint(slot);
                    189:                                sendint(v);
                    190:                                sendopt(circops, opts);
                    191:                                sendpair(x1, y1);
                    192:                                sendint(x2);
                    193:                                nterm += 10;
                    194:                                break;
                    195:                        case 't':       /* text */
                    196:                                if (fscanf(fp, "%d %s %d %d", &v, opts, &x1, &y1) != 4)
                    197:                                        return badfile(fp);
                    198:                                send1char(P_OBJECT);
                    199:                                send1char('t');
                    200:                                sendint(slot);
                    201:                                sendint(v);
                    202:                                sendopt(textops, opts);
                    203:                                sendpair(x1, y1);
                    204:                                getc(fp);       /* skip 1 separator; no quotes */
                    205:                                for (p = text; (c = getc(fp)) != '\n'; )
                    206:                                        *p++ = c;
                    207:                                *p = 0;
                    208:                                ungetc('\n', fp);
                    209:                                ntext = 1;
                    210:                                /* slow... */
                    211:                                if (eq(text, "bullet"))
                    212:                                        sendstring("*");
                    213:                                else if (eq(text, "dot"))
                    214:                                        sendstring(".");
                    215:                                else if (eq(text, "circle"))
                    216:                                        sendstring("o");
                    217:                                else if (eq(text, "times"))
                    218:                                        sendstring("x");
                    219:                                else {
                    220:                                        sendstring(text);
                    221:                                        ntext = strlen(text);
                    222:                                }
                    223:                                nterm += 10 + ntext;
                    224:                                break;
                    225:                        default:
                    226:                                return badfile(fp);
                    227:                        }
                    228:                        break;
                    229:                case 'd':       /* definition of some sort */
                    230:                        switch (c = skipbl(fp)) {
                    231:                        case 'v':       /* view */
                    232:                                if (fscanf(fp, "%d %s", &i, text) != 2)
                    233:                                        return badfile(fp);
                    234:                                send1char(P_DEFINE);
                    235:                                send1char('v');
                    236:                                sendint(i);
                    237:                                sendstring(text);
                    238:                                skipline(fp);   /* might be a title there */
                    239:                                break;
                    240:                        case 'c':       /* click */
                    241:                                if (fscanf(fp, "%d %s", &i, text) != 2)
                    242:                                        return badfile(fp);
                    243:                                send1char(P_DEFINE);
                    244:                                send1char('c');
                    245:                                sendint(i);
                    246:                                sendstring(text);
                    247:                                break;
                    248:                        case 'p':
                    249:                                skipline(fp);
                    250:                                break;
                    251:                        default:
                    252:                                return badfile(fp);
                    253:                        }
                    254:                        break;
                    255:                default:
                    256:                        return badfile(fp);
                    257:                }
                    258:        }
                    259:        send1char(P_ENDFILE);
                    260:        fclose(fp);
                    261:        flushproto();
                    262:        return 1;
                    263: }
                    264: 
                    265: badfile(fp)
                    266:        FILE *fp;
                    267: {
                    268:        send1char(P_ERRPRINT);
                    269:        sendstring("file is not in .i format");
                    270:        send1char(P_ENDFILE);
                    271:        while (getc(fp) != EOF)
                    272:                ;
                    273:        fclose(fp);
                    274:        flushproto();
                    275:        return 0;
                    276: }
                    277: 
                    278: sendopt(optvals, opts)
                    279:        int optvals[];
                    280:        char *opts;
                    281: {
                    282:        int i, n;
                    283: 
                    284:        n = 0;
                    285:        for (i = 0; optvals[i] && opts; i += 2)
                    286:                if (*opts == optvals[i]) {
                    287:                        n += optvals[i+1];
                    288:                        opts++;
                    289:                }
                    290:        sendint(n);
                    291: }
                    292: 
                    293: skipbl(fp)
                    294:        FILE *fp;
                    295: {
                    296:        int c;
                    297: 
                    298:        while ((c = getc(fp)) == ' ' || c == '\t')
                    299:                ;
                    300:        return c;
                    301: }
                    302: 
                    303: skipline(fp)
                    304:        FILE *fp;
                    305: {
                    306:        int c;
                    307: 
                    308:        while ((c = getc(fp)) != '\n')
                    309:                ;
                    310:        ungetc('\n', fp);
                    311: }
                    312: 
                    313: error(f, s, a1, a2, a3, a4, a5, a6, a7)
                    314: {
                    315:        extern char *cmdname;
                    316:        extern int dbg;
                    317: 
                    318:        fprintf(stderr, "%s: ", cmdname);
                    319:        fprintf(stderr, s, a1, a2, a3, a4, a5, a6, a7);
                    320:        fprintf(stderr, "\n");
                    321:        if (lineno)
                    322:                fprintf(stderr, " source line number %d\n", lineno);
                    323:        if (f) {
                    324:                if (dbg)
                    325:                        abort();
                    326:                exit(2);
                    327:        }
                    328: }
                    329: 
                    330: #ifndef X11
                    331: 
                    332: bootterm(procname)
                    333:        char *procname;
                    334: {
                    335:        char buf[100];
                    336: 
                    337:        sprintf(buf, "%s %s %s </dev/tty", termld, zload, procname);
                    338:        if (system(buf) != 0) {
                    339:                fprintf(stderr,
                    340:                        "anim: can't create pipe to terminal process\n");
                    341:                return 0;
                    342:        }
                    343:        return 1;
                    344: }
                    345: 
                    346: #endif
                    347: 
                    348: #ifdef X11
                    349: 
                    350: bootterm(procname)
                    351:        char *procname;
                    352: {
                    353:        int afildes[2], bfildes[2], pid;
                    354:        if((pipe(afildes)==-1)||(pipe(bfildes)==-1)){
                    355:                fprintf(stderr,
                    356:                        "anim: can't create pipe to terminal process\n");
                    357:                return 0;
                    358:        }
                    359:        if((pid=fork())==0){
                    360:                close(0);
                    361:                dup(afildes[0]);
                    362:                close(1);
                    363:                dup(bfildes[1]);
                    364:                execl(procname, "animterm", 0);
                    365:                exit(127);
                    366:        }
                    367:        if(pid==-1){
                    368:                fprintf(stderr,"anim: can't fork %s\n", procname);
                    369:                return 0;
                    370:        }
                    371:        close(0);
                    372:        dup(bfildes[0]);
                    373:        close(1);
                    374:        dup(afildes[1]);
                    375:        return 1;
                    376: }
                    377: 
                    378: #endif

unix.superglobalmegacorp.com

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