|
|
1.1 root 1: /* pe2ps.c - presentation element to presentation stream */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/psap/RCS/pe2ps.c,v 7.0 89/11/23 22:12:56 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/psap/RCS/pe2ps.c,v 7.0 89/11/23 22:12:56 mrose Rel $
9: *
10: *
11: * $Log: pe2ps.c,v $
12: * Revision 7.0 89/11/23 22:12:56 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: /* DATA */
35:
36: static PElement pe_eoc = { PE_CLASS_UNIV, PE_FORM_PRIM, PE_UNIV_EOC, 0 };
37:
38: /* */
39:
40: int pe2ps_aux (ps, pe, eval)
41: register PS ps;
42: register PE pe;
43: int eval;
44: {
45: int result;
46:
47: if (eval > 0)
48: switch (pe -> pe_form) {
49: case PE_FORM_PRIM:
50: case PE_FORM_ICONS:
51: break;
52:
53: case PE_FORM_CONS:
54: (void) ps_get_abs (pe);
55: break;
56: }
57:
58: if ((result = pe2ps_aux2 (ps, pe, eval)) != NOTOK)
59: result = ps_flush (ps);
60:
61: return result;
62: }
63:
64:
65: static int pe2ps_aux2 (ps, pe, eval)
66: register PS ps;
67: register PE pe;
68: int eval;
69: {
70: register PE p;
71:
72: if (pe -> pe_form == PE_FORM_ICONS) {
73: if (ps_write_aux (ps, pe -> pe_prim, pe -> pe_len, 1) == NOTOK)
74: return NOTOK;
75:
76: return OK;
77: }
78:
79: if (ps_write_id (ps, pe) == NOTOK || ps_write_len (ps, pe) == NOTOK)
80: return NOTOK;
81:
82: switch (pe -> pe_form) {
83: case PE_FORM_PRIM:
84: if (ps_write_aux (ps, pe -> pe_prim, pe -> pe_len, 1) == NOTOK)
85: return NOTOK;
86: break;
87:
88: case PE_FORM_CONS:
89: if (eval < 0)
90: break;
91: if (pe -> pe_len) {
92: for (p = pe -> pe_cons; p; p = p -> pe_next)
93: if (pe2ps_aux2 (ps, p, 0) == NOTOK)
94: return NOTOK;
95:
96: if (pe -> pe_len == PE_LEN_INDF
97: && pe2ps_aux2 (ps, &pe_eoc, 0) == NOTOK)
98: return NOTOK;
99: }
100: break;
101: }
102:
103: return OK;
104: }
105:
106: /* */
107:
108: static int ps_write_id (ps, pe)
109: register PS ps;
110: register PE pe;
111: {
112: byte buffer[1 + sizeof (PElementID)];
113: register byte *bp = buffer;
114: PElementForm form;
115: register PElementID id;
116:
117: if ((form = pe -> pe_form) == PE_FORM_ICONS)
118: form = PE_FORM_CONS;
119: *bp = ((pe -> pe_class << PE_CLASS_SHIFT) & PE_CLASS_MASK)
120: | ((form << PE_FORM_SHIFT) & PE_FORM_MASK);
121:
122: if ((id = pe -> pe_id) < PE_ID_XTND)
123: *bp++ |= id;
124: else {
125: register byte *ep;
126: register PElementID jd;
127:
128: *bp |= PE_ID_XTND;
129:
130: ep = buffer;
131: for (jd = id; jd != 0; jd >>= PE_ID_SHIFT)
132: ep++;
133:
134: for (bp = ep; id != 0; id >>= PE_ID_SHIFT)
135: *bp-- = id & PE_ID_MASK;
136: for (bp = buffer + 1; bp < ep; bp++)
137: *bp |= PE_ID_MORE;
138:
139: bp = ++ep;
140: }
141:
142: if (ps_write (ps, buffer, bp - buffer) == NOTOK)
143: return NOTOK;
144:
145: return OK;
146: }
147:
148: /* */
149:
150: /* probably should integrate the non-PE_LEN_SMAX case with the algorithm in
151: num2prim() for a single, unified routine */
152:
153: static int ps_write_len (ps, pe)
154: register PS ps;
155: register PE pe;
156: {
157: byte buffer[1 + sizeof (PElementLen)];
158: register byte *bp = buffer,
159: *ep;
160: register PElementLen len;
161:
162: if ((len = pe -> pe_len) == PE_LEN_INDF)
163: *bp++ = PE_LEN_XTND;
164: else
165: if (len <= PE_LEN_SMAX)
166: *bp++ = len & 0xff;
167: else {
168: ep = buffer + sizeof buffer - 1;
169: for (bp = ep; len != 0 && buffer < bp; len >>= 8)
170: *bp-- = len & 0xff;
171: *bp = PE_LEN_XTND | ((ep - bp) & 0xff);
172: if (ps_write (ps, bp, ep - bp + 1) == NOTOK)
173: return NOTOK;
174:
175: return OK;
176: }
177:
178: if (ps_write (ps, buffer, bp - buffer) == NOTOK)
179: return NOTOK;
180:
181: return OK;
182: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.