Annotation of 43BSDReno/contrib/isode-beta/pepsy/main.c, revision 1.1.1.1

1.1       root        1: /* main.c */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/pepsy/RCS/main.c,v 7.0 90/07/01 19:54:21 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/pepsy/RCS/main.c,v 7.0 90/07/01 19:54:21 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       main.c,v $
                     12:  * Revision 7.0  90/07/01  19:54:21  mrose
                     13:  * *** empty log message ***
                     14:  * 
                     15:  */
                     16: 
                     17: /*
                     18:  *                               NOTICE
                     19:  *
                     20:  *    Acquisition, use, and distribution of this module and related
                     21:  *    materials are subject to the restrictions of a license agreement.
                     22:  *    Consult the Preface in the User's Manual for the full terms of
                     23:  *    this agreement.
                     24:  *
                     25:  */
                     26: 
                     27: 
                     28: #include       <stdio.h>
                     29: #include       <ctype.h>
                     30: #include "config.h"
                     31: #ifdef PEPSY_REALS
                     32: #include       <math.h>
                     33: #define F_SMALL        (1.0e-10)       /* How accurate should reals agree */
                     34: #endif
                     35: #include       "psap.h"
                     36: #include       "T1-types.h"
                     37: #include       "T2-types.h"
                     38: 
                     39: 
                     40: 
                     41: #include "test_table.h"
                     42:        /* compactly generate the new item of data */
                     43: #define new(x) ((x *)calloc(1, sizeof (x)))
                     44: 
                     45: #define NULLQB (struct qbuf *)0
                     46: char   *fill();
                     47: static char   *idname();
                     48: static char   *clname();
                     49: static int prntbits();
                     50: static int pclen();
                     51: static int prntos();
                     52: static int prntstr();
                     53: 
                     54: extern int print_pe();
                     55: extern modtyp  _ZBIT_1;
                     56: extern char    *bitstr2strb();
                     57: extern PE mkpelist(), mkpe();
                     58: extern OID     mkoid();
                     59: extern struct type_UNIV_EXTERNAL *mkext();
                     60: 
                     61: static int     t_test = 1;     /* Iteration of the test */
                     62: 
                     63: #define NullParm       ((char  *) 0)
                     64: /*ARGSUSED*/
                     65: main(argc, argv)
                     66: int    argc;
                     67: char   **argv;
                     68: {
                     69:     int        i;
                     70:     int succ, fail;
                     71: 
                     72:     succ = fail = 0;
                     73:     for (i = MAXTCASE - 1; i >= 0; i--) {
                     74:        if (t_case[i].tst_entry < 0)
                     75:            continue;
                     76:        for (t_test = t_case[i].tst_tests; t_test > 0; t_test--) {
                     77:            if (ed_tst(i) < 0) {
                     78:                (void) printf("Failed\n");
                     79:                fail++;
                     80:            } else
                     81:                succ++;
                     82:        }
                     83:     }
                     84:     if (fail > 0)
                     85:        (void) printf("Failed\n");
                     86:     (void) printf("Total %d  = %d successes %d failures\n", fail + succ, succ, fail);
                     87: 
                     88: }
                     89: 
                     90: /*
                     91:  * Perform a test of encoding/decoding on type number tynum
                     92:  */
                     93: ed_tst(tynum)
                     94: int    tynum;
                     95: {
                     96:     PE pe;
                     97:     char *parm1, *parm2;
                     98: 
                     99:     if (tynum < 0 || tynum >= MAXTCASE)
                    100:            ferrd(1, "ed_tst illegal type %d\n", tynum);
                    101:     
                    102: 
                    103:     if ((parm1 = fill(tynum)) == NULL) {
                    104:        ferr(1, "calloc did not work\n");
                    105:     }
                    106: 
                    107: #define encode(tynum, x, parm) \
                    108:        enc_f(t_case[tynum].tst_entry, &_ZT1_mod, (x), 1, 0, NULLCP, (parm))
                    109: 
                    110:     if (encode(tynum, &pe, parm1) == NOTOK) {
                    111:        (void) printf("encode:failed on %s: %s\n", t_case[tynum].tst_name,
                    112:             PY_pepy);
                    113:        return(-1);
                    114:     }
                    115:        
                    116: 
                    117: #define decode(tynum, x, parm) \
                    118:        dec_f(t_case[tynum].tst_entry, &_ZT1_mod, (x), 1, (int *) 0, (char **)NULL, (parm))
                    119: 
                    120:     if (decode(tynum, pe, &parm2) == NOTOK) {
                    121:            (void) printf("decode:failed on %s: %s\n", t_case[tynum].tst_name,
                    122:                 PY_pepy);
                    123:            return (-2);
                    124:     }
                    125:        
                    126:     if (tcmp(tynum, parm1, parm2)) {
                    127:        (void) printf("%s: not transfered properly\n", t_case[tynum].tst_name);
                    128:        return (-1);
                    129:     }
                    130: 
                    131: #if PRNT
                    132: #define print(tynum, x)        \
                    133:     prnt_f(t_case[tynum].tst_entry, &_ZT1_mod, (x), 1, (int *) 0, (char **)0)
                    134: 
                    135:     if (print(tynum, pe) == NOTOK) {
                    136:            (void) printf("Print:failed on %s: %s\n", t_case[tynum].tst_name,
                    137:                 PY_pepy);
                    138:            exit(2);
                    139:     }
                    140: #endif
                    141:        
                    142: 
                    143: 
                    144: #define fre_space(tynum, parm) \
                    145:        fre_obj(parm, _ZT1_mod.md_dtab[t_case[tynum].tst_entry], &_ZT1_mod)
                    146: 
                    147:     fre_space(tynum, parm1);
                    148:     fre_space(tynum, parm2);
                    149: 
                    150:     pe_free(pe);
                    151: 
                    152:     return (0);
                    153: }
                    154: 
                    155:     /*SUPPRESS 218*/
                    156: /*
                    157:  * fill in some test data for the given type
                    158:  */
                    159: char   *
                    160: fill(tynum)
                    161: int    tynum;
                    162: {
                    163:     char       *parm;
                    164:     static int count;
                    165:     int                i;
                    166: 
                    167:     if ((parm = calloc(1, t_case[tynum].tst_size)) == NULL) {
                    168:        ferr(1, "calloc did not work\n");
                    169:     }
                    170: 
                    171:     switch (tynum) {
                    172:     case TY_MPDU:
                    173: #define Xparm ((struct type_T1_MPDU *)parm)
                    174:        if ((Xparm->a__seq = new(struct element_T1_1)) == NULL) {
                    175:                (void) printf("calloc did not work\n");
                    176:                return NULL;
                    177:        }
                    178:        Xparm->a__seq->fred = 10;
                    179:        Xparm->a__seq->george = 1;
                    180:        break;
                    181: #undef Xparm
                    182:     
                    183:     case TY_EMBEDDED:
                    184: #define Xparm ((struct type_T1_Embedded *)parm)
                    185:        Xparm->anMPDU = (struct type_T1_MPDU *)fill(TY_MPDU);
                    186:        Xparm->ei = 6966;
                    187:        break;
                    188: #undef Xparm
                    189: 
                    190:     case TY_STRINGS:
                    191: #define Xparm  ((struct type_T1_Strings *)parm)
                    192:        Xparm->ostring = str2qb("12\376\0\377a6", 7, 1);
                    193:        Xparm->bstring = strb2bitstr("\270\017\010\020\040\100", 50, 0, 0);
                    194:        Xparm->nstring = str2qb("123456", 6, 1);
                    195:        Xparm->pstring = str2qb("hello, world", 12, 1);
                    196:        Xparm->tstring = str2qb("teletex", 7, 1);
                    197:        Xparm->t61string = str2qb("T.61", 4, 1);
                    198:        Xparm->vstring = str2qb("visible", 7, 1);
                    199:        Xparm->vis__string = str2qb("visible again", 13, 1);
                    200:        Xparm->i646string = str2qb("who knows what this is", 22, 1);
                    201:        Xparm->ia5string = str2qb("This is ASCII\n\r", 15, 1);
                    202:        Xparm->graphstring = str2qb("This is a graphic string", 24, 1);
                    203:        Xparm->genstring = str2qb("This is a general string", 24, 1);
                    204:        break;
                    205: #undef Xparm
                    206: 
                    207:     case TY_EMB_STRINGS:
                    208: #define Xparm  ((struct type_T1_Emb__Strings *)parm)
                    209:        Xparm->atest = 2001;
                    210:        Xparm->ctest = strb2bitstr("\03\010\252\125", 24, 0, 0);
                    211:        Xparm->btest = str2qb("Good bye", 8, 1);
                    212:        Xparm->big__test = (struct type_T1_Strings *)fill(TY_STRINGS);
                    213:        if ((Xparm->emb__test = new(struct element_T1_0)) == NULL) {
                    214:                (void) printf("calloc did not work\n");
                    215:                return NULL;
                    216:        }
                    217:        Xparm->emb__test->em__int = -101;
                    218:        Xparm->emb__test->em__oct = str2qb("Embedded octet string", 21, 1);
                    219:        Xparm->emb__test->em__bit = strb2bitstr("\377\252\125\370\01", 40, 0,0);
                    220:        break;
                    221: #undef Xparm
                    222: 
                    223:     case TY_IMPLICIT:
                    224: #define Xparm  ((struct type_T1_Impl__Tags *)parm)
                    225:        Xparm->i__impl = -1;
                    226:        Xparm->o__impl = str2qb("I'm an implicit tagged octet string", 36, 1);
                    227:        Xparm->b__impl = strb2bitstr("\0\0\01\230\01", 40, 0, 0);
                    228:        Xparm->f__impl = 0xff; /* True */
                    229:        Xparm->obj__impl = (struct type_T1_Emb__Strings *)fill(TY_EMB_STRINGS);
                    230:        if ((Xparm->i__emb__test = new(struct element_T1_2)) == NULL) {
                    231:                (void) printf("calloc did not work\n");
                    232:                return NULL;
                    233:        }
                    234:        Xparm->i__emb__test->i__em__int = -101;
                    235:        Xparm->i__emb__test->i__em__oct = str2qb("Implicit Embedded", 18, 1);
                    236:        Xparm->i__emb__test->i__em__bit = strb2bitstr("\200\200\200\200", 32, 0, 0);
                    237: #undef Xparm
                    238:        break;
                    239: 
                    240:     case TY_EXPLICIT:
                    241: #define Xparm  ((struct type_T1_Expl__Tags *)parm)
                    242:        Xparm->i__expl = 35051;
                    243:        Xparm->o__expl = str2qb("explicit tagged octet string", 28, 1);
                    244:        Xparm->b__expl = strb2bitstr("\070\070\070\077", 32, 0, 0);
                    245:        Xparm->f__expl = 0xf0; /* True */
                    246:        Xparm->obj__expl = (struct type_T1_Emb__Strings *)fill(TY_EMB_STRINGS);
                    247:        if ((Xparm->i__exp__test = new(struct element_T1_3)) == NULL) {
                    248:                (void) printf("calloc did not work\n");
                    249:                return NULL;
                    250:        }
                    251:        Xparm->i__exp__test->i__ex__int = -9;
                    252:        Xparm->i__exp__test->i__ex__oct = str2qb("Explicit Embedded", 18, 1);
                    253:        Xparm->i__exp__test->i__ex__bit = strb2bitstr("\03\03\03\03\277", 40, 0, 0);
                    254: #undef Xparm
                    255:        break;
                    256:        
                    257:     case TY_SEQOF:
                    258: #define Xparm  ((struct type_T1_Seqof__Test *)parm)
                    259:     count = 2;
                    260:     Xparm->sqof__test1 = (struct element_T1_4 *) fill(TY_ELEMENT4);
                    261:     count = 2;
                    262:     Xparm->stof__test1 = (struct member_T1_2 *) fill(TY_MEMBER2);
                    263:     Xparm->i__test1 = 33;
                    264:     count = 2;
                    265:     Xparm->sqof__test2 = (struct element_T1_6 *) fill(TY_ELEMENT6);
                    266:     count = 2;
                    267:     Xparm->stof__test2 = (struct member_T1_4 *) fill(TY_MEMBER4);
                    268:     Xparm->i__test2 = 99;
                    269:     break;
                    270: #undef Xparm
                    271:        
                    272:     case TY_ELEMENT4:
                    273: #define Xparm  ((struct element_T1_4 *)parm)
                    274:     Xparm->element_T1_5 = (struct type_T1_Expl__Tags *)fill(TY_EXPLICIT);
                    275:     if (count-- > 0)
                    276:        Xparm->next = (struct element_T1_4 *) fill(TY_ELEMENT4);
                    277:     else
                    278:        Xparm->next = NULL;
                    279:     break;
                    280: #undef Xparm
                    281:        
                    282:     case TY_MEMBER2:
                    283: #define Xparm  ((struct member_T1_2 *)parm)
                    284:     Xparm->member_T1_3 = (struct type_T1_Expl__Tags *)fill(TY_EXPLICIT);
                    285:     if (count-- > 0)
                    286:        Xparm->next = (struct member_T1_2 *) fill(TY_MEMBER2);
                    287:     else
                    288:        Xparm->next = NULL;
                    289:     break;
                    290: #undef Xparm
                    291: 
                    292:     case TY_ELEMENT6:
                    293: #define Xparm  ((struct element_T1_6 *)parm)
                    294:     Xparm->element_T1_7 = (struct element_T1_8 *)fill(TY_ELEMENT8);
                    295:     if (count-- > 0)
                    296:        Xparm->next = (struct element_T1_6 *) fill(TY_ELEMENT6);
                    297:     else
                    298:        Xparm->next = NULL;
                    299:     break;
                    300: #undef Xparm
                    301: 
                    302:     case TY_ELEMENT8:
                    303: #define Xparm  ((struct element_T1_8 *)parm)
                    304:     Xparm->sqof__in = (struct type_T1_Expl__Tags *)fill(TY_EXPLICIT);
                    305:     Xparm->sqof__i = 212121;
                    306:     Xparm->sqof__o = str2qb("Element8 Embedded", 18, 1);
                    307:     break;
                    308: #undef Xparm
                    309: 
                    310:     case TY_MEMBER4:
                    311: #define Xparm  ((struct member_T1_4 *)parm)
                    312:     Xparm->member_T1_5 = (struct element_T1_9 *)fill(TY_ELEMENT9);
                    313:     if (count-- > 0)
                    314:        Xparm->next = (struct member_T1_4 *) fill(TY_MEMBER4);
                    315:     else
                    316:        Xparm->next = NULL;
                    317:     break;
                    318: #undef Xparm
                    319: 
                    320:     case TY_ELEMENT9:
                    321: #define Xparm  ((struct element_T1_9 *)parm)
                    322:        Xparm->stof__in = (struct type_T1_Expl__Tags *)fill(TY_EXPLICIT);
                    323:        Xparm->stof__i = -12345;
                    324:        Xparm->stof__o = str2qb("XYZabcde Embedded", 18, 1);
                    325:     break;
                    326: #undef Xparm
                    327: 
                    328:     case TY_CHOICE:
                    329: #define Xparm  ((struct type_T1_Choice__Test *)parm)
                    330:        Xparm->c1 = (struct choice_T1_0 *) fill(TY_CHOICE0);
                    331:        Xparm->c2 = (struct choice_T1_1 *) fill(TY_CHOICE1);
                    332:        Xparm->c3 = (struct choice_T1_2 *) fill(TY_CHOICE2);
                    333:        Xparm->c4 = (struct element_T1_11 *) fill(TY_ELEMENT11);
                    334:        break;
                    335: #undef Xparm
                    336: 
                    337:     case TY_CHOICE0:
                    338: #define Xparm  ((struct choice_T1_0 *)parm)
                    339:        
                    340:        switch (Xparm->offset = (t_test + 10)%choice_T1_0_obj__c1 + 1) {
                    341:        case choice_T1_0_i__c1:
                    342:            Xparm->un.i__c1 = 10101;
                    343:            break;
                    344:        
                    345:        case choice_T1_0_o__c1:
                    346:            Xparm->un.o__c1 = str2qb("Andrew Worsley!!!", 18, 1);
                    347:            break;
                    348:        
                    349:        case choice_T1_0_b__c1:
                    350:            Xparm->un.b__c1 = strb2bitstr("\02\02\02\07\077", 40, 0, 0);
                    351:            break;
                    352:        
                    353:        case choice_T1_0_f__c1:
                    354:            Xparm->un.f__c1 = 0x11;
                    355:            break;
                    356:        
                    357:        case choice_T1_0_obj__c1:
                    358:            Xparm->un.obj__c1 = (struct type_T1_Emb__Strings *) fill(TY_EMB_STRINGS);
                    359:            break;
                    360:        
                    361:        default:
                    362:            ferrd(1, "TY_CHOICE0:illegal offset %d\n", Xparm->offset);
                    363:        }
                    364:        break;
                    365: #undef Xparm
                    366: 
                    367:     case TY_CHOICE1:
                    368: #define Xparm  ((struct choice_T1_1 *)parm)
                    369:        
                    370:        switch (Xparm->offset = (t_test + 11)%choice_T1_1_obj__c2 + 1) {
                    371:        case choice_T1_1_i__c2:
                    372:            Xparm->un.i__c2 = 1212;
                    373:            break;
                    374:        
                    375:        case choice_T1_1_o__c2:
                    376:            Xparm->un.o__c2 = str2qb("Richard Worsley!!", 18, 1);
                    377:            break;
                    378:        
                    379:        case choice_T1_1_b__c2:
                    380:            Xparm->un.b__c2 = strb2bitstr("\02\01\01\07\077", 40, 0, 0);
                    381:            break;
                    382:        
                    383:        case choice_T1_1_f__c2:
                    384:            Xparm->un.f__c2 = 0x12;
                    385:            break;
                    386:        
                    387:        case choice_T1_1_obj__c2:
                    388:            Xparm->un.obj__c2 = (struct type_T1_Emb__Strings *) fill(TY_EMB_STRINGS);
                    389:            break;
                    390:        
                    391:        default:
                    392:            ferrd(1, "TY_CHOICE1:illegal offset %d\n", Xparm->offset);
                    393:        }
                    394:        break;
                    395: #undef Xparm
                    396: 
                    397:     case TY_CHOICE2:
                    398: #define Xparm  ((struct choice_T1_2 *)parm)
                    399:        
                    400:        switch (Xparm->offset = (t_test + 12)%choice_T1_2_i__c3 + 1) {
                    401:        case choice_T1_2_i__c3:
                    402:            Xparm->un.i__c3 = 689364;
                    403:            break;
                    404:        
                    405:        case choice_T1_2_seq__c3:
                    406:            Xparm->un.seq__c3 = (struct element_T1_10 *) fill(TY_ELEMENT10);
                    407:            break;
                    408:        
                    409:        case choice_T1_2_set__c3:
                    410:            Xparm->un.set__c3 = (struct member_T1_6 *) fill(TY_MEMBER6);
                    411:            break;
                    412:        
                    413:        default:
                    414:            ferrd(1, "TY_CHOICE2:illegal offset %d\n", Xparm->offset);
                    415:        }
                    416:        break;
                    417: #undef Xparm
                    418: 
                    419:     case TY_CHOICE3:
                    420: #define Xparm  ((struct choice_T1_3 *)parm)
                    421:        
                    422:        switch (Xparm->offset = (t_test + 13)%choice_T1_3_sc__b__i + 1) {
                    423:        case choice_T1_3_sc__a__i:
                    424:            Xparm->un.sc__a__i = 16891;
                    425:            break;
                    426:        
                    427:        case choice_T1_3_sc__b__i:
                    428:            Xparm->un.sc__b__i = 13151;
                    429:            break;
                    430:        
                    431:        case choice_T1_3_c4__i:
                    432:            Xparm->un.c4__i = 10938;
                    433:            break;
                    434:        
                    435:        case choice_T1_3_c4__obj:
                    436:            Xparm->un.c4__obj = (struct type_T1_Expl__Tags *) fill(TY_EXPLICIT);
                    437:            break;
                    438:        
                    439:        default:
                    440:            ferrd(1, "TY_CHOICE3:illegal offset %d\n", Xparm->offset);
                    441:        }
                    442:        break;
                    443: #undef Xparm
                    444: 
                    445:     case TY_ELEMENT10:
                    446: #define Xparm  ((struct element_T1_10 *)parm)
                    447:        Xparm->seq__c3__in = (struct type_T1_Expl__Tags *) fill(TY_EXPLICIT);
                    448:        Xparm->seq__c3__i = 40938;
                    449:        Xparm->seq__c3__o = str2qb("James Worsley!!!!", 18, 1);
                    450:        break;
                    451: #undef Xparm
                    452: 
                    453:     case TY_MEMBER6:
                    454: #define Xparm  ((struct member_T1_6 *)parm)
                    455:        Xparm->set__c3__in = (struct type_T1_Expl__Tags *) fill(TY_EXPLICIT);
                    456:        Xparm->set__c3__i = 0x40938;
                    457:        Xparm->set__c3__o = str2qb("Patrick Worsley!!", 18, 1);
                    458:        break;
                    459: #undef Xparm
                    460: 
                    461:     case TY_ELEMENT11:
                    462: #define Xparm  ((struct element_T1_11 *)parm)
                    463:        Xparm->c4__choice = (struct choice_T1_3 *) fill(TY_CHOICE3);
                    464:        break;
                    465: #undef Xparm
                    466: 
                    467:     case TY_OPTIONAL:
                    468: #define Xparm  ((struct type_T1_Opt__Strings *)parm)
                    469:         if (t_test & opt_T1_Opt__Strings_a__opt) {
                    470:            Xparm->optionals |= opt_T1_Opt__Strings_a__opt;
                    471:            Xparm->a__opt = 192837;
                    472:        }
                    473:         if (t_test & opt_T1_Opt__Strings_d__opt) {
                    474:            Xparm->optionals |= opt_T1_Opt__Strings_d__opt;
                    475:            Xparm->d__opt = 1;
                    476:        }
                    477:        Xparm->b__opt = str2qb("Susan Hannah Sibel", 19, 1);
                    478:         if (t_test*(t_test + 1) & opt_T1_Opt__Strings_d__opt) {
                    479:            Xparm->c__opt = strb2bitstr("\012\017\02\07\077", 40, 0, 0);
                    480:        }
                    481:         if (t_test & opt_T1_Opt__Strings_e__opt) {
                    482:            Xparm->optionals |= opt_T1_Opt__Strings_e__opt;
                    483:            Xparm->e__opt = 0;
                    484:        }
                    485:         if ((t_test + 12)*t_test & opt_T1_Opt__Strings_a__opt) {
                    486:            Xparm->big__opt = (struct type_T1_Strings *) fill(TY_STRINGS);
                    487:        }
                    488:         if ((t_test + 2)*t_test & opt_T1_Opt__Strings_a__opt) {
                    489:            Xparm->emb__opt = (struct element_T1_12 *) fill(TY_ELEMENT12);
                    490:        }
                    491:         if ((t_test + 4)*t_test & opt_T1_Opt__Strings_a__opt) {
                    492:            Xparm->st__opt = (struct member_T1_7 *) fill(TY_MEMBER7);
                    493:        }
                    494:         if ((t_test + 8)*t_test & opt_T1_Opt__Strings_a__opt) {
                    495:            Xparm->obj__opt = (struct type_T1_MPDU *) fill(TY_MPDU);
                    496:        }
                    497:         if (t_test & opt_T1_Opt__Strings_etag__opt) {
                    498:            Xparm->optionals |= opt_T1_Opt__Strings_etag__opt;
                    499:            Xparm->etag__opt = 2983461;
                    500:        }
                    501:         if ((t_test + 6)*t_test & opt_T1_Opt__Strings_a__opt) {
                    502:            Xparm->ch__opt = (struct choice_T1_4 *) fill(TY_CHOICE4);
                    503:        }
                    504:        break;
                    505: #undef Xparm
                    506: 
                    507:      case TY_ELEMENT12:
                    508: #define Xparm  ((struct element_T1_12 *)parm)
                    509:         if ((t_test + 10)*t_test & opt_T1_element_T1_12_oem__int) {
                    510:            Xparm->optionals |= opt_T1_element_T1_12_oem__int;
                    511:            Xparm->oem__int = 197336;
                    512:        }
                    513:         if (t_test*(t_test + 22) & opt_T1_Opt__Strings_a__opt) {
                    514:            Xparm->oem__oct = str2qb("Ling Worsley", 13, 1);
                    515:        }
                    516:         if (t_test*(t_test + 16) & opt_T1_Opt__Strings_d__opt) {
                    517:            Xparm->oem__bit = strb2bitstr("\0142\0117\02\017\07", 40, 0, 0);
                    518:        }
                    519:         break;
                    520: #undef Xparm
                    521: 
                    522:      case TY_MEMBER7:
                    523: #define Xparm  ((struct member_T1_7 *)parm)
                    524:         if ((t_test + 12)*t_test & opt_T1_member_T1_7_st__int0) {
                    525:            Xparm->optionals |= opt_T1_member_T1_7_st__int0;
                    526:            Xparm->st__int0 = 85659;
                    527:        }
                    528:         if ((t_test + 12)*t_test & opt_T1_member_T1_7_st__int1) {
                    529:            Xparm->optionals |= opt_T1_member_T1_7_st__int1;
                    530:            Xparm->st__int1 = 664388;
                    531:        }
                    532:         if ((t_test + 12)*t_test & opt_T1_member_T1_7_st__int2) {
                    533:            Xparm->optionals |= opt_T1_member_T1_7_st__int2;
                    534:            Xparm->st__int2 = 967768;
                    535:        }
                    536:         break;
                    537: #undef Xparm
                    538: 
                    539:     case TY_CHOICE4:
                    540: #define Xparm  ((struct choice_T1_4 *)parm)
                    541:        
                    542:        switch (Xparm->offset = (t_test + 14)%choice_T1_4_ch__2 + 1) {
                    543:        case choice_T1_4_ch__1:
                    544:            Xparm->un.ch__1 = 74576;
                    545:            break;
                    546:        
                    547:        case choice_T1_4_ch__2:
                    548:            Xparm->un.ch__2 = 28828;
                    549:            break;
                    550:        
                    551:        default:
                    552:            ferrd(1, "TY_CHOICE4:illegal offset %d\n", Xparm->offset);
                    553:        }
                    554:        break;
                    555: #undef Xparm
                    556: 
                    557:      case TY_EXTREF:
                    558: #define Xparm  ((struct type_T1_E__ref *)parm)
                    559:        Xparm->a__ref = (struct type_T2_Info *) fill(TY_T2_INFO);
                    560:        Xparm->b__ref = (struct type_T2_Info *) fill(TY_T2_INFO);
                    561:        Xparm->c__ref = (struct type_T1_Choice__Test *) fill(TY_CHOICE);
                    562:         if ((t_test + 20)*t_test & 0x2) {
                    563:            Xparm->d__ref = (struct type_T2_Info *) fill(TY_T2_INFO);
                    564:        }
                    565:         if ((t_test + 20)*t_test & 0x1) {
                    566:            Xparm->e__ref = (struct type_T2_Info *) fill(TY_T2_INFO);
                    567:        }
                    568:         break;
                    569: #undef Xparm
                    570: 
                    571:      case TY_T2_INFO:
                    572: #define Xparm  ((struct type_T2_Info *)parm)
                    573:        Xparm->a1 = 101910;
                    574:        Xparm->a2 = -304985;
                    575:        Xparm->a3 = 13;
                    576:        Xparm->a4 = (struct type_T2_MPDU *) fill(TY_T2_MPDU);
                    577:         break;
                    578: #undef Xparm
                    579: 
                    580:      case TY_T2_MPDU:
                    581: #define Xparm  ((struct type_T2_MPDU *)parm)
                    582:        Xparm->a__seq = (struct element_T2_0 *) fill(TY_T2_ELEM0);
                    583:         break;
                    584: #undef Xparm
                    585: 
                    586:      case TY_T2_ELEM0:
                    587: #define Xparm  ((struct element_T2_0 *)parm)
                    588:        Xparm->fred = 998877;
                    589:         break;
                    590: #undef Xparm
                    591: 
                    592:      case TY_OPTIMISED:
                    593: #define Xparm  ((struct type_T1_Optimised *)parm)
                    594:        Xparm->o1 = strb2bitstr("\0241\0227\032\011\0237", 40, 0, 0);
                    595:        Xparm->o2 = str2qb("Peckling Worsley!!!!", 20, 1);
                    596:        Xparm->o3 = (struct type_T1_MPDU *) fill(TY_MPDU);
                    597:        Xparm->o4 = (PE ) mkpelist(t_test);
                    598:        Xparm->element_T1_14  = (struct member_T1_9 *) fill(TY_MEMBER9);
                    599:        break;
                    600: #undef Xparm
                    601: 
                    602:      case TY_MEMBER9:
                    603: #define Xparm  ((struct member_T1_9 *)parm)
                    604:        Xparm->o5 = mkpelist(t_test);
                    605:        Xparm->o6 = mkpelist(t_test);
                    606:        Xparm->o7 = mkoid(t_test);
                    607:        break;
                    608: #undef Xparm
                    609: 
                    610:     case TY_EXTERNAL:
                    611: #define Xparm  ((struct type_T1_Ext__typ *)parm)
                    612:         Xparm->ext = mkext(t_test*8 + 1);
                    613:         Xparm->a__ny = mkpe(t_test*8 + 1);
                    614:         Xparm->ext__impl = mkext(t_test*6 + 1);
                    615:         Xparm->any__impl = mkpe(t_test*8 + 3);
                    616:         Xparm->ext__expl = mkext(t_test*4 + 1);
                    617:         Xparm->any__expl = mkpe(t_test*8 + 5);
                    618:        break;
                    619: #undef Xparm
                    620: 
                    621:     case TY_SEXTERNAL:
                    622: #define Xparm  ((struct type_T1_SExt *)parm)
                    623:        free(parm);     /* don't need it */
                    624:        Xparm = mkext(21);
                    625:        break;
                    626: #undef Xparm
                    627: 
                    628:     case TY_ETAGOBJ:
                    629: #define Xparm  ((struct type_T1_Etags *)parm)
                    630:        switch (Xparm->offset = (t_test + 4)%type_T1_Etags_bE + 1) {
                    631:        case type_T1_Etags_aE:
                    632:            Xparm->un.aE = 10283;
                    633:            break;
                    634:        
                    635:        case type_T1_Etags_bE:
                    636:            Xparm->un.bE = 40986;
                    637:            break;
                    638:        
                    639:        default:
                    640:            ferrd(1, "TY_ETAGOBJ:illegal offset %d\n", Xparm->offset);
                    641:        }
                    642:        break;
                    643: #undef Xparm
                    644: 
                    645: /* This has to be changed when posy is upgraded to handle DEFAULTS properly */
                    646:     case TY_DEFAULT:
                    647: #define Xparm  ((struct type_T1_Def__Strings *)parm)
                    648:        if (t_test*t_test & 2)
                    649:            Xparm->a__def = int_T1_a__def_a__def__0;
                    650:        else
                    651:            Xparm->a__def = int_T1_a__def_a__def__1;
                    652:        if (t_test*t_test & 4)
                    653:            Xparm->b__def = str2qb("Susan Sibel !!!!", 17, 1);
                    654:        else if (t_test*t_test & 8)
                    655:            Xparm->b__def = str2qb("hello, world", 12, 1);
                    656:        else
                    657:            Xparm->b__def = NULLQB;
                    658:        if (t_test*t_test & 8)
                    659:            Xparm->c__def = strb2bitstr(int2strb(bit_T1_c__def_c__def__two, 9),
                    660:                9, 0, 0);
                    661:        else
                    662:            Xparm->c__def = NULLPE;
                    663:        if (t_test*t_test & 0x10)
                    664:            Xparm->okay = 0;
                    665:        else
                    666:            Xparm->okay = 1;
                    667:        if (t_test*t_test & 0x20)
                    668:            Xparm->e__def = 0;
                    669:        else
                    670:            Xparm->e__def = 1;
                    671:        Xparm->big__def = (struct type_T1_Strings *) fill(TY_STRINGS);
                    672:        if (t_test*t_test*t_test & 0x10)
                    673:            Xparm->emb__def = NULL;
                    674:        else
                    675:            Xparm->emb__def = (struct element_T1_13 *) fill(TY_ELEMENT13);
                    676:        if (t_test*t_test*t_test & 0x20)
                    677:            Xparm->st__def = NULL;
                    678:        else
                    679:            Xparm->st__def = (struct member_T1_8 *) fill(TY_MEMBER8);
                    680:        break;
                    681: #undef Xparm
                    682: 
                    683:     case TY_ELEMENT13:
                    684: #define Xparm ((struct element_T1_13 *)parm)
                    685:        if (t_test*t_test*t_test & 1)
                    686:            Xparm->colour = int_T1_colour_green;
                    687:        else
                    688:            Xparm->colour = int_T1_colour_red;
                    689:        if (t_test*t_test & 040)
                    690:            Xparm->oem__oct = str2qb("Julia Dzuikas !!!!", 19, 1);
                    691:        else
                    692:            Xparm->oem__oct = NULLQB;
                    693:        if (t_test*t_test*t_test & 2)
                    694:            Xparm->version = strb2bitstr(int2strb((1 << bit_T1_version_basic)
                    695:                                             |(1 << bit_T1_version_patch1), 3),
                    696:                                             3, 0, 0);
                    697:        else
                    698:            Xparm->version = strb2bitstr(int2strb((1 << bit_T1_version_basic),
                    699:                                                    3), 3, 0, 0);
                    700:        break;
                    701: #undef Xparm
                    702: 
                    703:     case TY_MEMBER8:
                    704: #define Xparm ((struct member_T1_8 *)parm)
                    705:        if (t_test*t_test*t_test & 4)
                    706:            Xparm->wine = int_T1_wine_burgundy;
                    707:        else
                    708:            Xparm->wine = int_T1_wine_claret;
                    709:        if (t_test*t_test*t_test & 010)
                    710:            Xparm->beer = int_T1_beer_vb;
                    711:        else
                    712:            Xparm->beer = int_T1_beer_hieneken;
                    713:        if (t_test*t_test*t_test & 020)
                    714:            Xparm->spirit = int_T1_spirit_vodka;
                    715:        else
                    716:            Xparm->spirit = int_T1_spirit_brandy;
                    717:        break;
                    718: #undef Xparm
                    719: 
                    720:     case TY_STEST:
                    721: #define Xparm ((struct type_T1_Stest *)parm)
                    722:        if (t_test*(t_test + 2)*t_test & 4)
                    723:            Xparm->st1 = (struct type_T1_Sint *)fill(TY_SINT);
                    724:        else
                    725:            Xparm->st1 = (struct type_T1_Sint *)NULL;
                    726:        if (t_test*(t_test + 2)*t_test & 010)
                    727:            Xparm->st2 = str2qb("goodbye, world", 14, 1);
                    728:        else
                    729:            Xparm->st2 = str2qb("xxxxxxx, world", 14, 1);
                    730:        break;
                    731: #undef Xparm
                    732: 
                    733:     case TY_SINT:
                    734: #define Xparm ((struct type_T1_Sint *)parm)
                    735:        if (t_test*(t_test + 4)*t_test & 4)
                    736:            Xparm->parm = 33;
                    737:        else
                    738:            Xparm->parm = 44;
                    739:        break;
                    740: #undef Xparm
                    741: 
                    742:     case TY_ETYPE:
                    743: #define Xparm ((struct type_T1_Enum__type *)parm)
                    744:        switch (t_test & 3) {
                    745:        case 0:
                    746:            Xparm->parm = int_T1_Enum__type_pork;
                    747:            break;
                    748: 
                    749:        case 1:
                    750:            Xparm->parm = int_T1_Enum__type_beef;
                    751:            break;
                    752: 
                    753: 
                    754:        case 2:
                    755:            Xparm->parm = int_T1_Enum__type_chicken;
                    756:            break;
                    757: 
                    758: 
                    759:        case 3:
                    760:            Xparm->parm = int_T1_Enum__type_lamb;
                    761:            break;
                    762: 
                    763:        default:
                    764:            ferrd(1, "fill:ETYPE: Self consistency failure\n", t_test);
                    765:        }
                    766:        break;
                    767: #undef Xparm
                    768: 
                    769:     case TY_ENUM_TEST:
                    770: #define Xparm ((struct type_T1_T__enum *)parm)
                    771:        i = t_test;
                    772:        Xparm->ae1 = (struct type_T1_Enum__type *)fill(TY_ETYPE);
                    773:        t_test++;
                    774:        Xparm->ae2 = (struct type_T1_Enum__type *)fill(TY_ETYPE);
                    775:        t_test++;
                    776:        Xparm->ae3 = (struct type_T1_Enum__type *)fill(TY_ETYPE);
                    777:        t_test++;
                    778:        if (t_test & 1)
                    779:            Xparm->ae5 = (struct type_T1_Enum__type *)fill(TY_ETYPE);
                    780:        Xparm->ae4 = (struct type_T1_Enum__type *)fill(TY_ETYPE);
                    781:        t_test++;
                    782:        if (t_test & 2)
                    783:            Xparm->ae4->parm = int_T1_Enum__type_chicken; /* Default */
                    784:        t_test = i;
                    785:        break;
                    786: #undef Xparm
                    787: 
                    788: #ifdef PEPSY_REALS
                    789:     case TY_REAL:
                    790: #define Xparm  ((struct type_T1_Real *)parm)
                    791:        switch (t_test % 3) {
                    792:        case 0:
                    793:            Xparm->parm = -2.28789;
                    794:            break;
                    795:        
                    796:        case 1:
                    797:            Xparm->parm = 927639.98009;
                    798:            break;
                    799: 
                    800:        case 2:
                    801:            Xparm->parm = 0.0;
                    802:            break;
                    803: 
                    804:        default:
                    805:        ferrd(1, "fill:TY_REAL:Internal error %d\n", t_test);
                    806:         }
                    807:         break;
                    808: #undef Xparm
                    809: 
                    810:     case TY_REAL_TEST:
                    811: #define Xparm  ((struct type_T1_T__real *)parm)
                    812:        i = t_test;
                    813:         Xparm->r1 = (struct type_T1_Real *) fill(TY_REAL);
                    814:        t_test++;
                    815:         Xparm->r2 = (struct type_T1_Real *) fill(TY_REAL);
                    816:        t_test++;
                    817:         Xparm->r3 = (struct type_T1_Real *) fill(TY_REAL);
                    818:        t_test++;
                    819: 
                    820:        Xparm->r4 = (struct type_T1_Real *) fill(TY_REAL);
                    821:        t_test++;
                    822:        if (i & 1)      /* Default */
                    823:            Xparm->r4->parm = 3.1415962;
                    824: 
                    825:        if (i & 2) {    /* Optional */
                    826:            Xparm->r4 = (struct type_T1_Real *) fill(TY_REAL);
                    827:        }
                    828:        t_test = i;
                    829:        break;
                    830: #undef Xparm
                    831: 
                    832: #endif
                    833: 
                    834:     default:
                    835:        ferrd(1, "fill:unknown type %d\n", tynum);
                    836:     }
                    837: 
                    838:     return (parm);
                    839: }
                    840: 
                    841: #if 0
                    842: /*
                    843:  * encode each given type
                    844:  */
                    845: encode(tynum, ppe, parm)
                    846: int    tynum;
                    847: PE     *ppe;
                    848: char   *parm;
                    849: {
                    850:     int        d;
                    851: 
                    852:     switch (tynum) {
                    853:     case TY_MPDU:
                    854:        d = encode_T1_MPDU(ppe, 1, NULLVP, NULLCP, parm);
                    855:        break;
                    856:     
                    857:     case TY_EMBEDDED:
                    858:        d = encode_T1_Embedded(ppe, 1, NULLVP, NULLCP, parm);
                    859:        break;
                    860:     
                    861:     case TY_STRINGS:
                    862:        d = encode_T1_Strings(ppe, 1, NULLVP, NULLCP, parm);
                    863:        break;
                    864: 
                    865:     case TY_EMB_STRINGS:
                    866:        d = encode_T1_Emb__Strings(ppe, 1, NULLVP, NULLCP, parm);
                    867:        break;
                    868:    
                    869:     case TY_IMPLICIT:
                    870:        d = encode_T1_Impl__Tags(ppe, 1, NULLVP, NULLCP, parm);
                    871:        break;
                    872:    
                    873:     case TY_EXPLICIT:
                    874:        d = encode_T1_Expl__Tags(ppe, 1, NULLVP, NULLCP, parm);
                    875:        break;
                    876: 
                    877:     case TY_EXTERNAL:
                    878:        d = encode_T1_E__ref(ppe, 1, NULLVP, NULLCP, parm);
                    879:        break;
                    880: 
                    881:     default:
                    882:        ferrd(1, "encode:unknown type\n", tynum);
                    883:     }
                    884:     if (d == NOTOK) {
                    885:            (void) printf("encode:failed on %s\n", t_case[tynum].tst_name);
                    886:            exit(1);
                    887:     }
                    888: }
                    889: 
                    890: /*
                    891:  * decode each given type
                    892:  */
                    893: decode(tynum, pe, parm)
                    894: int    tynum;
                    895: PE     pe;
                    896: char   **parm;
                    897: {
                    898:     int        d;
                    899: 
                    900:     switch (tynum) {
                    901:     case TY_MPDU:
                    902:        d = decode_T1_MPDU(pe, 1, NULLVP, NULLCP, parm);
                    903:        break;
                    904: 
                    905:     case TY_EMBEDDED:
                    906:        d = decode_T1_Embedded(pe, 1, NULLVP, NULLCP, parm);
                    907:        break;
                    908: 
                    909:     case TY_STRINGS:
                    910:        d = decode_T1_Strings(pe, 1, NULLVP, NULLCP, parm);
                    911:        break;
                    912: 
                    913:     case TY_EMB_STRINGS:
                    914:        d = decode_T1_Emb__Strings(pe, 1, NULLVP, NULLCP, parm);
                    915:        break;
                    916: 
                    917:     case TY_IMPLICIT:
                    918:        d = decode_T1_Impl__Tags(pe, 1, NULLVP, NULLCP, parm);
                    919:        break;
                    920: 
                    921:     case TY_EXPLICIT:
                    922:        d = decode_T1_Expl__Tags(pe, 1, NULLVP, NULLCP, parm);
                    923:        break;
                    924: 
                    925:     case TY_EXTERNAL:
                    926:        d = decode_T1_E__ref(pe, 1, NULLVP, NULLCP, parm);
                    927:        break;
                    928:     default:
                    929:        ferrd(1, "decode:unknown type\n", tynum);
                    930:     }
                    931:     if (d == NOTOK) {
                    932:            (void) printf("decode:failed on %s\n", t_case[tynum].tst_name);
                    933:            exit(2);
                    934:     }
                    935: }
                    936: #endif
                    937: 
                    938: /*
                    939:  * compare two structures for differences of fields indicating an
                    940:  * error
                    941:  */
                    942: tcmp(tynum, parm1, parm2)
                    943: int    tynum;
                    944: char   *parm1, *parm2;
                    945: {
                    946:     int        d;
                    947:     d = 0;
                    948: 
                    949:     switch (tynum) {
                    950:     case TY_MPDU:
                    951: #define Xparm1 ((struct type_T1_MPDU *)parm1)
                    952: #define Xparm2 ((struct type_T1_MPDU *)parm2)
                    953:        if (Xparm1->a__seq && !Xparm2->a__seq
                    954:          || !Xparm1->a__seq && Xparm2->a__seq) {
                    955:            (void) printf("a__seq missing/present\n");
                    956:            d++;
                    957:        }
                    958:        if (Xparm1->a__seq && Xparm2->a__seq) {
                    959:            if (Xparm1->a__seq->fred != Xparm2->a__seq->fred) {
                    960:                (void) printf("%s->a__seq->fred %d != %d\n",  
                    961:                    Xparm1->a__seq->fred, Xparm2->a__seq->fred);
                    962:                d++;
                    963:            }
                    964:            if (Xparm1->a__seq->george != Xparm2->a__seq->george) {
                    965:                (void) printf("%s a__seq->george %d != %d\n", t_case[tynum].tst_name,
                    966:                    Xparm1->a__seq->george, Xparm2->a__seq->george);
                    967:                d++;
                    968:            }
                    969:        }
                    970:        break;
                    971: #undef Xparm1
                    972: #undef Xparm2
                    973: 
                    974:     case TY_EMBEDDED:
                    975: #define Xparm1 ((struct type_T1_Embedded *)parm1)
                    976: #define Xparm2 ((struct type_T1_Embedded *)parm2)
                    977:        if (Xparm1->anMPDU && !Xparm2->anMPDU ||!Xparm1->anMPDU && Xparm2->anMPDU) {
                    978:            (void) printf("anMPDU missing/present\n");
                    979:            d++;
                    980:        }
                    981:        if (Xparm1->anMPDU && Xparm2->anMPDU) {
                    982:                d += tcmp(TY_MPDU, (char *)Xparm1->anMPDU, (char *)Xparm2->anMPDU);
                    983:        }
                    984:        if (Xparm1->ei != Xparm2->ei) {
                    985:            (void) printf("%s ei %d != %d\n",  
                    986:                t_case[tynum].tst_name, Xparm1->ei, Xparm2->ei);
                    987:            d++;
                    988:        }
                    989:        break;
                    990: #undef Xparm1
                    991: #undef Xparm2
                    992: 
                    993:     case TY_STRINGS:
                    994: #define Xparm1 ((struct type_T1_Strings *)parm1)
                    995: #define Xparm2 ((struct type_T1_Strings *)parm2)
                    996:        if (qb_cmp(Xparm1->ostring, Xparm2->ostring)) {
                    997:                (void) printf("ostring octet string different\n");
                    998:                d++;
                    999:        }
                   1000:        if (bit_cmp(Xparm1->bstring, Xparm2->bstring)) {
                   1001:            (void) printf("bstring bitstring different\n");
                   1002:            d++;
                   1003:        }
                   1004:        if (qb_cmp(Xparm1->nstring, Xparm2->nstring)) {
                   1005:                (void) printf("nstring octet string different\n");
                   1006:                d++;
                   1007:        }
                   1008:        if (qb_cmp(Xparm1->pstring, Xparm2->pstring)) {
                   1009:                (void) printf("pstring octet string different\n");
                   1010:                d++;
                   1011:        }
                   1012:        if (qb_cmp(Xparm1->tstring, Xparm2->tstring)) {
                   1013:                (void) printf("tstring octet string different\n");
                   1014:                d++;
                   1015:        }
                   1016:        if (qb_cmp(Xparm1->t61string, Xparm2->t61string)) {
                   1017:                (void) printf("t61string octet string different\n");
                   1018:                d++;
                   1019:        }
                   1020:        if (qb_cmp(Xparm1->vstring, Xparm2->vstring)) {
                   1021:                (void) printf("vstring octet string different\n");
                   1022:                d++;
                   1023:        }
                   1024:        if (qb_cmp(Xparm1->vis__string, Xparm2->vis__string)) {
                   1025:                (void) printf("vis__string octet string different\n");
                   1026:                d++;
                   1027:        }
                   1028:        if (qb_cmp(Xparm1->i646string, Xparm2->i646string)) {
                   1029:                (void) printf("i646string octet string different\n");
                   1030:                d++;
                   1031:        }
                   1032:        if (qb_cmp(Xparm1->ia5string, Xparm2->ia5string)) {
                   1033:                (void) printf("ia5string octet string different\n");
                   1034:                d++;
                   1035:        }
                   1036:        if (qb_cmp(Xparm1->graphstring, Xparm2->graphstring)) {
                   1037:                (void) printf("graphstring octet string different\n");
                   1038:                d++;
                   1039:        }
                   1040:        if (qb_cmp(Xparm1->genstring, Xparm2->genstring)) {
                   1041:                (void) printf("genstring octet string different\n");
                   1042:                d++;
                   1043:        }
                   1044:        break;
                   1045: #undef Xparm1
                   1046: #undef Xparm2
                   1047: 
                   1048:     case TY_EMB_STRINGS:
                   1049: #define Xparm1 ((struct type_T1_Emb__Strings *)parm1)
                   1050: #define Xparm2 ((struct type_T1_Emb__Strings *)parm2)
                   1051:        if (qb_cmp(Xparm1->btest, Xparm2->btest)) {
                   1052:                (void) printf("btest octet string different\n");
                   1053:                d++;
                   1054:        }
                   1055:        if (bit_cmp(Xparm1->ctest, Xparm2->ctest)) {
                   1056:            (void) printf("ctest bitstring different\n");
                   1057:            d++;
                   1058:        }
                   1059:        if (Xparm1->atest != Xparm2->atest) {
                   1060:                (void) printf("atest integers different\n");
                   1061:                d++;
                   1062:        }
                   1063:        if (Xparm1->big__test && Xparm2->big__test) {
                   1064:                d += tcmp(TY_STRINGS, (char *)Xparm1->big__test, (char *)Xparm2->big__test);
                   1065:        } else if (Xparm1->big__test || Xparm2->big__test) {
                   1066:                (void) printf("big__test one Strings missing!\n");
                   1067:                d++;
                   1068:        }
                   1069:        if (qb_cmp(Xparm1->emb__test->em__oct, Xparm2->emb__test->em__oct)) {
                   1070:                (void) printf("emb__test->em__oct octet string different\n");
                   1071:                d++;
                   1072:        }
                   1073:        if (bit_cmp(Xparm1->emb__test->em__bit, Xparm2->emb__test->em__bit)) {
                   1074:            (void) printf("emb__test->em__bit bitstring different\n");
                   1075:            d++;
                   1076:        }
                   1077:        if (Xparm1->emb__test->em__int != Xparm2->emb__test->em__int) {
                   1078:                (void) printf("emb__test->em__int integers different\n");
                   1079:                d++;
                   1080:        }
                   1081:        break;
                   1082: #undef Xparm1
                   1083: #undef Xparm2
                   1084: 
                   1085:     case TY_IMPLICIT:
                   1086: #define Xparm1 ((struct type_T1_Impl__Tags *)parm1)
                   1087: #define Xparm2 ((struct type_T1_Impl__Tags *)parm2)
                   1088:        if (qb_cmp(Xparm1->o__impl, Xparm2->o__impl)) {
                   1089:                (void) printf("o__impl octet string different\n");
                   1090:                d++;
                   1091:        }
                   1092:        if (bit_cmp(Xparm1->b__impl, Xparm2->b__impl)) {
                   1093:            (void) printf("b__impl bitstring different\n");
                   1094:            d++;
                   1095:        }
                   1096:        if (Xparm1->i__impl != Xparm2->i__impl) {
                   1097:                (void) printf("i__impl integers different\n");
                   1098:                d++;
                   1099:        }
                   1100:        if (Xparm1->obj__impl && Xparm2->obj__impl) {
                   1101:                d += tcmp(TY_EMB_STRINGS, (char *)Xparm1->obj__impl, (char *)Xparm2->obj__impl);
                   1102:        } else if (Xparm1->obj__impl || Xparm2->obj__impl) {
                   1103:                (void) printf("obj__impl one Embedded Strings missing!\n");
                   1104:                d++;
                   1105:        }
                   1106:        if (qb_cmp(Xparm1->i__emb__test->i__em__oct, Xparm2->i__emb__test->i__em__oct)) {
                   1107:                (void) printf("i__emb__test->i__em__oct octet string different\n");
                   1108:                d++;
                   1109:        }
                   1110:        if (bit_cmp(Xparm1->i__emb__test->i__em__bit, Xparm2->i__emb__test->i__em__bit)) {
                   1111:            (void) printf("i__emb__test->i__em__bit bitstring different\n");
                   1112:            d++;
                   1113:        }
                   1114:        if (Xparm1->i__emb__test->i__em__int != Xparm2->i__emb__test->i__em__int) {
                   1115:                (void) printf("i__emb__test->i__em__int integers different\n");
                   1116:                d++;
                   1117:        }
                   1118: #undef Xparm1
                   1119: #undef Xparm2
                   1120:        break;
                   1121:        
                   1122:     case TY_EXPLICIT:
                   1123: #define Xparm1 ((struct type_T1_Expl__Tags *)parm1)
                   1124: #define Xparm2 ((struct type_T1_Expl__Tags *)parm2)
                   1125:        if (qb_cmp(Xparm1->o__expl, Xparm2->o__expl)) {
                   1126:                (void) printf("o__expl octet string different\n");
                   1127:                d++;
                   1128:        }
                   1129:        if (bit_cmp(Xparm1->b__expl, Xparm2->b__expl)) {
                   1130:            (void) printf("b__expl bitstring different\n");
                   1131:            d++;
                   1132:        }
                   1133:        if (Xparm1->i__expl != Xparm2->i__expl) {
                   1134:                (void) printf("i__expl integers different\n");
                   1135:                d++;
                   1136:        }
                   1137:        if (Xparm1->obj__expl && Xparm2->obj__expl) {
                   1138:                d += tcmp(TY_EMB_STRINGS, (char *)Xparm1->obj__expl, (char *)Xparm2->obj__expl);
                   1139:        } else if (Xparm1->obj__expl || Xparm2->obj__expl) {
                   1140:                (void) printf("obj__expl one Embedded Strings missing!\n");
                   1141:                d++;
                   1142:        }
                   1143:        if (qb_cmp(Xparm1->i__exp__test->i__ex__oct, Xparm2->i__exp__test->i__ex__oct)) {
                   1144:                (void) printf("i__exp__test->i__ex__oct octet string different\n");
                   1145:                d++;
                   1146:        }
                   1147:        if (bit_cmp(Xparm1->i__exp__test->i__ex__bit, Xparm2->i__exp__test->i__ex__bit)) {
                   1148:            (void) printf("i__exp__test->i__ex__bit bitstring different\n");
                   1149:            d++;
                   1150:        }
                   1151:        if (Xparm1->i__exp__test->i__ex__int != Xparm2->i__exp__test->i__ex__int) {
                   1152:                (void) printf("i__exp__test->i__ex__int integers different\n");
                   1153:                d++;
                   1154:        }
                   1155: #undef Xparm1
                   1156: #undef Xparm2
                   1157:        break;
                   1158:        
                   1159: 
                   1160:     case TY_SEQOF:
                   1161: #define Xparm1 ((struct type_T1_Seqof__Test *)parm1)
                   1162: #define Xparm2 ((struct type_T1_Seqof__Test *)parm2)
                   1163:     if (Xparm1->sqof__test1 && Xparm2->sqof__test1) {
                   1164:        d += tcmp(TY_ELEMENT4, (char *)Xparm1->sqof__test1, (char *)Xparm2->sqof__test1);
                   1165:     } else if (Xparm1->sqof__test1 || Xparm2->sqof__test1) {
                   1166:        (void) printf("sqof__test1 one missing");
                   1167:        d++;
                   1168:     }
                   1169:     if (Xparm1->stof__test1 && Xparm2->stof__test1) {
                   1170:        d += tcmp(TY_MEMBER2, (char *)Xparm1->stof__test1, (char *)Xparm2->stof__test1);
                   1171:     } else if (Xparm1->stof__test1 || Xparm2->stof__test1) {
                   1172:        (void) printf("stof__test1 one missing");
                   1173:        d++;
                   1174:     }
                   1175:     if (Xparm1->i__test1 != Xparm2->i__test1) {
                   1176:        (void) printf("i__test1 integers different\n");
                   1177:        d++;
                   1178:     }
                   1179:     if (Xparm1->sqof__test2 && Xparm2->sqof__test2) {
                   1180:        d += tcmp(TY_ELEMENT6, (char *)Xparm1->sqof__test2, (char *)Xparm2->sqof__test2);
                   1181:     } else if (Xparm1->sqof__test2 || Xparm2->sqof__test2) {
                   1182:        (void) printf("sqof__test2 one missing");
                   1183:        d++;
                   1184:     }
                   1185:     if (Xparm1->stof__test2 && Xparm2->stof__test2) {
                   1186:        d += tcmp(TY_MEMBER4, (char *)Xparm1->stof__test2, (char *)Xparm2->stof__test2);
                   1187:     } else if (Xparm1->stof__test2 || Xparm2->stof__test2) {
                   1188:        (void) printf("stof__test2 one missing");
                   1189:        d++;
                   1190:     }
                   1191:     if (Xparm1->i__test2 != Xparm2->i__test2) {
                   1192:        (void) printf("i__test2 integers different\n");
                   1193:        d++;
                   1194:     }
                   1195:     break;
                   1196: #undef Xparm1
                   1197: #undef Xparm2
                   1198:        
                   1199:     case TY_ELEMENT4:
                   1200: #define Xparm1 ((struct element_T1_4 *)parm1)
                   1201: #define Xparm2 ((struct element_T1_4 *)parm2)
                   1202:     if (Xparm1->element_T1_5 && Xparm2->element_T1_5) {
                   1203:        d += tcmp(TY_EXPLICIT, (char *)Xparm1->element_T1_5, (char *)Xparm2->element_T1_5);
                   1204:     } else if (Xparm1->element_T1_5 || Xparm2->element_T1_5) {
                   1205:        (void) printf("element_T1_5 one missing");
                   1206:        d++;
                   1207:     }
                   1208:     if (Xparm1->next && Xparm2->next) {
                   1209:        d += tcmp(TY_ELEMENT4, (char *)Xparm1->next, (char *)Xparm2->next);
                   1210:     } else if (Xparm1->next || Xparm2->next) {
                   1211:        (void) printf("%s: next one missing", t_case[tynum].tst_name);
                   1212:        d++;
                   1213:     }
                   1214:     break;
                   1215: #undef Xparm1
                   1216: #undef Xparm2
                   1217:        
                   1218:     case TY_MEMBER2:
                   1219: #define Xparm1 ((struct member_T1_2 *)parm1)
                   1220: #define Xparm2 ((struct member_T1_2 *)parm2)
                   1221:     if (Xparm1->member_T1_3 && Xparm2->member_T1_3) {
                   1222:        d += tcmp(TY_EXPLICIT, (char *)Xparm1->member_T1_3, (char *)Xparm2->member_T1_3);
                   1223:     } else if (Xparm1->member_T1_3 || Xparm2->member_T1_3) {
                   1224:        (void) printf("%s: member_T1_3 one missing", t_case[tynum].tst_name);
                   1225:        d++;
                   1226:     }
                   1227:     if (Xparm1->next && Xparm2->next) {
                   1228:        d += tcmp(TY_MEMBER2, (char *)Xparm1->next, (char *)Xparm2->next);
                   1229:     } else if (Xparm1->next || Xparm2->next) {
                   1230:        (void) printf("%s: next one missing", t_case[tynum].tst_name);
                   1231:        d++;
                   1232:     }
                   1233:     break;
                   1234: #undef Xparm1
                   1235: #undef Xparm2
                   1236: 
                   1237:     case TY_ELEMENT6:
                   1238: #define Xparm1 ((struct element_T1_6 *)parm1)
                   1239: #define Xparm2 ((struct element_T1_6 *)parm2)
                   1240:     if (Xparm1->element_T1_7 && Xparm2->element_T1_7) {
                   1241:        d += tcmp(TY_ELEMENT8, (char *)Xparm1->element_T1_7, (char *)Xparm2->element_T1_7);
                   1242:     } else if (Xparm1->element_T1_7 || Xparm2->element_T1_7) {
                   1243:        (void) printf("%s: element_T1_7 one missing", t_case[tynum].tst_name);
                   1244:        d++;
                   1245:     }
                   1246:     if (Xparm1->next && Xparm2->next) {
                   1247:        d += tcmp(TY_ELEMENT6, (char *)Xparm1->next, (char *)Xparm2->next);
                   1248:     } else if (Xparm1->next || Xparm2->next) {
                   1249:        (void) printf("%s: next one missing", t_case[tynum].tst_name);
                   1250:        d++;
                   1251:     }
                   1252:     break;
                   1253: #undef Xparm1
                   1254: #undef Xparm2
                   1255: 
                   1256:     case TY_ELEMENT8:
                   1257: #define Xparm1 ((struct element_T1_8 *)parm1)
                   1258: #define Xparm2 ((struct element_T1_8 *)parm2)
                   1259:     if (Xparm1->sqof__in && Xparm2->sqof__in) {
                   1260:        d += tcmp(TY_EXPLICIT, (char *)Xparm1->sqof__in, (char *)Xparm2->sqof__in);
                   1261:     } else if (Xparm1->sqof__in || Xparm2->sqof__in) {
                   1262:        (void) printf("%s: sqof__in one missing", t_case[tynum].tst_name);
                   1263:        d++;
                   1264:     }
                   1265:     if (Xparm1->sqof__i != Xparm2->sqof__i) {
                   1266:        (void) printf("sqof__i integers different\n");
                   1267:        d++;
                   1268:     }
                   1269:     if (qb_cmp(Xparm1->sqof__o, Xparm2->sqof__o)) {
                   1270:        (void) printf("sqof__o octet string different\n");
                   1271:        d++;
                   1272:     }
                   1273:     break;
                   1274: #undef Xparm1
                   1275: #undef Xparm2
                   1276: 
                   1277:     case TY_MEMBER4:
                   1278: #define Xparm1 ((struct member_T1_4 *)parm1)
                   1279: #define Xparm2 ((struct member_T1_4 *)parm2)
                   1280:     if (Xparm1->member_T1_5 && Xparm2->member_T1_5) {
                   1281:        d += tcmp(TY_ELEMENT9, (char *)Xparm1->member_T1_5, (char *)Xparm2->member_T1_5);
                   1282:     } else if (Xparm1->member_T1_5 || Xparm2->member_T1_5) {
                   1283:        (void) printf("%s: member_T1_5 one missing", t_case[tynum].tst_name);
                   1284:        d++;
                   1285:     }
                   1286:     if (Xparm1->next && Xparm2->next) {
                   1287:        d += tcmp(TY_MEMBER4, (char *)Xparm1->next, (char *)Xparm2->next);
                   1288:     } else if (Xparm1->next || Xparm2->next) {
                   1289:        (void) printf("%s: next one missing", t_case[tynum].tst_name);
                   1290:        d++;
                   1291:     }
                   1292:     break;
                   1293: #undef Xparm1
                   1294: #undef Xparm2
                   1295: 
                   1296:     case TY_ELEMENT9:
                   1297: #define Xparm1 ((struct element_T1_9 *)parm1)
                   1298: #define Xparm2 ((struct element_T1_9 *)parm2)
                   1299:     if (Xparm1->stof__in && Xparm2->stof__in) {
                   1300:        d += tcmp(TY_EXPLICIT, (char *)Xparm1->stof__in, (char *)Xparm2->stof__in);
                   1301:     } else if (Xparm1->stof__in || Xparm2->stof__in) {
                   1302:        (void) printf("%s: stof__in one missing", t_case[tynum].tst_name);
                   1303:        d++;
                   1304:     }
                   1305:     if (Xparm1->stof__i != Xparm2->stof__i) {
                   1306:        (void) printf("stof__i integers different\n");
                   1307:        d++;
                   1308:     }
                   1309:     if (qb_cmp(Xparm1->stof__o, Xparm2->stof__o)) {
                   1310:        (void) printf("stof__o octet string different\n");
                   1311:        d++;
                   1312:     }
                   1313:     break;
                   1314: #undef Xparm1
                   1315: #undef Xparm2
                   1316: 
                   1317:     case TY_CHOICE:
                   1318: #define Xparm1 ((struct type_T1_Choice__Test *)parm1)
                   1319: #define Xparm2 ((struct type_T1_Choice__Test *)parm2)
                   1320:     if (Xparm1->c1 && Xparm2->c1) {
                   1321:        d += tcmp(TY_CHOICE0, (char *)Xparm1->c1, (char *)Xparm2->c1);
                   1322:     } else if (Xparm1->c1 || Xparm2->c1) {
                   1323:        (void) printf("%s: c1 one missing", t_case[tynum].tst_name);
                   1324:        d++;
                   1325:     }
                   1326:     if (Xparm1->c2 && Xparm2->c2) {
                   1327:        d += tcmp(TY_CHOICE1, (char *)Xparm1->c2, (char *)Xparm2->c2);
                   1328:     } else if (Xparm1->c2 || Xparm2->c2) {
                   1329:        (void) printf("%s: c2 one missing", t_case[tynum].tst_name);
                   1330:        d++;
                   1331:     }
                   1332:     if (Xparm1->c3 && Xparm2->c3) {
                   1333:        d += tcmp(TY_CHOICE2, (char *)Xparm1->c3, (char *)Xparm2->c3);
                   1334:     } else if (Xparm1->c3 || Xparm2->c3) {
                   1335:        (void) printf("%s: c3 one missing", t_case[tynum].tst_name);
                   1336:        d++;
                   1337:     }
                   1338:     if (Xparm1->c4 && Xparm2->c4) {
                   1339:        d += tcmp(TY_ELEMENT11, (char *)Xparm1->c4, (char *)Xparm2->c4);
                   1340:     } else if (Xparm1->c4 || Xparm2->c4) {
                   1341:        (void) printf("%s: c4 one missing", t_case[tynum].tst_name);
                   1342:        d++;
                   1343:     }
                   1344:     break;
                   1345: #undef Xparm1
                   1346: #undef Xparm2
                   1347: 
                   1348:     case TY_CHOICE0:
                   1349: #define Xparm1 ((struct choice_T1_0 *)parm1)
                   1350: #define Xparm2 ((struct choice_T1_0 *)parm2)
                   1351:        if (Xparm1->offset != Xparm2->offset) {
                   1352:            d++;
                   1353:            (void) printf("%s: offset mismatch %d != %d\n", t_case[tynum].tst_name,
                   1354:                Xparm1->offset, Xparm2->offset);
                   1355:            break;
                   1356:        }
                   1357:        switch (Xparm1->offset) {
                   1358:        case choice_T1_0_i__c1:
                   1359:            if (Xparm1->un.i__c1 != Xparm2->un.i__c1) {
                   1360:                d++;
                   1361:                (void) printf("%s: i__c1 mismatch %d != %d", t_case[tynum].tst_name,
                   1362:                    Xparm1->un.i__c1, Xparm2->un.i__c1);
                   1363:            }
                   1364:            break;
                   1365:        
                   1366:        case choice_T1_0_o__c1:
                   1367:            if (qb_cmp(Xparm1->un.o__c1, Xparm2->un.o__c1)) {
                   1368:                (void) printf("o__c1 octet string different\n");
                   1369:                d++;
                   1370:            }
                   1371:            break;
                   1372:        
                   1373:        case choice_T1_0_b__c1:
                   1374:            if (bit_cmp(Xparm1->un.b__c1, Xparm2->un.b__c1)) {
                   1375:                (void) printf("un.b__c1 bitstring different\n");
                   1376:                d++;
                   1377:            }
                   1378:            break;
                   1379:        
                   1380:        case choice_T1_0_f__c1:
                   1381:            if (Xparm1->un.f__c1 && !Xparm2->un.f__c1
                   1382:              || !Xparm1->un.f__c1 && Xparm2->un.f__c1) {
                   1383:                (void) printf("f__c1 Boolean different\n");
                   1384:                d++;
                   1385:            }
                   1386:            break;
                   1387:        
                   1388:        case choice_T1_0_obj__c1:
                   1389:            if (Xparm1->un.obj__c1 && Xparm2->un.obj__c1) {
                   1390:                d += tcmp(TY_EMB_STRINGS, (char *)Xparm1->un.obj__c1,
                   1391:                  (char *)Xparm2->un.obj__c1);
                   1392:            } else if (Xparm1->un.obj__c1 || Xparm2->un.obj__c1) {
                   1393:                (void) printf("%s: un.obj__c1 one missing", t_case[tynum].tst_name);
                   1394:                d++;
                   1395:            }
                   1396:            break;
                   1397:        
                   1398:        default:
                   1399:            ferrd(1, "TY_CHOICE0:illegal offset %d\n", Xparm1->offset);
                   1400:        }
                   1401:        break;
                   1402: #undef Xparm1
                   1403: #undef Xparm2
                   1404: 
                   1405:     case TY_CHOICE1:
                   1406: #define Xparm1 ((struct choice_T1_1 *)parm1)
                   1407: #define Xparm2 ((struct choice_T1_1 *)parm2)
                   1408:        
                   1409:        if (Xparm1->offset != Xparm2->offset) {
                   1410:            d++;
                   1411:            (void) printf("%s: offset mismatch %d != %d\n", t_case[tynum].tst_name,
                   1412:                Xparm1->offset, Xparm2->offset);
                   1413:            break;
                   1414:        }
                   1415:        switch (Xparm1->offset) {
                   1416:        case choice_T1_1_i__c2:
                   1417:            if (Xparm1->un.i__c2 != Xparm2->un.i__c2) {
                   1418:                d++;
                   1419:                (void) printf("%s: i__c2 mismatch %d != %d", t_case[tynum].tst_name,
                   1420:                    Xparm1->un.i__c2, Xparm2->un.i__c2);
                   1421:            }
                   1422:            break;
                   1423:        
                   1424:        case choice_T1_1_o__c2:
                   1425:            if (qb_cmp(Xparm1->un.o__c2, Xparm2->un.o__c2)) {
                   1426:                (void) printf("o__c2 octet string different\n");
                   1427:                d++;
                   1428:            }
                   1429:            break;
                   1430:        
                   1431:        case choice_T1_1_b__c2:
                   1432:            if (bit_cmp(Xparm1->un.b__c2, Xparm2->un.b__c2)) {
                   1433:                (void) printf("un.b__c2 bitstring different\n");
                   1434:                d++;
                   1435:            }
                   1436:            break;
                   1437:        
                   1438:        case choice_T1_1_f__c2:
                   1439:            if (Xparm1->un.f__c2 && !Xparm2->un.f__c2
                   1440:              || !Xparm1->un.f__c2 && Xparm2->un.f__c2) {
                   1441:                d++;
                   1442:                (void) printf("%s: f__c2 mismatch %d != %d", t_case[tynum].tst_name,
                   1443:                    Xparm1->un.f__c2, Xparm2->un.f__c2);
                   1444:            }
                   1445:            break;
                   1446:        
                   1447:        case choice_T1_1_obj__c2:
                   1448:            if (Xparm1->un.obj__c2 && Xparm2->un.obj__c2) {
                   1449:                d += tcmp(TY_EMB_STRINGS, (char *)Xparm1->un.obj__c2,
                   1450:                  (char *)Xparm2->un.obj__c2);
                   1451:            } else if (Xparm1->un.obj__c2 || Xparm2->un.obj__c2) {
                   1452:                (void) printf("%s: un.obj__c2 one missing", t_case[tynum].tst_name);
                   1453:                d++;
                   1454:            }
                   1455:            break;
                   1456:        
                   1457:        default:
                   1458:            ferrd(1, "TY_CHOICE1:illegal offset %d\n", Xparm1->offset);
                   1459:        }
                   1460:        break;
                   1461: #undef Xparm1
                   1462: #undef Xparm2
                   1463: 
                   1464:     case TY_CHOICE2:
                   1465: #define Xparm1 ((struct choice_T1_2 *)parm1)
                   1466: #define Xparm2 ((struct choice_T1_2 *)parm2)
                   1467:        
                   1468:        switch (Xparm1->offset) {
                   1469:        case choice_T1_2_i__c3:
                   1470:            if (Xparm1->un.i__c3 != Xparm2->un.i__c3) {
                   1471:                d++;
                   1472:                (void) printf("%s: i__c3 mismatch %d != %d", t_case[tynum].tst_name,
                   1473:                    Xparm1->un.i__c3, Xparm2->un.i__c3);
                   1474:            }
                   1475:            break;
                   1476:        
                   1477:        case choice_T1_2_seq__c3:
                   1478:            if (Xparm1->un.seq__c3 && Xparm2->un.seq__c3) {
                   1479:                d += tcmp(TY_ELEMENT10, (char *)Xparm1->un.seq__c3, (char *)Xparm2->un.seq__c3);
                   1480:            } else if (Xparm1->un.seq__c3 || Xparm2->un.seq__c3) {
                   1481:                (void) printf("%s: un.seq__c3 one missing", t_case[tynum].tst_name);
                   1482:                d++;
                   1483:            }
                   1484:            break;
                   1485:        
                   1486:        case choice_T1_2_set__c3:
                   1487:            if (Xparm1->un.set__c3 && Xparm2->un.set__c3) {
                   1488:                d += tcmp(TY_MEMBER6, (char *)Xparm1->un.set__c3, (char *)Xparm2->un.set__c3);
                   1489:            } else if (Xparm1->un.set__c3 || Xparm2->un.set__c3) {
                   1490:                (void) printf("%s: un.set__c3 one missing", t_case[tynum].tst_name);
                   1491:                d++;
                   1492:            }
                   1493:            break;
                   1494:        
                   1495:        default:
                   1496:            ferrd(1, "TY_CHOICE2:illegal offset %d\n", Xparm1->offset);
                   1497:        }
                   1498:        break;
                   1499: #undef Xparm1
                   1500: #undef Xparm2
                   1501: 
                   1502:     case TY_CHOICE3:
                   1503: #define Xparm1 ((struct choice_T1_3 *)parm1)
                   1504: #define Xparm2 ((struct choice_T1_3 *)parm2)
                   1505:        
                   1506:        switch (Xparm1->offset) {
                   1507:        case choice_T1_3_sc__a__i:
                   1508:            if (Xparm1->un.sc__a__i != Xparm2->un.sc__a__i) {
                   1509:                d++;
                   1510:                (void) printf("%s: sc__a__i mismatch %d != %d", t_case[tynum].tst_name,
                   1511:                    Xparm1->un.sc__a__i, Xparm2->un.sc__a__i);
                   1512:            }
                   1513:            break;
                   1514:        
                   1515:        case choice_T1_3_sc__b__i:
                   1516:            if (Xparm1->un.sc__b__i != Xparm2->un.sc__b__i) {
                   1517:                d++;
                   1518:                (void) printf("%s: sc__b__i mismatch %d != %d", t_case[tynum].tst_name,
                   1519:                    Xparm1->un.sc__b__i, Xparm2->un.sc__b__i);
                   1520:            }
                   1521:            break;
                   1522:        
                   1523:        case choice_T1_3_c4__i:
                   1524:            if (Xparm1->un.c4__i != Xparm2->un.c4__i) {
                   1525:                d++;
                   1526:                (void) printf("%s: c4__i mismatch %d != %d", t_case[tynum].tst_name,
                   1527:                    Xparm1->un.c4__i, Xparm2->un.c4__i);
                   1528:            }
                   1529:            break;
                   1530:        
                   1531:        case choice_T1_3_c4__obj:
                   1532:            if (Xparm1->un.c4__obj && Xparm2->un.c4__obj) {
                   1533:                d += tcmp(TY_EXPLICIT, (char *)Xparm1->un.c4__obj, (char *)Xparm2->un.c4__obj);
                   1534:            } else if (Xparm1->un.c4__obj || Xparm2->un.c4__obj) {
                   1535:                (void) printf("%s: un.c4__obj one missing", t_case[tynum].tst_name);
                   1536:                d++;
                   1537:            }
                   1538:            break;
                   1539:        
                   1540:        default:
                   1541:            ferrd(1, "TY_CHOICE3:illegal offset %d\n", Xparm1->offset);
                   1542:        }
                   1543:        break;
                   1544: #undef Xparm1
                   1545: #undef Xparm2
                   1546: 
                   1547:     case TY_ELEMENT10:
                   1548: #define Xparm1 ((struct element_T1_10 *)parm1)
                   1549: #define Xparm2 ((struct element_T1_10 *)parm2)
                   1550:        if (Xparm1->seq__c3__in && Xparm2->seq__c3__in) {
                   1551:            d += tcmp(TY_EXPLICIT, (char *)Xparm1->seq__c3__in, (char *)Xparm2->seq__c3__in);
                   1552:        } else if (Xparm1->seq__c3__in || Xparm2->seq__c3__in) {
                   1553:            (void) printf("%s: seq__c3__in one missing", t_case[tynum].tst_name);
                   1554:            d++;
                   1555:        }
                   1556:        if (Xparm1->seq__c3__i != Xparm2->seq__c3__i) {
                   1557:            d++;
                   1558:            (void) printf("%s: seq__c3__i mismatch %d != %d", t_case[tynum].tst_name,
                   1559:                Xparm1->seq__c3__i, Xparm2->seq__c3__i);
                   1560:        }
                   1561:        if (qb_cmp(Xparm1->seq__c3__o, Xparm2->seq__c3__o)) {
                   1562:            (void) printf("seq__c3__o octet string different\n");
                   1563:            d++;
                   1564:        }
                   1565:        break;
                   1566: #undef Xparm1
                   1567: #undef Xparm2
                   1568: 
                   1569:     case TY_MEMBER6:
                   1570: #define Xparm1 ((struct member_T1_6 *)parm1)
                   1571: #define Xparm2 ((struct member_T1_6 *)parm2)
                   1572:        if (Xparm1->set__c3__in && Xparm2->set__c3__in) {
                   1573:            d += tcmp(TY_EXPLICIT, (char *)Xparm1->set__c3__in, (char *)Xparm2->set__c3__in);
                   1574:        } else if (Xparm1->set__c3__in || Xparm2->set__c3__in) {
                   1575:            (void) printf("%s: set__c3__in one missing", t_case[tynum].tst_name);
                   1576:            d++;
                   1577:        }
                   1578:        if (Xparm1->set__c3__i != Xparm2->set__c3__i) {
                   1579:            d++;
                   1580:            (void) printf("%s: set__c3__i mismatch %d != %d", t_case[tynum].tst_name,
                   1581:                Xparm1->set__c3__i, Xparm2->set__c3__i);
                   1582:        }
                   1583:        if (qb_cmp(Xparm1->set__c3__o, Xparm2->set__c3__o)) {
                   1584:            (void) printf("set__c3__o octet string different\n");
                   1585:            d++;
                   1586:        }
                   1587:        break;
                   1588: #undef Xparm1
                   1589: #undef Xparm2
                   1590: 
                   1591:     case TY_ELEMENT11:
                   1592: #define Xparm1 ((struct element_T1_11 *)parm1)
                   1593: #define Xparm2 ((struct element_T1_11 *)parm2)
                   1594:        if (Xparm1->c4__choice && Xparm2->c4__choice) {
                   1595:            d += tcmp(TY_CHOICE3, (char *)Xparm1->c4__choice, (char *)Xparm2->c4__choice);
                   1596:        } else if (Xparm1->c4__choice || Xparm2->c4__choice) {
                   1597:            (void) printf("%s: c4__choice one missing", t_case[tynum].tst_name);
                   1598:            d++;
                   1599:        }
                   1600:        break;
                   1601: #undef Xparm1
                   1602: #undef Xparm2
                   1603: 
                   1604:     case TY_OPTIONAL:
                   1605: #define Xparm1 ((struct type_T1_Opt__Strings *)parm1)
                   1606: #define Xparm2 ((struct type_T1_Opt__Strings *)parm2)
                   1607:         if (Xparm1->optionals & opt_T1_Opt__Strings_a__opt) {
                   1608:            if (Xparm1->a__opt != Xparm2->a__opt) {
                   1609:                d++;
                   1610:                (void) printf("%s: a__opt mismatch %d != %d", t_case[tynum].tst_name,
                   1611:                    Xparm1->a__opt, Xparm2->a__opt);
                   1612:            }
                   1613:        }
                   1614:         if (Xparm1->optionals & opt_T1_Opt__Strings_d__opt) {
                   1615:            if (Xparm1->d__opt && !Xparm2->d__opt
                   1616:              || !Xparm1->d__opt && Xparm2->d__opt) {
                   1617:                d++;
                   1618:                (void) printf("%s: d__opt mismatch %d != %d", t_case[tynum].tst_name,
                   1619:                    Xparm1->d__opt, Xparm2->d__opt);
                   1620:            }
                   1621:        }
                   1622:        if (Xparm1->b__opt != NULLQB && Xparm2->b__opt != NULLQB) {
                   1623:            if (qb_cmp(Xparm1->b__opt, Xparm2->b__opt)) {
                   1624:                (void) printf("b__opt octet string different\n");
                   1625:                d++;
                   1626:            }
                   1627:        }
                   1628:        if (Xparm1->b__opt != NULLQB && Xparm2->b__opt == NULLQB
                   1629:         || Xparm1->b__opt == NULLQB && Xparm2->b__opt != NULLQB) {
                   1630:            (void) printf("%s: b__opt one missing\n", t_case[tynum].tst_name);
                   1631:            d++;
                   1632:        }
                   1633:        if (Xparm1->c__opt != NULLPE && Xparm2->c__opt != NULLPE) {
                   1634:            if (bit_cmp(Xparm1->c__opt, Xparm2->c__opt)) {
                   1635:                (void) printf("%s:c__opt bitstring different\n",
                   1636:                    t_case[tynum].tst_name);
                   1637:                d++;
                   1638:            }
                   1639:        }
                   1640:         if (Xparm1->optionals & opt_T1_Opt__Strings_e__opt) {
                   1641:            if (Xparm1->e__opt && !Xparm2->e__opt
                   1642:            || !Xparm1->e__opt && Xparm2->e__opt) {
                   1643:                d++;
                   1644:                (void) printf("%s: e__opt mismatch %d != %d", t_case[tynum].tst_name,
                   1645:                    Xparm1->e__opt, Xparm2->e__opt);
                   1646:            }
                   1647:        }
                   1648:        if (Xparm1->big__opt && Xparm2->big__opt) {
                   1649:            d += tcmp(TY_STRINGS, (char *)Xparm1->big__opt,
                   1650:               (char *)Xparm2->big__opt);
                   1651:        } else if (Xparm1->big__opt && !Xparm2->big__opt
                   1652:               || !Xparm1->big__opt && Xparm2->big__opt) {
                   1653:            (void) printf("%s: big__opt one missing", t_case[tynum].tst_name);
                   1654:            d++;
                   1655:        }
                   1656:        if (Xparm1->emb__opt && Xparm2->emb__opt) {
                   1657:            d += tcmp(TY_ELEMENT12, (char *)Xparm1->emb__opt,
                   1658:               (char *)Xparm2->emb__opt);
                   1659:        } else if (Xparm1->emb__opt && !Xparm2->emb__opt
                   1660:               || !Xparm1->emb__opt && Xparm2->emb__opt) {
                   1661:            (void) printf("%s: emb__opt one missing", t_case[tynum].tst_name);
                   1662:            d++;
                   1663:        }
                   1664:        if (Xparm1->st__opt && Xparm2->st__opt) {
                   1665:            d += tcmp(TY_MEMBER7, (char *)Xparm1->st__opt,
                   1666:               (char *)Xparm2->st__opt);
                   1667:        } else if (Xparm1->st__opt && !Xparm2->st__opt
                   1668:               || !Xparm1->st__opt && Xparm2->st__opt) {
                   1669:            (void) printf("%s: st__opt one missing", t_case[tynum].tst_name);
                   1670:            d++;
                   1671:        }
                   1672:        if (Xparm1->obj__opt && Xparm2->obj__opt) {
                   1673:            d += tcmp(TY_MPDU, (char *)Xparm1->obj__opt,
                   1674:               (char *)Xparm2->obj__opt);
                   1675:        } else if (Xparm1->obj__opt && !Xparm2->obj__opt
                   1676:               || !Xparm1->obj__opt && Xparm2->obj__opt) {
                   1677:            (void) printf("%s: obj__opt one missing", t_case[tynum].tst_name);
                   1678:            d++;
                   1679:        }
                   1680:         if (Xparm1->optionals & opt_T1_Opt__Strings_etag__opt) {
                   1681:            if (Xparm1->etag__opt != Xparm2->etag__opt) {
                   1682:                d++;
                   1683:                (void) printf("%s: etag__opt mismatch %d != %d", t_case[tynum].tst_name,
                   1684:                    Xparm1->etag__opt, Xparm2->etag__opt);
                   1685:            }
                   1686:        }
                   1687:        if (Xparm1->ch__opt && Xparm2->ch__opt) {
                   1688:            d += tcmp(TY_CHOICE4, (char *)Xparm1->ch__opt,
                   1689:               (char *)Xparm2->ch__opt);
                   1690:        } else if (Xparm1->ch__opt && !Xparm2->ch__opt
                   1691:               || !Xparm1->ch__opt && Xparm2->ch__opt) {
                   1692:            (void) printf("%s: ch__opt one missing", t_case[tynum].tst_name);
                   1693:            d++;
                   1694:        }
                   1695:        break;
                   1696: #undef Xparm1
                   1697: #undef Xparm2
                   1698: 
                   1699:      case TY_ELEMENT12:
                   1700: #define Xparm1 ((struct element_T1_12 *)parm1)
                   1701: #define Xparm2 ((struct element_T1_12 *)parm2)
                   1702:         if (Xparm1->optionals & opt_T1_element_T1_12_oem__int) {
                   1703:            if (Xparm1->oem__int != Xparm2->oem__int) {
                   1704:                d++;
                   1705:                (void) printf("%s: oem__int mismatch %d != %d", t_case[tynum].tst_name,
                   1706:                    Xparm1->oem__int, Xparm2->oem__int);
                   1707:            }
                   1708:        }
                   1709:        if (Xparm1->oem__oct != NULLQB && Xparm2->oem__oct != NULLQB) {
                   1710:            if (qb_cmp(Xparm1->oem__oct, Xparm2->oem__oct)) {
                   1711:                (void) printf("oem__oct octet string different\n");
                   1712:                d++;
                   1713:            }
                   1714:        }
                   1715:        if (Xparm1->oem__oct != NULLQB && Xparm2->oem__oct == NULLQB
                   1716:         || Xparm1->oem__oct == NULLQB && Xparm2->oem__oct != NULLQB) {
                   1717:            (void) printf("%s: oem__oct one missing\n", t_case[tynum].tst_name);
                   1718:            d++;
                   1719:        }
                   1720:        if (Xparm1->oem__bit != NULLPE && Xparm2->oem__bit != NULLPE) {
                   1721:            if (bit_cmp(Xparm1->oem__bit, Xparm2->oem__bit)) {
                   1722:                (void) printf("%s:oem__bit bitstring different\n",
                   1723:                    t_case[tynum].tst_name);
                   1724:                d++;
                   1725:            }
                   1726:        }
                   1727:        break;
                   1728: #undef Xparm1
                   1729: #undef Xparm2
                   1730: 
                   1731:      case TY_MEMBER7:
                   1732: #define Xparm1 ((struct member_T1_7 *)parm1)
                   1733: #define Xparm2 ((struct member_T1_7 *)parm2)
                   1734:         if (Xparm1->optionals & opt_T1_member_T1_7_st__int0) {
                   1735:            if (Xparm1->st__int0 != Xparm2->st__int0) {
                   1736:                d++;
                   1737:                (void) printf("%s: st__int0 mismatch %d != %d", t_case[tynum].tst_name,
                   1738:                    Xparm1->st__int0, Xparm2->st__int0);
                   1739:            }
                   1740:        }
                   1741:         if (Xparm1->optionals & opt_T1_member_T1_7_st__int1) {
                   1742:            if (Xparm1->st__int1 != Xparm2->st__int1) {
                   1743:                d++;
                   1744:                (void) printf("%s: st__int1 mismatch %d != %d", t_case[tynum].tst_name,
                   1745:                    Xparm1->st__int1, Xparm2->st__int1);
                   1746:            }
                   1747:        }
                   1748:         if (Xparm1->optionals & opt_T1_member_T1_7_st__int2) {
                   1749:            if (Xparm1->st__int2 != Xparm2->st__int2) {
                   1750:                d++;
                   1751:                (void) printf("%s: st__int2 mismatch %d != %d", t_case[tynum].tst_name,
                   1752:                    Xparm1->st__int2, Xparm2->st__int2);
                   1753:            }
                   1754:        }
                   1755:        break;
                   1756: #undef Xparm1
                   1757: #undef Xparm2
                   1758: 
                   1759:     case TY_CHOICE4:
                   1760: #define Xparm1 ((struct choice_T1_4 *)parm1)
                   1761: #define Xparm2 ((struct choice_T1_4 *)parm2)
                   1762:        if (Xparm1->offset != Xparm2->offset) {
                   1763:            d++;
                   1764:            (void) printf("%s: offset mismatch %d != %d", t_case[tynum].tst_name,
                   1765:                Xparm1->offset, Xparm2->offset);
                   1766:            break;
                   1767:        }
                   1768:        switch (Xparm1->offset) {
                   1769:        case choice_T1_4_ch__1:
                   1770:            if (Xparm1->un.ch__1 != Xparm2->un.ch__1) {
                   1771:                d++;
                   1772:                (void) printf("%s: ch__1 mismatch %d != %d", t_case[tynum].tst_name,
                   1773:                    Xparm1->un.ch__1, Xparm2->un.ch__1);
                   1774:            }
                   1775:            break;
                   1776:        
                   1777:        case choice_T1_4_ch__2:
                   1778:            if (Xparm1->un.ch__2 != Xparm2->un.ch__2) {
                   1779:                d++;
                   1780:                (void) printf("%s: ch__2 mismatch %d != %d", t_case[tynum].tst_name,
                   1781:                    Xparm1->un.ch__2, Xparm2->un.ch__2);
                   1782:            }
                   1783:            break;
                   1784:        
                   1785:        default:
                   1786:            ferrd(1, "tcmp:TY_CHOICE4:illegal offset %d\n", Xparm1->offset);
                   1787:        }
                   1788:        break;
                   1789: #undef Xparm1
                   1790: #undef Xparm2
                   1791: 
                   1792:      case TY_EXTREF:
                   1793: #define Xparm1 ((struct type_T1_E__ref *)parm1)
                   1794: #define Xparm2 ((struct type_T1_E__ref *)parm2)
                   1795:        if (Xparm1->a__ref && Xparm2->a__ref) {
                   1796:            d += tcmp(TY_T2_INFO, (char *)Xparm1->a__ref,
                   1797:               (char *)Xparm2->a__ref);
                   1798:        } else if (Xparm1->a__ref == NULL || Xparm2->a__ref == NULL) {
                   1799:            (void) printf("%s: a__ref one missing", t_case[tynum].tst_name);
                   1800:            d++;
                   1801:        }
                   1802:        if (Xparm1->b__ref && Xparm2->b__ref) {
                   1803:            d += tcmp(TY_T2_INFO, (char *)Xparm1->b__ref,
                   1804:               (char *)Xparm2->b__ref);
                   1805:        } else if (Xparm1->b__ref == NULL || Xparm2->b__ref == NULL) {
                   1806:            (void) printf("%s: b__ref one missing", t_case[tynum].tst_name);
                   1807:            d++;
                   1808:        }
                   1809:        if (Xparm1->c__ref && Xparm2->c__ref) {
                   1810:            d += tcmp(TY_CHOICE, (char *)Xparm1->c__ref,
                   1811:               (char *)Xparm2->c__ref);
                   1812:        } else if (Xparm1->c__ref == NULL || Xparm2->c__ref == NULL) {
                   1813:            (void) printf("%s: c__ref one missing", t_case[tynum].tst_name);
                   1814:            d++;
                   1815:        }
                   1816:        if (Xparm1->d__ref && Xparm2->d__ref) {
                   1817:            d += tcmp(TY_T2_INFO, (char *)Xparm1->d__ref,
                   1818:               (char *)Xparm2->d__ref);
                   1819:        } else if (Xparm1->d__ref && !Xparm2->d__ref
                   1820:               || !Xparm1->d__ref && Xparm2->d__ref) {
                   1821:            (void) printf("%s: d__ref one missing", t_case[tynum].tst_name);
                   1822:            d++;
                   1823:        }
                   1824:        if (Xparm1->e__ref && Xparm2->e__ref) {
                   1825:            d += tcmp(TY_T2_INFO, (char *)Xparm1->e__ref,
                   1826:               (char *)Xparm2->e__ref);
                   1827:        } else if (Xparm1->e__ref && !Xparm2->e__ref
                   1828:               || !Xparm1->e__ref && Xparm2->e__ref) {
                   1829:            (void) printf("%s: e__ref one missing", t_case[tynum].tst_name);
                   1830:            d++;
                   1831:        }
                   1832:         break;
                   1833: #undef Xparm1
                   1834: #undef Xparm2
                   1835: 
                   1836:      case TY_T2_INFO:
                   1837: #define Xparm1 ((struct type_T2_Info *)parm1)
                   1838: #define Xparm2 ((struct type_T2_Info *)parm2)
                   1839:        if (Xparm1->a1 != Xparm2->a1) {
                   1840:            d++;
                   1841:            (void) printf("%s: a1 mismatch %d != %d", t_case[tynum].tst_name,
                   1842:                Xparm1->a1, Xparm2->a1);
                   1843:        }
                   1844:        if (Xparm1->a2 != Xparm2->a2) {
                   1845:            d++;
                   1846:            (void) printf("%s: a2 mismatch %d != %d", t_case[tynum].tst_name,
                   1847:                Xparm1->a2, Xparm2->a2);
                   1848:        }
                   1849:        if (Xparm1->a3 != Xparm2->a3) {
                   1850:            d++;
                   1851:            (void) printf("%s: a3 mismatch %d != %d", t_case[tynum].tst_name,
                   1852:                Xparm1->a3, Xparm2->a3);
                   1853:        }
                   1854:        if (Xparm1->a4 && Xparm2->a4) {
                   1855:            d += tcmp(TY_T2_MPDU, (char *)Xparm1->a4, (char *)Xparm2->a4);
                   1856:        } else if (Xparm1->a4 == NULL || Xparm2->a4 == NULL) {
                   1857:            (void) printf("%s: a4 one missing", t_case[tynum].tst_name);
                   1858:            d++;
                   1859:        }
                   1860:         break;
                   1861: #undef Xparm1
                   1862: #undef Xparm2
                   1863: 
                   1864:      case TY_T2_MPDU:
                   1865: #define Xparm1 ((struct type_T2_MPDU *)parm1)
                   1866: #define Xparm2 ((struct type_T2_MPDU *)parm2)
                   1867:        if (Xparm1->a__seq && Xparm2->a__seq) {
                   1868:            d += tcmp(TY_T2_ELEM0, (char *)Xparm1->a__seq,
                   1869:               (char *)Xparm2->a__seq);
                   1870:        } else if (Xparm1->a__seq == NULL || Xparm2->a__seq == NULL) {
                   1871:            (void) printf("%s: a__seq one missing", t_case[tynum].tst_name);
                   1872:            d++;
                   1873:        }
                   1874:         break;
                   1875: #undef Xparm1
                   1876: #undef Xparm2
                   1877: 
                   1878:      case TY_T2_ELEM0:
                   1879: #define Xparm1 ((struct element_T2_0 *)parm1)
                   1880: #define Xparm2 ((struct element_T2_0 *)parm2)
                   1881:        if (Xparm1->fred != Xparm2->fred) {
                   1882:            d++;
                   1883:            (void) printf("%s: fred mismatch %d != %d", t_case[tynum].tst_name,
                   1884:                Xparm1->fred, Xparm2->fred);
                   1885:        }
                   1886:         break;
                   1887: #undef Xparm1
                   1888: #undef Xparm2
                   1889: 
                   1890:      case TY_OPTIMISED:
                   1891: #define Xparm1 ((struct type_T1_Optimised *)parm1)
                   1892: #define Xparm2 ((struct type_T1_Optimised *)parm2)
                   1893:        if (Xparm1->o1 == NULLPE || Xparm2->o1 == NULLPE) {
                   1894:            (void) printf("%s: o1 one missing\n", t_case[tynum].tst_name);
                   1895:            d++;
                   1896:        } else if (bit_cmp(Xparm1->o1, Xparm2->o1)) {
                   1897:                (void) printf("%s:o1 bitstring different\n",
                   1898:                    t_case[tynum].tst_name);
                   1899:                d++;
                   1900:        }
                   1901:        if (Xparm1->o2 != NULLQB && Xparm2->o2 != NULLQB) {
                   1902:            if (qb_cmp(Xparm1->o2, Xparm2->o2)) {
                   1903:                (void) printf("o2 octet string different\n");
                   1904:                d++;
                   1905:            }
                   1906:        } else {
                   1907:            (void) printf("%s: o2 one missing\n", t_case[tynum].tst_name);
                   1908:            d++;
                   1909:        }
                   1910:        if (Xparm1->o3 && Xparm2->o3) {
                   1911:            d += tcmp(TY_MPDU, (char *)Xparm1->o3, (char *)Xparm2->o3);
                   1912:        } else if (Xparm1->o3 == NULL || Xparm2->o3 == NULL) {
                   1913:            (void) printf("%s: o3 one missing", t_case[tynum].tst_name);
                   1914:            d++;
                   1915:        }
                   1916:        if (Xparm1->o4 != NULLPE && Xparm2->o4 == NULLPE
                   1917:         || Xparm1->o4 == NULLPE && Xparm2->o4 != NULLPE) {
                   1918:            (void) printf("%s: o4 one missing\n", t_case[tynum].tst_name);
                   1919:            d++;
                   1920:        }
                   1921:        if (Xparm1->o4 != NULLPE && Xparm2->o4 != NULLPE) {
                   1922:            if (pe_cmp(Xparm1->o4, Xparm2->o4)) {
                   1923:                (void) printf("%s:o4 SET of ANY different\n",
                   1924:                    t_case[tynum].tst_name);
                   1925:                d++;
                   1926:            }
                   1927:        }
                   1928:        if (Xparm1->element_T1_14 && Xparm2->element_T1_14) {
                   1929:            d += tcmp(TY_MEMBER9, (char *)Xparm1->element_T1_14,
                   1930:            (char *)Xparm2->element_T1_14);
                   1931:        } else if (Xparm1->element_T1_14 == NULL
                   1932:                 || Xparm2->element_T1_14 == NULL) {
                   1933:            (void) printf("%s: element_T1_14 one missing", t_case[tynum].tst_name);
                   1934:            d++;
                   1935:        }
                   1936:        break;
                   1937: #undef Xparm1
                   1938: #undef Xparm2
                   1939: 
                   1940:      case TY_MEMBER9:
                   1941: #define Xparm1 ((struct member_T1_9 *)parm1)
                   1942: #define Xparm2 ((struct member_T1_9 *)parm2)
                   1943:        if (Xparm1->o5 != NULLPE && Xparm2->o5 != NULLPE) {
                   1944:            if (pe_cmp(Xparm1->o5, Xparm2->o5)) {
                   1945:                (void) printf("%s:o5 SET of ANY different\n",
                   1946:                    t_case[tynum].tst_name);
                   1947:                d++;
                   1948:            }
                   1949:        } else {
                   1950:            (void) printf("%s: o5 one missing\n", t_case[tynum].tst_name);
                   1951:            d++;
                   1952:        }
                   1953:        if (Xparm1->o6 != NULLPE && Xparm2->o6 != NULLPE) {
                   1954:            if (pe_cmp(Xparm1->o6, Xparm2->o6)) {
                   1955:                (void) printf("%s:o6 SET of ANY different\n",
                   1956:                    t_case[tynum].tst_name);
                   1957:                d++;
                   1958:            }
                   1959:        } else {
                   1960:            (void) printf("%s: o6 one missing\n", t_case[tynum].tst_name);
                   1961:            d++;
                   1962:        }
                   1963:        if (Xparm1->o7 != NULLOID && Xparm2->o7 != NULLOID) {
                   1964:            if (oid_cmp(Xparm1->o7, Xparm2->o7)) {
                   1965:                (void) printf("%s:o7 OID different\n",
                   1966:                    t_case[tynum].tst_name);
                   1967:                d++;
                   1968:            }
                   1969:        } else {
                   1970:            (void) printf("%s: o7 one missing\n", t_case[tynum].tst_name);
                   1971:            d++;
                   1972:        }
                   1973:        break;
                   1974: #undef Xparm1
                   1975: #undef Xparm2
                   1976: 
                   1977:     case TY_EXTERNAL:
                   1978: #define Xparm1 ((struct type_T1_Ext__typ *)parm1)
                   1979: #define Xparm2 ((struct type_T1_Ext__typ *)parm2)
                   1980:        if (Xparm1->ext != NULL && Xparm2->ext != NULL) {
                   1981:            if (ext_cmp(Xparm1->ext, Xparm2->ext)) {
                   1982:                (void) printf("%s:ext EXTERNAL different\n",
                   1983:                    t_case[tynum].tst_name);
                   1984:                d++;
                   1985:            }
                   1986:        } else {
                   1987:            (void) printf("%s: ext one missing\n", t_case[tynum].tst_name);
                   1988:            d++;
                   1989:        }
                   1990:        if (Xparm1->a__ny != NULLPE && Xparm2->a__ny != NULLPE) {
                   1991:            if (pe_cmp(Xparm1->a__ny, Xparm2->a__ny)) {
                   1992:                (void) printf("%s:a__ny ANY different\n",
                   1993:                    t_case[tynum].tst_name);
                   1994:                d++;
                   1995:            }
                   1996:        } else {
                   1997:            (void) printf("%s: a__ny one missing\n", t_case[tynum].tst_name);
                   1998:            d++;
                   1999:        }
                   2000:        if (Xparm1->ext__impl != NULL && Xparm2->ext__impl != NULL) {
                   2001:            if (ext_cmp(Xparm1->ext__impl, Xparm2->ext__impl)) {
                   2002:                (void) printf("%s:ext__impl EXTERNAL different\n",
                   2003:                    t_case[tynum].tst_name);
                   2004:                d++;
                   2005:            }
                   2006:        } else {
                   2007:            (void) printf("%s: ext__impl one missing\n", t_case[tynum].tst_name);
                   2008:            d++;
                   2009:        }
                   2010:        if (Xparm1->any__impl != NULLPE && Xparm2->any__impl != NULLPE) {
                   2011:            if (pe_cmp(Xparm1->any__impl, Xparm2->any__impl)) {
                   2012:                (void) printf("%s:any__impl ANY different\n",
                   2013:                    t_case[tynum].tst_name);
                   2014:                d++;
                   2015:            }
                   2016:        } else {
                   2017:            (void) printf("%s: any__impl one missing\n", t_case[tynum].tst_name);
                   2018:            d++;
                   2019:        }
                   2020:        if (Xparm1->ext__expl != NULL && Xparm2->ext__expl != NULL) {
                   2021:            if (ext_cmp(Xparm1->ext__expl, Xparm2->ext__expl)) {
                   2022:                (void) printf("%s:ext__expl EXTERNAL different\n",
                   2023:                    t_case[tynum].tst_name);
                   2024:                d++;
                   2025:            }
                   2026:        } else {
                   2027:            (void) printf("%s: ext__expl one missing\n", t_case[tynum].tst_name);
                   2028:            d++;
                   2029:        }
                   2030:        if (Xparm1->any__expl != NULLPE && Xparm2->any__expl != NULLPE) {
                   2031:            if (pe_cmp(Xparm1->any__expl, Xparm2->any__expl)) {
                   2032:                (void) printf("%s:any__expl ANY different\n",
                   2033:                    t_case[tynum].tst_name);
                   2034:                d++;
                   2035:            }
                   2036:        } else {
                   2037:            (void) printf("%s: any__expl one missing\n", t_case[tynum].tst_name);
                   2038:            d++;
                   2039:        }
                   2040:        break;
                   2041: #undef Xparm1
                   2042: #undef Xparm2
                   2043: 
                   2044:     case TY_SEXTERNAL:
                   2045: #define Xparm1 ((struct type_T1_SExt *)parm1)
                   2046: #define Xparm2 ((struct type_T1_SExt *)parm2)
                   2047:        if (Xparm1 != NULL && Xparm2 != NULL) {
                   2048:            if (ext_cmp(Xparm1, Xparm2)) {
                   2049:                (void) printf("%s:ext EXTERNAL different\n",
                   2050:                    t_case[tynum].tst_name);
                   2051:                d++;
                   2052:            }
                   2053:        } else {
                   2054:            (void) printf("%s: ext one missing\n", t_case[tynum].tst_name);
                   2055:            d++;
                   2056:        }
                   2057:        break;
                   2058: #undef Xparm1
                   2059: #undef Xparm2
                   2060: 
                   2061: 
                   2062:     case TY_ETAGOBJ:
                   2063: #define Xparm1 ((struct type_T1_Etags *)parm1)
                   2064: #define Xparm2 ((struct type_T1_Etags *)parm2)
                   2065:        if (Xparm1->offset != Xparm2->offset) {
                   2066:            d++;
                   2067:            (void) printf("%s: offset mismatch %d != %d", t_case[tynum].tst_name,
                   2068:                Xparm1->offset, Xparm2->offset);
                   2069:            break;
                   2070:        }
                   2071:        switch (Xparm1->offset) {
                   2072:        case type_T1_Etags_aE:
                   2073:            if (Xparm1->un.aE != Xparm2->un.aE) {
                   2074:                d++;
                   2075:                (void) printf("%s: un.aE mismatch %d != %d", t_case[tynum].tst_name,
                   2076:                    Xparm1->un.aE, Xparm2->un.aE);
                   2077:            }
                   2078:            break;
                   2079:        
                   2080:        case type_T1_Etags_bE:
                   2081:            if (Xparm1->un.bE != Xparm2->un.bE) {
                   2082:                d++;
                   2083:                (void) printf("%s: un.bE mismatch %d != %d", t_case[tynum].tst_name,
                   2084:                    Xparm1->un.bE, Xparm2->un.bE);
                   2085:            }
                   2086:            break;
                   2087:        
                   2088:        default:
                   2089:            ferrd(1, "TY_ETAGOBJ:illegal offset %d\n", Xparm1->offset);
                   2090:        }
                   2091:        break;
                   2092: #undef Xparm1
                   2093: #undef Xparm2
                   2094: 
                   2095: /* This has to be changed when posy is upgraded to handle DEFAULTS properly */
                   2096:     case TY_DEFAULT:
                   2097: #define Xparm1 ((struct type_T1_Def__Strings *)parm1)
                   2098: #define Xparm2 ((struct type_T1_Def__Strings *)parm2)
                   2099:        if (Xparm1->a__def != Xparm2->a__def) {
                   2100:            d++;
                   2101:            (void) printf("%s: a__def mismatch %d != %d", t_case[tynum].tst_name,
                   2102:                Xparm1->a__def, Xparm2->a__def);
                   2103:        }
                   2104:        if (Xparm1->b__def != NULLQB && Xparm2->b__def != NULLQB) {
                   2105:            if (qb_cmp(Xparm1->b__def, Xparm2->b__def)) {
                   2106:                (void) printf("b__def octet string different\n");
                   2107:                d++;
                   2108:            }
                   2109:        } else if (Xparm2->b__def == NULLQB) {
                   2110:            (void) printf("%s: b__def one missing\n", t_case[tynum].tst_name);
                   2111:            d++;
                   2112:        }
                   2113:        if (Xparm1->c__def != NULLPE && Xparm2->c__def != NULLPE) {
                   2114:            if (bit_cmp(Xparm1->c__def, Xparm2->c__def)) {
                   2115:                    (void) printf("%s:c__def bitstring different\n",
                   2116:                        t_case[tynum].tst_name);
                   2117:                    d++;
                   2118:            }
                   2119:        } else if (Xparm2->c__def == NULLPE) {
                   2120:            (void) printf("%s: c__def restored version missing\n", t_case[tynum].tst_name);
                   2121:            d++;
                   2122:        }
                   2123:        if (Xparm1->okay != Xparm2->okay) {
                   2124:            d++;
                   2125:            (void) printf("%s: okay mismatch %d != %d", t_case[tynum].tst_name,
                   2126:                Xparm1->okay, Xparm2->okay);
                   2127:        }
                   2128:        /* Can't test NULL ....
                   2129:        if (Xparm1->e__opt != Xparm2->e__opt) {
                   2130:            d++;
                   2131:            (void) printf("%s: e__opt mismatch %d != %d", t_case[tynum].tst_name,
                   2132:                Xparm1->e__opt, Xparm2->e__opt);
                   2133:        }
                   2134:        */
                   2135:        if (Xparm1->big__def && Xparm2->big__def) {
                   2136:            d += tcmp(TY_STRINGS, (char *)Xparm1->big__def,
                   2137:            (char *)Xparm2->big__def);
                   2138:        } else {
                   2139:            (void) printf("%s: big__def one missing", t_case[tynum].tst_name);
                   2140:            d++;
                   2141:        }
                   2142:        if (Xparm1->emb__def && Xparm2->emb__def) {
                   2143:            d += tcmp(TY_ELEMENT13, (char *)Xparm1->emb__def,
                   2144:            (char *)Xparm2->emb__def);
                   2145:        } else if (Xparm1->emb__def != NULL || Xparm2->emb__def != NULL) {
                   2146:            (void) printf("%s: emb__def one missing", t_case[tynum].tst_name);
                   2147:            d++;
                   2148:        }
                   2149:        if (Xparm1->st__def && Xparm2->st__def) {
                   2150:            d += tcmp(TY_MEMBER8, (char *)Xparm1->st__def,
                   2151:            (char *)Xparm2->st__def);
                   2152:        } else if (Xparm1->st__def != NULL || Xparm2->st__def != NULL) {
                   2153:            (void) printf("%s: st__def one missing", t_case[tynum].tst_name);
                   2154:            d++;
                   2155:        }
                   2156:        break;
                   2157: #undef Xparm1
                   2158: #undef Xparm2
                   2159: 
                   2160:     case TY_ELEMENT13:
                   2161: #define Xparm1 ((struct element_T1_13 *)parm1)
                   2162: #define Xparm2 ((struct element_T1_13 *)parm2)
                   2163:        if (Xparm1->colour != Xparm2->colour) {
                   2164:            d++;
                   2165:            (void) printf("%s: colour mismatch %d != %d", t_case[tynum].tst_name,
                   2166:                Xparm1->colour, Xparm2->colour);
                   2167:        }
                   2168:        if (Xparm1->oem__oct != NULLQB && Xparm2->oem__oct != NULLQB) {
                   2169:            if (qb_cmp(Xparm1->oem__oct, Xparm2->oem__oct)) {
                   2170:                (void) printf("oem__oct octet string different\n");
                   2171:                d++;
                   2172:            }
                   2173:        } else if (Xparm1->oem__oct != NULLQB || Xparm2->oem__oct != NULLQB) {
                   2174:            (void) printf("oem__oct: one missing 0x%x, 0x%x\n", Xparm1->oem__oct,
                   2175:            Xparm1->oem__oct);
                   2176:            d++;
                   2177:        }
                   2178:        if (Xparm1->version != NULLPE && Xparm2->version != NULLPE) {
                   2179:            if (bit_cmp(Xparm1->version, Xparm2->version)) {
                   2180:                    (void) printf("%s:version bitstring different\n",
                   2181:                        t_case[tynum].tst_name);
                   2182:                    d++;
                   2183:            }
                   2184:        } else if (Xparm2->version == NULLPE) {
                   2185:            (void) printf("%s: version decoded version missing\n",
                   2186:                t_case[tynum].tst_name);
                   2187:            d++;
                   2188:        }
                   2189:        break;
                   2190: #undef Xparm1
                   2191: #undef Xparm2
                   2192: 
                   2193:     case TY_MEMBER8:
                   2194: #define Xparm1 ((struct member_T1_8 *)parm1)
                   2195: #define Xparm2 ((struct member_T1_8 *)parm2)
                   2196:        if (Xparm1->wine != Xparm2->wine) {
                   2197:            d++;
                   2198:            (void) printf("%s: wine mismatch %d != %d", t_case[tynum].tst_name,
                   2199:                Xparm1->wine, Xparm2->wine);
                   2200:        }
                   2201:        if (Xparm1->beer != Xparm2->beer) {
                   2202:            d++;
                   2203:            (void) printf("%s: beer mismatch %d != %d", t_case[tynum].tst_name,
                   2204:                Xparm1->beer, Xparm2->beer);
                   2205:        }
                   2206:        if (Xparm1->spirit != Xparm2->spirit) {
                   2207:            d++;
                   2208:            (void) printf("%s: spirit mismatch %d != %d", t_case[tynum].tst_name,
                   2209:                Xparm1->spirit, Xparm2->spirit);
                   2210:        }
                   2211:        break;
                   2212: #undef Xparm1
                   2213: #undef Xparm2
                   2214: 
                   2215:     case TY_STEST:
                   2216: #define Xparm1 ((struct type_T1_Stest *)parm1)
                   2217: #define Xparm2 ((struct type_T1_Stest *)parm2)
                   2218:        if (Xparm1->st1 != NULL && Xparm2->st1 != NULL) {
                   2219:            d += tcmp(TY_SINT, (char *)Xparm1->st1, (char *)Xparm2->st1);
                   2220:        } else if (Xparm2->st1 == NULL) {
                   2221:            d++;
                   2222:            (void) printf("%s: missing", t_case[tynum].tst_name);
                   2223:        }
                   2224:        if (Xparm1->st2 != NULL && Xparm2->st2 != NULL) {
                   2225:            if (qb_cmp(Xparm1->st2, Xparm2->st2)) {
                   2226:                (void) printf("%s:st2 octet string different\n",
                   2227:                    t_case[tynum].tst_name);
                   2228:                d++;
                   2229:            }
                   2230:        } else if (Xparm2->st2 == NULL) {
                   2231:            d++;
                   2232:            (void) printf("%s: missing", t_case[tynum].tst_name);
                   2233:        }
                   2234:        break;
                   2235: #undef Xparm1
                   2236: #undef Xparm2
                   2237: 
                   2238:     case TY_SINT:
                   2239: #define Xparm1 ((struct type_T1_Sint *)parm1)
                   2240: #define Xparm2 ((struct type_T1_Sint *)parm2)
                   2241:        if (Xparm1->parm != Xparm2->parm) {
                   2242:            (void) printf("%s:parm %d != %d\n", t_case[tynum].tst_name, Xparm1->parm,
                   2243:                Xparm2->parm);
                   2244:            d++;
                   2245:        }
                   2246:        break;
                   2247: #undef Xparm1
                   2248: #undef Xparm2
                   2249: 
                   2250:     case TY_ETYPE:
                   2251: #define Xparm1 ((struct type_T1_Enum__type *)parm1)
                   2252: #define Xparm2 ((struct type_T1_Enum__type *)parm2)
                   2253:        if (Xparm1->parm != Xparm2->parm) {
                   2254:            (void) printf("%s:parm %d != %d\n", t_case[tynum].tst_name, Xparm1->parm,
                   2255:                Xparm2->parm);
                   2256:            d++;
                   2257:        }
                   2258:        break;
                   2259: #undef Xparm1
                   2260: #undef Xparm2
                   2261: 
                   2262:     case TY_ENUM_TEST:
                   2263: #define Xparm1 ((struct type_T1_T__enum *)parm1)
                   2264: #define Xparm2 ((struct type_T1_T__enum *)parm2)
                   2265:        if (Xparm1->ae1 && Xparm2->ae1 ) {
                   2266:            d += tcmp(TY_ETYPE, (char *)Xparm1->ae1, (char *)Xparm2->ae1);
                   2267:        } else {
                   2268:            d++;
                   2269:            (void) printf("%s:ae1 missing\n", t_case[tynum].tst_name);
                   2270:        }
                   2271:        if (Xparm1->ae2 && Xparm2->ae2 ) {
                   2272:            d += tcmp(TY_ETYPE, (char *)Xparm1->ae2, (char *)Xparm2->ae2);
                   2273:        } else {
                   2274:            d++;
                   2275:            (void) printf("%s:ae2 missing\n", t_case[tynum].tst_name);
                   2276:        }
                   2277:        if (Xparm1->ae3 && Xparm2->ae3 ) {
                   2278:            d += tcmp(TY_ETYPE, (char *)Xparm1->ae3, (char *)Xparm2->ae3);
                   2279:        } else {
                   2280:            d++;
                   2281:            (void) printf("%s:ae3 missing\n", t_case[tynum].tst_name);
                   2282:        }
                   2283:        /* Default */
                   2284:        if (Xparm1->ae4 && Xparm2->ae4 ) {
                   2285:            d += tcmp(TY_ETYPE, (char *)Xparm1->ae4, (char *)Xparm2->ae4);
                   2286:        } else {
                   2287:            d++;
                   2288:            (void) printf("%s:ae4 missing\n", t_case[tynum].tst_name);
                   2289:        }
                   2290:        /* Optional */
                   2291:        if (Xparm1->ae5 && Xparm2->ae5 ) {
                   2292:            d += tcmp(TY_ETYPE, (char *)Xparm1->ae5, (char *)Xparm2->ae5);
                   2293:        } else if (Xparm1->ae5 || Xparm2->ae5) {
                   2294:            d++;
                   2295:            (void) printf("%s:ae5 missing\n", t_case[tynum].tst_name);
                   2296:        }
                   2297:        break;
                   2298: #undef Xparm1
                   2299: #undef Xparm2
                   2300: 
                   2301: #ifdef PEPSY_REALS
                   2302:     case TY_REAL:
                   2303: #define Xparm1 ((struct type_T1_Real *)parm1)
                   2304: #define Xparm2 ((struct type_T1_Real *)parm2)
                   2305:        /* Horrible floating point test for roughly equal */
                   2306:        if (fabs(Xparm1->parm) < F_SMALL/2) {
                   2307:             if (fabs(Xparm1->parm - Xparm2->parm) > F_SMALL) {
                   2308:                (void) printf("%s:parm %f != %f\n", t_case[tynum].tst_name,
                   2309:                    Xparm1->parm, Xparm2->parm);
                   2310:                d++;
                   2311:            }
                   2312:        } else if (fabs((Xparm1->parm - Xparm2->parm)/Xparm1->parm) > F_SMALL) {
                   2313:            (void) printf("%s:parm %f != %f\n", t_case[tynum].tst_name, Xparm1->parm,
                   2314:                Xparm2->parm);
                   2315:            d++;
                   2316:        }
                   2317:        break;
                   2318: #undef Xparm1
                   2319: #undef Xparm2
                   2320: 
                   2321:     case TY_REAL_TEST:
                   2322: #define Xparm1 ((struct type_T1_T__real *)parm1)
                   2323: #define Xparm2 ((struct type_T1_T__real *)parm2)
                   2324:        if (Xparm1->r1 && Xparm2->r1 ) {
                   2325:            d += tcmp(TY_REAL, (char *)Xparm1->r1, (char *)Xparm2->r1);
                   2326:        } else {
                   2327:            d++;
                   2328:            (void) printf("%s:r1 missing\n", t_case[tynum].tst_name);
                   2329:        }
                   2330:        if (Xparm1->r2 && Xparm2->r2 ) {
                   2331:            d += tcmp(TY_REAL, (char *)Xparm1->r2, (char *)Xparm2->r2);
                   2332:        } else {
                   2333:            d++;
                   2334:            (void) printf("%s:r2 missing\n", t_case[tynum].tst_name);
                   2335:        }
                   2336:        if (Xparm1->r3 && Xparm2->r3 ) {
                   2337:            d += tcmp(TY_REAL, (char *)Xparm1->r3, (char *)Xparm2->r3);
                   2338:        } else {
                   2339:            d++;
                   2340:            (void) printf("%s:r3 missing\n", t_case[tynum].tst_name);
                   2341:        }
                   2342:        /* Default */
                   2343:        if (Xparm1->r4 && Xparm2->r4 ) {
                   2344:            d += tcmp(TY_REAL, (char *)Xparm1->r4, (char *)Xparm2->r4);
                   2345:        } else {
                   2346:            d++;
                   2347:            (void) printf("%s:r4 missing\n", t_case[tynum].tst_name);
                   2348:        }
                   2349:        /* Optional */
                   2350:        if (Xparm1->r5 && Xparm2->r5 ) {
                   2351:            d += tcmp(TY_REAL, (char *)Xparm1->r5, (char *)Xparm2->r5);
                   2352:        } else if (Xparm1->r5 || Xparm2->r5) {
                   2353:            d++;
                   2354:            (void) printf("%s:r5 missing\n", t_case[tynum].tst_name);
                   2355:        }
                   2356:        break;
                   2357: #undef Xparm1
                   2358: #undef Xparm2
                   2359: #endif
                   2360: 
                   2361:     default:
                   2362:        ferrd(1, "tcmp:unknown type %d\n", tynum);
                   2363:     }
                   2364:     if (d) {
                   2365:            (void) printf("tcmp:failed on %s\n", t_case[tynum].tst_name);
                   2366:     }
                   2367:     return (d);
                   2368: }
                   2369: 
                   2370: /*
                   2371:  * Compare two possible null qbuf lists and return non zero if they are
                   2372:  * different
                   2373:  * Pretty complex to allow for all sorts of weird cases
                   2374:  * Doesn't work for a qbuf which doesn't have a head ! Don't really know what
                   2375:  * is the proper form of a queue buf. MArshall's doco doesn't say
                   2376:  */
                   2377: qb_cmp(qb1, qb2)
                   2378: struct qbuf    *qb1, *qb2;
                   2379: {
                   2380:     struct     qbuf    *qp1, *qp2;
                   2381:     char       *po1, *po2;
                   2382:     int        len1, len2;
                   2383: 
                   2384:     if (qb1 == NULL && qb2 == NULL)
                   2385:        return (0);
                   2386:     
                   2387:     if (qb1 == NULL || qb2 == NULL)
                   2388:        return (1);
                   2389: 
                   2390:     qp1 = qb1->qb_forw;
                   2391:     qp2 = qb2->qb_forw;
                   2392:     po1 = qp1->qb_data;
                   2393:     po2 = qp2->qb_data;
                   2394:     len1 = qp1->qb_len;
                   2395:     len2 = qp2->qb_len;
                   2396: 
                   2397:     while (qp1 != qb1 && qp2 != qb2) {
                   2398:        if (len1 < len2) {
                   2399:            if (bcmp(po1, po2, len1))
                   2400:                    return (1);
                   2401:            len2 -= len1;
                   2402:            po2 += len1;
                   2403:            qp1 = qp1->qb_forw;
                   2404:            po1 = qp1->qb_data;
                   2405:            len1 = qp1->qb_len;
                   2406:        } else {
                   2407:            if (bcmp(po1, po2, len1))
                   2408:                    return (1);
                   2409:            len1 -= len2;
                   2410:            po1 += len2;
                   2411:            qp2 = qp2->qb_forw;
                   2412:            po2 = qp2->qb_data;
                   2413:            len2 = qp2->qb_len;
                   2414:        }
                   2415:     }
                   2416: 
                   2417:     if (len1 == 0)
                   2418:            qp1 = qp1->qb_forw;
                   2419:     if (len2 == 0)
                   2420:            qp2 = qp2->qb_forw;
                   2421:     while (qp1 != qb1 && qp1->qb_len == 0)
                   2422:            qp1 = qp1->qb_forw;
                   2423:     while (qp2 != qb2 && qp2->qb_len == 0)
                   2424:            qp2 = qp2->qb_forw;
                   2425:     if (qp1 == qb1 && qp2 == qb2)
                   2426:        return (0);     /* perfect match */
                   2427: 
                   2428:     return (1);
                   2429: }
                   2430: 
                   2431: /*
                   2432:  * compare two bitstrings. Including the little bits left at the end but
                   2433:  * not the bits not in the strings
                   2434:  */
                   2435: bit_cmp(b1, b2)
                   2436: PE     b1, b2;
                   2437: {
                   2438:        int     len1, len2;
                   2439:        register char   *cp1, *cp2;
                   2440: 
                   2441:        if (b1 == NULLPE && b2 == NULLPE)
                   2442:            return (0);
                   2443:        if (b1 == NULLPE || b2 == NULLPE)
                   2444:            goto fail;
                   2445: 
                   2446:        if ((cp1 = bitstr2strb(b1, &len1)) == NULL)
                   2447:            goto fail;
                   2448:        if ((cp2 = bitstr2strb(b2, &len2)) == NULL) {
                   2449:            free(cp1);
                   2450:            goto fail;
                   2451:        }
                   2452: 
                   2453:        if (len1 != len2 || bcmp(cp1, cp2, len1/8)) {
                   2454:            free(cp1);
                   2455:            free(cp2);
                   2456:            goto fail;
                   2457:        }
                   2458: 
                   2459:        if (len1 % 8) {
                   2460:                int i;
                   2461:                int     mask;
                   2462: 
                   2463:                /* Check those last few bits */
                   2464:                i = len1/8;
                   2465:                mask = (0xff00 >> len1 % 8) & 0xff;
                   2466:                if ((cp1[i] & mask) != (cp2[i] & mask)) {
                   2467:                    free(cp1);
                   2468:                    free(cp2);
                   2469:                    goto fail;
                   2470:                }
                   2471:        }
                   2472: 
                   2473:        free(cp1);
                   2474:        free(cp2);
                   2475:        return (0);
                   2476: 
                   2477:     fail:
                   2478:        return (1);
                   2479: }
                   2480: 
                   2481: #define MKMASK 0x7
                   2482: #define MKSHIFT 6
                   2483: /*
                   2484:  * Generate a randomish list of PElement s for use as ANY or SET  OF ANY ....
                   2485:  */
                   2486: PE
                   2487: mkpelist(i)
                   2488: {
                   2489:     PE pe, fpe = NULL;
                   2490: 
                   2491:     fpe = pe_alloc(PE_CLASS_PRIV, PE_FORM_CONS, (PElementID ) i);
                   2492:     while (i > 0) {
                   2493:        pe = mkpe(i);
                   2494:        pe->pe_next = fpe->pe_cons;
                   2495:        fpe->pe_cons = pe;
                   2496:        i--;
                   2497:     }
                   2498:     return (fpe);
                   2499: }
                   2500: 
                   2501: /*
                   2502:  * generate a randomish PElement
                   2503:  */
                   2504: PE
                   2505: mkpe(i)
                   2506: {
                   2507:     int        id, class;
                   2508:     PE         pe;
                   2509: 
                   2510:     id = i * i + 1;
                   2511:     class = PE_CLASS_PRIV;
                   2512:     switch ((i*i >> MKSHIFT) & MKMASK) {
                   2513:     case 5:
                   2514:     case 0:
                   2515:        pe = flag2prim(i & 0x1, (PElementClass ) class, (PElementID ) id);
                   2516:        break;
                   2517:     
                   2518:     case 6:
                   2519:     case 1:
                   2520:        pe = num2prim(i, (PElementClass ) class, (PElementID ) id);
                   2521:        break;
                   2522: 
                   2523:     case 7:
                   2524:     case 2:
                   2525:        pe = str2prim("mkpelist:testdata", 17, (PElementClass ) class,
                   2526:        (PElementID ) id);
                   2527:        break;
                   2528: 
                   2529:     case 3:
                   2530:        pe = strb2bitstr("\021\0245\375\0124", 4,
                   2531:            (PElementClass ) class, (PElementID ) id);
                   2532:        break;
                   2533:     
                   2534:     case 4:
                   2535:        pe = mkpelist(i - 1);
                   2536:        break;
                   2537: 
                   2538:     default:
                   2539:        ferrd(1, "mkpelist:internal error %d case not handled\n",
                   2540:            (i*i >> MKSHIFT) & MKMASK);
                   2541:     }
                   2542: 
                   2543:     return (pe);
                   2544: }
                   2545: 
                   2546: #define OID_SIZE       6
                   2547: /*
                   2548:  * make an OID for testing
                   2549:  */
                   2550: OID
                   2551: mkoid(i)
                   2552: int    i;
                   2553: {
                   2554:     OID        oid;
                   2555:     int        oid_cnt = i % OID_SIZE;
                   2556: 
                   2557:     if ((oid = new(struct OIDentifier)) == NULL) {
                   2558:        (void) printf("mkoid:calloc did not work\n");
                   2559:        return NULL;
                   2560:     }
                   2561:     if (oid_cnt < 2)
                   2562:        oid_cnt = 2;    /* At least two integers long */
                   2563:     oid->oid_nelem = oid_cnt;
                   2564:     if ((oid->oid_elements =
                   2565:         (unsigned int *)calloc((unsigned ) oid_cnt, sizeof (int))) == NULL) {
                   2566:        (void) printf("mkoid:calloc 2 did not work\n");
                   2567:        return NULL;
                   2568:     }
                   2569:     while (oid_cnt > 2) {
                   2570:        oid->oid_elements[oid_cnt - 1] = oid_cnt*i + 33;
                   2571:         oid_cnt--;
                   2572:     }
                   2573: 
                   2574:     oid->oid_elements[0] = 1;
                   2575:     oid->oid_elements[1] = 17;
                   2576: 
                   2577: 
                   2578:     return (oid);
                   2579: }
                   2580: 
                   2581: /*
                   2582:  * Produce an External structure initialised to test values
                   2583:  * for testing EXTERNAL encoding routines
                   2584:  */
                   2585: struct type_UNIV_EXTERNAL *
                   2586: mkext(i)
                   2587: int    i;
                   2588: {
                   2589:     int        k;
                   2590:     struct type_UNIV_EXTERNAL *p;
                   2591: 
                   2592:     k = i + 2;
                   2593:     k *= k;    /* generate a more random looking number */
                   2594:     k %= 51; /* Keep it in a reasonable bounds to avoid overflow */
                   2595:     if ((p = new(struct type_UNIV_EXTERNAL)) == NULL
                   2596:     || (p->encoding = new(struct choice_UNIV_0)) == NULL)
                   2597:        ferr(1, "mkext:malloc:out of memory\n");
                   2598:     
                   2599:     if (i & 0x1)
                   2600:        p->direct__reference = mkoid(i*3);
                   2601:     
                   2602:     p->indirect__reference = k & 0x7c;
                   2603: 
                   2604:     p->data__value__descriptor = str2qb("A very wild type of data", 25, 1);
                   2605: 
                   2606:     switch (p->encoding->offset = (k % choice_UNIV_0_arbitrary) + 1) {
                   2607: 
                   2608:     case choice_UNIV_0_arbitrary:
                   2609:        p->encoding->un.single__ASN1__type = mkpe(k % 7);
                   2610:        break;
                   2611: 
                   2612:     case choice_UNIV_0_single__ASN1__type:
                   2613:        p->encoding->un.single__ASN1__type = mkpe(k % 5);
                   2614:        break;
                   2615: 
                   2616:     case choice_UNIV_0_octet__aligned:
                   2617:        p->encoding->un.octet__aligned = str2qb("Some test data", 15, 1);
                   2618:        break;
                   2619: 
                   2620:     default:
                   2621:        ferrd(1, "mkext:internal error: bad offset %d\n", p->encoding->offset);
                   2622: 
                   2623:     }
                   2624: 
                   2625:     return (p);
                   2626: }
                   2627: 
                   2628: /*
                   2629:  * compare two external types to see if they are identical - return zero if
                   2630:  * they are and non zero if they are different
                   2631:  */
                   2632: ext_cmp(e1, e2)
                   2633: register struct      type_UNIV_EXTERNAL *e1, *e2;
                   2634: {
                   2635:      if (e1->direct__reference != NULLOID && e2->direct__reference != NULLOID) {
                   2636:         if (oid_cmp(e1->direct__reference, e2->direct__reference))
                   2637:                return (1);
                   2638:     } else {
                   2639:        if (e1->direct__reference != NULLOID || e2->direct__reference != NULLOID)
                   2640:            return (1);
                   2641:        if (e1->indirect__reference != e2->indirect__reference)
                   2642:            return (1);
                   2643:     }
                   2644:      if (e1->data__value__descriptor != NULLQB
                   2645:      && e2->data__value__descriptor != NULLQB) {
                   2646:         if (qb_cmp(e1->data__value__descriptor, e2->data__value__descriptor))
                   2647:                return (1);
                   2648:     } else if (e1->data__value__descriptor != NULLQB
                   2649:        || e2->data__value__descriptor != NULLQB)
                   2650:            return (1);
                   2651:     if (e1->encoding == NULL || e2->encoding == NULL)
                   2652:        return (1);
                   2653:     if (e1->encoding->offset != e2->encoding->offset)
                   2654:        return (1);
                   2655:     switch (e1->encoding->offset) {
                   2656:     case choice_UNIV_0_single__ASN1__type:
                   2657:         if (e1->encoding->un.single__ASN1__type == NULLPE
                   2658:         || e2->encoding->un.single__ASN1__type == NULLPE)
                   2659:             return (1);
                   2660:         if (pe_cmp(e1->encoding->un.single__ASN1__type,
                   2661:             e2->encoding->un.single__ASN1__type))
                   2662:            return (1);
                   2663:        break;
                   2664: 
                   2665:     case choice_UNIV_0_octet__aligned:
                   2666:         if (e1->encoding->un.octet__aligned == NULLQB
                   2667:         || e2->encoding->un.octet__aligned == NULLQB)
                   2668:             return (1);
                   2669:         if (qb_cmp(e1->encoding->un.octet__aligned,
                   2670:             e2->encoding->un.octet__aligned))
                   2671:            return (1);
                   2672:        break;
                   2673: 
                   2674:     case choice_UNIV_0_arbitrary:
                   2675:         if (e1->encoding->un.arbitrary == NULLPE
                   2676:         || e2->encoding->un.arbitrary == NULLPE)
                   2677:             return (1);
                   2678:         if (pe_cmp(e1->encoding->un.arbitrary,
                   2679:             e2->encoding->un.arbitrary))
                   2680:            return (1);
                   2681:        break;
                   2682: 
                   2683:     default:
                   2684:        ferrd(1, "ext_cmp:illegal offset value %d\n", e1->encoding->offset);
                   2685:     }
                   2686: 
                   2687:     return (0);
                   2688: }
                   2689: /*
                   2690:  * print the PE structure pointed to by pe
                   2691:  */
                   2692: print_pe(pe, n)
                   2693: PE      pe;
                   2694: int     n;
                   2695: {
                   2696: 
                   2697:     if (pe == NULL)
                   2698:        return;
                   2699:     (void) printf("%*s", 4 * n, "");
                   2700: #if 0
                   2701:     (void) printf("error = %d, context = %x, class = %x, form = %x, id = %x\n",
                   2702:           pe->pe_errno, pe->pe_context, pe->pe_class, pe->pe_form, pe->pe_id);
                   2703: #endif
                   2704:     if (pe->pe_errno)
                   2705:        (void) printf(" errno = %d", pe->pe_errno);
                   2706:     if (pe->pe_class == PE_CLASS_UNIV)
                   2707:        (void) printf(" %s", idname( (int )pe->pe_id));
                   2708:     else if (pe->pe_class == PE_CLASS_CONT)
                   2709:        (void) printf("[%d]", pe->pe_id);
                   2710:     else
                   2711:        (void) printf("[%s %d]", clname( (int )pe->pe_class), pe->pe_id);
                   2712: 
                   2713:     (void) printf("\n");
                   2714: 
                   2715: #if 0
                   2716:     (void) printf("%*s", 4 * n, "");
                   2717:     (void) printf("cardinality = %d offset = %d\n", pe->pe_cardinal, pe->pe_offset);
                   2718: #endif
                   2719:     if (pe->pe_form != 0x0) {
                   2720:        if (pe->pe_cons != NULLPE)
                   2721:            print_pe(pe->pe_cons, n + 1);
                   2722:     } else {
                   2723:        (void) printf("%*s", 4 * n, "");
                   2724:        switch (pe->pe_id) {
                   2725:        case PE_PRIM_BOOL:
                   2726:            (void) printf("%d", prim2flag(pe));
                   2727:            break;
                   2728: 
                   2729:        case PE_PRIM_INT:
                   2730:            (void) printf(" %d", prim2num(pe));
                   2731:            break;
                   2732:        case PE_PRIM_BITS:
                   2733:            prntbits(pe);
                   2734:            break;
                   2735: 
                   2736:        case PE_PRIM_OCTS:
                   2737:            (void) prntos(pe);
                   2738:            break;
                   2739: 
                   2740:        case PE_PRIM_NULL:
                   2741:            break;
                   2742: 
                   2743: 
                   2744:        case PE_DEFN_NUMS:
                   2745:        case PE_DEFN_PRTS:
                   2746:        case PE_DEFN_T61S:
                   2747:        case PE_DEFN_VTXS:
                   2748:        case PE_DEFN_IA5S:
                   2749:        case PE_DEFN_GFXS:
                   2750:        case PE_DEFN_VISS:
                   2751:        case PE_DEFN_GENS:
                   2752:        case PE_DEFN_CHRS:
                   2753:            (void) prntstr(pe);
                   2754:            break;
                   2755: 
                   2756: 
                   2757:        case PE_PRIM_OID:
                   2758:        case PE_CONS_EXTN:
                   2759:        case PE_PRIM_REAL:
                   2760:        case PE_PRIM_ENUM:
                   2761:        case PE_PRIM_ENCR:
                   2762: 
                   2763:        case PE_CONS_SEQ:
                   2764:        case PE_CONS_SET:
                   2765: 
                   2766:        case PE_DEFN_UTCT:
                   2767:        case PE_DEFN_GENT:
                   2768:        default:
                   2769:            (void) printf("Unimplemented %d ", pe->pe_id);
                   2770:            break;
                   2771:        }
                   2772:        (void) printf("\n");
                   2773:     }
                   2774:     if (pe->pe_next != NULLPE) {
                   2775:        (void) printf("%*s", 4 * n, "pe_next:\n");
                   2776:        print_pe(pe->pe_next, n);
                   2777:     }
                   2778: }
                   2779: 
                   2780: /*
                   2781:  * return the string describing that class
                   2782:  */
                   2783: static char   *
                   2784: clname(cl)
                   2785: int     cl;
                   2786: {
                   2787:     char   *p;
                   2788:     static char buf[30];
                   2789: 
                   2790:     switch (cl) {
                   2791:     case PE_CLASS_UNIV:
                   2792:        p = "Universal";
                   2793:        break;
                   2794: 
                   2795:     case PE_CLASS_APPL:
                   2796:        p = "Application";
                   2797:        break;
                   2798: 
                   2799:     case PE_CLASS_CONT:
                   2800:        p = "Context";
                   2801:        break;
                   2802: 
                   2803:     case PE_CLASS_PRIV:
                   2804:        p = "Private";
                   2805:        break;
                   2806: 
                   2807:     default:
                   2808:        (void) sprintf(buf, "Unknown Class %d", cl);
                   2809:        p = buf;
                   2810:        break;
                   2811:     }
                   2812:     return (p);
                   2813: }
                   2814: 
                   2815: 
                   2816: /*
                   2817:  * return the string describing that identity or the number itself
                   2818:  * Assuming a Universal class
                   2819:  */
                   2820: static char   *
                   2821: idname(id)
                   2822: int     id;
                   2823: {
                   2824:     char   *p;
                   2825:     static char buf[40];
                   2826: 
                   2827:     switch (id) {
                   2828:     case PE_PRIM_BOOL:
                   2829:        p = "Boolean";
                   2830:        break;
                   2831: 
                   2832:     case PE_PRIM_INT:
                   2833:        p = "Integer";
                   2834:        break;
                   2835: 
                   2836:     case PE_PRIM_BITS:
                   2837:        p = "Bit String";
                   2838:        break;
                   2839: 
                   2840:     case PE_PRIM_OCTS:
                   2841:        p = "Octet String";
                   2842:        break;
                   2843: 
                   2844:     case PE_PRIM_NULL:
                   2845:        p = "Null";
                   2846:        break;
                   2847: 
                   2848:     case PE_PRIM_OID:
                   2849:        p = "Object Descriptor";
                   2850:        break;
                   2851: 
                   2852:     case PE_CONS_EXTN:
                   2853:        p = "External";
                   2854:        break;
                   2855: 
                   2856:     case PE_PRIM_REAL:
                   2857:        p = "Real";
                   2858:        break;
                   2859: 
                   2860:     case PE_PRIM_ENUM:
                   2861:        p = "Enumerated Type";
                   2862:        break;
                   2863: 
                   2864:     case PE_PRIM_ENCR:
                   2865:        p = "Encrypted Type";
                   2866:        break;
                   2867: 
                   2868:     case PE_CONS_SEQ:
                   2869:        p = "Sequence";
                   2870:        break;
                   2871: 
                   2872:     case PE_CONS_SET:
                   2873:        p = "Set";
                   2874:        break;
                   2875: 
                   2876:     case PE_DEFN_NUMS:
                   2877:        p = "Numeric String";
                   2878:        break;
                   2879: 
                   2880:     case PE_DEFN_PRTS:
                   2881:        p = "Printable String";
                   2882:        break;
                   2883: 
                   2884:     case PE_DEFN_T61S:
                   2885:        p = "T.61 String";
                   2886:        break;
                   2887: 
                   2888:     case PE_DEFN_VTXS:
                   2889:        p = "Videotex String";
                   2890:        break;
                   2891: 
                   2892:     case PE_DEFN_IA5S:
                   2893:        p = "IA5 String";
                   2894:        break;
                   2895: 
                   2896:     case PE_DEFN_UTCT:
                   2897:        p = "UTC Time";
                   2898:        break;
                   2899: 
                   2900:     case PE_DEFN_GENT:
                   2901:        p = "Generalised Time";
                   2902:        break;
                   2903: 
                   2904:     case PE_DEFN_GFXS:
                   2905:        p = "Graphics String";
                   2906:        break;
                   2907: 
                   2908:     case PE_DEFN_VISS:
                   2909:        p = "Visable String";
                   2910:        break;
                   2911: 
                   2912:     case PE_DEFN_GENS:
                   2913:        p = "General String";
                   2914:        break;
                   2915: 
                   2916:     case PE_DEFN_CHRS:
                   2917:        p = "Character String";
                   2918:        break;
                   2919: 
                   2920:     default:
                   2921:        (void) sprintf(buf, "Unknown Universal %d", id);
                   2922:        p = buf;
                   2923:        break;
                   2924:     }
                   2925:     return (p);
                   2926: }
                   2927: /*
                   2928:  * Print out the value of a bits string
                   2929:  */
                   2930: static prntbits(pe)
                   2931: PE      pe;
                   2932: {
                   2933:     int     len, i;
                   2934: 
                   2935:     if ((len = pe->pe_nbits) < 0) {
                   2936:        (void) printf("prntbits:Bad bistring\n");
                   2937:        return;
                   2938:     }
                   2939:     (void) printf("Bits:");
                   2940:     for (i = 0; i < len; i++)
                   2941:        if (bit_test(pe, i))
                   2942:            (void) printf(" %d", i);
                   2943: 
                   2944:     (void) putchar('\n');
                   2945: }
                   2946: 
                   2947: /*
                   2948:  * Dump a bunch of hex digits printing out those that are printable
                   2949:  * Print out a given length of octets as hex (with the ASCII
                   2950:  * characters given if they have any
                   2951:  */
                   2952: static pclen(s, len)
                   2953: register char *s;
                   2954: register int len;
                   2955: {
                   2956:     register int cnt = 0;
                   2957: 
                   2958:     while (len-- > 0) {
                   2959:        if (cnt % 8 == 0)
                   2960:            (void) printf("\n%d:", cnt / 8 + 1);
                   2961:        if (isprint(*s & 0x7f))
                   2962:            (void) printf("\t%02x(%c)", *s & 0xff, *s & 0x7f);
                   2963:        else
                   2964:            (void) printf("\t%02x", *s & 0xff);
                   2965:        s++;
                   2966:        cnt++;
                   2967:     }
                   2968:     (void) putchar('\n');
                   2969: }
                   2970: 
                   2971: /*
                   2972:  * print out an octet string
                   2973:  */
                   2974: static prntos(pe)
                   2975: PE      pe;
                   2976: {
                   2977:     struct qbuf *qb;
                   2978: 
                   2979:     if ((qb = prim2qb(pe)) == NULL) {
                   2980: bad:
                   2981:        (void) printf("prntos:bad octet string\n");
                   2982:        return (NOTOK);
                   2983:     }
                   2984:     if (qb_pullup(qb) == NOTOK)
                   2985:        goto bad;
                   2986: 
                   2987:     if (qb->qb_forw->qb_data == NULL || qb->qb_forw->qb_len < 0)
                   2988:        goto bad;
                   2989: 
                   2990:     pclen(qb->qb_forw->qb_data, qb->qb_forw->qb_len);
                   2991:     return (OK);
                   2992: }
                   2993: 
                   2994: /*
                   2995:  * print out a string which should be printable
                   2996:  */
                   2997: static prntstr(pe)
                   2998: PE      pe;
                   2999: {
                   3000:     struct qbuf *qb;
                   3001: 
                   3002:     if ((qb = prim2qb(pe)) == NULL) {
                   3003: bad:
                   3004:        (void) printf("prntstr:bad string\n");
                   3005:        return (NOTOK);
                   3006:     }
                   3007:     if (qb_pullup(qb) == NOTOK)
                   3008:        goto bad;
                   3009: 
                   3010:     if (qb->qb_forw->qb_data == NULL || qb->qb_forw->qb_len < 0)
                   3011:        goto bad;
                   3012: 
                   3013:     (void) printf("\"%s\"", qb->qb_forw->qb_data);
                   3014:     return (OK);
                   3015: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.