|
|
1.1 root 1: /* pe_pullup.c - "pullup" a presentation element */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/psap/RCS/pe_pullup.c,v 7.0 89/11/23 22:13:06 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/psap/RCS/pe_pullup.c,v 7.0 89/11/23 22:13:06 mrose Rel $
9: *
10: *
11: * $Log: pe_pullup.c,v $
12: * Revision 7.0 89/11/23 22:13:06 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:
33:
34: PElementData pe_pullup_aux ();
35:
36: /* */
37:
38: int pe_pullup (pe)
39: register PE pe;
40: {
41: PElementLen len;
42: register PElementData dp;
43: register PE p;
44:
45: if (pe -> pe_form != PE_FORM_CONS)
46: return OK;
47:
48: if ((dp = pe_pullup_aux (pe, &len)) == NULLPED)
49: return NOTOK;
50:
51: for (p = pe -> pe_cons; p; p = p -> pe_next)
52: pe_free (p);
53:
54: pe -> pe_form = PE_FORM_PRIM;
55: pe -> pe_len = len;
56: pe -> pe_prim = dp;
57:
58: return OK;
59: }
60:
61: /* */
62:
63: static PElementData pe_pullup_aux (pe, len)
64: register PE pe;
65: register int *len;
66: {
67: register int i,
68: k;
69: int j;
70: register PElementClass class;
71: register PElementID id;
72: register PElementData dp,
73: ep,
74: fp;
75: register PE p;
76:
77: switch (pe -> pe_form) {
78: case PE_FORM_PRIM:
79: if ((dp = PEDalloc (i = pe -> pe_len)) == NULLPED)
80: return NULLPED;
81: PEDcpy (pe -> pe_prim, dp, i);
82: break;
83:
84: case PE_FORM_CONS:
85: dp = NULLPED, i = 0;
86: class = pe -> pe_class, id = pe -> pe_id;
87: for (p = pe -> pe_cons; p; p = p -> pe_next) {
88: if (p -> pe_class != class
89: || p -> pe_id != id
90: || (ep = pe_pullup_aux (p, &j)) == NULLPED) {
91: if (dp)
92: PEDfree (dp);
93: return NULLPED;
94: }
95: if (dp) {
96: if ((fp = PEDrealloc (dp, k = i + j)) == NULLPED) {
97: PEDfree (dp);
98: return NULLPED;
99: }
100: PEDcpy (ep, fp + i, j);
101: dp = fp, i = k;
102: }
103: else
104: dp = ep, i += j;
105: }
106: break;
107:
108: case PE_FORM_ICONS:
109: return NULLPED;
110: }
111:
112: *len = i;
113: return (dp);
114: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.