|
|
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.