|
|
1.1 ! root 1: /* prim2oid.c - presentation element to object identifier */ ! 2: ! 3: #ifndef lint ! 4: static char *rcsid = "$Header: /f/osi/psap/RCS/prim2oid.c,v 7.1 90/05/22 20:30:03 mrose Exp $"; ! 5: #endif ! 6: ! 7: /* ! 8: * $Header: /f/osi/psap/RCS/prim2oid.c,v 7.1 90/05/22 20:30:03 mrose Exp $ ! 9: * ! 10: * ! 11: * $Log: prim2oid.c,v $ ! 12: * Revision 7.1 90/05/22 20:30:03 mrose ! 13: * bug-fix ! 14: * ! 15: * Revision 7.0 89/11/23 22:13:12 mrose ! 16: * Release 6.0 ! 17: * ! 18: */ ! 19: ! 20: /* ! 21: * NOTICE ! 22: * ! 23: * Acquisition, use, and distribution of this module and related ! 24: * materials are subject to the restrictions of a license agreement. ! 25: * Consult the Preface in the User's Manual for the full terms of ! 26: * this agreement. ! 27: * ! 28: */ ! 29: ! 30: ! 31: /* LINTLIBRARY */ ! 32: ! 33: #include <stdio.h> ! 34: #include "psap.h" ! 35: ! 36: /* */ ! 37: ! 38: OID prim2oid (pe) ! 39: register PE pe; ! 40: { ! 41: register unsigned int i, ! 42: *ip; ! 43: register PElementData dp, ! 44: ep; ! 45: static OIDentifier oid; ! 46: register OID o = &oid; ! 47: ! 48: if (pe -> pe_form != PE_FORM_PRIM ! 49: || (dp = pe -> pe_prim) == NULLPED ! 50: || pe -> pe_len == 0) ! 51: return pe_seterr (pe, PE_ERR_PRIM, NULLOID); ! 52: ep = dp + pe -> pe_len; ! 53: ! 54: if (o -> oid_elements) ! 55: free ((char *) o -> oid_elements); ! 56: ! 57: for (i = 1; dp < ep; i++) { /* another whacko OSI encoding... */ ! 58: if (*dp == 0x80) ! 59: return pe_seterr (pe, PE_ERR_OID, NULLOID); ! 60: ! 61: while (*dp++ & 0x80) ! 62: if (dp > ep) ! 63: return pe_seterr (pe, PE_ERR_OID, NULLOID); ! 64: } ! 65: ! 66: if ((ip = (unsigned int *) malloc ((i + 1) * sizeof *ip)) == NULL) ! 67: return pe_seterr (pe, PE_ERR_NMEM, NULLOID); ! 68: o -> oid_elements = ip, o -> oid_nelem = i; ! 69: ! 70: for (dp = pe -> pe_prim; dp < ep; ) { ! 71: i = 0; ! 72: do { ! 73: i <<= 7; ! 74: i |= *dp & 0x7f; ! 75: } while (*dp++ & 0x80); ! 76: ! 77: if (ip != o -> oid_elements) ! 78: *ip++ = i; ! 79: else ! 80: if (i < 40) ! 81: *ip++ = 0, *ip++ = i; ! 82: else ! 83: if (i < 80) ! 84: *ip++ = 1, *ip++ = i - 40; ! 85: else ! 86: *ip++ = 2, *ip++ = i - 80; ! 87: } ! 88: ! 89: return o; ! 90: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.