|
|
1.1 root 1: /* psap.h - include file for presentation users (PS-USER) */
2:
3: /*
4: * $Header: /f/osi/h/RCS/psap.h,v 7.3 90/07/27 08:44:43 mrose Exp $
5: *
6: *
7: * $Log: psap.h,v $
8: * Revision 7.3 90/07/27 08:44:43 mrose
9: * update
10: *
11: * Revision 7.2 90/07/01 21:03:50 mrose
12: * pepsy
13: *
14: * Revision 7.1 90/03/22 08:39:21 mrose
15: * touch-up
16: *
17: * Revision 7.0 89/11/23 21:55:52 mrose
18: * Release 6.0
19: *
20: */
21:
22: /*
23: * NOTICE
24: *
25: * Acquisition, use, and distribution of this module and related
26: * materials are subject to the restrictions of a license agreement.
27: * Consult the Preface in the User's Manual for the full terms of
28: * this agreement.
29: *
30: */
31:
32:
33: #ifndef _PSAP_
34: #define _PSAP_
35:
36: #ifndef _MANIFEST_
37: #include "manifest.h"
38: #endif
39: #ifndef _GENERAL_
40: #include "general.h"
41: #endif
42: #ifndef OSX
43: #ifndef BSD42
44: #include <time.h>
45: #else
46: #ifndef timerisset
47: #include <sys/time.h>
48: #endif
49: #endif
50: #endif
51: #include <math.h>
52:
53: /* */
54:
55: typedef struct OIDentifier {
56: int oid_nelem; /* number of sub-identifiers */
57:
58: unsigned int *oid_elements; /* the (ordered) list of sub-identifiers */
59: } OIDentifier, *OID;
60: #define NULLOID ((OID) 0)
61:
62:
63: OID ode2oid ();
64: int oid_cmp (), elem_cmp ();
65: OID oid_cpy ();
66: int oid_free ();
67: #define oid2ode(i) oid2ode_aux ((i), 1)
68: char *oid2ode_aux ();
69: char *sprintoid ();
70: OID str2oid ();
71:
72: /* */
73:
74: typedef u_char PElementClass;
75:
76: typedef u_char PElementForm;
77:
78: typedef u_short PElementID; /* 0..16383 are meaningful (14 bits) */
79: #define PE_ID_BITS 14
80:
81: #define PE_ID(class,code) \
82: ((int) ((((code) & 0x3fff) << 2) | ((class) & 0x0003)))
83:
84: typedef int PElementLen;
85:
86:
87: typedef u_char byte, *PElementData;
88: #define NULLPED ((PElementData) 0)
89:
90: #define PEDalloc(s) ((PElementData) malloc ((unsigned int) (s)))
91:
92: #define PEDrealloc(p, s) ((PElementData) \
93: realloc ((char *) (p), (unsigned int) (s)))
94:
95: #define PEDfree(p) free ((char *) (p))
96:
97: #define PEDcmp(b1, b2, length) \
98: bcmp ((char *) (b1), (char *) (b2), (int) (length))
99:
100: #define PEDcpy(b1, b2, length) \
101: bcopy ((char *) (b1), (char *) (b2), (int) (length))
102:
103: /* */
104:
105: typedef struct PElement {
106: int pe_errno; /* Error codes */
107: #define PE_ERR_NONE 0 /* No error */
108: #define PE_ERR_OVER 1 /* Overflow */
109: #define PE_ERR_NMEM 2 /* Out of memory */
110: #define PE_ERR_BIT 3 /* No such bit */
111: #define PE_ERR_UTCT 4 /* Malformed universal timestring */
112: #define PE_ERR_GENT 5 /* Malformed generalized timestring */
113: #define PE_ERR_MBER 6 /* No such member */
114: #define PE_ERR_PRIM 7 /* Not a primitive form */
115: #define PE_ERR_CONS 8 /* Not a constructor form */
116: #define PE_ERR_TYPE 9 /* Class/ID mismatch in constructor */
117: #define PE_ERR_OID 10 /* Malformed object identifier */
118: #define PE_ERR_BITS 11 /* Malformed bitstring */
119: #define PE_ERR_NOSUPP 12 /* type not supported */
120:
121: /* for the PSAP */
122: int pe_context; /* indirect reference */
123: #define PE_DFLT_CTX 0 /* the default context */
124:
125: #define PE_ID_XTND 0x1f /* distinguished ID for extension bits */
126: #define PE_ID_MORE 0x80 /* more to come flag */
127: #define PE_ID_MASK 0x7f /* value in extension byte */
128: #define PE_ID_SHIFT 7
129:
130: #define PE_CLASS_MASK 0xc0 /* identifier class bits (8-7) */
131: #define PE_CLASS_SHIFT 6
132: #define PE_FORM_MASK 0x20 /* identifier form bit (6) */
133: #define PE_FORM_SHIFT 5
134: #define PE_CODE_MASK 0x1f /* identifier code bits (5-1) + ... */
135: #define PE_CODE_SHIFT 0
136:
137: PElementClass pe_class;
138: #define PE_CLASS_UNIV 0x0 /* Universal */
139: #define PE_CLASS_APPL 0x1 /* Application-wide */
140: #define PE_CLASS_CONT 0x2 /* Context-specific */
141: #define PE_CLASS_PRIV 0x3 /* Private-use */
142:
143: PElementForm pe_form;
144: #define PE_FORM_PRIM 0x0 /* PRIMitive */
145: #define PE_FORM_CONS 0x1 /* CONStructor */
146: #define PE_FORM_ICONS 0x2 /* internal: Inline CONStructor */
147:
148: PElementID pe_id; /* should be extensible, 14 bits for now */
149: /* Pseudo Types */
150: #define PE_UNIV_EOC 0x000 /* End-of-contents */
151:
152: /* Built-in Types */
153: #define PE_PRIM_BOOL 0x001 /* Boolean */
154: #define PE_PRIM_INT 0x002 /* Integer */
155: #define PE_PRIM_BITS 0x003 /* Bitstring */
156: #define PE_PRIM_OCTS 0x004 /* Octetstring */
157: #define PE_PRIM_NULL 0x005 /* Null */
158: #define PE_PRIM_OID 0x006 /* Object identifier */
159: #define PE_PRIM_ODE 0x007 /* Object descriptor */
160: #define PE_CONS_EXTN 0x008 /* External */
161: #define PE_PRIM_REAL 0x009 /* Real */
162: #define PE_PRIM_ENUM 0x00a /* Enumerated type */
163: #define PE_PRIM_ENCR 0x00b /* Encrypted */
164: #define PE_CONS_SEQ 0x010 /* Sequence */
165: #define PE_CONS_SET 0x011 /* Set */
166:
167: /* Defined Types */
168: #define PE_DEFN_NUMS 0x012 /* Numeric String */
169: #define PE_DEFN_PRTS 0x013 /* Printable String */
170: #define PE_DEFN_T61S 0x014 /* T.61 String */
171: #define PE_DEFN_VTXS 0x015 /* Videotex String */
172: #define PE_DEFN_IA5S 0x016 /* IA5 String */
173: #define PE_DEFN_UTCT 0x017 /* UTC Time */
174: #define PE_DEFN_GENT 0x018 /* Generalized Time */
175: #define PE_DEFN_GFXS 0x019 /* Graphics string (ISO2375) */
176: #define PE_DEFN_VISS 0x01a /* Visible string */
177: #define PE_DEFN_GENS 0x01b /* General string */
178: #define PE_DEFN_CHRS 0x01c /* Character string */
179:
180: PElementLen pe_len;
181: #define PE_LEN_XTND 0x80 /* long or indefinite form */
182: #define PE_LEN_SMAX 127 /* largest short form */
183: #define PE_LEN_MASK 0x7f /* mask to get number of bytes in length */
184: #define PE_LEN_INDF (-1) /* indefinite length */
185:
186: PElementLen pe_ilen;
187:
188: union {
189: PElementData un_pe_prim; /* PRIMitive value */
190: struct PElement *un_pe_cons; /* CONStructor head */
191: } pe_un1;
192: #define pe_prim pe_un1.un_pe_prim
193: #define pe_cons pe_un1.un_pe_cons
194:
195: union {
196: int un_pe_cardinal; /* cardinality of list */
197: int un_pe_nbits; /* number of bits in string */
198: } pe_un2;
199: #define pe_cardinal pe_un2.un_pe_cardinal
200: #define pe_nbits pe_un2.un_pe_nbits
201:
202: int pe_inline; /* for "ultra-efficient" PElements */
203: char *pe_realbase; /* .. */
204:
205: int pe_offset; /* offset of element in sequence */
206:
207: struct PElement *pe_next;
208:
209: int pe_refcnt; /* hack for ANYs in pepy */
210: } PElement, *PE;
211: #define NULLPE ((PE) 0)
212: #define NULLPEP ((PE *) 0)
213:
214: #define pe_seterr(pe, e, v) ((pe) -> pe_errno = (e), (v))
215:
216:
217: PE pe_alloc ();
218: int pe_free ();
219: int pe_cmp ();
220: PE pe_cpy ();
221: int pe_pullup ();
222: PE pe_expunge ();
223: int pe_extract ();
224:
225: PE str2pe ();
226: PE qb2pe ();
227:
228: extern int pe_maxclass;
229: extern char *pe_classlist[];
230:
231: extern int pe_maxuniv;
232: extern char *pe_univlist[];
233:
234: extern int pe_maxappl;
235: extern char **pe_applist;
236:
237: extern int pe_maxpriv;
238: extern char **pe_privlist;
239:
240: /* */
241:
242: typedef struct UTCtime {
243: int ut_year;
244: int ut_mon;
245: int ut_mday;
246: int ut_hour;
247: int ut_min;
248: int ut_sec;
249:
250: int ut_usec;
251:
252: int ut_zone;
253:
254: int ut_flags;
255: #define UT_NULL 0x00
256: #define UT_ZONE 0x01
257: #define UT_SEC 0x02
258: #define UT_USEC 0x04
259: } UTCtime, *UTC;
260: #define NULLUTC ((UTC) 0)
261:
262:
263: void tm2ut ();
264: long gtime ();
265: struct tm *ut2tm ();
266:
267: /* */
268:
269: extern char *psapversion;
270:
271:
272: int prim2flag ();
273: PE flag2prim ();
274: #define bool2prim(b) flag2prim ((b), PE_CLASS_UNIV, PE_PRIM_BOOL)
275:
276: int prim2num ();
277: PE num2prim ();
278: #define int2prim(i) num2prim ((i), PE_CLASS_UNIV, PE_PRIM_INT)
279:
280:
281: #define prim2enum(i) prim2num((i))
282: #define enum2prim(a,b,c) num2prim((a), (b), (c))
283: #define enumint2prim(i) enum2prim ((i), PE_CLASS_UNIV, PE_PRIM_ENUM)
284:
285:
286: /* psap REAL parameters - tons of 'em */
287: #define PE_REAL_FLAGS 0300 /* flag bits of real */
288: #define PE_REAL_BINENC 0200 /* binary encoding */
289: #define PE_REAL_DECENC 0000 /* decimal encoding */
290: #define PE_REAL_SPECENC 0100 /* special encoding */
291:
292: #define PE_REAL_B_S 0100 /* sign bit */
293: #define PE_REAL_B_BASE 0060 /* base bits */
294: #define PE_REAL_B_B2 0000
295: #define PE_REAL_B_B8 0020
296: #define PE_REAL_B_B16 0040
297:
298: #define PE_REAL_B_F 0014 /* factor bits */
299: #define PE_REAL_B_EXP 0003 /* exponent type bits */
300: #define PE_REAL_B_EF1 0000
301: #define PE_REAL_B_EF2 0001
302: #define PE_REAL_B_EF3 0002
303: #define PE_REAL_B_EF4 0003
304:
305: #define PE_REAL_PLUSINF 0200
306: #define PE_REAL_MINUSINF 0201
307:
308: #ifndef HUGE
309: #ifdef MAXFLOAT
310: #define PE_REAL_INFINITY MAXFLOAT
311: #else
312: #define PE_REAL_INFINITY 99.e99
313: #endif
314: #else
315: #define PE_REAL_INFINITY HUGE
316: #endif
317:
318: double prim2real ();
319: PE real2prim ();
320: #define double2prim(i) real2prim ((i), PE_CLASS_UNIV, PE_PRIM_REAL)
321:
322:
323: char *prim2str ();
324: PE str2prim ();
325: struct qbuf *prim2qb ();
326: PE qb2prim_aux (); /* really should be qb2pe () */
327: #define qb2prim(q,c,i) qb2prim_aux ((q), (c), (i), 0)
328: #define oct2prim(s,len) str2prim ((s), (len), \
329: PE_CLASS_UNIV, PE_PRIM_OCTS)
330: #define ia5s2prim(s,len) str2prim ((s), (len), \
331: PE_CLASS_UNIV, PE_DEFN_IA5S)
332: #define nums2prim(s,len) str2prim ((s), (len), \
333: PE_CLASS_UNIV, PE_DEFN_NUMS)
334: #define prts2prim(s,len) str2prim ((s), (len), \
335: PE_CLASS_UNIV, PE_DEFN_PRTS)
336: #define t61s2prim(s,len) str2prim ((s), (len), \
337: PE_CLASS_UNIV, PE_DEFN_T61S)
338: #define vtxs2prim(s,len) str2prim ((s), (len), \
339: PE_CLASS_UNIV, PE_DEFN_VTXS)
340: #define gfxs2prim(s,len) str2prim ((s), (len), \
341: PE_CLASS_UNIV, PE_DEFN_GFXS)
342: #define viss2prim(s,len) str2prim ((s), (len), \
343: PE_CLASS_UNIV, PE_DEFN_VISS)
344: #define gens2prim(s,len) str2prim ((s), (len), \
345: PE_CLASS_UNIV, PE_DEFN_GENS)
346: #define chrs2prim(s,len) str2prim ((s), (len), \
347: PE_CLASS_UNIV, PE_DEFN_CHRS)
348: #define ode2prim(s,len) str2prim ((s), (len), \
349: PE_CLASS_UNIV, PE_PRIM_ODE)
350:
351: PE prim2bit ();
352: PE bit2prim ();
353:
354: int bit_on (), bit_off ();
355: int bit_test ();
356:
357: OID prim2oid ();
358: PE obj2prim ();
359: #define oid2prim(o) obj2prim ((o), PE_CLASS_UNIV, PE_PRIM_OID)
360:
361: UTC prim2time ();
362: #define prim2utct(pe) prim2time ((pe), 0)
363: #define prim2gent(pe) prim2time ((pe), 1)
364: PE time2prim ();
365: #define utct2prim(u) time2prim ((u), 0, PE_CLASS_UNIV, PE_DEFN_UTCT)
366: #define gent2prim(u) time2prim ((u), 1, PE_CLASS_UNIV, PE_DEFN_GENT)
367: char *time2str ();
368: #define utct2str(u) time2str ((u), 0)
369: #define gent2str(u) time2str ((u), 1)
370: UTC str2utct (), str2gent ();
371:
372: PE prim2set ();
373: #define set2prim(pe) (pe)
374: int set_add (), set_addon (), set_del ();
375: PE set_find ();
376: #define first_member(pe) ((pe) -> pe_cons)
377: #define next_member(pe,p) ((p) -> pe_next)
378:
379: #define prim2seq(pe) (prim2set (pe))
380: #define seq2prim(pe) (pe)
381: int seq_add (), seq_addon (), seq_del ();
382: PE seq_find ();
383:
384:
385: char *pe_error ();
386:
387: /* */
388:
389: typedef struct {
390: int ps_errno; /* Error codes */
391: #define PS_ERR_NONE 0 /* No error */
392: #define PS_ERR_OVERID 1 /* Overflow in ID */
393: #define PS_ERR_OVERLEN 2 /* Overflow in length */
394: #define PS_ERR_NMEM 3 /* Out of memory */
395: #define PS_ERR_EOF 4 /* End of file */
396: #define PS_ERR_EOFID 5 /* End of file reading extended ID */
397: #define PS_ERR_EOFLEN 6 /* End of file reading extended length */
398: #define PS_ERR_LEN 7 /* Length mismatch */
399: #define PS_ERR_TRNC 8 /* Truncated */
400: #define PS_ERR_INDF 9 /* Indefinite length in primitive form */
401: #define PS_ERR_IO 10 /* I/O error */
402: #define PS_ERR_XXX 11 /* XXX */
403:
404: union {
405: caddr_t un_ps_addr;
406: struct {
407: char *st_ps_base;
408: int st_ps_cnt;
409: char *st_ps_ptr;
410: int st_ps_bufsiz;
411: } un_ps_st;
412: struct {
413: struct udvec *uv_ps_head;
414: struct udvec *uv_ps_cur;
415: struct udvec *uv_ps_end;
416: int uv_ps_elems;
417: int uv_ps_slop;
418: int uv_ps_cc;
419: } un_ps_uv;
420: } ps_un;
421: #define ps_addr ps_un.un_ps_addr
422: #define ps_base ps_un.un_ps_st.st_ps_base
423: #define ps_cnt ps_un.un_ps_st.st_ps_cnt
424: #define ps_ptr ps_un.un_ps_st.st_ps_ptr
425: #define ps_bufsiz ps_un.un_ps_st.st_ps_bufsiz
426: #define ps_head ps_un.un_ps_uv.uv_ps_head
427: #define ps_cur ps_un.un_ps_uv.uv_ps_cur
428: #define ps_end ps_un.un_ps_uv.uv_ps_end
429: #define ps_elems ps_un.un_ps_uv.uv_ps_elems
430: #define ps_slop ps_un.un_ps_uv.uv_ps_slop
431: #define ps_cc ps_un.un_ps_uv.uv_ps_cc
432:
433: caddr_t ps_extra; /* for George's recursive PStreams */
434:
435: int ps_inline; /* for "ultra-efficient" PStreams */
436:
437: int ps_scratch; /* XXX */
438:
439: int ps_byteno; /* byte position */
440:
441: IFP ps_primeP;
442: IFP ps_readP;
443: IFP ps_writeP;
444: IFP ps_flushP;
445: IFP ps_closeP;
446: } PStream, *PS;
447: #define NULLPS ((PS) 0)
448:
449: #define ps_seterr(ps, e, v) ((ps) -> ps_errno = (e), (v))
450:
451:
452: PS ps_alloc ();
453: void ps_free ();
454:
455: int ps_io ();
456: #define ps_read(ps, data, cc) ps_io ((ps), (ps) -> ps_readP, (data), (cc), 0)
457: #define ps_write(ps, data, cc) ps_write_aux ((ps), (data), (cc), 0)
458: #define ps_write_aux(ps, data, cc, inline) \
459: ps_io ((ps), (ps) -> ps_writeP, (data), (cc), (inline))
460:
461: int ps_flush ();
462:
463: int std_open ();
464: #define std_setup(ps, fp) ((ps) -> ps_addr = (caddr_t) (fp), OK)
465:
466: int str_open ();
467: int str_setup ();
468:
469: int dg_open ();
470: int dg_setup ();
471:
472: int fdx_open ();
473: int fdx_setup ();
474:
475: int qbuf_open ();
476: #define qbuf_setup(ps, qb) ((ps) -> ps_addr = (caddr_t) (qb), OK)
477:
478: #define ts_open dg_open
479: #define ts_setup(p,f,s) dg_setup ((p), (f), (s), ts_read, ts_write)
480: int ts_read (), ts_write ();
481:
482: int uvec_open ();
483: int uvec_setup ();
484:
485:
486: #define ps2pe(ps) ps2pe_aux ((ps), 1, 1)
487: PE ps2pe_aux ();
488: #define pe2ps(ps, pe) pe2ps_aux ((ps), (pe), 1)
489: int pe2ps_aux ();
490:
491:
492: PE pl2pe ();
493: int pe2pl ();
494:
495:
496: extern int ps_len_strategy;
497: #define PS_LEN_SPAG 0
498: #define PS_LEN_INDF 1
499: #define PS_LEN_LONG 2
500:
501: int ps_get_abs ();
502:
503:
504: char *ps_error ();
505:
506: /* */
507:
508: struct isobject {
509: char *io_descriptor;
510:
511: OIDentifier io_identity;
512: };
513:
514: int setisobject (), endisobject ();
515:
516: struct isobject *getisobject ();
517:
518: struct isobject *getisobjectbyname ();
519: struct isobject *getisobjectbyoid ();
520:
521: /* */
522:
523: PE qbuf2pe ();
524: char *qb2str ();
525: struct qbuf *str2qb ();
526: int qb_free ();
527:
528: int pe2ssdu ();
529: PE ssdu2pe ();
530:
531: void pe2text (), text2pe ();
532:
533: int pe2uvec ();
534:
535: char *int2strb ();
536: int strb2int ();
537:
538: PE strb2bitstr ();
539: char *bitstr2strb ();
540:
541: /* */
542:
543: extern char PY_pepy[];
544:
545: void PY_advise ();
546: int PY_pp ();
547:
548: int testdebug ();
549:
550: int vpush (), vpop ();
551: int vname (), vtag ();
552: int vprint ();
553: int vstring (), vunknown ();
554:
555: char *bit2str ();
556:
557: int vpushfp (), vpopfp ();
558:
559: int vpushstr (), vpopstr ();
560:
561: int vpushpp (), vpopp ();
562:
563: #ifdef PEPSY_VERSION
564: /* handle calls to the vunknown print routine */
565: #define vunknown_P 0, ((modtyp *) 0)
566:
567: /*
568: * vpdu now comes out of the closet as a real pepsy function "pvpdu" we
569: * keep the #define for vpdu for backwards compatiability of other peoples'
570: * code
571: */
572: #ifdef __STDC__
573: #define vpdu(lp,fnx,pe,text,rw) \
574: { \
575: pvpdu ((lp), fnx##_P, (pe), (text), (rw)); \
576: }
577: #else /* __STDC__ */
578: #define vpdu(lp,fnx,pe,text,rw) \
579: { \
580: pvpdu ((lp), fnx/**/_P, (pe), (text), (rw)); \
581: }
582: #endif /* __STDC__ */
583:
584: #else
585: /* Backwards compatibility with posy/pepy */
586: #define vpdu(lp,fnx,pe,text,rw) \
587: { \
588: int fnx (); \
589: \
590: _vpdu ((lp), fnx, (pe), (text), (rw)); \
591: }
592:
593: int _vpdu ();
594: #endif
595:
596: /* pepy string definitions */
597: extern char *pepy_strings[];
598:
599: #define PEPY_ERR_BAD (pepy_strings[0])
600: #define PEPY_ERR_BAD_BITS (pepy_strings[1])
601: #define PEPY_ERR_BAD_BOOLEAN (pepy_strings[2])
602: #define PEPY_ERR_BAD_CLASS (pepy_strings[3])
603: #define PEPY_ERR_BAD_CLASS_FORM_ID (pepy_strings[4])
604: #define PEPY_ERR_BAD_FORM (pepy_strings[5])
605: #define PEPY_ERR_BAD_INTEGER (pepy_strings[6])
606: #define PEPY_ERR_BAD_OID (pepy_strings[7])
607: #define PEPY_ERR_BAD_OCTET (pepy_strings[8])
608: #define PEPY_ERR_BAD_REAL (pepy_strings[9])
609: #define PEPY_ERR_BAD_SEQ (pepy_strings[10])
610: #define PEPY_ERR_BAD_SET (pepy_strings[11])
611: #define PEPY_ERR_TOO_MANY_BITS (pepy_strings[12])
612: #define PEPY_ERR_TOO_MANY_ELEMENTS (pepy_strings[13])
613: #define PEPY_ERR_UNKNOWN_CHOICE (pepy_strings[14])
614: #define PEPY_ERR_UNK_COMP (pepy_strings[15])
615: #define PEPY_ERR_INIT_FAILED (pepy_strings[16])
616: #define PEPY_ERR_INVALID_CHOICE (pepy_strings[17])
617: #define PEPY_ERR_MISSING (pepy_strings[18])
618: #define PEPY_ERR_NOMEM (pepy_strings[19])
619: #define PEPY_ERR_TOO_MANY_TAGGED (pepy_strings[20])
620: #define PEPY_ERR_EXTRA_MEMBERS (pepy_strings[21])
621:
622: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.