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

1.1       root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1985. */
                      2: 
                      3: /*
                      4:   $Header: b3fpr.c,v 1.4 85/08/22 16:58:15 timo Exp $
                      5: */
                      6: 
                      7: /* B formula/predicate invocation */
                      8: #include "b.h"
                      9: #include "b0fea.h"
                     10: #include "b1obj.h"
                     11: #include "b3err.h"
                     12: #include "b3sem.h"
                     13: #include "b3sou.h"
                     14: 
                     15: #define Other 0
                     16: #define Nume 1
                     17: 
                     18: #define In 1
                     19: #define Not_in 2
                     20: #ifdef EXT_COMMAND
                     21: #define Char_ready 3
                     22: #endif
                     23: 
                     24: /*
                     25:  * Table defining all predefined functions (but not propositions).
                     26:  */
                     27: 
                     28: #ifdef EXT_COMMAND
                     29: 
                     30: extern value e_getchar();
                     31: extern value e_screensize();
                     32: extern outcome e_ch_ready();
                     33: 
                     34: #endif EXT_COMMAND
                     35: 
                     36: struct funtab {
                     37:        string f_name; literal f_adic, f_kind;
                     38:        value   (*f_fun)();
                     39:        bool f_extended;
                     40: } funtab[] = {
                     41:        {"~",  Mon, Nume, approximate},
                     42:        {"+",  Mon, Nume, copy},
                     43:        {"+",  Dya, Nume, sum},
                     44:        {"-",  Mon, Nume, negated},
                     45:        {"-",  Dya, Nume, diff},
                     46:        {"*/", Mon, Nume, numerator},
                     47:        {"/*", Mon, Nume, denominator},
                     48: 
                     49:        {"*",  Dya, Nume, prod},
                     50:        {"/",  Dya, Nume, quot},
                     51:        {"**", Dya, Nume, power},
                     52: 
                     53:        {"^",  Dya, Other, concat},
                     54:        {"^^", Dya, Other, repeat},
                     55:        {"<<", Dya, Other, adjleft},
                     56:        {"><", Dya, Other, centre},
                     57:        {">>", Dya, Other, adjright},
                     58: 
                     59:        {"#",  Mon, Other, size},
                     60:        {"#",  Dya, Other, size2},
                     61: 
                     62:        {"pi", Zer, Other, pi},
                     63:        {"e",  Zer, Other, e},
                     64: 
                     65:        {"abs",    Mon, Nume, absval},
                     66:        {"sign",   Mon, Nume, signum},
                     67:        {"floor",  Mon, Nume, floorf},
                     68:        {"ceiling",Mon, Nume, ceilf},
                     69:        {"round",  Mon, Nume, round1},
                     70:        {"round",  Dya, Nume, round2},
                     71:        {"mod",    Dya, Nume, mod},
                     72:        {"root",   Mon, Nume, root1},
                     73:        {"root",   Dya, Nume, root2},
                     74: 
                     75:        {"sin", Mon, Nume, sin1},
                     76:        {"cos", Mon, Nume, cos1},
                     77:        {"tan", Mon, Nume, tan1},
                     78:        {"atan",Mon, Nume, atn1},
                     79:        {"atan",Dya, Nume, atn2},
                     80:        {"exp", Mon, Nume, exp1},
                     81:        {"log", Mon, Nume, log1},
                     82:        {"log", Dya, Nume, log2},
                     83: 
                     84:        {"keys", Mon, Other, keys},
                     85:        {"th'of",Dya, Other, th_of},
                     86:        {"min",  Mon, Other, min1},
                     87:        {"min",  Dya, Other, min2},
                     88:        {"max",  Mon, Other, max1},
                     89:        {"max",  Dya, Other, max2},
                     90: 
                     91: #ifdef EXT_COMMAND
                     92:        /* Extended group: */
                     93: 
                     94:        {"get'char", Zer, Other, e_getchar, Yes},
                     95:        {"screen'size", Zer, Other, e_screensize, Yes},
                     96: #endif
                     97: 
                     98:        {"", Dya, Other, NULL} /*sentinel*/
                     99: };
                    100: 
                    101: Visible Procedure initfpr() {
                    102:        struct funtab *fp; value r, f, pname;
                    103:        extern bool extcmds; /* Flag set by -E option */
                    104:        for (fp= funtab; *(fp->f_name) != '\0'; ++fp) {
                    105: #ifdef EXT_COMMAND
                    106:                if (fp->f_extended && !extcmds) continue;
                    107: #endif
                    108:                /* Define function */
                    109:                r= mk_text(fp->f_name);
                    110:                f= mk_fun(fp->f_adic, (intlet) (fp-funtab), NilTree, Yes);
                    111:                pname= permkey(r, fp->f_adic);
                    112:                def_unit(pname, f);
                    113:                release(f); release(r); release(pname);
                    114:        }
                    115: 
                    116:        defprd("in", Dya, In);
                    117:        defprd("not'in", Dya, Not_in);
                    118: #ifdef EXT_COMMAND
                    119:        if (extcmds) defprd("char'ready", Zer, Char_ready);
                    120: #endif
                    121: }
                    122: 
                    123: Hidden Procedure defprd(repr, adic, pre) string repr; literal adic; intlet pre; {
                    124:        value r= mk_text(repr), p= mk_prd(adic, pre, NilTree, Yes), pname;
                    125:        pname= permkey(r, adic);
                    126:        def_unit(pname, p);
                    127:        release(p); release(r); release(pname);
                    128: }
                    129: 
                    130: /* returns if a given test/yield exists *without faults* */
                    131: Hidden bool is_funprd(t, f, adicity, func) value t, *f; literal adicity; bool func; {
                    132:        value *aa;
                    133:        if (!is_unit(t, adicity, &aa)) return No;
                    134:        if (still_ok) {
                    135:                if (func) {
                    136:                        if (!Is_function(*aa)) return No;
                    137:                } else {
                    138:                        if (!Is_predicate(*aa)) return No;
                    139:                }
                    140:                *f= *aa; return Yes;
                    141:        } else return No;
                    142: }
                    143: 
                    144: Visible bool is_zerfun(t, f) value t, *f; {
                    145:        return is_funprd(t, f, Zer, Yes);
                    146: }
                    147: 
                    148: Visible bool is_monfun(t, f) value t, *f; {
                    149:        return is_funprd(t, f, Mon, Yes);
                    150: }
                    151: 
                    152: Visible bool is_dyafun(t, f) value t, *f; {
                    153:        return is_funprd(t, f, Dya, Yes);
                    154: }
                    155: 
                    156: Visible bool is_zerprd(t, p) value t, *p; {
                    157:        return is_funprd(t, p, Zer, No);
                    158: }
                    159: 
                    160: Visible bool is_monprd(t, p) value t, *p; {
                    161:        return is_funprd(t, p, Mon, No);
                    162: }
                    163: 
                    164: Visible bool is_dyaprd(t, p) value t, *p; {
                    165:        return is_funprd(t, p, Dya, No);
                    166: }
                    167: 
                    168: Visible value pre_fun(nd1, pre, nd2) value nd1, nd2; intlet pre; {
                    169:        struct funtab *fp= &funtab[pre]; literal adic= fp->f_adic;
                    170:        if (fp->f_kind == Nume && adic != Zer) { /* check types */
                    171:                if (adic == Dya && !Is_number(nd1)) {
                    172:                        error3(MESSMAKE(fp->f_name), Vnil,
                    173:                                MESS(4500, " has a non-numeric left operand"));
                    174:                        return Vnil;
                    175:                } else if (!Is_number(nd2)) {
                    176:                        error3(MESSMAKE(fp->f_name), Vnil,
                    177:                                MESS(4501, " has a non-numeric right operand"));
                    178:                        return Vnil;
                    179:                }
                    180:        }
                    181:        switch (adic) {
                    182:                case Zer: return((*fp->f_fun)());
                    183:                case Mon: return((*fp->f_fun)(nd2));
                    184:                case Dya: return((*fp->f_fun)(nd1, nd2));
                    185:                default: syserr(MESS(3300, "pre-defined fpr wrong"));
                    186:                         /*NOTREACHED*/
                    187:        }
                    188: }
                    189: 
                    190: Visible outcome pre_prop(nd1, pre, nd2) value nd1, nd2; intlet pre; {
                    191:        switch (pre) {
                    192:        case In: return in(nd1, nd2);
                    193:        case Not_in: return !in(nd1, nd2);
                    194: #ifdef EXT_COMMAND
                    195:        case Char_ready: return e_ch_ready();
                    196: #endif
                    197:        default:
                    198:                syserr(MESS(3301, "predicate not covered by proposition"));
                    199:                /*NOTREACHED*/
                    200:        }
                    201: }

unix.superglobalmegacorp.com

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