- case ODR_ENCODE:
- if (!p)
- return 0;
- if ((rd = ber_enctag(o->bp, class, tag, *constructed, o->left))
- <=0)
- return -1;
- o->bp += rd;
- o->left -= rd;
- fprintf(stderr, "\n[class=%d,tag=%d,cons=%d]", class, tag,
- *constructed);
- return 1;
- case ODR_DECODE:
- if (lclass < 0)
- {
- if ((br = ber_dectag(o->bp, &lclass, <ag, &lcons)) <= 0)
- return -1;
- fprintf(stderr, "\n[class=%d,tag=%d,cons=%d]", lclass, ltag,
- lcons);
- }
- if (class == lclass && tag == ltag)
- {
- o->bp += br;
- o->left -= br;
- *constructed = lcons;
- lclass = -1;
- return 1;
- }
- else
- return 0;
- case ODR_PRINT: return p != 0;
- default: return 0;
+ case ODR_ENCODE:
+ if (!*pp)
+ {
+ if (!opt)
+ o->error = OREQUIRED;
+ return 0;
+ }
+ if ((rd = ber_enctag(o, zclass, tag, *constructed)) < 0)
+ return -1;
+#ifdef ODR_DEBUG
+ fprintf(stderr, "\n[class=%d,tag=%d,cons=%d,stackp=%d]", zclass, tag,
+ *constructed, o->stackp);
+#endif
+ return 1;
+
+ case ODR_DECODE:
+ if (o->op->stackp > -1 && !odr_constructed_more(o))
+ {
+ if (!opt)
+ o->error = OREQUIRED;
+ return 0;
+ }
+ if (odr_ber_tag->lclass < 0)
+ {
+ if ((odr_ber_tag->br = ber_dectag(o->bp, &odr_ber_tag->lclass,
+ &odr_ber_tag->ltag, &odr_ber_tag->lcons)) <= 0)
+ {
+ o->error = OPROTO;
+ return 0;
+ }
+#ifdef ODR_DEBUG
+ fprintf(stderr,
+ "\n[class=%d,tag=%d,cons=%d,stackp=%d]",
+ odr_ber_tag->lclass, odr_ber_tag->ltag,
+ odr_ber_tag->lcons, o->stackp);
+#endif
+ }
+ if (zclass == odr_ber_tag->lclass && tag == odr_ber_tag->ltag)
+ {
+ o->bp += odr_ber_tag->br;
+ *constructed = odr_ber_tag->lcons;
+ odr_ber_tag->lclass = -1;
+ return 1;
+ }
+ else
+ {
+ if (!opt)
+ o->error = OREQUIRED;
+ return 0;
+ }
+ case ODR_PRINT:
+ if (!*pp && !opt)
+ o->error = OREQUIRED;
+ return *pp != 0;
+ default:
+ o->error = OOTHER;
+ return 0;