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

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: 
                      3: /*
                      4:   $Header: b2exp.c,v 1.4 85/08/22 16:54:36 timo Exp $
                      5: */
                      6: 
                      7: #include "b.h"
                      8: #include "b1obj.h"
                      9: #include "b2par.h"
                     10: #include "b2syn.h"
                     11: #include "b2nod.h"
                     12: #include "b2exp.h"
                     13: #include "b3err.h"
                     14: 
                     15: /* ******************************************************************** */
                     16: /*             expression                                              */
                     17: /* ******************************************************************** */
                     18: 
                     19: Visible parsetree expr(q) txptr q; {
                     20:        return collateral(q, singexpr);
                     21: }
                     22: 
                     23: Forward parsetree rsingexpr();
                     24: 
                     25: Visible parsetree singexpr(q) txptr q; {
                     26:        if (nothing(q, "expression")) return NilTree;
                     27:        else {
                     28:                expadm adm;
                     29:                initexp(&adm);
                     30:                return rsingexpr(q, &adm);
                     31:        }
                     32: }
                     33: 
                     34: Hidden Procedure initexp(adm) expadm *adm; {
                     35:        Parsed(adm)= Yes;
                     36:        N_fld(adm)= 0;
                     37:        Prop(adm)= dya_proposition;
                     38:        dya_proposition= No;
                     39: }
                     40: 
                     41: Hidden bool expr_opr() {
                     42:        return reptext_sign() || center_sign() || leftadj_sign() ||
                     43:                rightadj_sign();
                     44: }
                     45: 
                     46: Forward parsetree term(), factor(), primary(), base(), unp_expr();
                     47: Forward bool element();
                     48: 
                     49: Hidden parsetree rsingexpr(q, adm) txptr q; expadm *adm; {
                     50:        parsetree v; value w; txptr tx0= tx;
                     51:        v= term(q, adm);
                     52:        skipsp(&tx);
                     53:        if (Parsed(adm) && Text(q) && expr_opr()) {
                     54:                if (nodetype(v) == DYAF) pprerr(Prio);
                     55:                dya_formula(q, adm, &v, mk_text(textsign), L_expr, base);
                     56:        }
                     57:        skipsp(&tx);
                     58:        if (Parsed(adm) && Prop(adm)) {
                     59:                if (Text(q) && (nodetype(v) == DYAF || Level(adm) < L_expr))
                     60:                        /* predicate must follow */
                     61:                        return v; 
                     62:                else if (Text(q) && tag_operator(q, &w))
                     63:                        dya_formula(q, adm, &v, w, L_expr, unp_expr);
                     64:                else
                     65:                        parerr(MESS(2100, "no test where expected"));
                     66:        }
                     67:        if (Parsed(adm) && Text(q) && tag_operator(q, &w)) {
                     68:                if (nodetype(v) == DYAF) pprerr(Prio);
                     69:                dya_formula(q, adm, &v, w, L_expr, base);
                     70:        }
                     71:        if (!Parsed(adm)) /* v is an UNPARSED node */
                     72:                *Branch(v, UNP_TEXT)= cr_text(tx0, tx);
                     73:        upto_expr(q);
                     74:        return v;
                     75: }
                     76: 
                     77: Hidden Procedure dya_formula(q, adm, v, name, lev, fct)
                     78:        txptr q; expadm *adm; parsetree *v, (*fct)(); value name; intlet lev; {
                     79: 
                     80:        parsetree w;
                     81:        if (Level(adm) < lev) pprerr(Prio);
                     82:        N_fld(adm)+= 2;
                     83:        w= (*fct)(q, adm);
                     84:        if (Parsed(adm)) {
                     85:                N_fld(adm)-= 2;
                     86:                if (Trim(adm))
                     87:                        *v= node3(b_behead(name) ? BEHEAD : CURTAIL, *v, w);
                     88:                else
                     89:                        *v= node5(DYAF, *v, name, w, Vnil);
                     90:        } else {
                     91:                *Field(Unp_comp(adm), --N_fld(adm))= name;
                     92:                *Field(Unp_comp(adm), --N_fld(adm))= *v;
                     93:                *v= w;
                     94:        }
                     95: }
                     96: 
                     97: /* ******************************************************************** */
                     98: /*             term                                                    */
                     99: /* ******************************************************************** */
                    100: 
                    101: Hidden bool term_opr() {
                    102:        return plus_sign() || minus_sign() || join_sign();
                    103: }
                    104: 
                    105: Hidden parsetree term(q, adm) txptr q; expadm *adm; {
                    106:        parsetree v= factor(q, adm);
                    107:        skipsp(&tx);
                    108:        while (Parsed(adm) && Text(q) && term_opr()) {
                    109:                dya_formula(q, adm, &v, mk_text(textsign), L_term, factor);
                    110:                skipsp(&tx);
                    111:        }
                    112:        return v;
                    113: }
                    114: 
                    115: /* ******************************************************************** */
                    116: /*             factor                                                  */
                    117: /* ******************************************************************** */
                    118: 
                    119: Hidden parsetree factor(q, adm) txptr q; expadm *adm; {
                    120:        parsetree v= primary(q, adm);
                    121:        skipsp(&tx);
                    122:        while (Parsed(adm) && Text(q) && times_sign()) {
                    123:                dya_formula(q, adm, &v, mk_text(textsign), L_factor, primary);
                    124:                skipsp(&tx);
                    125:        }
                    126:        if (Parsed(adm) && Text(q) && over_sign())
                    127:                dya_formula(q, adm, &v, mk_text(textsign), L_factor, primary);
                    128:        return v;
                    129: }
                    130: 
                    131: /* ******************************************************************** */
                    132: /*             primary                                                 */
                    133: /* ******************************************************************** */
                    134: 
                    135: Hidden parsetree primary(q, adm) txptr q; expadm *adm; {
                    136:        parsetree v;
                    137:        v= base(q, adm);
                    138:        skipsp(&tx);
                    139:        if (Parsed(adm) && Text(q) && number_sign())
                    140:                dya_formula(q, adm, &v, mk_text(textsign), L_number, base);
                    141:        skipsp(&tx);
                    142:        if (Parsed(adm) && Text(q) && power_sign())
                    143:                dya_formula(q, adm, &v, mk_text(textsign), L_power, base);
                    144:        return v;
                    145: }
                    146: 
                    147: /* ******************************************************************** */
                    148: /*             base                                                    */
                    149: /* ******************************************************************** */
                    150: 
                    151: Forward parsetree rbase();
                    152: 
                    153: Hidden parsetree base(q, adm) txptr q; expadm *adm; {
                    154:        State(adm)= S_else;
                    155:        Level(adm)= L_expr;
                    156:        Trim(adm)= No;
                    157:        return rbase(q, adm);
                    158: }
                    159: 
                    160: Hidden bool critical(adm, v) expadm *adm; value v; {
                    161:        if (State(adm) == S_t) {
                    162:                if (b_plus(v) || b_minus(v))
                    163:                        return Level(adm) >= L_term;
                    164:                if (b_number(v))
                    165:                        return Level(adm) >= L_number;
                    166:        }
                    167:        return No;
                    168: }
                    169: 
                    170: Hidden parsetree mon_formula(q, adm, w, fct)
                    171:        txptr q; expadm *adm; value w; parsetree (*fct)(); {
                    172: 
                    173:        parsetree v;
                    174:        N_fld(adm)++;
                    175:        v= (*fct)(q, adm);
                    176:        if (Parsed(adm)) {
                    177:                N_fld(adm)--;
                    178:                return v == NilTree ? node2(TAG, w) : node4(MONF, w, v, Vnil);
                    179:        } else {
                    180:                *Field(Unp_comp(adm), --N_fld(adm))= w;
                    181:                return v;
                    182:        }
                    183: }
                    184: 
                    185: Hidden Procedure adjust_level(adm, lev) expadm *adm; intlet lev; {
                    186:        if (lev < Level(adm)) Level(adm)= lev;
                    187: }
                    188: 
                    189: Hidden parsetree rbase(q, adm) txptr q; expadm *adm; {
                    190:        parsetree v; value name;
                    191:        skipsp(&tx);
                    192:        if (Text(q) && tag_operator(q, &name)) {
                    193:                if (State(adm) == S_tt)
                    194:                        return mon_formula(q, adm, name, unp_expr);
                    195:                if (State(adm) == S_t) {
                    196:                        if (Level(adm) == L_expr || Prop(adm)) State(adm)= S_tt;
                    197:                        else if (!Trim(adm)) adjust_level(adm, L_bottom); 
                    198:                } else State(adm)= S_t;
                    199:                v= mon_formula(q, adm, name, rbase);
                    200:                if (!Trim(adm) && Parsed(adm) && nodetype(v) == MONF) 
                    201:                        adjust_level(adm, L_bottom);
                    202:                return v;
                    203:        } else if (Text(q) && (dyamon_sign() || mon_sign())) {
                    204:                name= mk_text(textsign);
                    205:                if (State(adm) == S_tt || critical(adm, name))
                    206:                        return mon_formula(q, adm, name, unp_expr);
                    207:                if (!Trim(adm)) {
                    208:                        if (State(adm) == S_t) adjust_level(adm, L_bottom);
                    209:                        else if (b_minus(name)) adjust_level(adm, L_factor);
                    210:                        else if (b_number(name)) adjust_level(adm, L_number);
                    211:                        else if (b_numtor(name) || b_denomtor(name)) 
                    212:                                adjust_level(adm, L_bottom);
                    213:                }
                    214:                State(adm)= S_else;
                    215:                if (!Trim(adm) && b_minus(name)) {
                    216:                        intlet lev= Level(adm);
                    217:                        v= mon_formula(q, adm, name, primary);
                    218:                        adjust_level(adm, lev);
                    219:                        return v;
                    220:                } else
                    221:                        return mon_formula(q, adm, name, rbase);
                    222:        } else if (Text(q) && element(q, &v)) {
                    223:                if (State(adm) == S_tt)
                    224:                        return mon_formula(q, adm, v, unp_expr);
                    225:                exp_trimmed_text(q, adm, &v);
                    226:                return v;
                    227:        } else {
                    228:                if (State(adm) == S_else) 
                    229:                        parerr(MESS(2101, "no expression where expected"));
                    230:                return NilTree;
                    231:        }
                    232: }
                    233: 
                    234: /* ******************************************************************** */
                    235: /*             element                                                 */
                    236: /* ******************************************************************** */
                    237: 
                    238: Forward bool closed_expr(), constant(), text_dis(), tlr_dis(), seltrim_tag();
                    239: 
                    240: Hidden bool element(q, v) txptr q; parsetree *v; {
                    241:        if (seltrim_tag(q, v) || closed_expr(q, v) || constant(q, v) ||
                    242:            text_dis(q, v) || tlr_dis(q, v)
                    243:           ) {
                    244:                selection(q, v);
                    245:                return Yes;
                    246:        }
                    247:        return No;
                    248: }
                    249: 
                    250: /* ******************************************************************** */
                    251: /*             (seltrim_tag)                                           */
                    252: /* ******************************************************************** */
                    253: 
                    254: Hidden bool seltrim_tag(q, v) txptr q; parsetree *v; {
                    255:        value name; txptr tx0= tx;
                    256:        if (Text(q) && is_tag(&name)) {
                    257:                txptr tx1= tx;
                    258:                skipsp(&tx);
                    259:                if (Text(q) && (sub_sign() || trim_sign())) {
                    260:                        tx= tx1;
                    261:                        *v= node2(TAG, name);
                    262:                        return Yes;
                    263:                } else {
                    264:                        release(name);
                    265:                        tx= tx0;
                    266:                }
                    267:        }
                    268:        return No;
                    269: }
                    270: 
                    271: /* ******************************************************************** */
                    272: /*             (expression)                                            */
                    273: /* ******************************************************************** */
                    274: 
                    275: Hidden bool closed_expr(q, v) txptr q; parsetree *v; {
                    276:        return open_sign() ? (*v= compound(q, expr), Yes) : No;
                    277: }
                    278: 
                    279: /* ******************************************************************** */
                    280: /*             constant                                                */
                    281: /*                                                                     */
                    282: /* note: stand_alone E<number> not allowed                             */
                    283: /* ******************************************************************** */
                    284: 
                    285: Forward bool digits();
                    286: 
                    287: Hidden bool constant(q, v) txptr q; parsetree *v; {
                    288:        if (Dig(Char(tx)) || Char(tx) == '.') {
                    289:                txptr tx0= tx;
                    290:                bool d= digits(q);
                    291:                if (Text(q) && point_sign() && !digits(q) && !d)
                    292:                        pprerr(MESS(2102, "point without digits"));
                    293:                if (Text(q) && Char(tx) == 'E' &&
                    294:                    (Dig(Char(tx+1)) || !keymark(Char(tx+1)))
                    295:                   ) {
                    296:                        tx++;
                    297:                        if (Text(q) && (plus_sign() || minus_sign()));
                    298:                        if (!digits(q)) pprerr(MESS(2103, "E not followed by exponent"));
                    299:                }
                    300:                *v= node3(NUMBER, numconst(tx0, tx), cr_text(tx0, tx));
                    301:                return Yes;
                    302:        }
                    303:        return No;
                    304: }
                    305: 
                    306: Hidden bool digits(q) txptr q; {
                    307:        txptr tx0= tx;
                    308:        while (Text(q) && Dig(Char(tx))) tx++;
                    309:        return tx > tx0;
                    310: }
                    311: 
                    312: /* ******************************************************************** */
                    313: /*             textual_display                                         */
                    314: /* ******************************************************************** */
                    315: 
                    316: Forward parsetree text_body();
                    317: 
                    318: Hidden bool text_dis(q, v) txptr q; parsetree *v; {
                    319:        if (apostrophe_sign() || quote_sign()) {
                    320:                parsetree w; value aq= mk_text(textsign);
                    321:                w= text_body(q, textsign);
                    322:                if (w == NilTree) w= node3(TEXT_LIT, mk_text(""), NilTree);
                    323:                *v= node3(TEXT_DIS, aq, w);
                    324:                return Yes;
                    325:        }
                    326:        return No;
                    327: }
                    328: 
                    329: Forward bool is_conversion();
                    330: 
                    331: Hidden parsetree text_body(q, aq) txptr q; string aq; {
                    332:        value head; parsetree tail;
                    333:        txptr tx0= tx;
                    334:        while (Text(q)) {
                    335:                if (Char(tx) == *aq || Char(tx) == '`') {
                    336:                        head= tx0 < tx ? cr_text(tx0, tx) : Vnil;
                    337:                        if (Char(tx) == Char(tx+1)) {
                    338:                                value spec= cr_text(tx, tx+1);
                    339:                                tx+= 2;
                    340:                                tail= text_body(q, aq);
                    341:                                tail= node3(TEXT_LIT, spec, tail);
                    342:                        } else {
                    343:                                parsetree e;
                    344:                                if (is_conversion(q, &e)) {
                    345:                                        tail= text_body(q, aq);
                    346:                                        tail= node3(TEXT_CONV, e, tail);
                    347:                                } else {
                    348:                                        tx++;
                    349:                                        tail= NilTree;
                    350:                                }
                    351:                        }
                    352:                        if (head == Vnil) return tail;
                    353:                        else return node3(TEXT_LIT, head, tail);
                    354:                } else
                    355:                        tx++;
                    356:        }
                    357:        parerr2(MESS(2104, "cannot find matching "), MESSMAKE(aq));
                    358:        return NilTree;
                    359: }
                    360: 
                    361: Hidden bool is_conversion(q, v) txptr q; parsetree *v; {
                    362:        if (conv_sign()) {
                    363:                txptr ftx, ttx;
                    364:                req("`", q, &ftx, &ttx);
                    365:                *v= expr(ftx); tx= ttx; 
                    366:                return Yes;
                    367:        }
                    368:        return No;
                    369: }
                    370: 
                    371: /* ******************************************************************** */
                    372: /*             table_display; list_display; range_display;             */
                    373: /* ******************************************************************** */
                    374: 
                    375: Hidden bool elt_dis(v) parsetree *v; {
                    376:        if (curlyclose_sign()) {
                    377:                *v= node1(ELT_DIS);
                    378:                return Yes;
                    379:        }
                    380:        return No;
                    381: }
                    382: 
                    383: Hidden bool range_dis(q, v) txptr q; parsetree *v; {
                    384:        txptr ftx, ttx;
                    385:        if (find("..", q, &ftx, &ttx)) {
                    386:                parsetree w;
                    387:                if (Char(ttx) == '.') { ftx++; ttx++; }
                    388:                w= singexpr(ftx); tx= ttx;
                    389:                *v= node3(RANGE_DIS, w, singexpr(q));
                    390:                return Yes;
                    391:        }
                    392:        return No;
                    393: }
                    394: 
                    395: Forward value tab_comp();
                    396: 
                    397: Hidden bool tab_dis(q, v) txptr q; parsetree *v; {
                    398:        if (Char(tx) == '[') {
                    399:                *v= node2(TAB_DIS, tab_comp(q, 1));
                    400:                return Yes;
                    401:        }
                    402:        return No;
                    403: }
                    404: 
                    405: Hidden value tab_comp(q, n) txptr q; intlet n; {
                    406:        value v; parsetree key, assoc; txptr ftx, ttx;
                    407:        if (find(";", q, &ftx, &ttx)) {
                    408:                tab_elem(ftx, &key, &assoc); tx= ttx;
                    409:                v= tab_comp(q, n+2);
                    410:        } else {
                    411:                tab_elem(q, &key, &assoc);
                    412:                v= mk_compound(n+1);
                    413:        }
                    414:        *Field(v, n-1)= key;
                    415:        *Field(v, n)= assoc;
                    416:        return v;
                    417: }
                    418: 
                    419: Hidden Procedure tab_elem(q, key, assoc) txptr q; parsetree *key, *assoc; {
                    420:        txptr ftx, ttx;
                    421:        need("[");
                    422:        req("]", q, &ftx, &ttx);
                    423:        *key= expr(ftx); tx= ttx;
                    424:        need(":");
                    425:        *assoc= singexpr(q);
                    426: }
                    427: 
                    428: Forward value list_comp();
                    429: 
                    430: Hidden Procedure list_dis(q, v) txptr q; parsetree *v; {
                    431:        *v= node2(LIST_DIS, list_comp(q, 1));
                    432: }
                    433: 
                    434: Hidden value list_comp(q, n) txptr q; intlet n; {
                    435:        value v; parsetree w; txptr ftx, ttx;
                    436:        if (find(";", q, &ftx, &ttx)) {
                    437:                w= singexpr(ftx); tx= ttx;
                    438:                v= list_comp(q, n+1);
                    439:        } else {
                    440:                w= singexpr(q);
                    441:                v= mk_compound(n);
                    442:        }
                    443:        *Field(v, n-1)= w;
                    444:        return v;
                    445: }
                    446: 
                    447: Hidden bool tlr_dis(q, v) txptr q; parsetree *v; {
                    448:        if (curlyopen_sign()) {
                    449:                skipsp(&tx);
                    450:                if (!elt_dis(v)) {
                    451:                        txptr ftx, ttx;
                    452:                        req("}", q, &ftx, &ttx);
                    453:                        if (!range_dis(ftx, v)) {
                    454:                                skipsp(&tx);
                    455:                                if (!tab_dis(ftx, v)) list_dis(ftx, v);
                    456:                        }
                    457:                        tx= ttx;
                    458:                }
                    459:                return Yes;
                    460:        }
                    461:        return No;
                    462: }
                    463: 
                    464: /* ******************************************************************** */
                    465: /*             selection                                               */
                    466: /* ******************************************************************** */
                    467: 
                    468: Visible Procedure selection(q, v) txptr q; parsetree *v; {
                    469:        txptr ftx, ttx;
                    470:        skipsp(&tx);
                    471:        while (Text(q) && sub_sign()) {
                    472:                req("]", q, &ftx, &ttx);
                    473:                *v= node3(SELECTION, *v, expr(ftx)); tx= ttx;
                    474:                skipsp(&tx);
                    475:        }
                    476: }
                    477: 
                    478: /* ******************************************************************** */
                    479: /*             trimmed_text                                            */
                    480: /* ******************************************************************** */
                    481: 
                    482: Hidden bool is_trimmed_text(q) txptr q; {
                    483:        txptr tx0= tx; bool b;
                    484:        skipsp(&tx);
                    485:        b= Text(q) && trim_sign();
                    486:        tx= tx0;
                    487:        return b;
                    488: }
                    489: 
                    490: Hidden Procedure trimmed_text(q, adm, v) txptr q; expadm *adm; parsetree *v; {
                    491:        Trim(adm)= Yes;
                    492:        while (Parsed(adm) && Text(q) && trim_sign()) {
                    493:                State(adm)= S_else;
                    494:                dya_formula(q, adm, v, mk_text(textsign), L_bottom, rbase);
                    495:                skipsp(&tx);
                    496:        }
                    497:        Trim(adm)= No;
                    498: }
                    499: 
                    500: Visible Procedure tar_trimmed_text(q, v) txptr q; parsetree *v; {
                    501:        if (is_trimmed_text(q)) {
                    502:                expadm adm;
                    503:                initexp(&adm);
                    504:                Level(&adm)= L_bottom;
                    505:                trimmed_text(q, &adm, v);
                    506:        }
                    507: }
                    508: 
                    509: Hidden Procedure exp_trimmed_text(q, adm, v)
                    510:        txptr q; expadm *adm; parsetree *v; {
                    511: 
                    512:        if (!Trim(adm) && is_trimmed_text(q)) {
                    513:                intlet s= State(adm); /* save */
                    514:                if (State(adm) == S_t) adjust_level(adm, L_bottom); 
                    515:                trimmed_text(q, adm, v);
                    516:                State(adm)= s; /* restore */
                    517:        }
                    518: }
                    519: 
                    520: /* ******************************************************************** */
                    521: /*             unp_expr, unp_test                                      */
                    522: /* ******************************************************************** */
                    523: 
                    524: Forward bool item();
                    525: 
                    526: Hidden parsetree unp_expr(q, adm) txptr q; expadm *adm; {
                    527:        value v;
                    528:        skipsp(&tx);
                    529:        if (Text(q) && item(q, &v)) {
                    530:                return mon_formula(q, adm, v, unp_expr);
                    531:        } else {
                    532:                Parsed(adm)= No;
                    533:                Unp_comp(adm)= mk_compound(N_fld(adm));
                    534:                return node3(UNPARSED, Unp_comp(adm), Vnil);
                    535:        }
                    536: }
                    537: 
                    538: Visible parsetree unp_test(q) txptr q; {
                    539:        parsetree v; expadm adm; txptr tx0= tx;
                    540:        initexp(&adm);
                    541:        v= unp_expr(q, &adm);
                    542:        *Branch(v, UNP_TEXT)= cr_text(tx0, tx);
                    543:        return v;
                    544: }
                    545: 
                    546: Visible bool tag_operator(q, v) txptr q; value *v; {
                    547:        txptr tx0= tx;
                    548:        if (Text(q) && is_tag(v)) {
                    549:                skipsp(&tx);
                    550:                if (!(Text(q) && (sub_sign() || trim_sign()))) return Yes;
                    551:                else {
                    552:                        release(*v);
                    553:                        tx= tx0;
                    554:                }
                    555:        }
                    556:        return No;
                    557: }
                    558: 
                    559: Hidden bool dm_operator(q, v) txptr q; value *v; {
                    560:        return dyamon_sign() ? (*v= mk_text(textsign), Yes) : tag_operator(q, v);
                    561: }
                    562: 
                    563: Hidden bool d_operator(q, v) txptr q; value *v; {
                    564:        return dya_sign() ? (*v= mk_text(textsign), Yes) : dm_operator(q, v);
                    565: }
                    566: 
                    567: Hidden bool m_operator(q, v) txptr q; value *v; {
                    568:        return mon_sign() ? (*v= mk_text(textsign), Yes) : dm_operator(q, v);
                    569: }
                    570: 
                    571: Hidden bool trim_operator(q, v) txptr q; value *v; {
                    572:        return trim_sign() ? (*v= mk_text(textsign), Yes) : No;
                    573: }
                    574: 
                    575: Hidden bool item(q, v) txptr q; value *v; {
                    576:        return  tag_operator(q, v) || trim_operator(q, v) ||
                    577:                d_operator(q, v) || m_operator(q, v) ||
                    578:                element(q, v);
                    579: }
                    580: 
                    581: /* ********************************************************************        */
                    582: /*             upto_expr                                               */
                    583: /* ********************************************************************        */
                    584: 
                    585: Hidden Procedure upto_expr(q) txptr q; {
                    586:        skipsp(&tx);
                    587:        if (Text(q)) {
                    588:                value dum;
                    589:                if (d_operator(q, &dum)) {
                    590:                        release(dum);
                    591:                        pprerr(Prio);
                    592:                } else parerr(MESS(2105, "something unexpected following expression"));
                    593:                tx= q;
                    594:        }
                    595: }
                    596: 
                    597: /* ********************************************************************        */
                    598: 
                    599: Hidden bool is_opr(v, s) value v; string s; {
                    600:        value t= Vnil;
                    601:        bool is= Is_text(v) && compare(v, t= mk_text(s)) == 0;
                    602:        release(t);
                    603:        return is;
                    604: }
                    605: 
                    606: Visible bool b_about(v) value v;       { return is_opr(v, "~"); }
                    607: Visible bool b_numtor(v) value v;      { return is_opr(v, "*/"); }
                    608: Visible bool b_denomtor(v) value v;    { return is_opr(v, "/*"); }
                    609: Visible bool b_plus(v) value v;        { return is_opr(v, "+"); }
                    610: Visible bool b_minus(v) value v;       { return is_opr(v, "-"); }
                    611: Visible bool b_number(v) value v;      { return is_opr(v, "#"); }
                    612: Visible bool b_behead(v) value v;      { return is_opr(v, "@"); }
                    613: Visible bool b_curtail(v) value v;     { return is_opr(v, "|"); }
                    614: #ifdef NOT_USED
                    615: Visible bool b_times(v) value v;       { return is_opr(v, "*"); }
                    616: Visible bool b_over(v) value v;        { return is_opr(v, "/"); }
                    617: Visible bool b_power(v) value v;       { return is_opr(v, "**"); }
                    618: Visible bool b_join(v) value v;                { return is_opr(v, "^"); }
                    619: Visible bool b_reptext(v) value v;     { return is_opr(v, "^^"); }
                    620: Visible bool b_center(v) value v;      { return is_opr(v, "><"); }
                    621: Visible bool b_leftadj(v) value v;     { return is_opr(v, "<<"); }
                    622: Visible bool b_rightadj(v) value v;    { return is_opr(v, ">>"); }
                    623: #endif

unix.superglobalmegacorp.com

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