|
|
1.1 ! root 1: /* Copyright (c) Stichting Mathematisch Centrum, Amsterdam, 1984. */ ! 2: /* $Header: B1tex.c,v 1.1 84/06/28 00:48:59 timo Exp $ */ ! 3: ! 4: /* B texts */ ! 5: #include "b.h" ! 6: #include "b1obj.h" ! 7: #include "B1tlt.h" /* for Cts */ ! 8: ! 9: Visible value mk_text(m) string m; { ! 10: value v; intlet len= strlen(m); ! 11: v= grab_tex(len); ! 12: strcpy(Str(v), m); ! 13: return v; ! 14: } ! 15: ! 16: Visible bool character(v) value v; { ! 17: if (Is_text(v) && Length(v) == 1) return Yes; ! 18: else return No; ! 19: } ! 20: ! 21: Visible char charval(v) value v; { ! 22: if (!Is_text(v) || Length(v) != 1) error("value not a character"); ! 23: return *Str(v); ! 24: } ! 25: ! 26: Visible string strval(v) value v; { ! 27: return Str(v); ! 28: } ! 29: ! 30: Visible value concat(s, t) value s, t; { ! 31: value c; ! 32: if (s->type != Tex) error("in t^u, t is not a text"); ! 33: else if (t->type != Tex) error("in t^u, t is a text, but u is not"); ! 34: c= grab_tex(Length(s)+Length(t)); ! 35: strcpy(Str(c), Str(s)); strcpy(Str(c)+Length(s), Str(t)); ! 36: return c; ! 37: } ! 38: ! 39: Hidden Procedure concato(s, t) value *s; string t; { ! 40: if ((*s)->type != Tex) error("attempt to join text with non-text"); ! 41: xtndtex(s, strlen(t)); ! 42: strcat(Str(*s), t); ! 43: } ! 44: ! 45: Visible value trim(v, B, C) value v; intlet B, C; { ! 46: intlet len= Length(v), k; value w; ! 47: string vp= Str(v)+B, wp; ! 48: if (v->type != Tex) error("trim (@ or |) applied to non-text"); ! 49: if (B < 0 || C < 0 || B+C > len) ! 50: error("trim (@ or |) out of bounds"); ! 51: w= grab_tex(len-=(B+C)); wp= Str(w); ! 52: Overall *wp++= *vp++; *wp= '\0'; ! 53: return w; ! 54: } ! 55: ! 56: Visible value repeat(x, y) value x, y; { ! 57: value r; intlet i= propintlet(intval(y)); intlet xl= Length(x), p, q; ! 58: string rp, xp; ! 59: if (x->type != Tex) error("in t^^n, t is not a text"); ! 60: if (i < 0) error("in t^^n, n is negative"); ! 61: r= grab_tex(propintlet(i*xl)); rp= Str(r); ! 62: for (p= 0; p < i; p++) { ! 63: xp= Str(x); ! 64: for (q= 0; q < xl; q++) *rp++= *xp++; ! 65: } ! 66: *rp= '\0'; ! 67: return r; ! 68: } ! 69: ! 70: #define Left 'L' ! 71: #define Right 'R' ! 72: #define Centre 'C' ! 73: ! 74: Hidden value adj(x, y, side) value x, y; literal side; { ! 75: value r, v= convert(x, Yes, Yes); int i= intval(y); ! 76: intlet lv= Length(v), la, k, ls, rs; ! 77: string rp, vp; ! 78: la= propintlet(i) - lv; ! 79: if (la <= 0) return v; ! 80: r= grab_tex(lv+la); rp= Str(r); vp= Str(v); ! 81: ! 82: if (side == Left) { ls= 0; rs= la; } ! 83: else if (side == Centre) { ls= la/2; rs= (la+1)/2; } ! 84: else { ls= la; rs= 0; } ! 85: ! 86: for (k= 0; k < ls; k++) *rp++= ' '; ! 87: for (k= 0; k < lv; k++) *rp++= *vp++; ! 88: for (k= 0; k < rs; k++) *rp++= ' '; ! 89: *rp= 0; ! 90: release(v); ! 91: return r; ! 92: } ! 93: ! 94: Visible value adjleft(x, y) value x, y; { ! 95: return adj(x, y, Left); ! 96: } ! 97: ! 98: Visible value centre(x, y) value x, y; { ! 99: return adj(x, y, Centre); ! 100: } ! 101: ! 102: Visible value adjright(x, y) value x, y; { ! 103: return adj(x, y, Right); ! 104: } ! 105: ! 106: /* For reasons of efficiency, wri does not always call convert but writes ! 107: directly on the standard output. Modifications in convert should ! 108: be mirrored by changes in wri and vice versa. */ ! 109: ! 110: Visible value convert(v, coll, outer) value v; bool coll, outer; { ! 111: literal type= v->type; intlet len= Length(v), k; value *vp= Ats(v); ! 112: value t, cv; ! 113: switch (type) { ! 114: case Num: ! 115: return mk_text(convnum(v)); ! 116: case Tex: ! 117: if (outer) return copy(v); ! 118: else {string tp= (string) vp; char cs[2]; ! 119: cs[1]= '\0'; ! 120: t= mk_text("'"); ! 121: Overall { ! 122: cs[0]= *tp++; ! 123: concato(&t, cs); ! 124: if (cs[0] == '\'' || cs[0] == '`') ! 125: concato(&t, cs); ! 126: } ! 127: concato(&t, "'"); ! 128: return t; ! 129: } ! 130: case Com: ! 131: outer&= coll; ! 132: t= mk_text(coll ? "" : "("); ! 133: Overall { ! 134: concato(&t, Str(cv= convert(*vp++, No, outer))); ! 135: release(cv); ! 136: if (k != len-1) concato(&t, outer ? " " : ", "); ! 137: } ! 138: if (!coll) concato(&t, ")"); ! 139: return t; ! 140: case Lis: case ELT: ! 141: t= mk_text("{"); ! 142: Overall { ! 143: concato(&t, Str(cv= convert(*vp++, No, No))); ! 144: release(cv); ! 145: if (k != len-1) concato(&t, "; "); ! 146: } ! 147: concato(&t, "}"); ! 148: return t; ! 149: case Tab: ! 150: t= mk_text("{"); ! 151: Overall { ! 152: concato(&t, "["); ! 153: concato(&t, Str(cv= convert(Cts(*vp), Yes, No))); ! 154: release(cv); ! 155: concato(&t, "]: "); ! 156: concato(&t, Str(cv= convert(Dts(*vp++), No, No))); ! 157: release(cv); ! 158: if (k != len-1) concato(&t, "; "); ! 159: } ! 160: concato(&t, "}"); ! 161: return t; ! 162: default: ! 163: syserr("converting value of unknown type"); ! 164: return (value) Dummy; ! 165: } ! 166: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.