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

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: }

unix.superglobalmegacorp.com

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