|
|
1.1 ! root 1: /* str2pe.c - create an Inline CONStructor PElement */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/psap/RCS/str2pe.c,v 7.0 89/11/23 22:13:47 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/psap/RCS/str2pe.c,v 7.0 89/11/23 22:13:47 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: str2pe.c,v $ ! 12: * Revision 7.0 89/11/23 22:13:47 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: /* LINTLIBRARY */ ! 29: ! 30: #include <stdio.h> ! 31: #include "psap.h" ! 32: #include "tailor.h" ! 33: ! 34: /* */ ! 35: ! 36: PElementLen str_get_len (); ! 37: ! 38: /* */ ! 39: ! 40: #define seterr(e,v) (*result = (e), (v)) ! 41: ! 42: ! 43: PE str2pe (s, len, advance, result) ! 44: char *s; ! 45: int len, ! 46: *advance, ! 47: *result; ! 48: { ! 49: #ifdef DEBUG ! 50: int n = len; ! 51: #endif ! 52: char *sp; ! 53: PElementClass class; ! 54: PElementForm form; ! 55: PElementID id; ! 56: PElementLen plen; ! 57: register PE pe; ! 58: ! 59: *result = PS_ERR_NONE; ! 60: ! 61: sp = s; ! 62: if (str_get_start (&sp, &len, &class, &form, &id, &plen, result) == NOTOK) ! 63: return NULLPE; ! 64: ! 65: if (form == PE_FORM_CONS) ! 66: form = PE_FORM_ICONS; ! 67: ! 68: if (plen == PE_LEN_INDF ! 69: && (plen = str_get_len (sp, len, result)) == PE_LEN_INDF) ! 70: return NULLPE; ! 71: ! 72: if ((pe = pe_alloc (class, form, id)) == NULLPE) ! 73: return seterr (PS_ERR_NMEM, NULLPE); ! 74: ! 75: pe -> pe_ilen = sp - s; ! 76: if (form == PE_FORM_ICONS) { ! 77: pe -> pe_len = pe -> pe_ilen + plen; ! 78: pe -> pe_prim = (PElementData) s; ! 79: } ! 80: else ! 81: if (pe -> pe_len = plen) ! 82: pe -> pe_prim = (PElementData) sp; ! 83: ! 84: pe -> pe_inline = 1; ! 85: ! 86: if (advance) ! 87: *advance = pe -> pe_ilen + plen; ! 88: ! 89: #ifdef DEBUG ! 90: if (psap_log -> ll_events & LLOG_PDUS) ! 91: pe2text (psap_log, pe, 1, n); ! 92: #endif ! 93: ! 94: return pe; ! 95: } ! 96: ! 97: /* */ ! 98: ! 99: static int str_get_start (sp, n, class, form, id, plen, result) ! 100: char **sp; ! 101: int *n, ! 102: *result; ! 103: PElementClass *class; ! 104: PElementForm *form; ! 105: PElementID *id; ! 106: PElementLen *plen; ! 107: { ! 108: register int i, ! 109: len; ! 110: register char *s; ! 111: byte c, ! 112: d; ! 113: register PElementID jd; ! 114: register PElementLen qlen; ! 115: ! 116: s = *sp, len = *n; ! 117: if (len-- <= 0) ! 118: return seterr (PS_ERR_EOF, NOTOK); ! 119: c = *s++; ! 120: ! 121: *class = (c & PE_CLASS_MASK) >> PE_CLASS_SHIFT; ! 122: *form = (c & PE_FORM_MASK) >> PE_FORM_SHIFT; ! 123: if ((jd = (c & PE_CODE_MASK)) == PE_ID_XTND) ! 124: for (jd = 0;; jd <<= PE_ID_SHIFT) { ! 125: if (len-- <= 0) ! 126: return seterr (PS_ERR_EOFID, NOTOK); ! 127: d = *s++; ! 128: ! 129: jd |= d & PE_ID_MASK; ! 130: if (!(d & PE_ID_MORE)) ! 131: break; ! 132: if (jd & (PE_ID_MASK << (PE_ID_SHIFT - 1))) ! 133: return seterr (PS_ERR_OVERID, NOTOK); ! 134: } ! 135: *id = jd; ! 136: #ifdef DEBUG ! 137: SLOG (psap_log, LLOG_DEBUG, NULLCP, ! 138: ("class=%d form=%d id=%d", *class, *form, *id)); ! 139: #endif ! 140: ! 141: if (len-- <= 0) ! 142: return seterr (PS_ERR_EOFLEN, NOTOK); ! 143: c = *s++; ! 144: ! 145: if ((i = c) & PE_LEN_XTND) { ! 146: if ((i &= PE_LEN_MASK) > sizeof (PElementLen)) ! 147: return seterr (PS_ERR_OVERLEN, NOTOK); ! 148: ! 149: if (i) { ! 150: for (qlen = 0; i-- > 0;) { ! 151: if (len-- <= 0) ! 152: return seterr (PS_ERR_EOFLEN, NOTOK); ! 153: c = *s++; ! 154: ! 155: qlen = (qlen << 8) | (c & 0xff); ! 156: } ! 157: ! 158: *plen = qlen; ! 159: } ! 160: else ! 161: if (*form == PE_FORM_PRIM) ! 162: return seterr (PS_ERR_INDF, NOTOK); ! 163: else ! 164: *plen = PE_LEN_INDF; ! 165: } ! 166: else ! 167: *plen = i; ! 168: #ifdef DEBUG ! 169: SLOG (psap_log, LLOG_DEBUG, NULLCP, ("len=%d", *plen)); ! 170: #endif ! 171: ! 172: *sp = s, *n = len; ! 173: ! 174: return OK; ! 175: } ! 176: ! 177: /* */ ! 178: ! 179: static PElementLen str_get_len (s, len, result) ! 180: char *s; ! 181: int len, ! 182: *result; ! 183: { ! 184: char *sp; ! 185: PElementClass class; ! 186: PElementForm form; ! 187: PElementID id; ! 188: PElementLen plen; ! 189: ! 190: for (sp = s;;) { ! 191: if (str_get_start (&sp, &len, &class, &form, &id, &plen, result) ! 192: == NOTOK) ! 193: return PE_LEN_INDF; ! 194: ! 195: if (class == PE_CLASS_UNIV && id == PE_UNIV_EOC) ! 196: return ((PElementLen) (sp - s)); ! 197: ! 198: if (plen == PE_LEN_INDF ! 199: && (plen = str_get_len (sp, len, result)) == PE_LEN_INDF) ! 200: return PE_LEN_INDF; ! 201: ! 202: sp += plen, len -= plen; ! 203: } ! 204: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.