Annotation of 43BSDReno/contrib/isode-beta/psap/pl2pe.c, revision 1.1.1.1

1.1       root        1: /* pl2pe.c - presentation list to presentation element */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/psap/RCS/pl2pe.c,v 7.0 89/11/23 22:13:07 mrose Rel $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/psap/RCS/pl2pe.c,v 7.0 89/11/23 22:13:07 mrose Rel $
                      9:  *
                     10:  *
                     11:  * $Log:       pl2pe.c,v $
                     12:  * Revision 7.0  89/11/23  22:13:07  mrose
                     13:  * Release 6.0
                     14:  * 
                     15:  */
                     16: 
                     17: /*
                     18:  *                               NOTICE
                     19:  *
                     20:  *    Acquisition, use, and distribution of this module and related
                     21:  *    materials are subject to the restrictions of a license agreement.
                     22:  *    Consult the Preface in the User's Manual for the full terms of
                     23:  *    this agreement.
                     24:  *
                     25:  */
                     26: 
                     27: 
                     28: /* Presentation lists are a human-readable, unambiguous way of describing
                     29:    a presentation element.
                     30: 
                     31:     SYNTAX:            list    ::      "(" class code arguments ")"
                     32: 
                     33:                        class   ::      "UNIV" / "APPL" / "CONT" / "PRIV"
                     34: 
                     35:                        code    ::      name / number
                     36: 
                     37:                        name    ::      letter (letter / digit / dash)*
                     38: 
                     39:                        number  ::      "0x" [0-f] [0-f]* /
                     40:                                        "0" [0-7] [0-7]* /
                     41:                                        [1-9] [0-9]* /
                     42:                                        "\"" (IA5 subset)* "\""
                     43: 
                     44:                        arguments::     primitive / constructor
                     45: 
                     46:                        primitive::     number number*
                     47: 
                     48:                        constructor::   list*
                     49: 
                     50:    NOTE WELL:  A single "number" must be representable in no more than
                     51:                (sizeof (int)) bytes.
                     52:  */
                     53: 
                     54: 
                     55: /* LINTLIBRARY */
                     56: 
                     57: #include <ctype.h>
                     58: #include <stdio.h>
                     59: #include "psap.h"
                     60: 
                     61: /*    DATA */
                     62: 
                     63: typedef struct PList {
                     64:     u_char pl_code;
                     65: #define        PL_CODE_LPAR    0
                     66: #define        PL_CODE_NAME    1
                     67: #define        PL_CODE_NUM     2
                     68: #define        PL_CODE_RPAR    3
                     69: 
                     70:     union {
                     71:        char    un_pl_name[BUFSIZ];
                     72:        int     un_pl_num;
                     73:     }                       pl_un;
                     74: #define        pl_name pl_un.un_pl_name
                     75: #define        pl_num  pl_un.un_pl_num
                     76: }                      PList, *PL;
                     77: 
                     78: 
                     79: PE  pl2pe_aux ();
                     80: 
                     81: /*  */
                     82: 
                     83: PE     pl2pe (ps)
                     84: register PS    ps;
                     85: {
                     86:     struct PList    pls;
                     87:     register PL            pl = &pls;
                     88: 
                     89:     if (pl_read_lex (ps, pl) == NOTOK) {
                     90:        if (ps -> ps_errno == PS_ERR_EOF)
                     91:            ps -> ps_errno = PS_ERR_NONE;
                     92:        return NULLPE;
                     93:     }
                     94:     if (pl -> pl_code != PL_CODE_LPAR)
                     95:        return ps_seterr (ps, PS_ERR_XXX, NULLPE);
                     96: 
                     97:     return pl2pe_aux (ps, pl);
                     98: }
                     99:     
                    100: /*  */
                    101: 
                    102: static PE  pl2pe_aux (ps, pl)
                    103: register PS    ps;
                    104: register PL    pl;
                    105: {
                    106:     PElementClass   class;
                    107:     PElementID     id;
                    108:     register PE            pe;
                    109: 
                    110:     if (pl_read_class (ps, pl, &class) == NOTOK)
                    111:        return NULLPE;
                    112:     if (pl_read_id (ps, pl, class, &id) == NOTOK)
                    113:        return NULLPE;
                    114: 
                    115:     if ((pe = pe_alloc (class, PE_FORM_PRIM, id)) == NULLPE)
                    116:        return ps_seterr (ps, PS_ERR_NMEM, NULLPE);
                    117: 
                    118:     if (pl_read_lex (ps, pl) == NOTOK)
                    119:        return NULLPE;
                    120:     switch (pl -> pl_code) {
                    121:        case PL_CODE_LPAR: 
                    122:            if (pl_read_cons (ps, pl, &pe -> pe_cons) == NOTOK)
                    123:                goto you_lose;  /* else fall */
                    124:        case PL_CODE_RPAR: 
                    125:            pe -> pe_form = PE_FORM_CONS;
                    126:            break;
                    127: 
                    128:        case PL_CODE_NUM: 
                    129:            if (pl_read_prim (ps, pl, pe) == NOTOK)
                    130:                goto you_lose;
                    131:            break;
                    132: 
                    133:        default: 
                    134:            ps -> ps_errno = PS_ERR_XXX;
                    135:            goto you_lose;
                    136:     }
                    137:     return pe;
                    138: 
                    139: you_lose: ;
                    140:     pe_free (pe);
                    141:     return NULLPE;
                    142: }
                    143: 
                    144: /*  */
                    145: 
                    146: static int pl_read_class (ps, pl, class)
                    147: register PS    ps;
                    148: register PL    pl;
                    149: register PElementClass *class;
                    150: {
                    151:     register int    i;
                    152: 
                    153:     if (pl_read_lex (ps, pl) == NOTOK)
                    154:        return NOTOK;
                    155:     if (pl -> pl_code != PL_CODE_NAME)
                    156:        return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    157: 
                    158:     if ((i = pl_read_name (pl -> pl_name, pe_classlist, pe_maxclass)) == NOTOK)
                    159:        return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    160: 
                    161:     *class = i;
                    162:     return OK;
                    163: }
                    164: 
                    165: /*  */
                    166: 
                    167: static int pl_read_id (ps, pl, class, id)
                    168: register PS    ps;
                    169: register PL    pl;
                    170: register PElementClass class;
                    171: register PElementID *id;
                    172: {
                    173:     register int    i;
                    174:     register char **list;
                    175: 
                    176:     if (pl_read_lex (ps, pl) == NOTOK)
                    177:        return NOTOK;
                    178:     switch (pl -> pl_code) {
                    179:        case PL_CODE_NAME: 
                    180:            switch (class) {
                    181:                case PE_CLASS_UNIV: 
                    182:                    list = pe_univlist, i = pe_maxuniv;
                    183:                    break;
                    184:                case PE_CLASS_APPL: 
                    185:                    list = pe_applist, i = pe_maxappl;
                    186:                    break;
                    187:                default: 
                    188:                    list = NULL, i = 0;
                    189:                    break;
                    190:                case PE_CLASS_PRIV:
                    191:                    list = pe_privlist, i = pe_maxpriv;
                    192:                    break;
                    193:            }
                    194:            if ((i = pl_read_name (pl -> pl_name, list, i)) == NOTOK)
                    195:                return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    196:            break;
                    197: 
                    198:        case PL_CODE_NUM: 
                    199:            i = pl -> pl_num;
                    200:            break;
                    201: 
                    202:        default: 
                    203:            return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    204:     }
                    205: 
                    206:     *id = i;
                    207:     return OK;
                    208: }
                    209: 
                    210: /*  */
                    211: 
                    212: static int  pl_read_name (name, list, n)
                    213: register char *name,
                    214:             **list;
                    215: register int   n;
                    216: {
                    217:     register int    i;
                    218:     register char  *bp;
                    219: 
                    220:     for (i = n; i > 0; i--)
                    221:        if ((bp = *list++) && strcmp (bp, name) == 0)
                    222:            return (n - i);
                    223: 
                    224:     return NOTOK;
                    225: }
                    226: 
                    227: /*  */
                    228: 
                    229: static int  pl_read_cons (ps, pl, pe)
                    230: register PS    ps;
                    231: register PL    pl;
                    232: register PE    *pe;
                    233: {
                    234:     register PE            p,
                    235:                    q;
                    236: 
                    237:     if ((p = pl2pe_aux (ps, pl)) == NULLPE)
                    238:        return NOTOK;
                    239:     *pe = p;
                    240: 
                    241:     for (q = p;; q = q -> pe_next = p) {
                    242:        if (pl_read_lex (ps, pl) == NOTOK)
                    243:            return NOTOK;
                    244:        switch (pl -> pl_code) {
                    245:            case PL_CODE_LPAR: 
                    246:                if ((p = pl2pe_aux (ps, pl)) == NULLPE)
                    247:                    return NOTOK;
                    248:                break;
                    249: 
                    250:            default: 
                    251:                return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    252: 
                    253:            case PL_CODE_RPAR: 
                    254:                return OK;
                    255:        }
                    256:     }
                    257: }
                    258: 
                    259: /*  */
                    260: 
                    261: static int  pl_read_prim (ps, pl, pe)
                    262: register PS    ps;
                    263: register PL    pl;
                    264: register PE    pe;
                    265: {
                    266:     register int    i,
                    267:                     len,
                    268:                     n;
                    269:     register PElementData dp,
                    270:                          ep;
                    271: 
                    272:     if ((len = pl -> pl_num) == 0)
                    273:        goto out;
                    274:     if ((dp = PEDalloc (len)) == NULLPED)
                    275:        return ps_seterr (ps, PS_ERR_NMEM, NOTOK);
                    276: 
                    277:     pe -> pe_prim = dp, pe -> pe_len = len;
                    278: 
                    279:     for (ep = dp + len; dp < ep;) {
                    280:        i = min (ep - dp, sizeof (int));
                    281:        if (pl_read_lex (ps, pl) == NOTOK)
                    282:            return NOTOK;
                    283:        if (pl -> pl_code != PL_CODE_NUM)
                    284:            return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    285:        n = pl -> pl_num;
                    286:        while (i-- > 0)
                    287:            *dp++ = (n >> (i * 8)) & 0xff;
                    288:     }
                    289: 
                    290: out: ;
                    291:     if (pl_read_lex (ps, pl) == NOTOK)
                    292:        return NOTOK;
                    293:     if (pl -> pl_code != PL_CODE_RPAR)
                    294:        return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    295: 
                    296:     return OK;
                    297: }
                    298: 
                    299: /*  */
                    300: 
                    301: #ifdef XXX
                    302: static int  pl_read_lex (ps, pl)
                    303: register PS    ps;
                    304: register PL    pl;
                    305: {
                    306:     int     i = pl_read_lex_aux (ps, pl);
                    307: 
                    308:     fprintf (stderr, "pl_read_lex returns ");
                    309:     if (i == NOTOK) {
                    310:        fprintf (stderr, "NOTOK [%s]\n", ps_error (ps -> ps_errno));
                    311:        return NOTOK;
                    312:     }
                    313:     switch (pl -> pl_code) {
                    314:        case PL_CODE_LPAR: 
                    315:            fprintf (stderr, "LPAR");
                    316:            break;
                    317:        case PL_CODE_RPAR: 
                    318:            fprintf (stderr, "RPAR");
                    319:            break;
                    320:        case PL_CODE_NAME: 
                    321:            fprintf (stderr, "NAME \"%s\"", pl -> pl_name);
                    322:            break;
                    323:        case PL_CODE_NUM: 
                    324:            fprintf (stderr, "NUM 0x%x", pl -> pl_num);
                    325:            break;
                    326:        default: 
                    327:            fprintf (stderr, "code %d", pl -> pl_code);
                    328:            break;
                    329:     }
                    330:     fprintf (stderr, "\n");
                    331:     if (pl -> pl_code == PL_CODE_RPAR)
                    332:        sleep(1);
                    333: 
                    334:     return i;
                    335: }
                    336: 
                    337: #define        pl_read_lex     pl_read_lex_aux
                    338: #endif
                    339: 
                    340: /*  */
                    341: 
                    342: static int  pl_read_lex (ps, pl)
                    343: register PS    ps;
                    344: register PL    pl;
                    345: {
                    346:     register int    base,
                    347:                     n;
                    348:     register char  *bp;
                    349:     byte    c;
                    350: 
                    351:     do {
                    352:        if (pl_read (ps, &c) == NOTOK)
                    353:            return NOTOK;
                    354:     } while (isspace (c));
                    355: 
                    356:     switch (c) {
                    357:        case '(': 
                    358:            pl -> pl_code = PL_CODE_LPAR;
                    359:            return OK;
                    360:        case ')': 
                    361:            pl -> pl_code = PL_CODE_RPAR;
                    362:            return OK;
                    363: 
                    364:        case ';':
                    365:            do {
                    366:                if (pl_read (ps, &c) == NOTOK)
                    367:                    return NOTOK;
                    368:            } while (c != '\n');
                    369:            return pl_read_lex (ps, pl);
                    370: 
                    371:        default: 
                    372:            if (isalpha (c)) {
                    373:                pl -> pl_code = PL_CODE_NAME;
                    374:                bp = pl -> pl_name;
                    375:                while (isalnum (c) || c == '-') {
                    376:                    *bp++ = c;
                    377:                    if (pl_read (ps, &c) == NOTOK)
                    378:                        return NOTOK;
                    379:                }
                    380:                *bp = NULL;
                    381:                ps -> ps_scratch = c;
                    382:                return OK;
                    383:            }
                    384: 
                    385:            if (c == '"') {
                    386:                pl -> pl_code = PL_CODE_NUM;
                    387:                for (n = 0;;) {
                    388:                    if (pl_read (ps, &c) == NOTOK)
                    389:                        return NOTOK;
                    390:                    if (c == '"') {
                    391:                        pl -> pl_num = n;
                    392:                        return OK;
                    393:                    }
                    394:                    n = (n << 8) | (c & 0xff);
                    395:                }
                    396:            }
                    397: 
                    398:            if (!isdigit (c))
                    399:                return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    400: 
                    401:            pl -> pl_code = PL_CODE_NUM;
                    402:            if (c == '0') {
                    403:                if (pl_read (ps, &c) == NOTOK)
                    404:                    return NOTOK;
                    405:                if (c == 'x' || c == 'X') {
                    406:                    base = 16;
                    407:                    if (pl_read (ps, &c) == NOTOK)
                    408:                        return NOTOK;
                    409:                }
                    410:                else {
                    411:                    base = 8;
                    412:                    if (c < '0' || c > '7') {
                    413:                        pl -> pl_num = 0;
                    414:                        ps -> ps_scratch = c;
                    415:                        return OK;
                    416:                    }
                    417:                }
                    418:            }
                    419:            else
                    420:                base = 10;
                    421: 
                    422:            for (n = 0;;) {
                    423:                switch (base) {
                    424:                    case 10: 
                    425:                        if (c < '0' || c > '9')
                    426:                            return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    427:                        break;
                    428: 
                    429:                    case 8: 
                    430:                        if (c < '0' || c > '7')
                    431:                            return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    432:                        break;
                    433: 
                    434:                    case 16: 
                    435:                        if (c >= '0' && c <= '9')
                    436:                            break;
                    437:                        if (c >= 'A' && c <= 'F')
                    438:                            c += 'a' - 'A';
                    439:                        else
                    440:                            if (c < 'a' || c > 'f')
                    441:                                return ps_seterr (ps, PS_ERR_XXX, NOTOK);
                    442:                        c += '9' + 1 - 'a';
                    443:                        break;
                    444:                }
                    445:                n = (n * base) + c - '0';
                    446:                if (pl_read (ps, &c) == NOTOK)
                    447:                    return NOTOK;
                    448:                if (!isxdigit (c)) {
                    449:                    pl -> pl_num = n;
                    450:                    ps -> ps_scratch = c;
                    451:                    return OK;
                    452:                }
                    453:            }
                    454:     }
                    455: }
                    456: 
                    457: /*  */
                    458: 
                    459: static int pl_read (ps, c)
                    460: register PS    ps;
                    461: register byte  *c;
                    462: {
                    463:     if (ps -> ps_scratch) {
                    464:        *c = ps -> ps_scratch;
                    465:        ps -> ps_scratch = 0;
                    466:        return OK;
                    467:     }
                    468: 
                    469:     return ps_read (ps, c, 1);
                    470: }

unix.superglobalmegacorp.com

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