+++ /dev/null
-#include "asn1fix_internal.h"
-
-asn1p_expr_t *
-asn1f_class_access(arg_t *arg, asn1p_expr_t *rhs_pspecs, const asn1p_ref_t *ref) {
- asn1p_expr_t *ioclass;
- asn1p_expr_t *classfield;
- asn1p_expr_t *expr;
- asn1p_ref_t tmpref;
-
- assert(ref->comp_count > 1);
-
- DEBUG("ClassAccess lookup (%s%s) for line %d",
- asn1f_printable_reference(ref), rhs_pspecs ? ", parameterized" : "",
- ref->_lineno);
-
- /*
- * Fetch the first part of the reference (OBJECT or ObjectSet).
- * OBJECT.&<something>...
- * ObjectSet.&<something>...
- */
- assert(isupper(ref->components[0].name[0]));
-
- tmpref = *ref;
- tmpref.comp_count = 1;
- ioclass = asn1f_lookup_symbol(arg, rhs_pspecs, &tmpref);
- if(ioclass == NULL) {
- DEBUG("ClassAccess lookup (%s) failed",
- asn1f_printable_reference(&tmpref));
- errno = ESRCH;
- return NULL;
- }
- if(ioclass->expr_type == A1TC_REFERENCE) {
- ioclass = WITH_MODULE(
- ioclass->module,
- asn1f_lookup_symbol(arg, ioclass->rhs_pspecs, ioclass->reference));
- if(ioclass == NULL) {
- errno = ESRCH;
- return NULL;
- }
- }
- if(ioclass->expr_type != A1TC_CLASSDEF) {
- if(!(ioclass->_mark & TM_BROKEN)) {
- ioclass->_mark |= TM_BROKEN;
- FATAL("Class field %s lookup at line %d in something that is not a class: %s at line %d",
- asn1f_printable_reference(ref), ref->_lineno,
- ioclass->Identifier,
- ioclass->_lineno);
- }
- errno = EINVAL;
- return NULL;
- }
-
- classfield = asn1f_lookup_child(ioclass, ref->components[1].name);
- if(classfield == NULL) {
- DEBUG("CLASS %s does not contain field %s",
- ioclass->Identifier, ref->components[1].name);
- errno = ESRCH;
- return NULL;
- }
-
- assert(classfield->meta_type == AMT_OBJECTFIELD);
-
- DEBUG("CLASS %s -> %s (%d)", ioclass->Identifier,
- classfield->Identifier, classfield->expr_type);
-
- switch(classfield->expr_type) {
- case A1TC_CLASSFIELD_TFS:
- if(TQ_FIRST(&classfield->members)) {
- /* Already have something */
- } else {
- expr = asn1p_expr_new(classfield->_lineno, arg->mod);
- expr->expr_type = ASN_TYPE_ANY;
- expr->meta_type = AMT_TYPE;
- asn1p_expr_add(classfield, expr);
- }
- /* Fall through */
- case A1TC_CLASSFIELD_FTVFS:
- expr = TQ_FIRST(&classfield->members);
- assert(expr);
- return expr;
- break;
- default:
- FATAL("%s.%s: field type not yet supported. "
- "Consider donation to the asn1c author.",
- ioclass->Identifier, classfield->Identifier);
- return NULL;
- }
-
- return NULL;
-}
-