int berDecStrmReal (OSCTXT *pctxt, OSREAL *object_p, ASN1TagType tagging, int length) { OSRTBuffer savedBuf; OSOCTET tmpbuf[16]; register int stat = 0; if (tagging == ASN1EXPL) { if ((stat = berDecStrmMatchTag (pctxt, ASN_ID_REAL, &length, TRUE)) != 0) /* RTERR_IDNOTFOU will be logged later, by the generated code, or reset by rtxErrReset (for optional seq elements). */ return (stat == RTERR_IDNOTFOU) ? stat : LOG_RTERR (pctxt, stat); } /* Read encoded value into memory */ if (length > sizeof(tmpbuf)) { return LOG_RTERR (pctxt, RTERR_TOOBIG); } stat = rtxStreamRead (pctxt, tmpbuf, length); if (stat < 0) return LOG_RTERR (pctxt, stat); /* Decode */ memcpy (&savedBuf, &pctxt->buffer, sizeof(OSRTBuffer)); rtxInitContextBuffer (pctxt, tmpbuf, length); stat = xd_real (pctxt, object_p, ASN1IMPL, length); /* Reset context buffer */ memcpy (&pctxt->buffer, &savedBuf, sizeof(OSRTBuffer)); return stat; }
EXTERN int asn1D_UBL_OrderResponse_1_0_LineItemCountNumericType (OSCTXT* pctxt, UBL_OrderResponse_1_0_LineItemCountNumericType *pvalue, ASN1TagType tagging, int length) { int stat = 0; int reqcnt = 0; ASN1CCB ccb; if (tagging == ASN1EXPL) { stat = xd_match1 (pctxt, 0x10, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); } /* decode SEQUENCE */ ccb.len = length; ccb.ptr = OSRTBUFPTR(pctxt); ccb.seqx = 0; while (!XD_CHKEND (pctxt, &ccb)) { switch (ccb.seqx) { case 0: /* decode base */ if (XD_PEEKTAG (pctxt, 0x80)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = xd_real (pctxt, &pvalue->base, ASN1IMPL, length); if (stat != 0) return LOG_RTERR (pctxt, stat); reqcnt++; } break; default: { ASN1TAG tag; int len; stat = xd_tag_len (pctxt, &tag, &len, 0); if (stat != 0) return LOG_RTERR (pctxt, stat); switch (tag) { case (TM_CTXT|TM_PRIM|0): stat = RTERR_SEQORDER; break; default: stat = RTERR_SEQOVFLW; break; }} } if (stat != 0) return LOG_RTERR (pctxt, stat); else ccb.seqx++; } if (reqcnt < 1) { return LOG_RTERR (pctxt, RTERR_SETMISRQ); } if (tagging == ASN1EXPL && ccb.len == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } return (stat); }
EXTERN int asn1D_UBL_OrderResponse_1_0_PackagesCountQuantityType (OSCTXT* pctxt, UBL_OrderResponse_1_0_PackagesCountQuantityType *pvalue, ASN1TagType tagging, int length) { int stat = 0; int reqcnt = 0; ASN1CCB ccb; if (tagging == ASN1EXPL) { stat = xd_match1 (pctxt, 0x10, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); } /* decode SEQUENCE */ memset (&pvalue->m, 0, sizeof(pvalue->m)); ccb.len = length; ccb.ptr = OSRTBUFPTR(pctxt); ccb.seqx = 0; while (!XD_CHKEND (pctxt, &ccb)) { switch (ccb.seqx) { case 0: /* decode quantityUnitCode */ if (XD_PEEKTAG (pctxt, 0x80)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = xd_utf8str (pctxt, &pvalue->quantityUnitCode, ASN1IMPL, length); if (stat != 0) return LOG_RTERR (pctxt, stat); reqcnt++; } break; case 1: /* decode quantityUnitCodeListAgencyID */ if (XD_PEEKTAG (pctxt, 0x81)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = xd_utf8str (pctxt, &pvalue->quantityUnitCodeListAgencyID, ASN1IMPL, length); if (stat == 0) { pvalue->m.quantityUnitCodeListAgencyIDPresent = TRUE; } } break; case 2: /* decode quantityUnitCodeListAgencyName */ if (XD_PEEKTAG (pctxt, 0x82)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = xd_utf8str (pctxt, &pvalue->quantityUnitCodeListAgencyName, ASN1IMPL, length); if (stat == 0) { pvalue->m.quantityUnitCodeListAgencyNamePresent = TRUE; } } break; case 3: /* decode quantityUnitCodeListID */ if (XD_PEEKTAG (pctxt, 0x83)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = xd_utf8str (pctxt, &pvalue->quantityUnitCodeListID, ASN1IMPL, length); if (stat == 0) { pvalue->m.quantityUnitCodeListIDPresent = TRUE; } } break; case 4: /* decode base */ if (XD_PEEKTAG (pctxt, 0x84)) { stat = xd_Tag1AndLen (pctxt, &length); if (stat != 0) return LOG_RTERR (pctxt, stat); stat = xd_real (pctxt, &pvalue->base, ASN1IMPL, length); if (stat != 0) return LOG_RTERR (pctxt, stat); reqcnt++; } break; default: { ASN1TAG tag; int len; stat = xd_tag_len (pctxt, &tag, &len, 0); if (stat != 0) return LOG_RTERR (pctxt, stat); switch (tag) { case (TM_CTXT|TM_PRIM|0): case (TM_CTXT|TM_CONS|0): case (TM_CTXT|TM_PRIM|1): case (TM_CTXT|TM_CONS|1): case (TM_CTXT|TM_PRIM|2): case (TM_CTXT|TM_CONS|2): case (TM_CTXT|TM_PRIM|3): case (TM_CTXT|TM_CONS|3): case (TM_CTXT|TM_PRIM|4): stat = RTERR_SEQORDER; break; default: stat = RTERR_SEQOVFLW; break; }} } if (stat != 0) return LOG_RTERR (pctxt, stat); else ccb.seqx++; } if (reqcnt < 2) { return LOG_RTERR (pctxt, RTERR_SETMISRQ); } if (tagging == ASN1EXPL && ccb.len == ASN_K_INDEFLEN) { if (XD_MATCHEOC (pctxt)) XD_BUMPIDX (pctxt, 2); else return LOG_RTERR (pctxt, ASN_E_INVLEN); } return (stat); }