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