#############################################################  -*- c -*-
## generic include for XXX. Do not use directly.
##
## $Id: generic-value-map-func.m2i,v 1.7 2004/10/08 23:41:50 rstory Exp $
########################################################################
@if $m2c_mark_boundary == 1@
/** START code generated by $RCSfile: generic-value-map-func.m2i,v $ $Revision: 1.7 $ */
@end@
########################################################################
## }
/**
 * map a value from its original native format to the MIB format.
 *
 * @retval MFD_SUCCESS         : success
 * @retval MFD_ERROR           : Any other error
 *
 * @note parameters follow the memset convention (dest, src).
 *
 * @note generation and use of this function can be turned off by re-running
 * mib2c after adding the following line to the file
 * default-node-${node}.m2d :
 *   @eval $@m2c_node_skip_mapping = 1@
 *
 * @remark
 *  If the values for your data type don't exactly match the
 *  possible values defined by the mib, you should map them here.
 *  Otherwise, just do a direct copy.
 */
int
${node}_map($m2c_node_map_param)
{
@if $m2c_node_needlength == 1@
@   if $m2c_include_examples == 1@
    int converted_len;

@   end@
    netsnmp_assert(NULL != raw_$m2c_node_param_val_name);
    netsnmp_assert((NULL != mib_$m2c_node_param_ref_name) && (NULL != mib_$m2c_node_param_ref_lname));
@else@
    netsnmp_assert(NULL != mib_$m2c_node_param_ref_name);
@end@
    
    DEBUGMSGTL(("verbose:${context}:${node}_map","called\n"));
    
@if $m2c_node_needlength == 1@
    /*
     * TODO:241:r: |-> Implement $node non-integer mapping
     * it is hard to autogenerate code for mapping types that are not simple
     * integers, so here is an idea of what you might need to do. It will
     * probably need some tweaking to get right.
     */
    /*
     * if the length of the raw data doesn't directly correspond with
     * the length of the mib data, set converted_len to the
     * space required.
     */
    converted_len = raw_$m2c_node_param_val_lname; /* assume equal */
    if((NULL == *mib_$m2c_node_param_ref_name) || (*mib_$m2c_node_param_ref_lname < converted_len)) {
        if(! allow_realloc) {
            snmp_log(LOG_ERR,"not enough space for value mapping\n");
            return SNMP_ERR_GENERR;
        }
        *mib_$m2c_node_param_ref_name = realloc( *mib_$m2c_node_param_ref_name, converted_len * sizeof(**mib_$m2c_node_param_ref_name));
        if(NULL == *mib_$m2c_node_param_ref_name) {
            snmp_log(LOG_ERR,"could not allocate memory\n");
            return SNMP_ERR_GENERR;
        }
    }
    *mib_$m2c_node_param_ref_lname = converted_len;
    memcpy( *mib_$m2c_node_param_ref_name, raw_$m2c_node_param_val_name, converted_len );
##
@elsif ($node.enums == 1) && ("$node.perltype" eq "INTEGER")@
    /*
     * TODO:241:o: |-> Implement $node enum mapping.
     * uses INTERNAL_* macros defined in the header files
     */
    switch(raw_$m2c_node_param_val_name) {
@    foreach $e $v enum@
@        include m2c_setup_enum.m2i@
        case INTERNAL_$m2c_iname:
             *mib_$m2c_node_param_ref_name = $m2c_ename;
             break;

@    end@ # foreach
             default:
                 snmp_log(LOG_ERR, "couldn't map value %d for $node\n", raw_$m2c_node_param_val_name );
                 return MFD_ERROR;
    }
##
@else@
    /*
     * TODO:241:o: |-> Implement $node mapping.
     * If the values for your data type don't exactly match the
     * possible values defined by the mib, you should map them here.
     */
    (*mib_$m2c_node_param_ref_name) = raw_$m2c_node_param_val_name;
@end@

    return MFD_SUCCESS;
} /* ${node}_map */

##
########################################################################
@if $m2c_mark_boundary == 1@
/** END code generated by $RCSfile: generic-value-map-func.m2i,v $ $Revision: 1.7 $ */
@end@
