|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.