Annotation of 43BSD/contrib/B/src/bsmall/b2fpr.c, revision 1.1

1.1     ! root        1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */
        !             2: /* $Header: b2fpr.c,v 1.1 84/06/28 00:49:12 timo Exp $ */
        !             3: 
        !             4: /* B formula/predicate invocation */
        !             5: #include "b.h"
        !             6: #include "b1obj.h"
        !             7: #include "b2fil.h"
        !             8: #include "b2env.h"
        !             9: #include "b2sem.h"
        !            10: #include "b2syn.h"
        !            11: #include "b2sou.h"
        !            12: 
        !            13: #define Other 0
        !            14: #define Nume 1
        !            15: 
        !            16: #define In ('[')
        !            17: #define Not_in (']')
        !            18: 
        !            19: /*
        !            20:  * Table defining all predefined functions (not propositions).
        !            21:  */
        !            22: 
        !            23: struct funtab {
        !            24:        char    *f_name;
        !            25:        char    f_lopri, f_hipri;
        !            26:        char    f_adic;
        !            27:        char    f_flag;
        !            28:        value   (*f_fun)();
        !            29: } funtab[] = {
        !            30:        {"~",  8, 8, Mon, Nume, approximate},
        !            31:        {"+",  8, 8, Mon, Nume, copy},
        !            32:        {"+",  2, 2, Dya, Nume, sum},
        !            33:        {"-",  5, 5, Mon, Nume, negated},
        !            34:        {"-",  2, 2, Dya, Nume, diff},
        !            35:        {"*/", 1, 8, Mon, Nume, numerator},
        !            36:        {"/*", 1, 8, Mon, Nume, denominator},
        !            37: 
        !            38:        {"*",  4, 4, Dya, Nume, prod},
        !            39:        {"/",  3, 4, Dya, Nume, quot},
        !            40:        {"**", 6, 7, Dya, Nume, power},
        !            41: 
        !            42:        {"^",  2, 2, Dya, Other, concat},
        !            43:        {"^^", 1, 8, Dya, Other, repeat},
        !            44:        {"<<", 1, 8, Dya, Other, adjleft},
        !            45:        {"><", 1, 8, Dya, Other, centre},
        !            46:        {">>", 1, 8, Dya, Other, adjright},
        !            47: 
        !            48:        {"#",  7, 7, Mon, Other, size},
        !            49:        {"#",  7, 8, Dya, Other, size2},
        !            50: 
        !            51:        {"pi", 8, 8, Zer, Other, pi},
        !            52:        {"e",  8, 8, Zer, Other, e},
        !            53: 
        !            54:        {"abs",    1, 8, Mon, Nume, absval},
        !            55:        {"sign",   1, 8, Mon, Nume, signum},
        !            56:        {"floor",  1, 8, Mon, Nume, floorf},
        !            57:        {"ceiling",1, 8, Mon, Nume, ceilf},
        !            58:        {"round",  1, 8, Mon, Nume, round1},
        !            59:        {"round",  1, 8, Dya, Nume, round2},
        !            60:        {"mod",    1, 8, Dya, Nume, mod},
        !            61:        {"root",   1, 8, Mon, Nume, root1},
        !            62:        {"root",   1, 8, Dya, Nume, root2},
        !            63: 
        !            64:        {"sin", 1, 8, Mon, Nume, sin1},
        !            65:        {"cos", 1, 8, Mon, Nume, cos1},
        !            66:        {"tan", 1, 8, Mon, Nume, tan1},
        !            67:        {"atan",1, 8, Mon, Nume, atn1},
        !            68:        {"atan",1, 8, Dya, Other, atn2},
        !            69:        {"exp", 1, 8, Mon, Nume, exp1},
        !            70:        {"log", 1, 8, Mon, Nume, log1},
        !            71:        {"log", 1, 8, Dya, Other, log2},
        !            72: 
        !            73:        {"keys", 1, 8, Mon, Other, keys},
        !            74:        {"th'of",1, 8, Dya, Other, th_of},
        !            75:        {"min",  1, 8, Mon, Other, min1},
        !            76:        {"min",  1, 8, Dya, Other, min2},
        !            77:        {"max",  1, 8, Mon, Other, max1},
        !            78:        {"max",  1, 8, Dya, Other, max2},
        !            79: 
        !            80:        {"", 0, 0, Dya, Other, NULL} /*sentinel*/
        !            81: };
        !            82: 
        !            83: Visible Procedure initfprs() {
        !            84:        struct funtab *fp; value r, f;
        !            85:        for (fp = funtab; fp->f_lopri != 0; ++fp) {
        !            86:                /* Define function */
        !            87:                r= mk_text(fp->f_name);
        !            88:                f= mk_fun(fp->f_lopri, fp->f_hipri, fp->f_adic,
        !            89:                        Pre, (txptr)(fp-funtab), /*NON-PORTABLE: remove the cast*/
        !            90:                        (txptr)Dummy, (value)Dummy, (bool)Dummy);
        !            91:                def_unit(f, r, fp->f_adic == Zer ? FZR
        !            92:                              :fp->f_adic == Mon ? FMN : FDY);
        !            93:                release(f); release(r);
        !            94:        }
        !            95: 
        !            96:        defprd("in", Dya, Pre, In);
        !            97:        defprd("not'in", Dya, Pre, Not_in);
        !            98: }
        !            99: 
        !           100: Hidden Procedure defprd(repr, adic, def, fux) string repr; literal adic, def, fux; {
        !           101:        literal ad= adic == Zer ? FZR : adic == Mon ? FMN : FDY;
        !           102:        value r= mk_text(repr), p= mk_prd(adic, def, (txptr) fux /*nasty*/, (txptr)Dummy, (value)Dummy, (bool)Dummy);
        !           103:        def_unit(p, r, ad);
        !           104:        release(p); release(r);
        !           105: }
        !           106: 
        !           107: Hidden bool is_funprd(t, f, adicity, func) value t, *f; literal adicity; bool func; {
        !           108:        value *aa, *sl= lookup(t);
        !           109:        if (sl != Pnil) return No;
        !           110:        if (!is_unit(t, adicity, &aa)) return No;
        !           111:        if (func) {
        !           112:                if (!Is_function(*aa)) return No;
        !           113:        } else {
        !           114:                if (!Is_predicate(*aa)) return No;
        !           115:        }
        !           116:        *f= *aa; return Yes;
        !           117: }
        !           118: 
        !           119: Visible bool is_zerfun(t, f) value t, *f; {
        !           120:        return is_funprd(t, f, FZR, Yes);
        !           121: }
        !           122: 
        !           123: Visible bool is_monfun(t, f) value t, *f; {
        !           124:        return is_funprd(t, f, FMN, Yes);
        !           125: }
        !           126: 
        !           127: Visible bool is_dyafun(t, f) value t, *f; {
        !           128:        return is_funprd(t, f, FDY, Yes);
        !           129: }
        !           130: 
        !           131: Visible bool is_zerprd(t, p) value t, *p; {
        !           132:        return is_funprd(t, p, FZR, No);
        !           133: }
        !           134: 
        !           135: Visible bool is_monprd(t, p) value t, *p; {
        !           136:        return is_funprd(t, p, FMN, No);
        !           137: }
        !           138: 
        !           139: Visible bool is_dyaprd(t, p) value t, *p; {
        !           140:        return is_funprd(t, p, FDY, No);
        !           141: }
        !           142: 
        !           143: char torbuf[3];
        !           144: #define Tor *tb++= Char(tx++)
        !           145: #define Rot *tb= '\0'
        !           146: 
        !           147: Visible value montor() {
        !           148:        txptr tb= torbuf; value r, f;
        !           149:        switch (Char(tx)) {
        !           150:        case '~': Tor; break;
        !           151:        case '+': Tor; break;
        !           152:        case '-': Tor; break;
        !           153:        case '*': Tor;
        !           154:                if (Char(tx) != '/') pprerr("function * is not monadic", "");
        !           155:                Tor; break;
        !           156:        case '/': Tor;
        !           157:                if (Char(tx) != '*') pprerr("function / is not monadic", "");
        !           158:                Tor; break;
        !           159:        case '#': Tor; break;
        !           160:        default:  syserr("unhandled Montormark");
        !           161:        }
        !           162:        Rot;
        !           163:        r= mk_text(torbuf);
        !           164:        f= unit_info(r, FMN);
        !           165:        release(r);
        !           166:        return f;
        !           167: }
        !           168: 
        !           169: Visible value dyator() {
        !           170:        txptr tb= torbuf; value r, f;
        !           171:        switch (Char(tx)) {
        !           172:        case '+': Tor; break;
        !           173:        case '-': Tor; break;
        !           174:        case '*': Tor;
        !           175:                {txptr tx0= tx;
        !           176:                loop:   if (Char(tx++) != '*') {tx= tx0; break;}
        !           177:                        if (Char(tx++) != '/') {tx= tx0; Tor; break;}
        !           178:                        goto loop;
        !           179:                }
        !           180:        case '/': Tor; break;
        !           181:        case '^': Tor; if (Char(tx) == '^') Tor; break;
        !           182:        case '<': Tor;
        !           183:                if (Char(tx) != '<') pprerr("order-relator instead of function", "");
        !           184:                Tor; break;
        !           185:        case '>': Tor;
        !           186:                if (Char(tx) != '<' && Char(tx) != '>')
        !           187:                        pprerr("order-relator instead of function", "");
        !           188:                Tor; break;
        !           189:        case '#': Tor; break;
        !           190:        default:  syserr("unhandled Dyatormark");
        !           191:        }
        !           192:        Rot;
        !           193:        r= mk_text(torbuf);
        !           194:        f= unit_info(r, FDY);
        !           195:        release(r);
        !           196:        return f;
        !           197: }
        !           198: 
        !           199: Visible value formula(nd1, tor, nd2) value nd1, tor, nd2; {
        !           200:        funprd *t;
        !           201:        struct funtab *fp;
        !           202:        if (!Is_function(tor)) syserr("formula called with non-function");
        !           203:        if (!xeq) return (value) Dummy;
        !           204:        t= Funprd(tor);
        !           205:        if (!(t->adic==Zer ? nd2==Vnil : (t->adic==Mon) == (nd1==Vnil)))
        !           206:                syserr("invoked formula has other adicity than invoker");
        !           207:        if (t->def == Use) {
        !           208:                value r;
        !           209:                udfpr(nd1, t, nd2, Ret);
        !           210:                r= resval; resval= Vnil;
        !           211:                return r;
        !           212:        }
        !           213:        fp= &funtab[(int)(t->fux)];
        !           214:        if (fp->f_flag == Nume && t->adic != Zer) { /* check types */
        !           215:                if (t->adic == Dya && !Is_number(nd1)) {
        !           216:                        error("left operand not a number");
        !           217:                        return Vnil;
        !           218:                } else if (!Is_number(nd2)) {
        !           219:                        error("right operand not a number");
        !           220:                        return Vnil;
        !           221:                }
        !           222:        }
        !           223:        if (t->adic == Zer) return((*fp->f_fun)());
        !           224:        else if (fp->f_adic == Mon) return((*fp->f_fun)(nd2));
        !           225:        else return((*fp->f_fun)(nd1, nd2));
        !           226: }
        !           227: 
        !           228: Visible outcome proposition(nd1, pred, nd2) value nd1, pred, nd2; {
        !           229:        funprd *p;
        !           230:        if (!Is_predicate(pred)) syserr("proposition called with non-predicate");
        !           231:        if (!xeq) return (outcome) Dummy;
        !           232:        p= Funprd(pred);
        !           233:        if (!(p->adic==Zer ? nd2==Vnil : (p->adic==Mon) == (nd1==Vnil)))
        !           234:                syserr("invoked proposition has other adicity than invoker");
        !           235:        if (p->def == Use) {
        !           236:                outcome o;
        !           237:                udfpr(nd1, p, nd2, Rep);
        !           238:                o= resout; resout= Und;
        !           239:                return o;
        !           240:        }
        !           241:        switch (p->fux) {
        !           242:        case In:
        !           243:                return in(nd1, nd2);
        !           244:        case Not_in:
        !           245:                return !in(nd1, nd2);
        !           246:        default:
        !           247:                syserr("predicate not covered by proposition");
        !           248:                return (outcome) Dummy;
        !           249:        }
        !           250: }

unix.superglobalmegacorp.com

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