|
|
1.1 root 1: /* ps2pe.c - presentation stream to presentation element */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/psap/RCS/ps2pe.c,v 7.1 90/07/27 08:47:25 mrose Exp $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/psap/RCS/ps2pe.c,v 7.1 90/07/27 08:47:25 mrose Exp $
9: *
10: *
11: * $Log: ps2pe.c,v $
12: * Revision 7.1 90/07/27 08:47:25 mrose
13: * update
14: *
15: * Revision 7.0 89/11/23 22:13:18 mrose
16: * Release 6.0
17: *
18: */
19:
20: /*
21: * NOTICE
22: *
23: * Acquisition, use, and distribution of this module and related
24: * materials are subject to the restrictions of a license agreement.
25: * Consult the Preface in the User's Manual for the full terms of
26: * this agreement.
27: *
28: */
29:
30:
31: /* LINTLIBRARY */
32:
33: #include <stdio.h>
34: #include "psap.h"
35: #include "tailor.h"
36:
37: /* */
38:
39: PE ps2pe_aux (ps, top, all)
40: register PS ps;
41: int top,
42: all;
43: {
44: register PElementLen len;
45: PElementClass class;
46: PElementForm form;
47: PElementID id;
48: register PE pe;
49:
50: if (top && ps_prime (ps) == NOTOK)
51: return NULLPE;
52:
53: if (ps_read_id (ps, top, &class, &form, &id) == NOTOK)
54: return NULLPE;
55: if ((pe = pe_alloc (class, form, id)) == NULLPE)
56: return ps_seterr (ps, PS_ERR_NMEM, NULLPE);
57: if (ps_read_len (ps, &pe -> pe_len) == NOTOK)
58: goto you_lose;
59:
60: if (all == 0)
61: return pe;
62: len = pe -> pe_len;
63: switch (pe -> pe_form) {
64: case PE_FORM_PRIM:
65: if (len == PE_LEN_INDF) {
66: (void) ps_seterr (ps, PS_ERR_INDF, NULLPE);
67: goto you_lose;
68: }
69: if (len > 0) {
70: if (ps -> ps_inline) { /* "ultra-efficiency"... */
71: if (ps -> ps_base == NULLCP || ps -> ps_cnt < len) {
72: (void) ps_seterr (ps, PS_ERR_EOF, NULLPE);
73: goto you_lose;
74: }
75: pe -> pe_inline = 1;
76: pe -> pe_prim = (PElementData) ps -> ps_ptr;
77: ps -> ps_ptr += len, ps -> ps_cnt -= len;
78: ps -> ps_byteno += len;
79: }
80: else {
81: if ((pe -> pe_prim = PEDalloc (len)) == NULLPED) {
82: (void) ps_seterr (ps, PS_ERR_NMEM, NULLPE);
83: goto you_lose;
84: }
85: if (ps_read (ps, pe -> pe_prim, len) == NOTOK) {
86: #ifdef DEBUG
87: SLOG (psap_log, LLOG_DEBUG, NULLCP,
88: ("error reading primitive, %d bytes: %s",
89: len, ps_error (ps -> ps_errno)));
90: #endif
91: goto you_lose;
92: }
93: }
94: }
95: break;
96:
97: case PE_FORM_CONS:
98: if (len != 0 && ps_read_cons (ps, &pe -> pe_cons, len) == NOTOK)
99: goto you_lose;
100: break;
101: }
102:
103: return pe;
104:
105: you_lose: ;
106: #ifdef DEBUG
107: if (psap_log -> ll_events & LLOG_DEBUG) {
108: LLOG (psap_log, LLOG_PDUS, ("PE read thus far"));
109: pe2text (psap_log, pe, 1, NOTOK);
110: }
111: #endif
112:
113: pe_free (pe);
114: return NULLPE;
115: }
116:
117: /* */
118:
119: static int pe_id_overshift = PE_ID_MASK << (PE_ID_BITS - (PE_ID_SHIFT + 1));
120:
121:
122: int ps_read_id (ps, top, class, form, id)
123: register PS ps;
124: int top;
125: register PElementClass *class;
126: register PElementForm *form;
127: register PElementID *id;
128: {
129: byte c,
130: d;
131: register PElementID j;
132:
133: if (ps_read (ps, &c, 1) == NOTOK) {
134: if (top && ps -> ps_errno == PS_ERR_EOF)
135: ps -> ps_errno = PS_ERR_NONE;
136: else {
137: #ifdef DEBUG
138: SLOG (psap_log, LLOG_DEBUG, NULLCP,
139: ("error reading initial octet: %s", ps_error (ps -> ps_errno)));
140: #endif
141: }
142:
143: return NOTOK;
144: }
145:
146: *class = (c & PE_CLASS_MASK) >> PE_CLASS_SHIFT;
147: *form = (c & PE_FORM_MASK) >> PE_FORM_SHIFT;
148: j = (c & PE_CODE_MASK);
149:
150: if (j == PE_ID_XTND)
151: for (j = 0;; j <<= PE_ID_SHIFT) {
152: if (ps_read (ps, &d, 1) == NOTOK) {
153: if (ps -> ps_errno == PS_ERR_EOF)
154: ps -> ps_errno = PS_ERR_EOFID;
155: return NOTOK;
156: }
157:
158: j |= d & PE_ID_MASK;
159: if (!(d & PE_ID_MORE))
160: break;
161: if (j & pe_id_overshift)
162: return ps_seterr (ps, PS_ERR_OVERID, NOTOK);
163: }
164: *id = j;
165: DLOG (psap_log, LLOG_DEBUG, ("class=%d form=%d id=%d",*class, *form, *id));
166:
167: return OK;
168: }
169:
170: /* */
171:
172: int ps_read_len (ps, len)
173: register PS ps;
174: register PElementLen *len;
175: {
176: register int i;
177: register PElementLen j;
178: byte c;
179:
180: if (ps_read (ps, &c, 1) == NOTOK) {
181: #ifdef DEBUG
182: SLOG (psap_log, LLOG_DEBUG, NULLCP,
183: ("error reading initial length octet: %s",
184: ps_error (ps -> ps_errno)));
185: #endif
186:
187: return NOTOK;
188: }
189:
190: if ((i = c) & PE_LEN_XTND) {
191: if ((i &= PE_LEN_MASK) > sizeof (PElementLen))
192: return ps_seterr (ps, PS_ERR_OVERLEN, NOTOK);
193:
194: if (i) {
195: for (j = 0; i-- > 0;) {
196: if (ps_read (ps, &c, 1) == NOTOK) {
197: if (ps -> ps_errno == PS_ERR_EOF)
198: ps -> ps_errno = PS_ERR_EOFLEN;
199: return NOTOK;
200: }
201:
202: j = (j << 8) | (c & 0xff);
203: }
204: *len = j;
205: }
206: else
207: *len = PE_LEN_INDF;
208: }
209: else
210: *len = i;
211: #ifdef DEBUG
212: SLOG (psap_log, LLOG_DEBUG, NULLCP, ("len=%d", *len));
213: #endif
214:
215: return OK;
216: }
217:
218: /* */
219:
220: int ps_read_cons (ps, pe, len)
221: register PS ps;
222: register PE *pe;
223: register PElementLen len;
224: {
225: register int cc;
226: register PE p,
227: q;
228:
229: cc = ps -> ps_byteno + len;
230:
231: if ((p = ps2pe_aux (ps, 0, 1)) == NULLPE) {
232: no_cons: ;
233: #ifdef DEBUG
234: if (len == PE_LEN_INDF)
235: LLOG (psap_log, LLOG_DEBUG,
236: ("error building indefinite constructor, %s",
237: ps_error (ps -> ps_errno)));
238: else
239: LLOG (psap_log, LLOG_DEBUG,
240: ("error building constructor, stream at %d, wanted %d: %s",
241: ps -> ps_byteno, cc, ps_error (ps -> ps_errno)));
242: #endif
243:
244: return NOTOK;
245: }
246: *pe = p;
247:
248: if (len == PE_LEN_INDF) {
249: if (p -> pe_class == PE_CLASS_UNIV && p -> pe_id == PE_UNIV_EOC) {
250: pe_free (p);
251: *pe = NULLPE;
252: return OK;
253: }
254: for (q = p; p = ps2pe_aux (ps, 0, 1); q = q -> pe_next = p) {
255: if (p -> pe_class == PE_CLASS_UNIV && p -> pe_id == PE_UNIV_EOC) {
256: pe_free (p);
257: return OK;
258: }
259: }
260:
261: goto no_cons;
262: }
263:
264: for (q = p;; q = q -> pe_next = p) {
265: if (cc < ps -> ps_byteno)
266: return ps_seterr (ps, PS_ERR_LEN, NOTOK);
267: if (cc == ps -> ps_byteno)
268: return OK;
269: if ((p = ps2pe_aux (ps, 0, 1)) == NULLPE)
270: goto no_cons;
271: }
272: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.