|
|
1.1 root 1: /* ps_get_abs.c - get absolute length */
2:
3: #ifndef lint
4: static char *rcsid = "$Header: /f/osi/psap/RCS/ps_get_abs.c,v 7.0 89/11/23 22:13:23 mrose Rel $";
5: #endif
6:
7: /*
8: * $Header: /f/osi/psap/RCS/ps_get_abs.c,v 7.0 89/11/23 22:13:23 mrose Rel $
9: *
10: *
11: * $Log: ps_get_abs.c,v $
12: * Revision 7.0 89/11/23 22:13:23 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: /* DATA */
34:
35: int ps_len_strategy = PS_LEN_SPAG;
36:
37: /* */
38:
39: int ps_get_abs (pe)
40: register PE pe;
41: {
42: register PElementLen len;
43: register PE p;
44:
45: switch (pe -> pe_form) {
46: case PE_FORM_PRIM:
47: len = pe -> pe_len;
48: break;
49:
50: case PE_FORM_CONS:
51: len = 0;
52: for (p = pe -> pe_cons; p; p = p -> pe_next)
53: len += ps_get_abs (p);
54:
55: switch (ps_len_strategy) {
56: case PS_LEN_SPAG:
57: default:
58: if (len <= PE_LEN_SMAX) {
59: pe -> pe_len = len;
60: break;
61: } /* else fall */
62:
63: case PS_LEN_INDF:
64: pe -> pe_len = PE_LEN_INDF;
65: len += 2; /* for EOC */
66: break;
67:
68: case PS_LEN_LONG:
69: pe -> pe_len = len;
70: break;
71: }
72: break;
73:
74: case PE_FORM_ICONS:
75: return pe -> pe_len;
76: }
77:
78: return (ps_get_id (pe) + ps_get_len (pe) + len);
79: }
80:
81: /* */
82:
83: static int ps_get_id (pe)
84: register PE pe;
85: {
86: register int i;
87: register PElementID id;
88:
89: if ((id = pe -> pe_id) < PE_ID_XTND)
90: return 1;
91:
92: for (i = 1; id != 0; id >>= PE_ID_SHIFT)
93: i++;
94: return i;
95: }
96:
97: /* */
98:
99: static int ps_get_len (pe)
100: register PE pe;
101: {
102: register int i;
103: register PElementLen len;
104:
105: if ((len = pe -> pe_len) == PE_LEN_INDF || len <= PE_LEN_SMAX)
106: return 1;
107:
108: for (i = 1; len > 0; len >>= 8)
109: i++;
110: return i;
111: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.