|
|
1.1 ! root 1: /* prim2str.c - presentation element to octet string */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/psap/RCS/prim2str.c,v 7.0 89/11/23 22:13:16 mrose Rel $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/psap/RCS/prim2str.c,v 7.0 89/11/23 22:13:16 mrose Rel $ ! 9: * ! 10: * ! 11: * $Log: prim2str.c,v $ ! 12: * Revision 7.0 89/11/23 22:13:16 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: ! 35: /* Similar to pe_pullup. Returns a newly allocated string, composed of ! 36: of any sub-elements in pe, whereas pe_pullup always reverts "pe" to ! 37: a primitive. The string is null-terminated, though pe_len specifically ! 38: does NOT reflect this. */ ! 39: ! 40: char *prim2str (pe, len) ! 41: register PE pe; ! 42: register int *len; ! 43: { ! 44: register int i, ! 45: k; ! 46: int j; ! 47: register char *dp, ! 48: *ep, ! 49: *fp; ! 50: register PElementClass class; ! 51: register PElementID id; ! 52: register PE p; ! 53: ! 54: *len = 0; ! 55: switch (pe -> pe_form) { ! 56: case PE_FORM_PRIM: ! 57: if ((dp = malloc ((unsigned) ((i = pe -> pe_len) + 1))) == NULLCP) ! 58: return pe_seterr (pe, PE_ERR_NMEM, NULLCP); ! 59: bcopy ((char *) pe -> pe_prim, dp, i); ! 60: break; ! 61: ! 62: case PE_FORM_CONS: ! 63: if ((p = pe -> pe_cons) == NULLPE) { ! 64: if ((dp = malloc ((unsigned) ((i = 0) + 1))) == NULLCP) ! 65: return pe_seterr (pe, PE_ERR_NMEM, NULLCP); ! 66: break; ! 67: } ! 68: dp = NULLCP, i = 0; ! 69: class = p -> pe_class, id = p -> pe_id; ! 70: for (p = pe -> pe_cons; p; p = p -> pe_next) { ! 71: if ((p -> pe_class != class || p -> pe_id != id) ! 72: && (p -> pe_class != PE_CLASS_UNIV ! 73: || p -> pe_id != PE_PRIM_OCTS)) { ! 74: if (dp) ! 75: free (dp); ! 76: return pe_seterr (pe, PE_ERR_TYPE, NULLCP); ! 77: } ! 78: ! 79: if ((ep = prim2str (p, &j)) == NULLCP) { ! 80: if (dp) ! 81: free (dp); ! 82: return pe_seterr (pe, PE_ERR_NMEM, NULLCP); ! 83: } ! 84: if (dp) { ! 85: if ((fp = realloc (dp, (unsigned) ((k = i + j) + 1))) ! 86: == NULLCP) { ! 87: free (dp); ! 88: return pe_seterr (pe, PE_ERR_NMEM, NULLCP); ! 89: } ! 90: bcopy (ep, fp + i, j); ! 91: dp = fp, i = k; ! 92: } ! 93: else ! 94: dp = ep, i += j; ! 95: } ! 96: break; ! 97: } ! 98: ! 99: if (dp) ! 100: dp[*len = i] = NULL; ! 101: ! 102: return dp; ! 103: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.