|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T p
Length: 2331 (0x91b) Types: TextFile Names: »prim2str.c«
└─⟦3d0c2be1b⟧ Bits:30001254 ISODE-5.0 Tape └─⟦eba4602b1⟧ »./isode-5.0.tar.Z« └─⟦d3ac74d73⟧ └─⟦this⟧ »isode-5.0/psap/prim2str.c«
/* prim2str.c - presentation element to octet string */ #ifndef lint static char *rcsid = "$Header: /f/osi/psap/RCS/prim2str.c,v 6.0 89/03/18 23:38:58 mrose Rel $"; #endif /* * $Header: /f/osi/psap/RCS/prim2str.c,v 6.0 89/03/18 23:38:58 mrose Rel $ * * * $Log: prim2str.c,v $ * Revision 6.0 89/03/18 23:38:58 mrose * Release 5.0 * */ /* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */ /* LINTLIBRARY */ #include <stdio.h> #include "psap.h" /* \f */ /* Similar to pe_pullup. Returns a newly allocated string, composed of of any sub-elements in pe, whereas pe_pullup always reverts "pe" to a primitive. The string is null-terminated, though pe_len specifically does NOT reflect this. */ char *prim2str (pe, len) register PE pe; register int *len; { register int i, k; int j; register char *dp, *ep, *fp; register PElementClass class; register PElementID id; register PE p; *len = 0; switch (pe -> pe_form) { case PE_FORM_PRIM: if ((dp = malloc ((unsigned) ((i = pe -> pe_len) + 1))) == NULLCP) return pe_seterr (pe, PE_ERR_NMEM, NULLCP); bcopy ((char *) pe -> pe_prim, dp, i); break; case PE_FORM_CONS: if ((p = pe -> pe_cons) == NULLPE) { if ((dp = malloc ((unsigned) ((i = 0) + 1))) == NULLCP) return pe_seterr (pe, PE_ERR_NMEM, NULLCP); break; } dp = NULLCP, i = 0; class = p -> pe_class, id = p -> pe_id; for (p = pe -> pe_cons; p; p = p -> pe_next) { if (p -> pe_class != class || p -> pe_id != id || (ep = prim2str (p, &j)) == NULLCP) { if (dp) free (dp); return pe_seterr (pe, p -> pe_class != class || p -> pe_id != id ? PE_ERR_TYPE : PE_ERR_NMEM, NULLCP); } if (dp) { if ((fp = realloc (dp, (unsigned) ((k = i + j) + 1))) == NULLCP) { free (dp); return pe_seterr (pe, PE_ERR_NMEM, NULLCP); } bcopy (ep, fp + i, j); dp = fp, i = k; } else dp = ep, i += j; } break; } if (dp) dp[*len = i] = NULL; return dp; }