|
|
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: 43814 (0xab26)
Types: TextFile
Names: »prnt.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦041b9c0f8⟧ »EurOpenD22/isode/pepsy.system-6.0.Z«
└─⟦d49939f05⟧
└─⟦6a28ec38e⟧ »pepsy.tar«
└─⟦this⟧ »pepsy/prnt.c«
/*
* These routines are the driving routines for parsing encoding and printing
* data
*/
#include <stdio.h>
#include <ctype.h>
#include "../h/psap.h"
#include "pep.h"
#include "pepdefs.h"
#define PEPYPARM char **
#ifndef PEPYPARM
#define PEPYPARM char **
#endif
extern PEPYPARM NullParm;
#undef NULLPE
#define NULLPE ((PE) 0)
extern PE p_pr_seq(), p_pr_seqof(), p_pr_set(), p_pr_setof(), p_pr_type();
extern PE en_seq(), en_seqof(), en_set(), en_setof(), en_type();
extern PE p_pr_choice(), en_choice(), en_etype(), p_pr_etype(), p_pr_obj();
extern PE p_setpresent();
extern char *printable();
extern IFP vfnx;
extern FILE *vfp;
extern ptpe *next_ptpe();
extern int _pverbose;
int xlevel = 0;
int tabed = 0;
int xpushed = 0;
#define NEXT_TPE(p) p = next_ptpe(p)
#define CHKTAG(mod, p, pe) p_ismatch(p, mod, pe->pe_class, pe->pe_id)
/*SUPPRESS 36*/ /* for Saber C */
/*
* prntode the specified type of the specified module into the given pe
*/
prnt_f(typ, mod, pe, explicit, len, buf)
/*ARGSUSED*/
int typ; /* which type it is */
modtyp *mod; /* Module it is from */
PE pe;
int explicit;
int *len;
char **buf;
{
ptpe *p;
if (typ < 0 || typ >= mod->md_nentries)
ferrd(1, "prnt_f:Illegal typ %d\n", typ);
p = mod->md_ptab[typ];
if (p->pe_type != PE_START)
ferr(1, "prnt_f: missing PE_START\n");
xpush(p->pe_typename, xlevel);
p++;
if ((pe = (PE) p_pr_obj(explicit, pe, p, mod)) == NULLPE) {
xpull();
return (NOTOK);
}
xpull();
return (OK);
}
/*
* Parse an object. The top level of an object does not have any offset field
* which makes it different to pr_type routine which must assume that it
* has an offset.
*/
PE
p_pr_obj(expl, pe, p, mod)
int expl; /* do we look at the tag */
PE pe;
ptpe *p;
modtyp *mod; /* Module it is from */
{
int cnt = 0;
if (_pverbose > 6) {
(*vfnx) (vfp, "1st Printing the type %d \n", p->pe_type);
}
while (p->pe_type != PE_END) {
if (ISDTYPE(p) && expl && CHKTAG(mod, p, pe) == 0) {
if (DEFAULT(p))
ferr(1, "p_pr_obj:Default not implemented\n");
else if (OPTIONAL(p))
goto next;
else {
dmp_tpe(vfp, "p_pr_obj:missing mandatory parameter", p, mod);
return (NULLPE);
}
}
if (_pverbose > 6) {
(*vfnx) (vfp, "2nd Printing the type %d \n", p->pe_type);
}
switch (p->pe_type) {
case PE_END:
case PE_START:
return (NULLPE);
case UCODE:
if ((*mod->md_ducode)(pe, p, mod) != OK)
return (NULLPE);
break;
case ETAG:
switch (p->pe_ucode) {
default:
p++;
if (p_pr_obj(1, pe->pe_cons, p, mod) == NULLPE)
return (NULLPE);
}
break;
case SEQ_START:
if ((pe = p_pr_seq(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case SEQOF_START:
if ((pe = p_pr_seqof(pe, p, mod)) == NULLPE) {
return (NULLPE);
}
break;
case SET_START:
if ((pe = p_pr_set(pe, p, mod)) == NULLPE) {
return (NULLPE);
}
break;
case SETOF_START:
if ((pe = p_pr_setof(pe, p, mod)) == NULLPE) {
return (NULLPE);
}
break;
case IMP_OBJ:
p++;
if (p->pe_type == EXTOBJ || p->pe_type == SEXTOBJ) {
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag,(modtyp *)p[1].pe_ucode, pe, 0, NULL, (char *) 0 );
xpull();
} else {
xpush(p->pe_typename, xlevel);
if ((pe = p_pr_obj(0, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
}
break;
case SOBJECT:
case OBJECT:
printname(p->pe_typename, xlevel);
if ((pe = p_pr_obj(expl, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
return (NULLPE);
}
break;
case CHOICE_START:
if ((pe = p_pr_choice(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case SEXTOBJ:
case EXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_tpe("pr_type: missing EXTMOD", p, mod);
ferr(1, "pr_type:internal error\n");
}
printname(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
(char *) 0 );
break;
default:
if ((pe = p_pr_type(expl, pe, p, mod)) == NULLPE)
return (NULLPE);
break;
}
if (ISDTYPE(p) && cnt > 0)
ferr(1, "p_pr_obj:compound type found\n");
if (ISDTYPE(p) && pe != NULLPE) {
return (pe);
}
next:
NEXT_TPE(p);
}
return (pe);
}
/*
* Parse a single type.
* If a basic type parse it, if a compound type call the appropriate
* parsing routine
*/
PE
p_pr_type(expl, pe, p, mod)
int expl; /* do we look at the tag */
PE pe;
ptpe *p;
modtyp *mod; /* Module it is from */
{
int cnt = 0;
int len, i, val;
char *ptr;
struct qbuf *qptr;
OID oid;
PE pe_ptr;
i = len = val = 0;
if (_pverbose > 6) {
(*vfnx) (vfp, "1st Printing the type %d \n", p->pe_type);
}
while (p->pe_type != PE_END) {
/*
print_pe (pe, 1);
*/
if (ISDTYPE(p) && expl && CHKTAG(mod, p, pe) == 0) {
if (DEFAULT(p)) {
setpval(p, p + 1, mod);
goto next;
} else if (OPTIONAL(p))
goto next;
else {
dmp_ptpe("p_pr_type:missing mandatory parameter", p, mod);
return (NULLPE);
}
}
if (_pverbose > 6) {
(*vfnx) (vfp, "2nd Printing the type %d \n", p->pe_type);
}
switch (p->pe_type) {
case PE_END:
case PE_START:
return (NULLPE);
case UCODE:
if ((*mod->md_ducode)(pe, p, mod) != OK)
return (NULLPE);
break;
case ETAG:
switch (p->pe_ucode) {
default:
p++;
if (p_pr_etype(pe->pe_cons, p, mod) == NULLPE)
return (NULLPE);
}
break;
case SEQ_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_seq(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SEQOF_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_seqof(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SET_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_set(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SETOF_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_setof(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case IMP_OBJ:
p++;
if (p->pe_type == EXTOBJ) {
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 0, NULL, (char **) 0 );
xpull();
} else {
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(0, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
}
break;
case SOBJECT:
case OBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(expl, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
return (NULLPE);
}
break;
case CHOICE_START:
if ((pe = (PE) p_pr_choice(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case SEXTOBJ:
case EXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_type: missing EXTMOD", p, mod);
ferr(1, "p_pr_type:internal error\n");
}
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
(char *) 0 );
xpull();
break;
case INTEGER:
if (pe != NULLPE) {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s %d (INTEGER VALUE)\n", (p->pe_typename) ? p->pe_typename : "", prim2num(pe));
else
(*vfnx) (vfp, "%s %d \n", (p->pe_typename) ? p->pe_typename : "", prim2num(pe));
}
break;
case BOOLEAN:
if (pe != NULLPE) {
val = prim2flag(pe);
indent();
if (_pverbose)
(*vfnx) (vfp, "%s %s (BOOLEAN VALUE)\n", (p->pe_typename) ? p->pe_typename : "", (val) ? "TRUE" : "FALSE");
else
(*vfnx) (vfp, "%s %s \n", (p->pe_typename) ? p->pe_typename : "", (val) ? "TRUE" : "FALSE");
}
break;
case T_NULL:
break;
case SCONS_ANY:
case SANY:
if (pe != NULLPE) {
if (pe->pe_errno != PE_ERR_NONE) {
ferr (1, "p_pr_type:bad integer %s",
pe_error(pe->pe_errno));
return (NULLPE);
} else
pr_pe_element(pe, p);
}
break;
case CONS_ANY:
case ANY:
if (pe != NULLPE) {
if (pe->pe_errno != PE_ERR_NONE) {
ferr (1, "p_pr_type:bad integer %s",
pe_error(pe->pe_errno));
return (NULLPE);
} else
pr_pe_element(pe, p);
}
break;
case SOCTETSTRING:
if (pe != NULLPE) {
if ((((struct qbuf *) qptr) = prim2qb(pe)) ==
(struct qbuf *) NULL && pe->pe_errno != PE_ERR_NONE) {
ferr (1, "p_pr_type:bad octet string %s",
pe_error(pe->pe_errno));
return (NULLPE);
} else {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s \"%s\" (OCTETSTRING)\n", (p->pe_typename) ? p->pe_typename : "", qb2str((struct qbuf *) qptr));
else
(*vfnx) (vfp, "%s \"%s\"\n", (p->pe_typename) ? p->pe_typename : "", qb2str((struct qbuf *) qptr));
qb_free(qptr);
}
}
break;
case OCTETSTRING:
if (pe != NULLPE) {
if (((struct qbuf *) qptr
= prim2qb(pe)) == (struct qbuf *) NULL
&& pe->pe_errno != PE_ERR_NONE) {
ferr (1, "p_pr_type:bad octet string %s",
pe_error(pe->pe_errno));
return (NULLPE);
} else {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s \"%s\" (OCTETSTRING)\n", (p->pe_typename) ? p->pe_typename : "", qb2str(((struct qbuf *) qptr)));
else
(*vfnx) (vfp, "%s \"%s\" \n", (p->pe_typename) ? p->pe_typename : "", qb2str(((struct qbuf *) qptr )));
}
}
break;
case SBITSTRING:
if (pe != NULLPE) {
/*
if (((PE) pe_ptr = prim2bit(pe))== NULLPE)
I think this is a bug in ISODE's routines prim2bit
does the wrong thing
*/
if (((PE) pe_ptr = pe_cpy(pe)) == NULLPE) {
ferr (1, "p_pr_type:out of memory");
return (NULLPE);
}
indent();
(*vfnx) (vfp, "%s '", (p->pe_typename) ? p->pe_typename : "");
ptr = bitstr2strb((PE) pe_ptr, &len);
for (i=0; i < len; i+=8)
(*vfnx) (vfp, "%.2x ", *ptr++ & 0xff);
(*vfnx) (vfp, "'H\n");
if (_pverbose) {
indent();
(*vfnx) (vfp, "%s '", (p->pe_typename) ? p->pe_typename : "");
for (i=0; i < len; i++) {
(*vfnx) (vfp, "%d", bit_test((PE) pe_ptr, i));
if ((i+1) % 4 == 0)
(*vfnx) (vfp, " ");
}
(*vfnx) (vfp, "'B (BITSTRING)\n");
}
}
break;
case BITSTRING:
if (pe != NULLPE) {
/*
if (((PE) pe_ptr = prim2bit(pe))== NULLPE)
I think this is a bug in ISODE's routines prim2bit
does the wrong thing
*/
if (((PE) pe_ptr = pe_cpy(pe)) == NULLPE) {
ferr (1, "p_pr_type:out of memory");
return (NULLPE);
}
indent();
(*vfnx) (vfp, "%s '", (p->pe_typename) ? p->pe_typename : "");
ptr = bitstr2strb((PE) pe_ptr, &len);
for (i=0; i < len; i+=8)
(*vfnx) (vfp, "%.2x ", *ptr++ & 0xff);
(*vfnx) (vfp, "'H (BITSTRING)\n");
if (_pverbose) {
indent();
(*vfnx) (vfp, "%s '", (p->pe_typename) ? p->pe_typename : "");
for (i=0; i < len; i++) {
(*vfnx) (vfp, "%d", bit_test((PE) pe_ptr, i));
if ((i+1) % 4 == 0)
(*vfnx) (vfp, " ");
}
(*vfnx) (vfp, "'B\n");
}
}
break;
case SOBJID:
if ((oid = (OID) prim2oid(pe)) == NULLOID) {
ferr (1, "p_pr_type:Object Identifier: out of memory");
return (NULLPE);
} else {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s %s (OBJECT ID)\n", (p->pe_typename) ? p->pe_typename : "", (char *) sprintoid(oid));
else
(*vfnx) (vfp, "%s %s\n", (p->pe_typename) ? p->pe_typename : "", (char *) sprintoid(oid));
}
break;
case OBJID:
if ((oid = (OID) prim2oid(pe)) == NULLOID) {
ferr (1, "p_pr_type:Object Identifier: out of memory");
return (NULLPE);
} else {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s %s (OBJECT ID)\n", (p->pe_typename) ? p->pe_typename : "", (char *) sprintoid(oid));
else
(*vfnx) (vfp, "%s %s\n", (p->pe_typename) ? p->pe_typename : "", (char *) sprintoid(oid));
}
break;
default:
dmp_ptpe("p_pr_type: type not implemented", p, mod);
ferrd(1, "p_pr_type: %d not implemented\n", p->pe_type);
break;
}
if (ISDTYPE(p) && cnt > 0)
ferr(1, "p_pr_type:compound type found\n");
if (ISDTYPE(p) && pe != NULLPE)
return (pe);
next:
NEXT_TPE(p);
}
return (pe);
}
/*
* Parse a sequence, calling appropriate routines to parse each sub type
*/
PE
p_pr_seq(head, p, mod)
PE head;
ptpe *p;
modtyp *mod; /* Module it is from */
{
PE pe, pe_ptr;
struct qbuf *qptr;
int *popt = NULL; /* Pointer to optional field */
int *int_ptr = NULL;
int optcnt = 0; /* Number of optionals bits so far */
if (p->pe_type != SEQ_START)
ferr(1, "p_pr_seq: missing SEQ_START\n");
p++;
if (p->pe_type == DFLT_B)
p++;
pe = first_member(head);
while (p->pe_type != PE_END) {
if (_pverbose > 6) {
ferr (1, "prnt_seq with the type %d\n",p->pe_type);
}
if (ISDTYPE(p) && OPTIONAL(p)) {
if (pe == NULLPE || CHKTAG(mod, p, pe) == 0)
goto next;
} else if (ISDTYPE(p) && (pe == NULLPE || CHKTAG(mod, p, pe) == 0)) {
if (DEFAULT(p)) {
setpval(p, p + 1, mod);
goto next;
} else {
dmp_ptpe("p_pr_seq:missing mandatory parameter", p, mod);
return (NULLPE);
}
}
switch (p->pe_type) {
case OPTL:
popt = (int *) int_ptr;
break;
case UCODE:
if ((*mod->md_ducode)(pe, p, mod) != OK)
return (NULLPE);
break;
case ETAG:
if ((pe = (PE) p_pr_type(1, pe, p, mod)) == NULLPE)
return NULLPE;
break;
case SEQ_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_seq(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SEQOF_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_seqof(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SET_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_set(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SETOF_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_setof(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case IMP_OBJ:
p++;
if (p->pe_type == EXTOBJ) {
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 0, NULL, (char *) 0);
xpull();
} else {
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(0, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
}
break;
case SOBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(1, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
return (NULLPE);
}
break;
case OBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(1, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
return (NULLPE);
}
break;
case CHOICE_START:
if ((pe = (PE) p_pr_choice(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case SEXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_seq: missing EXTMOD", p, mod);
ferr(1, "p_pr_seq:internal error\n");
}
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL, (char *) 0);
xpull();
break;
case EXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_seq: missing EXTMOD", p, mod);
ferr(1, "p_pr_seq:internal error\n");
}
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL, (char *) 0);
xpull();
break;
default:
if ((pe = (PE) p_pr_type(1, pe, p, mod)) == NULLPE)
return (NULLPE);
break;
/*
ferrd(1, "p_pr_seq: unknown type %d\n", p->pe_type);
*/
}
if (ISDTYPE(p) && pe != NULLPE)
pe = next_member(head, pe);
next:
NEXT_TPE(p);
}
return (head);
}
/*
* Parse a set, calling appropriate routines to parse each sub type
*/
PE
p_pr_set(head, p, mod)
PE head;
ptpe *p;
modtyp *mod; /* Module it is from */
{
PE pe;
int *popt = NULL; /* Pointer to optional field */
int *int_ptr = NULL;
int optcnt = 0; /* Number of optionals bits so far */
if (p->pe_type != SET_START)
ferr(1, "p_pr_seq: missing SET_START\n");
p++;
if (p->pe_type == DFLT_B)
p++;
while (p->pe_type != PE_END) {
if (_pverbose > 6) {
ferr (1, "prnt_set with the type %d\n",p->pe_type);
}
if (ISDTYPE(p) && OPTIONAL(p)) {
if ((pe = (PE) p_setpresent(head, p, mod)) == NULLPE)
goto next;
} else if (ISDTYPE(p) && (pe = (PE) p_setpresent(head, p, mod)) == NULLPE) {
if (DEFAULT(p)) {
printname(p->pe_typename, xlevel);
setpval(p, p + 1, mod);
goto next;
} else {
dmp_ptpe("p_pr_set:missing mandatory parameter", p, mod);
return (NULLPE);
}
}
switch (p->pe_type) {
case OPTL:
popt = int_ptr;
break;
case UCODE:
if ((*mod->md_ducode)(pe, p, mod) != OK)
return (NULLPE);
break;
case ETAG:
if ((pe = (PE) p_pr_type(1, pe, p, mod)) == NULLPE)
return NULLPE;
break;
case SEQ_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_seq(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SEQOF_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_seqof(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SET_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_set(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SETOF_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_setof(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case IMP_OBJ:
p++;
if (p->pe_type == EXTOBJ) {
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 0, NULL,
(char *) 0);
} else {
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(0, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
}
break;
case SOBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(1, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
return (NULLPE);
}
break;
case OBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(1, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
return (NULLPE);
}
break;
case CHOICE_START:
if ((pe = (PE) p_pr_choice(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case SEXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_set: missing EXTMOD", p, mod);
ferr(1, "p_pr_set:internal error\n");
}
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL, (char *) 0);
xpull();
break;
case EXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_set: missing EXTMOD", p, mod);
ferr(1, "p_pr_set:internal error\n");
}
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL, (char *) 0);
xpull();
break;
default:
if ((pe = (PE) p_pr_type(1, pe, p, mod)) == NULLPE)
return (NULLPE);
break;
/*
ferrd(1, "p_pr_set: unknown type %d\n", p->pe_type);
*/
}
next:
NEXT_TPE(p);
}
return (head);
}
/*
* Parse a sequence of calling appropriate routines to parse each sub type
*/
PE
p_pr_seqof(head, p, mod)
PE head;
ptpe *p;
modtyp *mod; /* Module it is from */
{
PE pe;
ptpe *start; /* first entry in list */
int dflt = 0;
if (p->pe_type != SEQOF_START) {
dmp_ptpe("p_pr_seqof:missing SEQOF_START", p, mod);
ferr(1, "p_pr_seqof: missing SEQOF_START\n");
}
p++;
if (p->pe_type == DFLT_B)
p++;
start = p;
pe = first_member(head);
while (pe != NULLPE) {
while (p->pe_type != PE_END) {
if (_pverbose > 6) {
ferr (1, "prnt_seqof with the type %d\n",p->pe_type);
}
if (ISDTYPE(p) && CHKTAG(mod, p, pe) == 0) {
if (DEFAULT(p))
ferr(1, "p_pr_seqof:Default not implemented\n");
else if (OPTIONAL(p))
goto next;
else {
dmp_ptpe( "p_pr_seqof:missing mandatory parameter", p,
mod);
return (NULLPE);
}
}
switch (p->pe_type) {
case UCODE:
if ((*mod->md_ducode)(pe, p, mod) != OK)
return (NULLPE);
break;
case ETAG:
if ((pe = (PE) p_pr_type(1, pe, p, mod)) == NULLPE)
return NULLPE;
break;
/* case SCTRL:
parm = (char *) ((char *) parm);
break; */
case SEQ_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_seq(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SEQOF_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_seqof(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SET_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_set(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SETOF_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_setof(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SOBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(1, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
return (NULLPE);
}
break;
case OBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(1, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
return (NULLPE);
}
break;
case CHOICE_START:
if ((pe = (PE) p_pr_choice(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case SEXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_seqof: missing EXTMOD", p, mod);
ferr(1, "p_pr_seqof:internal error\n");
}
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL, (char *) 0);
xpull();
break;
case EXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_seqof: missing EXTMOD", p, mod);
ferr(1, "p_pr_seqof:internal error\n");
}
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL, (char *) 0);
xpull();
break;
default:
if ((pe = (PE) p_pr_type(1, pe, p, mod)) == NULLPE)
return (NULLPE);
break;
}
if (ISDTYPE(p) && dflt == 0)
pe = next_member(head, pe);
next:
NEXT_TPE(p);
}
/* parm = (char *) (parm); */
p = start;
}
return (head);
}
/*
* Parse a setof, calling appropriate routines to parse each sub type
*/
PE
p_pr_setof(head, p, mod)
PE head;
ptpe *p;
modtyp *mod; /* Module it is from */
{
PE pe;
int dflt;
ptpe *start;
if (p->pe_type != SETOF_START)
ferr(1, "p_pr_setof: missing SETOF_START\n");
p++;
if (p->pe_type == DFLT_B)
p++;
start = p;
for (pe = first_member(head); pe; pe = next_member(head, pe)) {
while (p->pe_type != PE_END) {
if (_pverbose > 6) {
ferr (1, "prnt_seqof with the type %d\n", p->pe_type);
}
if (pe == NULLPE || CHKTAG(mod, p, pe) == 0) {
if (DEFAULT(p)) {
setpval(p, p + 1, mod);
goto next;
} else {
dmp_ptpe(
"p_pr_setof:missing mandatory parameter", p, mod);
return (NULLPE);
}
}
else
dflt = 0;
switch (p->pe_type) {
case UCODE:
if ((*mod->md_ducode)(pe, p, mod) != OK)
return (NULLPE);
break;
case ETAG:
if ((pe = (PE) p_pr_type(1, pe->pe_cons, p, mod)) == NULLPE)
return NULLPE;
break;
/* case SCTRL:
parm = (char *) (parm);
break; */
case SEQ_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_seq(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SEQOF_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_seqof(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SET_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_set(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SETOF_START:
xpush(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_setof(pe, p, mod)) == NULLPE) {
xpull();
return (NULLPE);
}
xpull();
break;
case SOBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(1, pe,
mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
return (NULLPE);
}
break;
case OBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(1, pe, mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE) {
return (NULLPE);
}
break;
case CHOICE_START:
if ((pe = (PE) p_pr_choice(pe,
p, mod)) == NULLPE)
return (NULLPE);
break;
case SEXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_setof: missing EXTMOD", p, mod);
ferr(1, "p_pr_setof:internal error\n");
}
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL, (char *) 0);
xpull();
break;
case EXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_setof: missing EXTMOD", p, mod);
ferr(1, "p_pr_setof:internal error\n");
}
xpush(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL, (char *) 0);
xpull();
break;
default:
if ((pe = (PE) p_pr_type(1, pe, p, mod)) == NULLPE)
return (NULLPE);
break;
/*
ferrd(1, "p_pr_setof: unknown type %d\n", p->pe_type);
*/
}
#if 0
/* fixup - we only delete in this function */
if (ISDTYPE(p) && dflt == 0)
set_del(head, pe->pe_class, pe->pe_id);
#endif
next:
NEXT_TPE(p);
}
/* parm = (char *)(parm); */
p = start;
}
return (head);
}
/*
* parse a choice field. This means find which choice is taken
*/
PE
p_pr_choice(head, p, mod)
PE head;
ptpe *p;
modtyp *mod; /* Module it is from */
{
int offset;
int cnt;
PE pe;
if (p->pe_type != CHOICE_START) {
dmp_ptpe("p_pr_choice:missing CHOICE_START", p, mod);
ferrd(1, "p_pr_choice:illegal table entry %d\n", p->pe_type);
}
p++;
xpush(p->pe_typename, xlevel);
if (p->pe_type == DFLT_B)
p++;
if (p->pe_type == SCTRL) {
p++;
}
for (cnt = 1; p->pe_type != PE_END; NEXT_TPE(p), cnt++) {
if (ISDTYPE(p) && p_ismatch(p, mod, head->pe_class, head->pe_id)) {
pe = (PE) p_pr_etype(head, p, mod);
offset = cnt;
xpull();
return (pe);
}
}
dmp_ptpe("p_pr_choice: no choice taken", p, mod);
return (NULLPE);
}
/*
* Calculate the next ptpe entry in the sequence. Count a sequence as one element
*/
ptpe *
next_ptpe(p)
ptpe *p;
{
int level;
level = 0;
if (p->pe_type == PE_END)
ferr(1, "next_ptpe:PE_END");
do {
again:
switch (p->pe_type) {
case SEQ_START:
case SEQOF_START:
case SET_START:
case SETOF_START:
case CHOICE_START:
level++;
break;
case UCODE:
case SCTRL:
case CH_ACT:
case INTEGER:
case BOOLEAN:
case SANY:
case SCONS_ANY:
case ANY:
case CONS_ANY:
case T_NULL:
case OBJECT:
case SOBJECT:
case BITSTRING:
case SBITSTRING:
case OCTETSTRING:
case SOCTETSTRING:
case OBJID:
case SOBJID:
case OPTL:
case EXTMOD:
case DFLT_B:
break;
case IMP_OBJ:
case ETAG:
case EXTOBJ:
case SEXTOBJ:
case DFLT_F:
p++;
goto again;
case PE_END:
level--;
break;
default:
ferrd(1, "next_ptpe: unknown type %d\n", p->pe_type);
}
p++;
} while (level > 0 || p->pe_type == DFLT_B);
return (p);
}
/*
* check that pe is non null and that the tag and class match and return
* zero if the don't
*/
p_chktag(mod, p, pe)
modtyp *mod; /* Module it is from */
ptpe *p;
PE pe;
{
int cl, tag;
if (pe == NULLPE)
return (0);
#if 0
if (p->pe_type == OBJECT && skip_next_tag) /* first time we find skip */
return (1);
if (skip_next_tag) { /* 2nd time reset skip */
skip_next_tag = 0;
return (1);
}
#endif
if (!p_findcltag(p, mod, &cl, &tag))
return (0);
if (pe->pe_id != tag || pe->pe_class != cl)
return (0);
return (1);
}
#if 0
/*
test if we need to check the tag associated with the ptpe entry p
*/
legal_tag(p)
ptpe *p;
{
int ret;
switch (p->pe_type) {
case SCTRL:
case CH_ACT:
case ANY:
case OBJECT:
case CHOICE_START:
case CONS_ANY:
/* case ETAG: don't think we should have this here */
ret = 0;
break;
default:
#if 0
if (skip_next_tag) {
skip_next_tag = 0;
ret = 0;
}
else
#endif
ret = 1;
break;
}
return ret;
}
#endif
/*
* Parse a single type for explicit tag
* If a basic type parse it, if a compound type call the appropriate
* parsing routine
*/
PE
p_pr_etype(pe, p, mod)
PE pe;
ptpe *p;
modtyp *mod; /* Module it is from */
{
int intval, len, i;
char *ptr;
struct qbuf *qptr;
PE pe_ptr;
OID oid;
switch (p->pe_type) {
case PE_END:
case PE_START:
return (NULLPE);
case UCODE:
if ((*mod->md_ducode)(pe, p, mod) != OK)
return (NULLPE);
break;
case ETAG:
switch (p->pe_ucode) {
default:
p++;
if (p_pr_etype(pe->pe_cons, p, mod) == NULLPE)
return (NULLPE);
}
break;
case SEQ_START:
if ((pe = (PE) p_pr_seq(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case SEQOF_START:
if ((pe = (PE) p_pr_seqof(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case SET_START:
if ((pe = (PE) p_pr_set(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case SETOF_START:
if ((pe = (PE) p_pr_setof(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case IMP_OBJ:
p++;
if (p->pe_type == EXTOBJ) {
printname(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 0, NULL,
(char **) 0);
} else {
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(0, pe,
mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE)
return (NULLPE);
}
break;
case SOBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(1, pe,
mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE)
return (NULLPE);
break;
case OBJECT:
printname(p->pe_typename, xlevel);
if ((pe = (PE) p_pr_obj(1, pe,
mod->md_ptab[p->pe_tag] + 1, mod)) == NULLPE)
return (NULLPE);
break;
case CHOICE_START:
if ((pe = (PE) p_pr_choice(pe, p, mod)) == NULLPE)
return (NULLPE);
break;
case SEXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_etype: missing EXTMOD", p, mod);
ferr(1, "p_pr_etype:internal error\n");
}
printname(p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
(char *) 0);
break;
case EXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_pr_etype: missing EXTMOD", p, mod);
ferr(1, "p_pr_etype:internal error\n");
}
printname (p->pe_typename, xlevel);
prnt_f(p->pe_tag, (modtyp *)p[1].pe_ucode, pe, 1, NULL,
(char *) 0);
break;
case INTEGER:
if (pe != NULLPE) {
if ((intval = prim2num(pe)) == NOTOK && pe->pe_errno != PE_ERR_NONE) {
ferr (1, "p_pr_etype:bad integer %s",
pe_error(pe->pe_errno));
return (NULLPE);
} else {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s %d (ETAG INTEGER)\n", (p->pe_typename) ? p->pe_typename : "", intval);
else
(*vfnx) (vfp, "%s %d \n", (p->pe_typename) ? p->pe_typename : "", intval);
}
}
break;
case BOOLEAN:
if (pe != NULLPE) {
if ((intval = prim2flag(pe)) == NOTOK && pe->pe_errno != PE_ERR_NONE) {
ferr (1, "p_pr_etype:bad integer %s",
pe_error(pe->pe_errno));
return (NULLPE);
} else {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s %s (ETAG BOOLEAN)\n", (p->pe_typename) ? p->pe_typename : "", (intval) ? "TRUE" : "FALSE");
else
(*vfnx) (vfp, "%s %s \n", (p->pe_typename) ? p->pe_typename : "", (intval) ? "TRUE" : "FALSE");
}
}
break;
case T_NULL:
break;
case ANY:
case CONS_ANY:
if (pe != NULLPE) {
if (pe->pe_errno != PE_ERR_NONE) {
ferr (1, "p_pr_etype:bad integer %s",
pe_error(pe->pe_errno));
return (NULLPE);
} else
pr_pe_element(pe, p);
}
break;
case SANY:
case SCONS_ANY:
/* This could require changes when I find out what the CONS_ANY type
* is really for
*/
if (pe != NULLPE) {
if (pe->pe_errno != PE_ERR_NONE) {
ferr (1, "p_pr_etype:bad integer %s",
pe_error(pe->pe_errno));
return (NULLPE);
} else
pr_pe_element(pe, p);
}
break;
case SOCTETSTRING:
if (pe != NULLPE) {
if ((((struct qbuf *) qptr)
= prim2qb(pe)) == (struct qbuf *) NULL
&& pe->pe_errno != PE_ERR_NONE) {
ferr (1, "p_pr_etype:bad octet string %s",
pe_error(pe->pe_errno));
return (NULLPE);
} else {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s \"%s\" (OCTETSTRING)\n", (p->pe_typename) ? p->pe_typename : "", qb2str(qptr));
else
(*vfnx) (vfp, "%s \"%s\"\n", (p->pe_typename) ? p->pe_typename : "", qb2str(qptr));
}
}
break;
case OCTETSTRING:
if (pe != NULLPE) {
if ((((struct qbuf *) qptr)
= prim2qb(pe)) == (struct qbuf *) NULL
&& pe->pe_errno != PE_ERR_NONE) {
ferr (1, "p_pr_etype:bad octet string %s",
pe_error(pe->pe_errno));
return (NULLPE);
} else {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s \"%s\" (OCTETSTRING)\n", (p->pe_typename) ? p->pe_typename : "", qb2str(qptr));
else
(*vfnx) (vfp, "%s \"%s\"\n", (p->pe_typename) ? p->pe_typename : "", qb2str(qptr));
}
}
break;
case SBITSTRING:
if (pe != NULLPE) {
if (((PE) pe_ptr = pe_cpy(pe)) == NULLPE) {
ferr (1, "p_pr_etype:out of memory");
return (NULLPE);
} else
indent();
(*vfnx) (vfp, "%s '", (p->pe_typename) ? p->pe_typename : "");
ptr = bitstr2strb((PE) pe_ptr, &len);
for (i=0; i < len; i+=8)
(*vfnx) (vfp, "%.2x ", *ptr++ & 0xff);
(*vfnx) (vfp, "'H\n");
if (_pverbose) {
indent();
(*vfnx) (vfp, "%s '", (p->pe_typename) ? p->pe_typename : "");
for (i=0; i < len; i++) {
(*vfnx) (vfp, "%d", bit_test((PE) pe_ptr, i));
if ((i+1) % 4 == 0)
(*vfnx) (vfp, " ");
}
(*vfnx) (vfp, "'B (BITSTRING)\n");
}
}
break;
case BITSTRING:
if (pe != NULLPE) {
if (((PE) pe_ptr = pe_cpy(pe)) == NULLPE) {
ferr (1, "p_pr_etype:out of memory");
return (NULLPE);
} else
indent();
(*vfnx) (vfp, "%s '", (p->pe_typename) ? p->pe_typename : "");
ptr = bitstr2strb((PE) pe_ptr, &len);
for (i=0; i < len; i+=8)
(*vfnx) (vfp, "%.2x ", *ptr++ & 0xff);
(*vfnx) (vfp, "'H\n");
if (_pverbose) {
indent();
(*vfnx) (vfp, "%s '", (p->pe_typename) ? p->pe_typename : "");
for (i=0; i < len; i++) {
(*vfnx) (vfp, "%d", bit_test((PE) pe_ptr, i));
if ((i+1) % 4 == 0)
(*vfnx) (vfp, " ");
}
(*vfnx) (vfp, "'B (BITSTRING)\n");
}
}
break;
case SOBJID:
if (((OID) oid = prim2oid(pe)) == NULLOID) {
ferr (1, "p_pr_etype:Object Identifier: out of memory");
return (NULLPE);
} else {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s %s (SOBJECT ID)\n", (p->pe_typename) ? p->pe_typename : "", (char *) sprintoid(oid));
else
(*vfnx) (vfp, "%s %s\n", (p->pe_typename) ? p->pe_typename : "", (char *) sprintoid(oid));
}
break;
case OBJID:
if (((OID) oid = prim2oid(pe)) == NULLOID) {
ferr (1, "en_etype:Object Identifier: out of memory");
return (NULLPE);
} else {
indent();
if (_pverbose)
(*vfnx) (vfp, "%s %s (OBJECT ID)\n", (p->pe_typename) ? p->pe_typename : "", (char *) sprintoid(oid));
else
(*vfnx) (vfp, "%s %s\n", (p->pe_typename) ? p->pe_typename : "", (char *) sprintoid(oid));
}
break;
default:
ferrd(1, "p_pr_etype: %d not implemented\n", p->pe_type);
break;
}
return (pe);
}
/*
* determine what the class and tag must be of the given object
*/
p_findcltag(p, mod, pcl, ptag)
ptpe *p;
modtyp *mod; /* Module it is from */
int *pcl, *ptag;
{
if (!ISDTYPE(p))
return (0);
if (p->pe_type != OBJECT) {
*pcl = CLASS(p);
*ptag = TAG(p);
return (1);
}
p = mod->md_ptab[p->pe_tag] + 1;
while (p->pe_type != PE_END) {
if (ISDTYPE(p))
return (p_findcltag(p, mod, pcl, ptag));
}
dmp_ptpe("p_findcltag:warning:object with no data in it", p, mod);
return (0);
}
/*
* Is there a match at for this tag and class pair. Return 1 if yes 0 if no
* We will search through contained objects and through choices
*/
p_ismatch(p, mod, cl, tag)
ptpe *p;
modtyp *mod; /* Module it is from */
unsigned int cl, tag;
{
if (!ISDTYPE(p))
return (0);
switch (p->pe_type) {
case SOBJECT:
case OBJECT:
/* Needs to be changed for optional and default */
return (p_ismatch(p = mod->md_ptab[p->pe_tag] + 1, mod, cl, tag));
case SEXTOBJ:
case EXTOBJ:
if (p[1].pe_type != EXTMOD) {
dmp_ptpe("p_ismatch: missing EXTMOD", p, mod);
ferr(1, "p_ismatch:internal error\n");
}
return(p_ismatch(((modtyp *)p[1].pe_ucode)->md_ptab[p->pe_tag] + 1,
(modtyp *)p[1].pe_ucode, cl, tag));
case CHOICE_START:
for (p++; p->pe_type != PE_END; p = NEXT_TPE(p)) {
if (!ISDTYPE(p))
continue;
if (p_ismatch(p, mod, cl, tag))
return (1);
}
return (0);
default:
return (tag == TAG(p) && cl == CLASS(p));
}
/*NOTREACHED*/
/* return (0); */
}
/*
* determine if the given field is present in the data
* This is simple if the field is a simple type with an obvious tag but
* in the case of an object or a CHOICE type the tag is not obvious. If the
* object is a CHOICE there are more than one possible tag that could match
* and in this case we must try to match each one of them.
*/
PE
p_setpresent(head, p, mod)
PE head;
ptpe *p;
modtyp *mod;
{
PE pe;
if (!ISDTYPE(p))
return (NULLPE);
switch (p->pe_type) {
case OBJECT:
case SOBJECT:
{
/* Needs to be changed for optional and default */
return (p_setpresent(head, p = mod->md_ptab[p->pe_tag] + 1, mod));
}
case CHOICE_START:
for (p++; p->pe_type != PE_END; p = NEXT_TPE(p)) {
if (!ISDTYPE(p))
continue;
if ((pe = (PE) p_setpresent(head, p, mod)))
return (pe);
}
return (NULLPE);
default:
return (set_find(head, CLASS(p), TAG(p)));
}
}
/*
* set the default value to that value in the structure
*/
setpval(typ, dflt, mod)
ptpe *typ, *dflt;
modtyp *mod;
{
int len, i, intval;
char *ptr, charval;
PE pe_ptr;
struct qbuf *qptr;
again:
switch (typ->pe_type) {
case INTEGER:
intval = IVAL(dflt);
indent();
(*vfnx) (vfp, "%d (DEFAULT INTEGER)\n", intval);
break;
case BOOLEAN:
intval = IVAL(dflt);
indent();
/* (*vfnx) (vfp, "%s %d (DEFAULT BOOLEAN)\n", (typ->pe_typename) ? typ->pe_typename : "", charval); */
(*vfnx) (vfp, "%d (DEFAULT BOOLEAN)\n", intval);
break;
case T_NULL:
/* Only one value */
break;
case SBITSTRING:
(PE) pe_ptr = strb2bitstr(PVAL(dflt), IVAL(dflt), 0, 0);
break;
case BITSTRING:
(PE) pe_ptr =
strb2bitstr(PVAL(dflt), IVAL(dflt), 0, 0);
indent();
(*vfnx) (vfp, " '");
ptr = bitstr2strb((PE) pe_ptr, &len);
for (i=0; i < len; i+=8)
(*vfnx) (vfp, "%.2x", *ptr++);
(*vfnx) (vfp, "'H (DEFAULT BITSTRING)\n");
if (_pverbose) {
indent();
(*vfnx) (vfp, " '");
for (i=0; i < len; i++) {
(*vfnx) (vfp, "%d", bit_test((PE) pe_ptr, i));
if ((i+1) % 4 == 0)
(*vfnx) (vfp, " ");
}
(*vfnx) (vfp, "'B (DEFAULT BITSTRING)\n");
}
break;
case SOCTETSTRING:
/* (struct qbuf *) qptr = str2qb(PVAL(dflt), IVAL(dflt), 1);
break; */
case OCTETSTRING:
(struct qbuf *) (qptr) =
str2qb(PVAL(dflt), IVAL(dflt), 1);
if (_pverbose)
(*vfnx) (vfp, "\"%s\" (DEFAULT OCTETSTRING)\n", qb2str((struct qbuf *) qptr));
else
(*vfnx) (vfp, "\"%s\" (DEFAULT OCTETSTRING)\n", qb2str((struct qbuf *) qptr));
break;
case OBJECT:
setpval(mod->md_ptab[typ->pe_tag] + 1, dflt, mod);
break;
case SOBJECT:
setpval(mod->md_ptab[typ->pe_tag] + 1, dflt, mod);
break;
case IMP_OBJ:
typ++;
case SCONS_ANY:
case ANY:
case CONS_ANY:
case SANY:
case SEXTOBJ:
case EXTOBJ:
case OBJID:
case SOBJID:
case SEQ_START:
case SET_START:
case -1: /* Just use the pepy method of null pointers */
/* This is the posy/pepy hack way of doing things at the moment */
(char *) ptr = NULL;
break;
default:
/* dmp_tpe("setpval: type not implemented", typ, mod); - need mod*/
ferrd(1, "setpval: %d not implemented\n", typ->pe_type);
break;
}
}
xpush(string)
char *string;
{
if (string && *string) {
printname(string);
tabed = 0;
xlevel++;
xpushed++;
(*vfnx) (vfp, "{\n");
} else
xpushed++;
}
xpull()
{
int i;
if (xpushed == xlevel) {
xlevel--;
xpushed--;
for (i = xlevel; i > 0; i--)
(*vfnx) (vfp, " ");
(*vfnx) (vfp, "}\n");
} else
xpushed--;
}
char *
printable(strptr)
char *strptr;
{
char *ptr;
if (strptr == NULL) {
ferr(1, "NULL String pointer\n");
return(NULL);
}
if (*strptr == NULL)
return(NULL);
for (ptr=strptr; *ptr; ptr++) {
if (isprint(*ptr))
continue;
else
return(NULL);
}
return(strptr);
}
pr_pe_element(pe_ptr, p)
PE pe_ptr;
ptpe *p;
{
int i = 0;
char *ptr, *class;
PE p1;
switch (pe_ptr->pe_class) {
case PE_CLASS_UNIV:
class = "UNIVERSAL";
break;
case PE_CLASS_APPL:
class = "APPLICATION";
break;
case PE_CLASS_CONT:
class = "CONTEXT";
break;
case PE_CLASS_PRIV:
class = "PRIVATE";
break;
default:
class = "UNDEFINED CLASS";
break;
}
if (pe_ptr->pe_form == PE_FORM_CONS) {
indent();
if (p->pe_typename && *p->pe_typename)
(*vfnx) (vfp, "%s {\n", p->pe_typename);
else
if (pe_ptr->pe_class == PE_CLASS_CONT)
(*vfnx) (vfp, " [%d] {\n", pe_ptr->pe_id);
else
(*vfnx) (vfp, " [%s %d] {\n", class, pe_ptr->pe_id);
xlevel++;
for (p1 = pe_ptr->pe_un1.un_pe_cons; p1; p1 = p1->pe_next) {
p->pe_typename = "";
pr_pe_element(p1, p);
}
xlevel--;
indent();
(*vfnx) (vfp, " }\n");
} else {
indent();
if (ptr = printable(pe_ptr->pe_un1.un_pe_prim))
(*vfnx) (vfp, "%s [%s %d] \"%s\"\n", (p->pe_typename) ? p->pe_typename : "", class, pe_ptr->pe_id, (*ptr) ? ptr : "");
else {
(*vfnx) (vfp, "%s [%s %d] '", (p->pe_typename) ? p->pe_typename : "", class, pe_ptr->pe_id);
if (pe_ptr->pe_un1.un_pe_prim) {
for (ptr= (char *) pe_ptr->pe_un1.un_pe_prim; i < pe_ptr->pe_len; ptr++, i++)
(*vfnx) (vfp, "%.2x", *ptr & 0xff);
}
(*vfnx) (vfp, "'H \n");
}
}
}
printname(string)
char *string;
{
int i;
tabed = 1;
for (i = xlevel; i > 0; i--)
(*vfnx) (vfp, " ");
if (string && *string)
(*vfnx) (vfp, "%s ", string);
}
indent()
{
int i;
if (tabed) {
tabed = 0;
return;
}
for (i = xlevel; i > 0; i--)
(*vfnx) (vfp, " ");
}