|
|
1.1 ! root 1: /* pe2pl.c - presentation element to presentation list */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/psap/RCS/pe2pl.c,v 7.0 89/11/23 22:12:53 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/psap/RCS/pe2pl.c,v 7.0 89/11/23 22:12:53 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: pe2pl.c,v $ ! 12: * Revision 7.0 89/11/23 22:12:53 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: ! 62: #define bf_write() \ ! 63: if (ps_write (ps, (PElementData) buffer, (PElementLen) strlen (buffer)) == NOTOK) \ ! 64: return NOTOK ! 65: ! 66: /* */ ! 67: ! 68: int pe2pl (ps, pe) ! 69: register PS ps; ! 70: register PE pe; ! 71: { ! 72: int result; ! 73: ! 74: if ((result = pe2pl_aux (ps, pe, 0)) != NOTOK) ! 75: result = ps_flush (ps); ! 76: ! 77: return result; ! 78: } ! 79: ! 80: /* */ ! 81: ! 82: static int pe2pl_aux (ps, pe, level) ! 83: register PS ps; ! 84: register PE pe; ! 85: int level; ! 86: { ! 87: register int i, ! 88: ia5, ! 89: ia5ok; ! 90: register char *bp; ! 91: char buffer[BUFSIZ]; ! 92: register PE p; ! 93: register PElementID id; ! 94: register PElementData dp, ! 95: ep, ! 96: fp, ! 97: gp; ! 98: ! 99: (void) sprintf (buffer, "%*s( %s ", ! 100: level * 4, "", pe_classlist[pe -> pe_class]); ! 101: bf_write (); ! 102: ! 103: switch (pe -> pe_class) { ! 104: case PE_CLASS_UNIV: ! 105: if ((id = pe -> pe_id) < pe_maxuniv && (bp = pe_univlist[id])) { ! 106: if (ps_write (ps, (PElementData) bp, (PElementLen) strlen (bp)) ! 107: == NOTOK) ! 108: return NOTOK; ! 109: } ! 110: else ! 111: goto no_code; ! 112: break; ! 113: ! 114: case PE_CLASS_APPL: ! 115: if ((id = pe -> pe_id) < pe_maxappl && (bp = pe_applist[id])) { ! 116: if (ps_write (ps, (PElementData) bp, (PElementLen) strlen (bp)) ! 117: == NOTOK) ! 118: return NOTOK; ! 119: } ! 120: else ! 121: goto no_code; ! 122: ! 123: case PE_CLASS_PRIV: ! 124: if ((id = pe -> pe_id) < pe_maxpriv && (bp = pe_privlist[id])) { ! 125: if (ps_write (ps, (PElementData) bp, (PElementLen) strlen (bp)) ! 126: == NOTOK) ! 127: return NOTOK; ! 128: } /* else fall */ ! 129: ! 130: case PE_CLASS_CONT: ! 131: no_code: ; ! 132: (void) sprintf (buffer, "0x%x", pe -> pe_id); ! 133: bf_write (); ! 134: break; ! 135: } ! 136: ! 137: level++; ! 138: switch (pe -> pe_form) { ! 139: case PE_FORM_PRIM: ! 140: case PE_FORM_ICONS: ! 141: (void) sprintf (buffer, " 0x%x%c", ! 142: pe -> pe_len, pe -> pe_len ? '\n' : ' '); ! 143: bf_write (); ! 144: ! 145: if (pe -> pe_len) { ! 146: ia5ok = 0; ! 147: if (pe -> pe_form == PE_FORM_PRIM ! 148: && pe -> pe_class == PE_CLASS_UNIV) ! 149: switch (pe -> pe_id) { ! 150: case PE_PRIM_OCTS: ! 151: case PE_DEFN_IA5S: ! 152: case PE_DEFN_NUMS: ! 153: case PE_DEFN_PRTS: ! 154: case PE_DEFN_T61S: ! 155: case PE_DEFN_VTXS: ! 156: case PE_DEFN_VISS: ! 157: case PE_DEFN_GENT: ! 158: case PE_DEFN_UTCT: ! 159: case PE_DEFN_GFXS: ! 160: case PE_PRIM_ODE: ! 161: case PE_DEFN_GENS: ! 162: ia5ok = 1; ! 163: break; ! 164: ! 165: default: ! 166: break; ! 167: } ! 168: ! 169: for (ep = (dp = pe -> pe_prim) + pe -> pe_len; dp < ep;) { ! 170: i = min (ep - dp, sizeof (int)); ! 171: if (ia5 = ia5ok) { ! 172: for (gp = (fp = dp) + i; fp < gp; fp++) { ! 173: switch (*fp) { ! 174: case ' ': ! 175: continue; ! 176: case '"': ! 177: break; ! 178: default: ! 179: if (iscntrl (*fp) ! 180: || isspace (*fp) ! 181: || (*fp & 0x80)) ! 182: break; ! 183: continue; ! 184: } ! 185: ia5 = 0; ! 186: break; ! 187: } ! 188: } ! 189: (void) sprintf (buffer, ia5 ? "%*s\"" : "%*s0x", ! 190: level * 4, ""); ! 191: bp = buffer + strlen (buffer); ! 192: while (i-- > 0) { ! 193: (void) sprintf (bp, ia5 ? (i ? "%c" : "%c\"\n") ! 194: : (i ? "%02x" : "%02x\n"), *dp++); ! 195: bp += strlen (bp); ! 196: } ! 197: bf_write (); ! 198: } ! 199: } ! 200: else ! 201: level = 1; ! 202: break; ! 203: ! 204: case PE_FORM_CONS: ! 205: if (p = pe -> pe_cons) { ! 206: if (ps_write (ps, (PElementData) "\n", (PElementLen) 1) ! 207: == NOTOK) ! 208: return NOTOK; ! 209: for (p = pe -> pe_cons; p; p = p -> pe_next) ! 210: if (pe2pl_aux (ps, p, level) == NOTOK) ! 211: return NOTOK; ! 212: } ! 213: else { ! 214: if (ps_write (ps, (PElementData) " ", (PElementLen) 1) ! 215: == NOTOK) ! 216: return NOTOK; ! 217: level = 1; ! 218: } ! 219: break; ! 220: } ! 221: level--; ! 222: ! 223: (void) sprintf (buffer, "%*s)\n", level * 4, ""); ! 224: bf_write (); ! 225: ! 226: return OK; ! 227: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.