diff options
Diffstat (limited to 'src/isode/pepsy/etabs.c')
| -rw-r--r-- | src/isode/pepsy/etabs.c | 2264 |
1 files changed, 0 insertions, 2264 deletions
diff --git a/src/isode/pepsy/etabs.c b/src/isode/pepsy/etabs.c deleted file mode 100644 index d90f727a7a..0000000000 --- a/src/isode/pepsy/etabs.c +++ /dev/null @@ -1,2264 +0,0 @@ -/* etabs.c */ - -/* - * isode/pepsy/etabs.c - */ - -/* - * 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. - * - */ - - -#include <stdio.h> -#include <ctype.h> -#include "pepsydefs.h" -#include "sym.h" -#include "pass2.h" -#include "mine.h" - -s_table *head; - -extern s_table *lookup_list(), *proc_def(); - -extern char *c_tag(), *c_class(); -extern char *ec_tag(), *ec_class(); -extern char *strip_last(); -extern char *get_val(), *get_comp(), *get_string(); -extern s_table *get_offset(); -extern char *my_strcat(), *strp2name(); -extern char *my_new_str(); -extern char *mymodule; -extern char *modsym(); -extern char *concat(); -extern char *genlabel(); -extern char *notidtoid(); -extern char *code2name(); -extern char *yp2name(); -extern YV calc_yv(); -extern SY syfind(); -static s_table *en_ptr; -extern s_table *ptr; -extern char *rm_indirect(); -extern char *getfield(); -extern char *setfield(); - -static int cons_type = 0; -/* int explicit; */ - -s_table *save_ptr; - -extern YT gen_etag(); - -#define WORDSIZE 20 -#define MAXNAME 256 /* maximum size of a identifier */ - -#ifdef DEBUG -char *str_yp_code[] = { - "Undefined", "Boolean", "Integer", "Named number list", "Bitstring", - "Named Bitstring list", "Octet String", "Null", "Sequence", - "Sequence of", "Sequence list", "Set", "Set of", "Set list", - "Choice", "Any", "Object Identifier", - "", "", "", "", "", "", "", "", - "", "", "", "", "", "", "", "Identifier", - -}; - -#endif - -/* - * table encode a type. generate tables for the encoding of a type - */ -tenc_typ(fp, yp, id, type) -FILE *fp; -YP yp; -char *id; -char *type; -{ - - char *t, *f; - char *p1; - YP y; - YAL yal; - - - if (yp->yp_code < 0 || yp->yp_code > YP_REAL) - ferrd(1, "tenc_typ: unimplemented type %d\n", yp->yp_code); - - if (yp == NULL) { - ferr(0, "tenc_typ:NULL argument\n"); - return; - } - - /* Preserve the type of the containing object */ - if (type) - t = type; - else if (yp->yp_param_type) { - char *t1; - /* we have a [[ P type ]] specification */ - if ((t1 = rm_indirect(yp->yp_param_type)) == NULLCP) { - fprintf(stderr, - "\ntenc_typ:SETLIST can't extract direct type from %s\n", - yp->yp_param_type); - exit(1); - } - t = strdup(t1); - } else - t = my_strcat("struct ", modsym(mymodule, id, "type")); - - if (yal = yp->yp_bef_alist) { - yal->yal_type = t; - if (yal->yal_enc) - gen_act(fp, yp->yp_bef_alist->yal_enc); - } - if (yal = yp->yp_aft_alist) { - yal->yal_type = t; - } - if (yal = yp->yp_control_act) - yal -> yal_type = t; - - if (yal = yp->yp_optional_act) - yal -> yal_type = t; - - if (yp->yp_flags & YP_DEFAULT) - gdflt(fp, yp, G_ENC); - - if ((yp->yp_flags & YP_PARMVAL) && yp->yp_parm) { - if ((f = getfield(yp->yp_parm)) == NULLCP) { - fprintf(stderr, "\ntenc_typ: can't extract field from %s\n", - yp->yp_parm); - exit(1); - } - f = strdup(f); - } else - f = yp->yp_varexp; - - if ((yp->yp_flags & (YP_OPTIONAL|YP_OPTCONTROL|YP_DEFAULT)) - == (YP_OPTIONAL|YP_OPTCONTROL)) { - char *f1; - char *bitno; - - if (yp -> yp_optional_act && yp -> yp_optional_act -> yal_enc) { - fprintf (fp, "\t{ BOPTIONAL, %d, 0, FL_USELECT},\n", - yp -> yp_optional_act -> yal_enc -> a_num); - } - else { - if ((f1 = getfldbit(yp->yp_optcontrol, &bitno)) == NULLCP) { - fprintf(stderr, - "\ntenc_typ:BOPTIONAL: can't extract field from %s\n", - yp->yp_optcontrol); - exit(1); - } - (void) fprintf(fp, "\t{ BOPTIONAL, AOFFSET(%s, %s), %s, 0},\n", - t, f1, bitno); - } - } - - /* handle explicit tags - one day may have to change this if anyone - * ever defines a type with more than one explicit tag - */ - if (yp->yp_flags & YP_TAG && !(yp->yp_flags & YP_IMPLICIT)) { - (void) fprintf(fp, "\t{ ETAG, 0, "); - (void) fprintf(fp, "%s, %s },\n", ec_tag(yp), ec_class(yp)); - } - - if (yp->yp_yfn && yp->yp_yfn->yfn_enc) { - gen_fn(fp, yp, yp->yp_yfn->yfn_enc); - - if (yp->yp_aft_alist && yp->yp_aft_alist->yal_enc) - gen_act(fp, yp->yp_aft_alist->yal_enc); - - return; - } - - switch (yp->yp_code) { - - case YP_UNDF: - ferr(1, "tenc_typ:Undefined type\n"); - - case YP_BOOL: - p1 = "BOOLEAN"; - if (yp->yp_intexp) - f = setfield(yp->yp_intexp); - if (noindirect(f)) - ferr(1, "tenc_typ:BOOL: must specify a field [[ b .. ]]\n"); - if (yp->yp_varexp || (yp->yp_intexp && !noindirect(f))) - break; - ferr(1, "tenc_typ:BOOL: couldn't determine type\n"); - - case YP_INTLIST: - - case YP_INT: - - case YP_ENUMLIST: - if (yp->yp_intexp) - f = setfield(yp->yp_intexp); - if (noindirect(f)) - ferr(1, "tenc_typ:INT: must specify a field [[ i .. ]]\n"); - if (yp->yp_varexp || (yp->yp_intexp && !noindirect(f))) { - p1 = "INTEGER"; - break; - } - ferr(1, "tenc_typ:INT: couldn't determine type\n"); - break; - - case YP_REAL: - if (yp->yp_strexp) - f = setfield(yp->yp_strexp); - if (noindirect(f)) - ferr(1, "tenc_typ:REAL: must specify a field [[ r .. ]]\n"); - if (yp->yp_varexp || (yp->yp_strexp && !noindirect(f))) { - p1 = "REALTYPE"; - break; - } - ferr(1, "tenc_typ:REAL: couldn't determine type\n"); - break; - - case YP_BIT: - case YP_BITLIST: - if (yp->yp_strexp && yp->yp_intexp) { - if (yp->yp_strexp) - f = setfield(yp->yp_strexp); - if (noindirect(f)) - ferr(1, "tenc_typ:BIT: must specify a field [[ x .. ]]\n"); - p1 = "BITSTR_PTR"; - prnte(fp, t, f, yp, p1); - if (yp->yp_intexp) - f = setfield(yp->yp_intexp); - if (noindirect(f)) - ferr(1, "tenc_typ:BIT: must specify a field [[ x .. ]]\n"); - p1 = "BITSTR_LEN"; - break; - } - if (yp->yp_strexp == NULLCP && yp->yp_intexp) - f = setfield(yp->yp_intexp); - if (yp->yp_varexp || (yp->yp_intexp && !noindirect(f))) { - p1 = "BITSTRING"; - break; - } - t = NULL; - p1 = NULL; - (void) fprintf(fp, "\t{ SBITSTRING, 0, %s, %s },\n", - c_tag(yp), c_class(yp)); - break; - - case YP_OCT: - if (yp->yp_strexp) { - switch (yp->yp_prfexp) { - case 'q': /* [[ q parm->qbufptr ]] */ - if (yp->yp_strexp) - f = setfield(yp->yp_strexp); - if (noindirect(f)) - p1 = "SOCTETSTRING"; - else - p1 = "OCTETSTRING"; - break; - - case 's': /* [[ s ptr ]] */ - if (yp->yp_strexp) - f = setfield(yp->yp_strexp); - if (noindirect(f)) - ferr(1, "tenc_typ:OCT: must specify a field [[ s .. ]]\n"); - p1 = "T_STRING"; - break; - - case 'o': /* [[ o ptr $ length ]] */ - if (yp->yp_strexp) - f = setfield(yp->yp_strexp); - if (noindirect(f)) - ferr(1, "tenc_typ:OCT: must specify a field [[ s .. ]]\n"); - p1 = "OCTET_PTR"; - prnte(fp, t, f, yp, p1); - if (yp->yp_intexp) - f = setfield(yp->yp_intexp); - if (noindirect(f)) - ferr(1, "tenc_typ:OCT: must specify a field [[ s .. ]]\n"); - p1 = "OCTET_LEN"; - break; - - default: - fprintf(stderr,"\ntenc_typ: Unknown Octet string specifier %c\n", - yp->yp_prfexp); - exit(1); - } - break; - } - - if (f && !noindirect(f)) { - p1 = "OCTETSTRING"; - break; - } - t = NULL; - p1 = NULL; - (void) fprintf(fp, "\t{ SOCTETSTRING, 0, %s, %s },\n", - c_tag(yp), c_class(yp)); - break; - - case YP_OID: - if (yp->yp_strexp) - f = setfield(yp->yp_strexp); - if (yp->yp_varexp || (yp->yp_strexp && !noindirect(f))) { - p1 = "OBJID"; - break; - } - t = NULL; - p1 = NULL; - (void) fprintf(fp, "\t{ SOBJID, 0, %s, %s },\n", - c_tag(yp), c_class(yp)); - break; - - - case YP_SEQ: - case YP_SET: - case YP_ANY: - if (yp->yp_strexp) - f = setfield(yp->yp_strexp); - if (yp->yp_varexp || (yp->yp_strexp && !noindirect(f))) { - p1 = "ANY"; - break; - } - t = NULL; - p1 = NULL; - (void) fprintf(fp, "\t{ SANY, 0, %s, %s },\n", - c_tag(yp), c_class(yp)); - break; - - case YP_NULL: - p1 = "T_NULL"; - t = NULL; - break; - - case YP_IDEFINED: - p1 = NULL; - if ((yp->yp_flags & YP_PARMVAL) && yp->yp_prfexp) - ferr(1, - "\n[[ ? reference ]] [[ p reference ]] is illegal\n\t only one allowed\n"); - - if (yp->yp_prfexp) { /* [[ ? parm->field ]] - complex to process */ - gen_identry(fp, t, f, yp, gen_ventry); - break; - } - - { - /* Predefined Universal Type */ - struct univ_typ *p, *univtyp(); - - if ((p = univtyp(yp->yp_identifier))) { - if (p->univ_flags & UNF_EXTMOD) { - yp->yp_module = p->univ_mod; - goto do_obj; - } - if (f == NULL || noindirect(f)) {/* No offset type */ - if (yp->yp_flags & YP_TAG - && yp->yp_flags & YP_IMPLICIT) - prstfield(fp, p->univ_tab, t, f, - int2tstr(yp->yp_tag->yt_value->yv_number), - c_flags(yp, yp->yp_tag->yt_class)); - /* - (void) fprintf(fp, "\t{ S%s, 0, %d, %s },\n", - p->univ_tab, - yp->yp_tag->yt_value->yv_number, - c_flags(yp, yp->yp_tag->yt_class)); - */ - else - prstfield(fp, p->univ_tab, t, f, - int2tstr((int)p->univ_id), - c_flags(yp, p->univ_class)); - /* - (void) fprintf(fp, "\t{ S%s, 0, %d, %s },\n", - p->univ_tab, p->univ_id, - c_flags(yp, p->univ_class)); - */ - break; - } - if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT) - prtfield(fp, p->univ_tab, t, f, - int2tstr(yp->yp_tag->yt_value->yv_number), - c_flags(yp, yp->yp_tag->yt_class)); - /* - (void) fprintf(fp, "\t{ %s, OFFSET(%s, %s), %d, %s },\n", - p->univ_tab, t, f, - yp->yp_tag->yt_value->yv_number, - c_flags(yp, yp->yp_tag->yt_class)); - */ - else - prtfield(fp, p->univ_tab, t, f, int2tstr((int)p->univ_id), - c_flags(yp, p->univ_class)); - /* - (void) fprintf(fp, "\t{ %s, OFFSET(%s, %s), %d, %s },\n", - p->univ_tab, t, f, p->univ_id, - c_flags(yp, p->univ_class)); - */ - break; - } - } -do_obj: - if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT) - (void) fprintf(fp, "\t{ IMP_OBJ, 0, %s, %s },\n", c_tag(yp), c_class(yp)); - if (yp->yp_module == NULL - || strcmp(yp->yp_module, mymodule) == 0) { - if (f == NULL || noindirect(f)) { /* No offset type */ - prstfield(fp, "OBJECT", t, f, - concat("_Z", proc_name(yp->yp_identifier, 0)), - c_class(yp)); - /* - (void) fprintf(fp, "\t{ SOBJECT, 0, _Z%s, %s },\n", - proc_name(yp->yp_identifier, 0), c_class(yp)); - */ - } else - prtfield(fp, "OBJECT", t, f, - concat("_Z", proc_name(yp->yp_identifier, 0)), - c_class(yp)); - /* - (void) fprintf(fp, - "\t{ OBJECT, OFFSET(%s, %s), _Z%s, %s },\n", - t, f, proc_name(yp->yp_identifier, 0), c_class(yp)); - */ - } else { - if (f == NULL || noindirect(f)) { /* No offset type */ - prstfield(fp, "EXTOBJ", t, f, - concat("_Z", strp2name(yp->yp_identifier, yp->yp_module)), - c_class(yp)); - /* - (void) fprintf(fp, "\t{ SEXTOBJ, 0, _Z%s, %s },\n", - strp2name(yp->yp_identifier, yp->yp_module), - c_class(yp)); - */ - } else - prtfield(fp, "EXTOBJ", t, f, - concat("_Z", strp2name(yp->yp_identifier, yp->yp_module)), - c_class(yp)); - /* - (void) fprintf(fp, - "\t{ EXTOBJ, OFFSET(%s, %s), _Z%s, %s },\n", - t, f, strp2name(yp->yp_identifier, yp->yp_module), - c_class(yp)); - */ - - (void) fprintf(fp, "\t{ EXTMOD, %d, 0, 0 },\n", - gen_modref(yp->yp_module)); - } - break; - - case YP_SEQLIST: - p1 = NULL; - /* support for -h flag */ - cons_type++; - save_ptr = en_ptr; - if (yp->yp_varexp == NULL && type != NULL) - ferr(1, "tenc_typ:YP_SEQLIST:NULL varexp pointer\n"); - prcte(fp, type, t, f, yp, "SEQ_START"); - if (y = yp->yp_type) { - char *t1; - - /* compute the type of data */ - if (yp->yp_param_type) { - /* we have a [[ P type ]] specification */ - if ((t1 = rm_indirect(yp->yp_param_type)) == NULLCP) { - fprintf(stderr, - "\ntenc_typ:SEQLIST: can't extract direct type from %s\n", - yp->yp_param_type); - exit(1); - } - yp->yp_structname = strdup(t1); - } else if (type) { - if (yp->yp_declexp == NULL) - ferr(1, "tenc_typ:YP_SEQLIST:no declexp\n"); - yp->yp_structname = my_strcat("struct ", yp->yp_declexp); - } else - yp->yp_structname = t; - - if (optfield(y)) { - (void) fprintf(fp, - "\t{ OPTL, OFFSET(%s, optionals), 0, 0 },\n", - yp->yp_structname); - } - tenc_loop(fp, y, id, yp->yp_structname); - } - (void) fprintf(fp, "\t{ PE_END, 0, 0, 0 },\n"); - en_ptr = save_ptr; - cons_type--; - break; - - case YP_SETLIST: - p1 = NULL; - /* support for -h flag */ - cons_type++; - if (yp->yp_varexp == NULL && type != NULL) - ferr(1, "tenc_typ:YP_SETLIST:NULL varexp pointer\n"); - prcte(fp, type, t, f, yp, "SET_START"); - if (y = yp->yp_type) { - char *t1; - - if (yp->yp_param_type) { - /* we have a [[ P type ]] specification */ - if ((t1 = rm_indirect(yp->yp_param_type)) == NULLCP) { - fprintf(stderr, - "\ntenc_typ:SETLIST can't extract direct type from %s\n", - yp->yp_param_type); - exit(1); - } - yp->yp_structname = strdup(t1); - } else if (type) { - if (yp->yp_declexp == NULL) - ferr(1, "tenc_typ:YP_SETLIST:no declexp\n"); - yp->yp_structname = my_strcat("struct ", yp->yp_declexp); - } else - yp->yp_structname = t; - if (optfield(y)) { - (void) fprintf(fp, - "\t{ OPTL, OFFSET(%s, optionals), 0, 0 },\n", - yp->yp_structname); - } - tenc_loop(fp, y, id, yp->yp_structname); - } - (void) fprintf(fp, "\t{ PE_END, 0, 0, 0 },\n"); - en_ptr = save_ptr; - cons_type--; - break; - - case YP_SEQTYPE: - p1 = NULL; - cons_type++; - save_ptr = en_ptr; - prcte(fp, type, t, f, yp, "SEQOF_START"); - if (y = yp->yp_type) { - char *t1; - - if (yp->yp_param_type) { - /* we have a [[ P type ]] specification */ - if ((t1 = rm_indirect(yp->yp_param_type)) == NULLCP) { - fprintf(stderr, - "\ntenc_typ:SETLIST can't extract direct type from %s\n", - yp->yp_param_type); - exit(1); - } - yp->yp_structname = strdup(t1); - } else if (type) { - if (yp->yp_declexp == NULL) - ferr(1, "tenc_typ:YP_SEQTYPE:no declexp\n"); - yp->yp_structname = my_strcat("struct ", yp->yp_declexp); - } else - yp->yp_structname = t; - tenc_loop(fp, y, id, yp->yp_structname); - } - if (yp->yp_flags & YP_CONTROLLED) { - char *f1; - - if ((f1 = getfield(yp->yp_control)) == NULLCP) { - fprintf(stderr, "\ntenc_typ:SEQ OF: can't extract field from %s\n", - yp->yp_control); - exit(1); - } - (void) fprintf(fp, "\t{ PE_END, OFFSET(%s, %s), 0, 0 },\n", - yp->yp_structname, f1); - } else if (yp->yp_structname != NULL) - (void) fprintf(fp, "\t{ PE_END, OFFSET(%s, next), 0, 0 },\n", - yp->yp_structname); - else - (void) fprintf(fp, "\t{ PE_END, 0, 0, 0 },\n"); - en_ptr = save_ptr; - cons_type--; - break; - - case YP_SETTYPE: - p1 = NULL; - cons_type++; - save_ptr = en_ptr; - prcte(fp, type, t, f, yp, "SETOF_START"); - - if (y = yp->yp_type) { - char *t1; - - if (yp->yp_param_type) { - /* we have a [[ P type ]] specification */ - if ((t1 = rm_indirect(yp->yp_param_type)) == NULLCP) { - fprintf(stderr, - "\ntenc_typ:SETTYPE can't extract direct type from %s\n", - yp->yp_param_type); - exit(1); - } - yp->yp_structname = strdup(t1); - } else if (type) { - if (yp->yp_declexp == NULL) - ferr(1, "tenc_typ:YP_SETTYPE:no declexp\n"); - yp->yp_structname = my_strcat("struct ", yp->yp_declexp); - } else - yp->yp_structname = t; - tenc_loop(fp, y, id, yp->yp_structname); - } - if (yp->yp_flags & YP_CONTROLLED) { - char *f1; - - if ((f1 = getfield(yp->yp_control)) == NULLCP) { - fprintf(stderr, "\ntenc_typ:SET OF: can't extract field from %s\n", - yp->yp_control); - exit(1); - } - (void) fprintf(fp, "\t{ PE_END, OFFSET(%s, %s), 0, 0 },\n", - yp->yp_structname, f1); - } else if (yp->yp_structname != NULL) - (void) fprintf(fp, "\t{ PE_END, OFFSET(%s, next), 0, 0 },\n", - yp->yp_structname); - else - (void) fprintf(fp, "\t{ PE_END, 0, 0, 0 },\n"); - en_ptr = save_ptr; - cons_type--; - break; - - case YP_CHOICE: - p1 = NULL; - /* support for -h flag */ - if (hflag && (y = yp->yp_type) && !y->yp_next) { - tenc_typ(fp, y, id, yp->yp_structname); - break; - } - cons_type++; - save_ptr = en_ptr; - if (type == NULL || type && noindirect(f)) - prstfield(fp, "CHOICE_START", t, f, NULLCP, c_class(yp)); - else - prtfield(fp, "CHOICE_START", t, type ? f : NULLCP, NULLCP, c_class(yp)); - if (y = yp->yp_type) { - char *t1; - - if (yp->yp_param_type) { - /* we have a [[ P type ]] specification */ - if ((t1 = rm_indirect(yp->yp_param_type)) == NULLCP) { - fprintf(stderr, - "\ntenc_typ:CHOICE can't extract direct type from %s\n", - yp->yp_param_type); - exit(1); - } - yp->yp_structname = strdup(t1); - } else if (type) { - if (yp->yp_declexp == NULL) - ferr(1, "tenc_typ:YP_CHOICE:no declexp\n"); - yp->yp_structname = my_strcat("struct ", yp->yp_declexp); - } else - yp->yp_structname = t; - - if (yp -> yp_control_act && yp->yp_control_act->yal_enc) { - (void) fprintf (fp, "\t{ SCTRL, %d, 0, FL_USELECT },\n", - yp -> yp_control_act -> yal_enc -> a_num); - } - else if (yp->yp_flags & YP_CONTROLLED) { - char *f1; - - if ((f1 = getfield(yp->yp_control)) == NULLCP) { - fprintf(stderr, "\ntenc_typ:CHOICE: can't extract field from %s\n", - yp->yp_control); - exit(1); - } - (void) fprintf(fp, "\t{ SCTRL, OFFSET(%s, %s), 0, 0 },\n", - yp->yp_structname, f1); - } else if (yp->yp_structname != NULL) - (void) fprintf(fp, "\t{ SCTRL, OFFSET(%s, offset), 0, 0 },\n", - yp->yp_structname); - else - ferr(1, "\nCHOICE missing SCTRL\n"); - tenc_loop(fp, y, id, yp->yp_structname); - } - (void) fprintf(fp, "\t{ PE_END, 0, 0, 0 },\n"); - en_ptr = save_ptr; - cons_type--; - break; - - default: - ferrd(1, "tenc_typ: yp_code = %d not implemented\n", yp->yp_code); - } - - if (p1 != NULL) - prnte(fp, t, f, yp, p1); - - if (yp->yp_aft_alist && yp->yp_aft_alist->yal_enc) - gen_act(fp, yp->yp_aft_alist->yal_enc); - -} - -static int fflags[] = { - 0, 1, 2, 2, 3, 3, 4, 5, 16, 16, 16, 17, 17, 17, -0, -1, 6, 0, 10, 9}; - -/* - * calculate the tag string of the given type and return it - */ -char * -c_tag(yp) -YP yp; -{ - static char buf[WORDSIZE]; - int i; - - if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT) { - i = yp->yp_tag->yt_value->yv_number; - } else { - if (yp->yp_code < 0 || yp->yp_code > YP_REAL - || yp->yp_code == YP_CHOICE) - i = 0; - else - i = fflags[yp->yp_code]; - /* Choice now legal argument - to allow prte_* routines to work */ - if (i == 0 && yp->yp_code != YP_CHOICE) - ferrd (1, "c_tag:Unknown Tag %d", yp->yp_code); - } - - (void) sprintf(buf, "%d", i); - - return (buf); -} - -/* - * calculate the tag string of the explicit tag and return it - */ -char * -ec_tag(yp) -YP yp; -{ - static char buf[WORDSIZE]; - int i; - - if (!(yp->yp_flags & YP_TAG) || yp->yp_flags & YP_IMPLICIT) - ferr(1, "ec_tag:internal error:called with out explicit tag\n"); - - i = yp->yp_tag->yt_value->yv_number; - - (void) sprintf(buf, "%d", i); - - return (buf); -} - -/* - * produce a string that represents the class/flags field for a given - * yp entry taking the class to be that given in cl - */ -char * -c_flags(yp, cl) -YP yp; -PElementClass cl; -{ - char *p1; - static char buf[STRSIZE]; - - switch (yp->yp_code) { - case YP_IDEFINED: - case YP_CHOICE: - if (yp->yp_flags & YP_TAG) - break; - if (yp->yp_flags & YP_OPTIONAL - && ((yp->yp_flags & (YP_OPTIONAL|YP_OPTCONTROL|YP_DEFAULT)) - != (YP_OPTIONAL|YP_OPTCONTROL))) { - p1 = "FL_OPTIONAL"; - } else if (yp->yp_flags & YP_DEFAULT) { - p1 = "FL_DEFAULT"; - } else - p1 = "0"; - return (p1); - - default: - break; - } - p1 = class2str(cl); - if (yp->yp_flags & YP_OPTIONAL - && ((yp->yp_flags & (YP_OPTIONAL|YP_OPTCONTROL|YP_DEFAULT)) - != (YP_OPTIONAL|YP_OPTCONTROL))) { - (void) strncpy(buf, p1, STRSIZE); - p1 = strncat(buf, "|FL_OPTIONAL", STRSIZE); - } else if (yp->yp_flags & YP_DEFAULT) { - (void) strncpy(buf, p1, STRSIZE); - p1 = strncat(buf, "|FL_DEFAULT", STRSIZE); - } - return (p1); -} -/* - * turn the class number into its corresponding string - */ -char * -class2str(cl) -PElementClass cl; -{ - register char *p1; - - switch (cl) { - case PE_CLASS_UNIV: - p1 = "FL_UNIVERSAL"; - break; - - case PE_CLASS_APPL: - p1 = "FL_APPLICATION"; - break; - - case PE_CLASS_PRIV: - p1 = "FL_PRIVATE"; - break; - - case PE_CLASS_CONT: - p1 = "FL_CONTEXT"; - break; - - default: - ferrd(1, "class2str: illegal class found %d\n", (int)cl); - - } - return (p1); -} - -/* - * calculate a string specifying the class for the given type and - * return it - */ -char * -c_class(yp) -YP yp; -{ - int i; - - if (yp->yp_flags & YP_TAG && yp->yp_flags & YP_IMPLICIT) { - i = yp->yp_tag->yt_class; - } else { - i = PE_CLASS_UNIV; - } - return (c_flags(yp, (PElementClass)i)); - -} -/* - * calculate a string specifying the class for the explicit tag and - * return it - */ -char * -ec_class(yp) -YP yp; -{ - int i; - char *p1; - static char buf[STRSIZE]; - - if (!(yp->yp_flags & YP_TAG) || yp->yp_flags & YP_IMPLICIT) - ferr(1, "ec_class:internal error:called with out explicit tag\n"); - switch (yp->yp_code) { - case YP_IDEFINED: - case YP_CHOICE: - if (yp->yp_flags & YP_TAG) - break; - if (yp->yp_flags & YP_OPTIONAL - && ((yp->yp_flags & (YP_OPTIONAL|YP_OPTCONTROL|YP_DEFAULT)) - != (YP_OPTIONAL|YP_OPTCONTROL))) { - p1 = "FL_OPTIONAL"; - } else if (yp->yp_flags & YP_DEFAULT) { - p1 = "FL_DEFAULT"; - } else - p1 = "0"; - return (p1); - - default: - break; - } - - i = yp->yp_tag->yt_class; - - switch (i) { - case PE_CLASS_UNIV: - p1 = "FL_UNIVERSAL"; - break; - - case PE_CLASS_APPL: - p1 = "FL_APPLICATION"; - break; - - case PE_CLASS_PRIV: - p1 = "FL_PRIVATE"; - break; - - case PE_CLASS_CONT: - p1 = "FL_CONTEXT"; - break; - - default: - ferrd(1, "c_class: illegal class found %d\n", i); - - } - if ((yp->yp_flags & YP_OPTIONAL) - && ((yp->yp_flags & (YP_OPTIONAL|YP_OPTCONTROL|YP_DEFAULT)) - != (YP_OPTIONAL|YP_OPTCONTROL))) { - (void) strncpy(buf, p1, STRSIZE); - p1 = strncat(buf, "|FL_OPTIONAL", STRSIZE); - } else if (yp->yp_flags & YP_DEFAULT) { - (void) strncpy(buf, p1, STRSIZE); - p1 = strncat(buf, "|FL_DEFAULT", STRSIZE); - } - return (p1); -} - -/* - * generate tables for encoding a contructed type - */ -tenc_loop(fp, yp, id, type) -FILE *fp; -YP yp; -char *id; -char *type; -{ - for (; yp != NULL; yp = yp->yp_next) { - tenc_typ(fp, yp, id, type); - } -} - -/* - * Print the string and exit if argument greater than zero - */ -ferr(i, s) -int i; -char *s; -{ - (void) fprintf(stderr, "%s", s); - if (i > 0) - exit(i); -} - -/* - * Print the integer and exit if argument greater than zero - */ -ferrd(i, s, d) -int i; -char *s; -int d; -{ - (void) fprintf(stderr, s, d); - if (i > 0) - exit(i); -} - -/* - * Print the string and exit if argument greater than zero - */ -ferrs(i, s, d) -int i; -char *s; -char *d; -{ - (void) fprintf(stderr, s, d); - if (i > 0) - exit(i); -} - -/* - * return a copy of the string s minus its last character - */ -char * -strip_last(s) -char *s; -{ - char *t, *r; - - if (s) { - t = new_string(s); - for (r = t; *r != '\0'; r++); - ; - *--r = '\0'; - return t; - } else - return NULL; -} - -/* - * add the declaration specified by the strings type and id to the - * start of the declaration list - */ -add_list(type, id) -char *type, *id; -{ - - s_table *prev; - - if ((prev = (s_table *) malloc(sizeof(s_table))) == NULL) - ferr(1, "add_list: Out of memory\n"); - prev->type = type; - prev->name = id; - prev->parent = NULL; - prev->defined = 0; - prev->next = head; - head = prev; -} - -/* - * print the declaration list - */ -print_list() -{ - s_table *prev; - - for (prev = head; prev != NULL; prev = prev->next) { - (void) printf("type is %s\n", prev->type); - (void) printf("name is %s\n", prev->name); - (void) printf("\n"); - } -} - -/* - * parse the declaration in the string s returning the type in v1 and - * the name in v2 - */ -parse_decl(s, v1, v2) -char **s, **v1, **v2; -{ - char *t; - - for (t = *s; *t != '\0' && !(isalnum(*t) || *t == '_'); t++); - - *s = t; - if (*t != '\0') { - for (; *t != '*'; t++); - *t = '\0'; - *v1 = my_strcat(*s, "*"); - Printf(3, ("the type is %s\n", *v1)); - if (*++t == '*') - t++; - for (*s = t; isalnum(*t) || *t == '_'; t++); - if (*t != '\0') { - *t = '\0'; - t++; - } - *v2 = new_string(*s); /* don't really need new_string */ - Printf(2, ("the name is %s\n", *v2)); - *s = t; - } -} - -/* - * return the next identifier in the string s - */ -char * -get_val(s) -char **s; -{ - char *t, *r; - - for (t = *s; *t != '\0' && !(isalnum(*t) || *t == '_' || *t == '.'); t++); - - if (*t != '\0') { - for (*s = t; isalnum(*t) || *t == '_' || *t == '.'; t++); - *t = '\0'; - r = *s; - Printf(3, ("arg is |%s|\n", r)); - *s = ++t; - return r; - } else - return NULL; -} - -/* - * return the next component (sequence of characters up to the next - * ';' or '\0') of the string s - */ -char * -get_comp(s) -char **s; -{ - char *t, *r; - - for (t = *s; *t != '\0' && !(isalnum(*t) || *t == '_' || *t == ';'); t++); - - if (*t != '\0') { - for (*s = t; *t != '\0' && *t != ';'; t++); - *t = '\0'; - r = *s; - Printf(3, ("component is |%s|\n", r)); - *s = ++t; - return r; - } else - return NULL; -} - -/* - * return a copy of that part of the string s which may contain - * definitions for the variables generated by posy - */ -char * -get_string(s, direction) -char *s; -int direction; -{ - char *t, *t1; - - if (direction & YP_ENCODER) - return new_string(s); - if (direction & YP_DECODER) { - t = new_string(s); - for (t1 = t; !(isalnum(*t1) || *t1 == '_'); t1++); - if (*t1 == 'i' && *++t1 == 'f' && *++t1 == ' ') { /* MEMALLOC code */ - for (; *t1 != '}'; t1++) /* skip MEMALLOC code */ - ; - t1++; - Printf(4, ("returning the string %s\n", t1)); - return t1; - } else - return t; - } - return NULL; -} - -/* - * Determine wether this list contains any items that will generate - * an optional field. If so return non zero - */ -optfield(yp) -YP yp; -{ - for (; yp; yp = yp->yp_next) { - if (yp->yp_flags & YP_OPTIONAL) { - - if ((yp->yp_flags & (YP_OPTIONAL|YP_OPTCONTROL|YP_DEFAULT)) - == (YP_OPTIONAL|YP_OPTCONTROL)) - return (0); - - switch (yp->yp_code) { - case YP_BOOL: - case YP_INT: - case YP_INTLIST: - case YP_ENUMLIST: - case YP_NULL: - return (1); - } - } - } - return (0); -} - -gen_dflts(fp, yp, type) -FILE *fp; -YP yp; -char *type; -{ - YP y; - - if (yp == NULL) - return; - switch (yp->yp_code) { - case YP_IDEFINED: - break; - - case YP_CHOICE: - case YP_SEQTYPE: - case YP_SETTYPE: - case YP_SEQLIST: - case YP_SETLIST: - for (y = yp->yp_type; y != NULL; y = y->yp_next) { - gen_dflts(fp, y, type); - } - break; - - default: - break; - } - /* Output definitions for default entries */ - if (yp->yp_flags & YP_DEFAULT) - defdflt(fp, yp, type); - - if (yp->yp_yfn) - declfns(fp, yp->yp_yfn); -} -/* - * Compute the concatenation into a temporary buffer of two strings - * after having run notid on them first - */ -char * -strp2name(s1, s2) -char *s1, *s2; -{ - char *p; - static char buf[STRSIZE * 2 + 5]; - - if ((int)strlen(s1) > STRSIZE || (int)strlen(s2) > STRSIZE) - ferr(1, "strp2name:string to big\n"); - (void) strcpy(buf, p = notidtoid(s1)); - free(p); - (void) strcat(buf, p = notidtoid(s2)); - free(p); - - return (buf); -} - -/* - * Output the definitions for default entries and initialise the yp's - * to have pointers which reference these definitions for use by - * gdflt routine. - */ -defdflt(fp, yp, name) -FILE *fp; -YP yp; -char *name; -{ - YV yv; - YV yv1; - SY sy; - YP yp1; - int size, i; - char *str; - char *label; - struct univ_typ *p; - int code; - - if ((yp->yp_flags & YP_DEFAULT) == 0) - ferrd(1, "defdflt:called with out a default code = %d\n", yp->yp_code); - yv = yp->yp_default; - - yp1 = yp; - - /* Find the bottom definition */ - code = yp1->yp_code; - while (code == YP_IDEFINED) { - if ((sy = syfind(yp1->yp_identifier)) == NULL) { - if ((p = univtyp(yp1->yp_identifier)) == NULL - || p->univ_type <= YP_UNDF) - ferrs(1, - "defdflt:IDEFINED:cannot find definition of symbol %s\n", - yp1->yp_identifier); - code = p->univ_type; - break; - - } - yp1 = sy->sy_type; - code = yp1->yp_code; - } - - switch (code) { - case YP_BOOL: - case YP_INT: - case YP_INTLIST: - case YP_ENUMLIST: - switch (yv->yv_code) { - case YV_NUMBER: - case YV_BOOL: - /* None needed */ - break; - - case YV_IDEFINED: - if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) { - ferrs(1, "defdflt:BOOL/INT:cannot find definition of %s\n", - yv->yv_identifier); - } - /* None Needed */ - break; - - default: - ferrd(1, "defdflt:INT/BOOL:unimplemented value code = %d\n", - yv->yv_code); - } - break; - - case YP_REAL: - switch (yv->yv_code) { - case YV_REAL: - yv1 = yv; - goto dumpdef3; - - case YV_IDEFINED: - if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) { - ferrs(1, "defdflt:REAL:cannot find definition of %s\n", - yv->yv_identifier); - } - goto dumpdef3; - - default: - ferrd(1, "defdflt:REAL:unimplemented value code = %d\n", - yv->yv_code); - } - break; - - case YP_BIT: - case YP_BITLIST: - switch (yv->yv_code) { - /* - * This is an illegal value for a bit string ! - BUT ACSE - * uses it ! - */ - /* gdflt also patched to support it */ - case YV_IDEFINED: - ferrs(0, - "warning:bitstring default specified illegally with identifier %s\n", - yv->yv_identifier); - if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) { - ferrs(1, "defdflt:BIT:cannot find definition of %s\n", - yv->yv_identifier); - } - /* doesn't work fix posy-yacc.y */ - size = numtobstr(yv1, &str); - goto dumpdef1; - - case YV_NUMBER: - size = numtobstr(yv, &str); - goto dumpdef1; - - case YV_VALIST: - if ((size = valisttobs(yp1, yv, &str)) < 0) { - ferrs(1, "defdflt:bad default value for bit string %s\n", - yp->yp_flags & YP_ID ? yp->yp_identifier : ""); - } - goto dumpdef1; - - case YV_HSTRING: - str = yv->yv_xstring; - size = yv->yv_xlength*4; - goto dumpdef1; - - case YV_BSTRING: - str = yv->yv_xstring; - size = yv->yv_xlength; - goto dumpdef1; - - default: - /* Could be a syntax error */ - ferrd(1, "defdflt:BIT:illegal value code = %d\n", yv->yv_code); - } - break; - - case YP_IDEFINED: - ferrs(1, "defdflt:IDEFINED:internal error on symbol %s\n", - yp1->yp_identifier); - break; - - case YP_OCT: - switch (yv->yv_code) { - case YV_NUMBER: - size = numtobstr(yv, &str); - goto dumpdef2; - - case YV_STRING: - str = yv->yv_string; - size = strlen(str); - goto dumpdef2; - - case YV_HSTRING: - str = yv->yv_xstring; - size = (yv->yv_xlength + 1)/2; - goto dumpdef2; - - case YV_BSTRING: - str = yv->yv_xstring; - size = (yv->yv_xlength + 7)/8; /* round up */ - goto dumpdef2; - - default: - /* Could be a syntax error */ - ferrd(1, "defdflt:OCT:illegal value code = %d\n", yv->yv_code); - } - break; - - case YP_NULL: - case YP_SEQ: - case YP_SEQTYPE: - case YP_SEQLIST: - case YP_SET: - case YP_SETTYPE: - case YP_SETLIST: - case YP_CHOICE: - case YP_ANY: - case YP_OID: - /* None yet */ - break; - - default: - ferrd(1, "defdflt:unknown type %d\n", code); - } - - return; - -dumpdef1: /* Bitstrings */ - label = genlabel(name, yp); - yp->yp_action0 = label; - yp->yp_act0_lineno = size; - i = (size + NBPC - 1) / NBPC; - (void) fprintf(fp, "\nstatic unsigned char %s[] = ", label); - if (printable(str, i)) - prstr(fp, str, i); - else - prhstr(fp, str, i); - (void) fprintf(fp, ";\n"); - return; - -dumpdef2: /* Octet strings (and aliases) */ - label = genlabel(name, yp); - yp->yp_action0 = label; - yp->yp_act0_lineno = size; - (void) fprintf(fp, "\nstatic unsigned char %s[] = ", label); - if (printable(str, size)) - prstr(fp, str, size); - else - prhstr(fp, str, size); - (void) fprintf(fp, ";\n"); - return; - -dumpdef3: /* Reals */ - label = genlabel(name, yp); - yp->yp_action0 = label; - (void) fprintf(fp, "\nstatic double %s = %f;\n", label, yv1->yv_real); - return; - -} -/* - * generate the default entry for encoding/decoding fields. This - * should contain the default value which the encoder will know means - * default encoding - */ -gdflt(fp, yp, which) -FILE *fp; -YP yp; -int which; /* Which type of entries to generate - * G_ENC encode G_DEC decode */ -{ - YV yv; - YV yv1; - SY sy; - YP yp1; - char *ndflt; - struct univ_typ *p; - int code; - - - if (which == G_ENC) - ndflt = "DFLT_F"; - else - ndflt = "DFLT_B"; - - if ((yp->yp_flags & YP_DEFAULT) == 0) - ferrd(1, "gdflt:called with out a default code = %d\n", yp->yp_code); - yv = yp->yp_default; - - yp1 = yp; - - /* Find the bottom definition */ - code = yp1->yp_code; - while (code == YP_IDEFINED) { - if ((sy = syfind(yp1->yp_identifier)) == NULL) { - if ((p = univtyp(yp1->yp_identifier)) == NULL - || p->univ_type <= YP_UNDF) - ferrs(1, - "gdflt:IDEFINED:cannot find definition of symbol %s\n", - yp1->yp_identifier); - code = p->univ_type; - break; - - } - yp1 = sy->sy_type; - code = yp1->yp_code; - } - - switch (code) { - case YP_BOOL: - case YP_INT: - case YP_INTLIST: - case YP_ENUMLIST: - switch (yv->yv_code) { - case YV_NUMBER: - case YV_BOOL: - (void) fprintf(fp, "\t{ %s, %d, 0, 0 },\n", ndflt, - yp->yp_default->yv_number); - break; - - case YV_IDEFINED: - if ((yv1 = calc_yv(yp1, yv->yv_identifier)) == NULL) { - ferrs(1, "gdflt:BOOL/INT:cannot find definition of %s\n", - yv->yv_identifier); - } - (void) fprintf(fp, "\t{ %s, %d, 0, 0 },\n", ndflt, - yv1->yv_number); - break; - - default: - ferrd(1, "gdflt:INT/BOOL:unimplemented value code = %d\n", - yv->yv_code); - } - break; - - case YP_BIT: - case YP_BITLIST: - switch (yv->yv_code) { -#ifdef ILLEGAL_DEFAULTS - case YV_IDEFINED: /* supporting illegal default - * specification */ -#endif - case YV_NUMBER: - case YV_HSTRING: - case YV_BSTRING: - case YV_VALIST: - (void) fprintf(fp, "\t{ %s, %d, %d, 0 },\n", ndflt, - yp->yp_act0_lineno, addptr(yp->yp_action0)); - break; - - default: - /* Could be a syntax error */ - ferrd(1, "gdflt:BIT:illegal value code = %d\n", yv->yv_code); - } - break; - - case YP_IDEFINED: - ferrs(1, "gdflt:IDEFINED:internal error on symbol %s\n", - yp1->yp_identifier); - break; - - case YP_REAL: - switch (yv->yv_code) { -#ifdef ILLEGAL_DEFAULTS - case YV_IDEFINED: /* Illegal according to ASN.1 but we can do it - * so why not support it - */ -#endif - case YV_REAL: - (void) fprintf(fp, "\t{ %s, 0, %d, 0 },\n", ndflt, - addptr(concat("&", yp->yp_action0))); - break; - - default: - /* Could be a syntax error */ - ferrd(1, "gdflt:REAL:illegal value code = %d\n", yv->yv_code); - } - break; - - case YP_OCT: - switch (yv->yv_code) { - case YV_NUMBER: - case YV_STRING: - case YV_HSTRING: - case YV_BSTRING: - (void) fprintf(fp, "\t{ %s, %d, %d, 0 },\n", ndflt, - yp->yp_act0_lineno, addptr(yp->yp_action0)); - break; - - default: - /* Could be a syntax error */ - ferrd(1, "gdflt:OCT:illegal value code = %d\n", yv->yv_code); - } - break; - - case YP_NULL: - case YP_SEQ: - case YP_SEQTYPE: - case YP_SEQLIST: - case YP_SET: - case YP_SETTYPE: - case YP_SETLIST: - case YP_CHOICE: - case YP_ANY: - case YP_OID: - (void) fprintf(fp, "\t{ %s, 0, 0, 0 },\n", ndflt); - break; - - default: - ferrd(1, "gdflt:unknown type %d\n", yp->yp_code); - } - -} -/* - * Calculate the value associated with the given identifier id by - * looking at the value definitions associated with type definition - * yp. Returns the value definition if found or NULL if not. - */ -YV -calc_yv(yp, id) -YP yp; -char *id; -{ - YV yv; - - for (yv = yp->yp_value; yv != NULL; yv = yv->yv_next) { - if (yv->yv_flags & YV_NAMED && strcmp(yv->yv_named, id) == 0) - return (yv); - } - - return (NULL); -} - -/* - * ******* This does not work. posy needs to be fixed for case of - * '01'b ***** Turn a Literal number value in yv into a bistring - * initialisation. Return the length of the bit string or less than - * zero on error. Set the (char *) pointer, whose address is in - * ppstr, to point to a string containing the a reference to a - * character array which contains the bits. - */ - -numtobstr(yv, ppstr) -YV yv; -char **ppstr; -{ - - int ibits, lastb, i; - char *buf; - - buf = malloc(NBPI / NBPC + 1); - memset(buf, 0, NBPI / NBPC + 1); - lastb = -1; - ibits = yv->yv_number; - for (i = 0; i < NBPI; i++) { - if ((1 << i) & ibits) { - buf[i / NBPC] |= 1 << (NBPC - 1 - (i % NBPC)); - lastb = i; - } - } - - *ppstr = buf; - return (lastb + 1); -} -#define ROUNDUP 10 -/* - * Take a list of Values (YV_VALIST) which should contain a list of - * bits and convert them into a bitstring initialisation. As in - * numtobstr return the size of the bit string or a negative number - * if there is an error. Put a reference to a character array which - * contains the definition of the bits in the character pointer whose - * address is in ppstr. yp is the definition of the type which - * contains the names of all the defined bits. - */ -valisttobs(yp, yv, ppstr) -YP yp; -YV yv; -char **ppstr; -{ - - YV yv1, yv2; - int lastb, val, nsize, size; - char *buf; - - lastb = -1; - size = ROUNDUP; - if ((buf = malloc((unsigned)size)) == NULL) { - ferrd(1, "valisttobs:malloc:failed on %d\n", size); - } - memset(buf, 0, size); - for (yv1 = yv->yv_idlist; yv1 != NULL; yv1 = yv1->yv_next) { - if ((yv2 = calc_yv(yp, yv1->yv_identifier)) == NULL) { - return (-1); - } - val = yv2->yv_number; - /* Bug here probably */ - if (size < val / NBPC) { - nsize = val / NBPC + ROUNDUP; - if ((buf = realloc(buf, (unsigned)nsize)) == NULL) { - ferrd(1, "valisttobs:realloc:failed on %d\n", nsize); - } - memset(buf + size, 0, nsize - size); - size = nsize; - } - buf[val / NBPC] |= 1 << (NBPC - 1 - (val % NBPC)); - if (val > lastb) - lastb = val; - } - *ppstr = buf; - return (lastb + 1); -} -/* - * Print the string out in a format acceptable as a quoted string in - * a C program including the quotes. Using \ escapes for unprintable - * characters - */ -prstr(fp, str, len) -FILE *fp; -char *str; -int len; -{ - (void) fputc('"', fp); - while (len-- > 0) { - if (isprint(*str & 0xff)) { - (void) fputc(*str & 0xff, fp); - str++; - continue; - } - (void) fprintf(fp, "\\%0o", *str & 0xff); - } - (void) fputc('"', fp); -#define MAXPLINE 16 -} -/* - * output a initialisation for a character array as unsigned hex - * numbers - */ -prhstr(fp, str, len) -FILE *fp; -char *str; -int len; -{ - int npline; /* number on this line */ - - (void) fprintf(fp, "{\n"); - npline = 0; - while (len > 0) { - if (npline >= MAXPLINE) { - (void) fputc('\n', fp); - npline = 0; - } - npline++; - (void) fprintf(fp, " 0x%02x,", *str++ & 0xff); - len--; - } - (void) fprintf(fp, "}"); -} -/* - * determine if the string is printable i.e. only sensible to be read - * as a character string. 1 (true) if it is 0, if it isn't - */ -printable(str, i) -char *str; -int i; -{ - while (i-- > 0) { - if (!isprint(*str & 0xff)) - return (0); /* look for the first non printable - * character */ - str++; - } - return (1); -} -/* - * generate a unique identifier using the name given and the name if - * present in yp. Return a pointer to it in a space malloc'ed out - */ -char * -genlabel(name, yp) -char *name; -YP yp; -{ - char buf[MAXNAME]; - static int cnt; - char *p1, *p2; - - p1 = notidtoid(name); - if (yp->yp_flags & YP_ID) { - p2 = notidtoid(yp->yp_id); - (void) sprintf(buf, "L%s_%s_%d", p1, p2, cnt++); - free(p2); - } else - (void) sprintf(buf, "L%s_X_%d", p1, cnt++); - free(p1); - - return (my_new_str(buf)); -} -/* - * generate a ptr table reference for the given module table entry - */ -gen_modref(mod) -char *mod; -{ - char buf[BUFSIZ]; - char *p1; - int ind; - - p1 = notidtoid(mod); - (void) sprintf(buf, "&%s%s%s", PREFIX, p1, MODTYP_SUFFIX); - ind = addptr(buf); - free(p1); - - return (ind); -} - -char * -setfield(p) -char *p; -{ - char *f; - - if ((f = getfield(p)) == NULLCP) { - fprintf(stderr, "\nsetfield: can't extract field from %s\n", p); - exit(1); - } - return (strdup(f)); -} - -/* - * print a normal table entry - */ -prnte(fp, t, f, yp, p1) -FILE *fp; -char *t; /* parent type */ -char *f; /* field name */ -YP yp; /* object */ -char *p1; /* table entry name */ -{ - if (p1 == NULL) - ferr(1, "prnte: called with a NULL p1\n"); - - if (t && noindirect(f)) - prstfield(fp, p1, t, f, c_tag(yp), c_class(yp)); - else - prtfield(fp, p1, t, f, c_tag(yp), c_class(yp)); -} - -/* - * generate the entry allowing for defined types and then call the given - * function to generate the base entry - * Algorithm: - * If we can find the base type - * i) generate any ETAG that subsequent definitions might have - * ii) call the function to generate the base entry - * iii) and the function checks that it matches the type of the value pass - * else - can't find the base type - probably because it is external - * i) generate a warning and exit - */ -gen_identry(fp, t, f, yp, fn) -FILE *fp; -char *t, *f; -YP yp; -int (*fn)(); -{ - YP yp1; - int code; - SY sy; - YT pd_yt = NULLYT; /* Passed down tag if any */ - YT yt; - struct univ_typ *p = NULL; - char *flags; /* the flags if any which each subtype must have */ - int save_flags; - - yp1 = yp; - code = yp1->yp_code; - - if (yp->yp_flags & YP_OPTIONAL) - flags = "|FL_OPTIONAL"; - else if (yp->yp_flags & YP_DEFAULT) - flags = "|FL_DEFAULT"; - else - flags = ""; - - /* any explicit tag for original yp type is handled before this - * routine is called so don't call gen_etag for it here - * but we do need to initialise pd_yt for the case of an IMPLICIT TAG. - */ - if ((yp->yp_flags & (YP_TAG|YP_IMPLICIT))== (YP_TAG|YP_IMPLICIT)) - pd_yt = yp->yp_tag; - - while (code == YP_IDEFINED) { - if ((sy = syfind(yp1->yp_identifier)) == NULL) { - if ((p = univtyp(yp1->yp_identifier)) == NULL - || p->univ_type <= YP_UNDF) - ferrs(1, - "\ngen_identry:symbol %s is not defined in this file:\npepsy cannot support value passing for this type, sorry\n", - yp1->yp_identifier); - code = p->univ_type; - break; - - } - yp1 = sy->sy_type; - /* check for Explicit tags & generate ETAG entries */ - pd_yt = gen_etag(fp, pd_yt, yp1, flags); - code = yp1->yp_code; - } - - if (p) { - /* how do we check type is consistent with value passed ? */ - yp1 = new_type(code, -1); - - yp1->yp_flags |= yp->yp_flags & (YP_OPTIONAL|YP_DEFAULT); - - if (pd_yt == NULLYT) { - yp1->yp_tag = new_tag(p->univ_class); - yp1->yp_tag->yt_value = new_value(YV_NUMBER); - yp1->yp_tag->yt_value->yv_number = p->univ_id; - } else - yp1->yp_tag = pd_yt; - yp1->yp_flags |= YP_TAG|YP_IMPLICIT; - - (*fn)(fp, yp, yp1, t, f); - - /* lets free the yp1 allocated above */ - if (pd_yt == NULLYT) { - free((char *)yp1->yp_tag->yt_value); - free((char *)yp1->yp_tag); - } - free((char *)yp1); - - return; - } - /* check type is consistent with value passed some where??*/ - - save_flags = yp1->yp_flags; - yp1->yp_flags |= yp->yp_flags & (YP_OPTIONAL|YP_DEFAULT); - - if (pd_yt) { - yt = yp1->yp_tag; - yp1->yp_tag = pd_yt; - yp1->yp_flags |= YP_TAG|YP_IMPLICIT; - } - - (*fn)(fp, yp, yp1, t, f); - - if (pd_yt) { /* restore the tag for later */ - yp1->yp_tag = yt; - } - yp1->yp_flags = save_flags; - -} - -/* - * generate the ETAG entry if needed for following the given defined type - * down to what it is. Given that its use above has an IMPLICIT tag pd_yt - * if it is non Null - */ -YT -gen_etag(fp, pd_yt, yp, flags) -FILE *fp; -YT pd_yt; -YP yp; -char *flags; -{ - YT yt; - - yt = yp->yp_tag; - if (yt && yt->yt_value) { - if ((yp->yp_flags & (YP_TAG|YP_IMPLICIT)) == YP_TAG) { - /* EXPLICIT TAG so generate an ETAG */ - if (pd_yt) - yt = pd_yt; /* if we have a value passed down use that */ - (void) fprintf(fp, "\t{ ETAG, 0, %d, %s%s },\n", - yt->yt_value->yv_number, - class2str(yt->yt_class), flags); - pd_yt = NULLYT; /* non't pass on any value */ - - } else if ((yp->yp_flags & (YP_TAG|YP_IMPLICIT))== (YP_TAG|YP_IMPLICIT)) { - /* otherwise it is implicit and so pass its tag down - * unless we already have a tag being passed in which case - * the passed down tag overrides this current tag - */ - if (pd_yt == NULLYT) - pd_yt = yt; - } - } - - return (pd_yt); -} - -/* - * generate the table entry for a value passing defined type which - * is equivalent to the given primative type - */ -gen_ventry(fp, oyp, yp, t, f) -FILE *fp; -YP oyp, yp; -char *t, *f; -{ - char *p1; - register char s = oyp->yp_prfexp; /* type of value passing */ - - - if (noindirect(f) && s != 'q' && s != 'a') - ferrs(1, - "gen_ventry: must specify a field for primative value- not %s\n", f); - - switch (s) { - case 'q': /* [[ q parm->qbufptr ]] */ - if (yp->yp_code != YP_OCT) - warning("qbuf pointer passed for a %s by type %s", - code2name(yp->yp_code), yp2name(oyp)); - - f = setfield(oyp->yp_strexp); - if (noindirect(f)) - p1 = "SOCTETSTRING"; - else - p1 = "OCTETSTRING"; - break; - - case 's': /* [[ s ptr ]] */ - if (yp->yp_code != YP_OCT) - warning("string pointer passed for a %s by type %s", - code2name(yp->yp_code), yp2name(oyp)); - - f = setfield(oyp->yp_strexp); - p1 = "T_STRING"; - break; - - case 'o': /* [[ o ptr $ length ]] */ - if (yp->yp_code != YP_OCT) - warning("octet/length pair passed for a %s by type %s", - code2name(yp->yp_code), yp2name(oyp)); - f = setfield(oyp->yp_strexp); - p1 = "OCTET_PTR"; - prnte(fp, t, f, yp, p1); - if (oyp->yp_intexp) - f = setfield(oyp->yp_intexp); - if (noindirect(f)) - ferr(1, "gen_ventry:OCT: must specify a field [[ s .. ]]\n"); - p1 = "OCTET_LEN"; - break; - - case 'x': /* [[ x ptr $ length ]] */ - if (yp->yp_code != YP_BIT && yp->yp_code != YP_BITLIST) - warning("bit string/length pair passed for a %s by type %s", - code2name(yp->yp_code), yp2name(oyp)); - - f = setfield(oyp->yp_strexp); - p1 = "BITSTR_PTR"; - prnte(fp, t, f, yp, p1); - f = setfield(oyp->yp_intexp); - if (noindirect(f)) - ferr(1, "tenc_typ:BIT: must specify a field [[ x .. ]]\n"); - p1 = "BITSTR_LEN"; - break; - - case 'r': /* [[ r REAL ]] */ - if (yp->yp_code != YP_REAL) - warning("Real passed for a %s by type %s", - code2name(yp->yp_code), yp2name(oyp)); - - f = setfield(oyp->yp_strexp); - p1 = "REALTYPE"; - break; - - case 'i': /* [[ i INTEGER ]] */ - if (yp->yp_code != YP_INT && yp->yp_code != YP_INTLIST - && yp->yp_code != YP_ENUMLIST) - warning("integer passed for a %s by type %s", - code2name(yp->yp_code), yp2name(oyp)); - - if (oyp->yp_intexp) - f = setfield(oyp->yp_intexp); - p1 = "INTEGER"; - break; - - case 't': /* [[ t Bitvector ]] */ - if (yp->yp_code != YP_BIT && yp->yp_code != YP_BITLIST) - warning("Bitvector (PE) passed for a %s by type %s", - code2name(yp->yp_code), yp2name(oyp)); - - f = setfield(oyp->yp_intexp); - if (oyp->yp_varexp && !noindirect(f)) - p1 = "BITSTRING"; - else - p1 = "SBITSTRING"; - break; - - case 'b': /* [[ b BOOLEAN ]] */ - if (yp->yp_code != YP_BOOL) - warning("Boolean passed for a %s by type %s", - code2name(yp->yp_code), yp2name(oyp)); - - if (oyp->yp_intexp) - f = setfield(oyp->yp_intexp); - p1 = "BOOLEAN"; - break; - - case 'O': /* [[ O Object Identifier ]] */ - if (yp->yp_code != YP_OID) - warning("Object Identifier pointer passed for a %s by type %s", - code2name(yp->yp_code), yp2name(oyp)); - f = setfield(oyp->yp_strexp); - p1 = "OBJID"; - break; - - case 'a': /* [[ a ANY ]] */ - if (yp->yp_code != YP_ANY) - warning("PE pointer passed for a %s by type %s", - code2name(yp->yp_code), yp2name(oyp)); - f = setfield(oyp->yp_strexp); - if (noindirect(f)) - p1 = "SANY"; - else - p1 = "ANY"; - break; - default: - ferrd(1, "gen_vident:unknown Value passed %d\n", (int )s); - } - - prnte(fp, t, f, yp, p1); -} - -/* - * generate a table entry for a function call that handles this type - */ -gen_fn(fp, yp, fn) -FILE *fp; -YP yp; -char *fn; /* name of routine to generate */ -{ - - gen_identry(fp, fn, NULLCP, yp, gen_fnentry); -} - -/* - * generate a table entry for a function call that handles this type - */ -/* ARGSUSED */ -gen_fnentry(fp, oyp, yp, fn, dummy) -FILE *fp; -YP oyp; -YP yp; -char *fn; /* name of routine to generate */ -char *dummy; -{ - - (void) fprintf(fp, "\t{ FN_CALL, %d, %s, %s },\n", - addptr(fn), c_tag(yp), c_class(yp)); -} -/* - * declare the functions that are used - * One day generate ANSII C definitions as well - */ -declfns(fp, fn) -FILE *fp; -YFN fn; -{ - if (fn->yfn_enc) { - (void) fprintf(fp, "extern int %s();\n", fn->yfn_enc); - } - if (fn->yfn_dec) { - (void) fprintf(fp, "extern int %s();\n", fn->yfn_dec); - } - if (fn->yfn_prt) { - (void) fprintf(fp, "extern int %s();\n", fn->yfn_prt); - } - if (fn->yfn_fre) { - (void) fprintf(fp, "extern int %s();\n", fn->yfn_fre); - } -} -/* - * generate the table entry to handle an action - UCODE - */ -gen_act(fp, act) -FILE *fp; -Action act; -{ - (void) fprintf(fp, "\t{ UCODE, %d, 0, 0 }, /* line %d */\n", act->a_num, - act->a_line); -} - -/* - * print out the field entry for a type where all the parameters are given - */ -prtfield(fp, typ, t, f, cl, fl) -FILE *fp; -char *typ, *t, *f, *cl, *fl; -{ - if (cl == NULLCP) - cl = "0"; - - if (f && t) { - if (*f == '&') - f++; - (void) fprintf(fp, "\t{ %s, OFFSET(%s, %s), %s, %s },\n", typ, t, f, - cl, fl); - } else - (void) fprintf(fp, "\t{ %s, 0, %s, %s },\n", typ, cl, fl); -} - -/* - * print out the field entry for a Simple type where all the parameters - * are given - */ -prstfield(fp, typ, t, f, cl, fl) -FILE *fp; -char *typ, *t, *f, *cl, *fl; -{ - if (cl == NULLCP) - cl = "0"; - - if (f && t && *f == '&') { - f++; - (void) fprintf(fp, "\t{ S%s, OFFSET(%s, %s), %s, %s },\n", typ, t, f, - cl, fl); - } else - (void) fprintf(fp, "\t{ S%s, 0, %s, %s },\n", typ, cl, fl); -} - -/* - * convert an integer into a temporary string. Useful for calling - * the printing routines with - */ -char * -int2tstr(i) -int i; -{ - static char buf[STRSIZE]; - - (void) sprintf(buf, "%d", i); - - return (buf); -} - -static char *codetab[] = { - "Undefined", "BOOLEAN", "INTEGER", "INTEGER (named numbers)", "BIT STRING", - "BIT STRING (named bits)", "OCTET STRING", "NULL", "SEQUENCE", - "SEQUENCE OF", "SEQUENCE", "SET", "SET OF", "SET", "CHOICE", - "ANY", "OBJECT IDENTIFIER", "Defined type", "ENUMERATED", - "REAL", "Imported type", - - NULL -}; -/* - * produce a user readable name for a yp_code value - */ -char * -code2name(code) -int code; -{ - static char buf[STRSIZE]; - - if (code < 0 || code > YP_IMPTYPE) { - (void) sprintf(buf, "Unknown code (%d)", code); - return (buf); - } - - return (codetab[code]); -} -/* - * print out a description of the yp type for the user that is good enough - * for them to identifier the entry if possible - */ -char * -yp2name(yp) -YP yp; -{ - static char buf[STRSIZE*4]; - char *p; - - p = buf; - if (yp->yp_code == YP_IDEFINED) { - if (yp->yp_module) { - (void) sprintf(p, "%s.", yp->yp_module); - p += strlen(p); - } - if (yp->yp_identifier) - (void) sprintf(p, "%s", yp->yp_identifier); - else - (void) strcpy(p, "(no identifier)"); - p += strlen(p); - if (yp->yp_modid) { - (void) sprintf(p, " (%s)", sprintoid(yp->yp_modid)); - p += strlen(p); - } - } else { - (void) sprintf(p, "%s", code2name(yp->yp_code)); - p += strlen(p); - } - - if (yp->yp_flags & YP_ID) { - (void) sprintf(p, " %s", yp->yp_id); - p += strlen(p); - } - - if (yp->yp_lineno > 0) { - (void) sprintf(p, " on line %d", yp->yp_lineno); - p += strlen(p); - } - - return (buf); - -} -/* - * generate a table entry for the given compound type. It determines wether to - * generate a simple type (prstfield) or not. - */ -prcte(fp, type, t, f, yp, p1) -FILE *fp; -char *type; /* zero if we are foundation type of the table */ -char *t; /* parent type */ -char *f; /* field name */ -YP yp; /* object */ -char *p1; /* table entry name */ -{ - if (type == NULL || type && noindirect(f)) - prstfield(fp, p1, t, f, c_tag(yp), c_class(yp)); - else - prtfield(fp, p1, t, type ? f : NULLCP, c_tag(yp), c_class(yp)); -} |
