More explain stuff.
[yaz-moved-to-github.git] / asn / prt-exp.c
index 9249933..be6355d 100644 (file)
@@ -4,7 +4,22 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: prt-exp.c,v $
- * Revision 1.2  1995-08-15 11:59:43  quinn
+ * Revision 1.7  1995-12-14 16:28:07  quinn
+ * More explain stuff.
+ *
+ * Revision 1.6  1995/12/14  11:09:09  quinn
+ * Fixed bug in tagging.
+ *
+ * Revision 1.5  1995/12/05  11:15:50  quinn
+ * Work.
+ *
+ * Revision 1.4  1995/09/29  17:11:54  quinn
+ * Smallish
+ *
+ * Revision 1.3  1995/09/27  15:02:42  quinn
+ * Modified function heads & prototypes.
+ *
+ * Revision 1.2  1995/08/15  11:59:43  quinn
  * Updated External
  *
  * Revision 1.1  1995/08/10  08:54:02  quinn
@@ -125,10 +140,8 @@ int z_HumanStringUnit(ODR o, Z_HumanStringUnit **p, int opt)
 
 int z_HumanString(ODR o, Z_HumanString **p, int opt)
 {
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt && odr_ok(o);
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_sequence_of(o, z_HumanStringUnit, &(*p)->strings,
        &(*p)->num_strings))
        return 1;
@@ -161,10 +174,8 @@ int z_IconObjectUnit(ODR o, Z_IconObjectUnit **p, int opt)
 
 int z_IconObject(ODR o, Z_IconObject **p, int opt)
 {
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_sequence_of(o, z_IconObjectUnit, &(*p)->iconUnits,
        &(*p)->num_iconUnits))
        return 1;
@@ -230,10 +241,8 @@ int z_NetworkAddress(ODR o, Z_NetworkAddress **p, int opt)
        {-1, -1, -1, -1, 0}
     };
 
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
        return 1;
     *p = 0;
@@ -280,31 +289,29 @@ int z_AccessInfo(ODR o, Z_AccessInfo **p, int opt)
 
 int z_QueryTypeDetails(ODR o, Z_QueryTypeDetails **p, int opt)
 {
-       static Odr_arm arm[] =
-       {
-           {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_QueryTypeDetails_private,
-               z_PrivateCapabilities},
-           {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_QueryTypeDetails_rpn,
-               z_RpnCapabilities},
-           {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_QueryTypeDetails_iso8777,
-               z_Iso8777Capabilities},
-           {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_QueryTypeDetails_z3958,
-               z_HumanString},
-           {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_QueryTypeDetails_erpn,
-               z_RpnCapabilities},
-           {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_QueryTypeDetails_rankedList,
-               z_HumanString},
-           {-1, -1, -1, -1, 0}
-       };
-
-       if (o->direction == ODR_DECODE)
-           *p = odr_malloc(o, sizeof(**p));
-       else if (!*p)
-           return opt;
-       if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
-           return 1;
-       *p = 0;
-       return opt && odr_ok(o);
+    static Odr_arm arm[] =
+    {
+       {ODR_IMPLICIT, ODR_CONTEXT, 0, Z_QueryTypeDetails_private,
+           z_PrivateCapabilities},
+       {ODR_IMPLICIT, ODR_CONTEXT, 1, Z_QueryTypeDetails_rpn,
+           z_RpnCapabilities},
+       {ODR_IMPLICIT, ODR_CONTEXT, 2, Z_QueryTypeDetails_iso8777,
+           z_Iso8777Capabilities},
+       {ODR_IMPLICIT, ODR_CONTEXT, 3, Z_QueryTypeDetails_z3958,
+           z_HumanString},
+       {ODR_IMPLICIT, ODR_CONTEXT, 4, Z_QueryTypeDetails_erpn,
+           z_RpnCapabilities},
+       {ODR_IMPLICIT, ODR_CONTEXT, 5, Z_QueryTypeDetails_rankedList,
+           z_HumanString},
+       {-1, -1, -1, -1, 0}
+    };
+
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
+    if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
+       return 1;
+    *p = 0;
+    return opt && odr_ok(o);
 }
 
 int z_PrivateCapOperator(ODR o, Z_PrivateCapOperator **p, int opt)
@@ -384,10 +391,8 @@ int z_ProxSupportUnit(ODR o, Z_ProxSupportUnit **p, int opt)
        {-1, -1, -1, -1, 0}
     };
 
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
        return 1;
     *p = 0;
@@ -431,10 +436,8 @@ int z_AccessRestrictionsUnit(ODR o, Z_AccessRestrictionsUnit **p, int opt)
 
 int z_AccessRestrictions(ODR o, Z_AccessRestrictions **p, int opt)
 {
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_sequence_of(o, z_AccessRestrictionsUnit, &(*p)->restrictions,
        &(*p)->num_restrictions))
        return 1;
