/*
 * Miscellaneous functions necessary for several other modules.
 */
#ifndef	_ASN1FIX_RETRIEVE_H_
#define	_ASN1FIX_RETRIEVE_H_

/*
 * Simple search for the label in the descendants of the given node.
 * ERRORS:
 * NULL/ESRCH
 */
asn1p_expr_t *asn1f_lookup_child(asn1p_expr_t *tc, const char *name);

/*
 * Return a module which contain a specified name, as stated in appropriate
 * IMPORTS section of the current module (arg->mod).
 *
 * RETURN VALUES:
 * NULL/ESRCH:	The name was not found in IMPORTS section.
 * NULL/EPERM:	The name was not found in EXPORTS section of the source module.
 * Also, NULL with errno values defined by asn1f_lookup_module().
 */
asn1p_module_t *asn1f_lookup_in_imports(arg_t *arg, asn1p_module_t *mod, const char *name);

/*
 * Return a module by its name or optional OID.
 *
 * RETURN VALUES:
 * NULL/ENOENT:	No module was found by the specified name and oid
 * NULL/ETOOMANYREFS:	Several modules are matching the specified name and oid
 */
asn1p_module_t *asn1f_lookup_module(arg_t *arg,
		const char *module_name,
		asn1p_oid_t *module_oid);

/*
 * Return the reference to a destination of the given reference,
 * symbol lookup. Not a recursive function.
 */
asn1p_expr_t *asn1f_lookup_symbol(arg_t *arg,
		asn1p_module_t *mod,
		asn1p_ref_t *ref);

/*
 * Recursively find the original type for the given expression.
 * i.e.:
 * If the original specification defines
 * 	v Type1 ::= 5
 * 	Type1 ::= Type2 (1..5)
 * 	Type3 ::= Type4 (2..7)
 * 	Type4 ::= INTEGER (1..10)
 * Then this function, given the the first expression as an argument,
 * would return an expression for Type4.
 * WARNING: No attempts are made to honor constraints at this moment.
 */
asn1p_expr_t *asn1f_find_terminal_type(arg_t *arg, asn1p_expr_t *tc);

/*
 * Recursively find the original value for the given expression.
 * i.e.:
 * If the original specification defines
 * 	v Type1 ::= value
 * 	value Type2 ::= value2
 * 	value2 Type3 ::= 3
 * Then this function will return the expression for value2 if given
 * the v as an argment.
 */
asn1p_expr_t *asn1f_find_terminal_value(arg_t *arg, asn1p_expr_t *tc);

#endif	/* _ASN1FIX_RETRIEVE_H_ */
