Annotation of 43BSD/contrib/B/src/bint/b3mai.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: 
                      3: /*
                      4:  $Header: b3mai.c,v 1.4 85/08/22 17:15:36 timo Exp $
                      5:  */
                      6: 
                      7: 
                      8: /* B driver for interpreter */
                      9: 
                     10: #include "b.h"
                     11: #include "b0fea.h"
                     12: #include "b1obj.h"
                     13: #include "b1mem.h"
                     14: #include "b2nod.h"
                     15: #include "b2syn.h"
                     16: #include "b2par.h"
                     17: #include "b3env.h"
                     18: #include "b3scr.h"
                     19: #include "b3err.h"
                     20: #include "b3fil.h"
                     21: #include "b3sig.h"
                     22: #include "b3sem.h"
                     23: #include "b3sou.h"
                     24: 
                     25: value evalthread();
                     26: 
                     27: Hidden bool call_error, in_process;
                     28: 
                     29: #ifdef INTEGRATION
                     30: bool dflag= No; /* -d: debugging output wanted */
                     31: bool slowterminal= No;
                     32: bool hushbaby= No;
                     33: #endif INTEGRATION
                     34: 
                     35: Visible bool timing; /* Set if timing output wanted */
                     36: Visible bool extcmds; /* Set if must recognize extended commands */
                     37: 
                     38: main(argc, argv) int argc; string argv[]; {
                     39: #ifdef START_MESSAGE
                     40:        fprintf(stderr, "Interactive B version %s\n%s\n", rcsid,
                     41:            "Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985.");
                     42: #endif
                     43:        in_process= No; call_error= No;
                     44:        call(argc, argv);
                     45:        if (call_error) exit(-1);
                     46:        in_process= Yes;
                     47:        init();
                     48:        call(argc, argv);
                     49:        bye(0);
                     50: }
                     51: 
                     52: #define Cllerr stderr
                     53: 
                     54: Hidden string pname;    /* program name */
                     55: 
                     56: Hidden Procedure erm(m, n, argc, pargc, pargv) string m, n; int argc, pargc; string pargv[]; {
                     57:        fprintf(Cllerr,
                     58:  "*** There is something I don't quite get in your call of %s\n", pname);
                     59:        show_call(argc, pargc, pargv);
                     60:        fprintf(Cllerr, "*** The problem is: %s %s\n", m, n);
                     61:        if (in_process) bye(-1);
                     62:        call_error= Yes;
                     63: }
                     64: 
                     65: Hidden Procedure call(pargc, pargv) int pargc; string pargv[]; {
                     66:        int argc; string *argv;
                     67: 
                     68:        pname = pargv[0];
                     69:        argc = pargc-1;
                     70:        argv = pargv+1;
                     71:        while (argc >= 0)
                     72:        if (argc > 0 && argv[0][0] == '-' && argv[0][1] != '\0') {
                     73:                if (argv[0][1] == 'q') { if (in_process) bye(0);
                     74: #ifndef INTEGRATION
                     75:                } else if (argv[0][1] == 'i') {
                     76:                        filtered= Yes;
                     77:                        cmd_prompt= "\001>";
                     78:                        eg_prompt=  "\001E";
                     79:                        raw_prompt= "\001R";
                     80:                        qn_prompt=  "\001Y";
                     81: #endif
                     82:                } else if (argv[0][1] == 'T') {
                     83:                        timing = Yes;
                     84:                } else if (argv[0][1] == 'E') {
                     85:                        extcmds = Yes;
                     86: #ifdef INTEGRATION
                     87: #ifndef NDEBUG
                     88:                } else if (argv[0][1] == 'd') {
                     89:                        dflag= Yes;
                     90: #endif NDEBUG
                     91: #endif INTEGRATION
                     92:                } else erm("I never learned about the option", argv[0], argc, pargc, pargv);
                     93:                argc -= 1;
                     94:                argv += 1;
                     95:        } else {
                     96:                if (argc == 0 || (argv[0][0] == '-' && argv[0][1] == '\0')) {
                     97:                        release(iname);
                     98:                        iname = Vnil;
                     99:                        ifile = stdin;
                    100:                } else {
                    101:                        release(iname);
                    102:                        iname = mk_text(*argv);
                    103:                        ifile = fopen(*argv, "r");
                    104:                }
                    105:                if (ifile != NULL) { if (in_process) process();
                    106:                } else erm("can't open input file", *argv, argc, pargc, pargv);
                    107:                if (ifile != NULL && ifile != stdin) fclose(ifile);
                    108:                ++argv; --argc;
                    109:        }
                    110: }
                    111: 
                    112: Hidden Procedure show_call(eargc, pargc, pargv)
                    113:  int eargc, pargc; string pargv[]; {
                    114:        int argc= pargc; string *argv= pargv;
                    115:        intlet p, pos= 4;
                    116:        fprintf(Cllerr, "    ");
                    117:        while (argc > 0) {
                    118:                fprintf(Cllerr, *argv);
                    119:                pos+= strlen(*argv);
                    120:                if (argc == eargc) p= pos-1;
                    121:                ++argv; --argc;
                    122:                if (argc > 0) {
                    123:                        putc(' ', Cllerr);
                    124:                        pos++;
                    125:                }
                    126:        }
                    127:        putc('\n', Cllerr);
                    128:        for (pos= 0; pos < p; pos++) putc(' ', Cllerr);
                    129:        fprintf(Cllerr, "^\n");
                    130: }
                    131: 
                    132: #ifdef STATMEM
                    133: #ifndef IBMPC
                    134: #undef STATMEM
                    135: #endif
                    136: #endif
                    137: 
                    138: #ifdef ebug
                    139: #ifdef IBMPC
                    140: #define PCLEAK
                    141: #ifndef STATMEM
                    142: #define STATMEM
                    143: #endif STATMEM
                    144: #endif IBMPC
                    145: #endif ebug
                    146: 
                    147: #ifdef IBMPC
                    148: Visible unsigned _stack= 6000; /* Default stack size */
                    149: #endif
                    150: 
                    151: #ifdef STATMEM
                    152: Hidden long alloccnt= 0;
                    153: #endif
                    154: 
                    155: /* Quick hack to print memory statistics */
                    156: Visible Procedure memstat(where) string where; {
                    157: #ifdef STATMEM
                    158:        long sizmem();
                    159:        fprintf(stderr, "*** %s: sizmem=%ld, sizmalloc=%ld.\n",
                    160:                        where, sizmem(), alloccnt);
                    161: #endif
                    162: }
                    163: 
                    164: Visible char*
                    165: qmalloc(syze)
                    166:        unsigned syze;
                    167: {
                    168: #ifdef STATMEM
                    169:        char *p;
                    170:        long before, sizmem();
                    171:        before= sizmem();
                    172:        p= malloc(syze);
                    173:        alloccnt += (before - sizmem());
                    174:        return p;
                    175: #else
                    176:        return malloc(syze);
                    177: #endif
                    178: }
                    179: 
                    180: Hidden Procedure init() {
                    181: #ifdef STATMEM
                    182:        allmem();
                    183:        memstat("before init");
                    184: #endif
                    185:        set_file_names();
                    186: #ifdef INTEGRATION
                    187:        initgram(); /* set refcnt to infinity */
                    188:        initsugg(); /* set refcnt to infinity */
                    189:        memstat("after gram/sugg");
                    190: #endif
                    191: #ifdef PCLEAK
                    192:        initsou();
                    193:        initfpr();
                    194: #endif
                    195:        initmem();
                    196:        initenv();
                    197:        initnum();
                    198:        initsyn();
                    199: #ifndef PCLEAK
                    200:        initsou();
                    201:        initfpr();
                    202: #endif
                    203:        init_scr();
                    204:        initerr();
                    205:        initsig();
                    206:        initint();
                    207: #ifdef TYPE_CHECK
                    208:        initpol();
                    209:        inittyp();
                    210: #endif
                    211: #ifdef INTEGRATION
                    212:        initfile();
                    213:        initkeys();
                    214: #ifdef unix
                    215:        initunix();
                    216: #endif
                    217:        initterm();
                    218:        initbtop();
                    219: #endif
                    220:        end_init();
                    221:        setprmnv();
                    222:        getprmnv();
                    223:        memstat("after init");
                    224:        showtime("after initialization");
                    225: }
                    226: 
                    227: Visible Procedure
                    228: endall()
                    229: {
                    230:        endsou();
                    231:        endsyn();
                    232:        endnum();
                    233:        endenv();
                    234:        endsta();
                    235: #ifdef INTEGRATION
                    236:        endscr();
                    237:        endterm();
                    238:        /* enddemo(); ? */
                    239:        endbtop();
                    240: #ifdef unix
                    241:        endunix();
                    242: #endif
                    243:        enderro();
                    244:        endsugg();
                    245: #endif INTEGRATION
                    246: }
                    247: 
                    248: /* ******************************************************************** */
                    249: /*             immediate command                                       */
                    250: /* ******************************************************************** */
                    251: 
                    252: Hidden bool sa_expr(e) parsetree *e; {
                    253:        return is_expr(Char(tx)) ? (*e= expr(ceol), Yes) : No;
                    254: }
                    255: 
                    256: Hidden Procedure special() {
                    257:        switch(Char(tx++)) {
                    258:                case ':':       skipsp(&tx);
                    259:                                if (Char(tx) == ':') lst_uhds();
                    260:                                else edit_unit();
                    261:                                break;
                    262:                case '=':       skipsp(&tx);
                    263:                                if (Char(tx) == '=') lst_ttgs();
                    264:                                else edit_target();
                    265:                                break;
                    266:                case '!':       system(tx); break;
                    267:                        /* Obey the rest of the line as an OS command */
                    268:                default:        syserr(MESS(3700, "special"));
                    269:        }
                    270: }
                    271: 
                    272: Visible Procedure imm_command() {
                    273:        parsetree codeseq= NilTree;
                    274:        parsetree c= NilTree, d= NilTree, e= NilTree; value v; int level;
                    275:        cntxt= In_command; still_ok= Yes; interrupted= No;
                    276:        terminated= No;
                    277:        resexp= Voi; lino= 0;
                    278:        level= ilev();
                    279:        if (!still_ok) return;
                    280:        if (level > 0) parerr(MESS(3701, "outer indentation not zero"));
                    281:        else if (findceol(), Ceol(tx));
                    282:        else if (Char(tx) == ':' || Char(tx) == '=' || Char(tx) == '!')
                    283:                if (interactive) special();
                    284:                else parerr(MESS(3702, "special commands only interactively"));
                    285:        else if (sa_expr(&e)) {
                    286:                if (still_ok) fix_nodes(&e, &codeseq);
                    287:                showtime("after fix_nodes");
                    288:                curline= e; curlino= one;
                    289:                v= evalthread(codeseq);
                    290:                if (still_ok) { wri(v, Yes, No, No); newline(); }
                    291:                release(v); release(e);
                    292:                showtime("after evaluation");
                    293:        } else if (unit_keyword()) {
                    294:                create_unit();
                    295:        } else if (quit_keyword()) terminated= Yes;
                    296:        else if (term_com(&c)) {
                    297:                release(c);
                    298:                parerr(MESS(3703, "terminating commands only allowed in units and refinements"));
                    299:        } else if (control_command(&c) || simple_command(&c, &d)) {
                    300:                        /* control_command MUST come before simple above */
                    301:                if (still_ok) fix_nodes(&c, &codeseq);
                    302:                showtime("after fix_nodes");
                    303:                curline= c; curlino= one;
                    304:                execthread(codeseq);
                    305:                release(c); release(d);
                    306:                showtime("after execution");
                    307:        } else parerr(MESS(3704, "I don't recognise this as a command"));
                    308: }
                    309: 
                    310: Hidden Procedure process() {
                    311:        re_screen();
                    312:        re_env();
                    313:        f_lino= 0;
                    314:        while (!Eof && !terminated) {
                    315: #ifdef EXT_COMMAND
                    316:                e_done();
                    317: #endif
                    318:                imm_command();
                    319:                if (!interactive && !still_ok) bye(1);
                    320:        }
                    321: }

unix.superglobalmegacorp.com

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