@@ -481,10 +484,8 @@ int z_Charge(ODR o, Z_Charge **p, int opt)
 
 int z_DatabaseList(ODR o, Z_DatabaseList **p, int opt)
 {
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_sequence_of(o, z_DatabaseName, &(*p)->databases,
        &(*p)->num_databases))
        return 1;
@@ -507,10 +508,8 @@ int z_AttributeCombinations(ODR o, Z_AttributeCombinations **p, int opt)
 
 int z_AttributeCombination(ODR o, Z_AttributeCombination **p, int opt)
 {
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_sequence_of(o, z_AttributeOccurrence, &(*p)->occurrences,
        &(*p)->num_occurrences))
        return 1;
@@ -520,10 +519,8 @@ int z_AttributeCombination(ODR o, Z_AttributeCombination **p, int opt)
 
 int z_AttributeValueList(ODR o, Z_AttributeValueList **p, int opt)
 {
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_sequence_of(o, z_StringOrNumeric, &(*p)->attributes,
        &(*p)->num_attributes))
        return 1;
@@ -644,7 +641,7 @@ int z_DatabaseInfo(ODR o, Z_DatabaseInfo **p, int opt)
         odr_implicit(o, z_HumanString, &(*p)->disclaimers, ODR_CONTEXT,
            12, 1) &&
         odr_implicit(o, z_HumanString, &(*p)->news, ODR_CONTEXT, 13, 1) &&
-       ((odr_constructed_begin(o, p, ODR_CONTEXT, 14) &&
+       ((odr_constructed_begin(o, &(*p)->recordCount, ODR_CONTEXT, 14) &&
            odr_choice(o, arm, &(*p)->recordCount, &(*p)->recordCount_which) &&
            odr_constructed_end(o)) || odr_ok(o)) &&
         odr_implicit(o, z_HumanString, &(*p)->defaultOrder, ODR_CONTEXT,
@@ -730,10 +727,8 @@ int z_PathUnit(ODR o, Z_PathUnit **p, int opt)
 
 int z_Path(ODR o, Z_Path **p, int opt)
 {
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     odr_implicit_settag(o, ODR_CONTEXT, 201);
     if (odr_sequence_of(o, z_OtherInformationUnit, &(*p)->list,
        &(*p)->num))
@@ -744,10 +739,8 @@ int z_Path(ODR o, Z_Path **p, int opt)
 
 int z_ElementInfoList(ODR o, Z_Path **p, int opt)
 {
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     odr_implicit_settag(o, ODR_CONTEXT, 201);
     if (odr_sequence_of(o, z_OtherInformationUnit, &(*p)->list,
        &(*p)->num))
@@ -767,11 +760,8 @@ int z_ElementDataType(ODR o, Z_ElementDataType **p, int opt)
        {-1, -1, -1, -1, 0}
     };
 
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
-
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
        return 1;
     *p = 0;
@@ -1110,10 +1100,8 @@ int z_SortKeyDetailsSortType(ODR o, Z_SortKeyDetailsSortType **p, int opt)
        {-1, -1, -1, -1, 0}
     };
 
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
        return 1;
     *p = 0;
@@ -1210,10 +1198,8 @@ int z_VariantValue(ODR o, Z_VariantValue **p, int opt)
 
 int z_ValueSetEnumerated(ODR o, Z_ValueSetEnumerated **p, int opt)
 {
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_sequence_of(o, z_ValueDescription, &(*p)->enumerated,
        &(*p)->num_enumerated))
        return 1;
@@ -1231,10 +1217,8 @@ int z_ValueSet(ODR o, Z_ValueSet **p, int opt)
        {-1, -1, -1, -1, 0}
     };
 
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
        return 1;
     *p = 0;
@@ -1264,10 +1248,8 @@ int z_ValueDescription(ODR o, Z_ValueDescription **p, int opt)
        {-1, -1, -1, -1, 0}
     };
 
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt && odr_ok(o);
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
        return 1;
     *p = 0;
@@ -1378,10 +1360,8 @@ int z_ExplainRecord(ODR o, Z_ExplainRecord **p, int opt)
        {-1, -1, -1, -1, 0}
     };
 
-    if (o->direction == ODR_DECODE)
-       *p = odr_malloc(o, sizeof(**p));
-    else if (!*p)
-       return opt;
+    if (!odr_initmember(o, p, sizeof(**p)))
+       return opt && odr_ok(o);
     if (odr_choice(o, arm, &(*p)->u, &(*p)->which))
        return 1;
     *p = 0;