int convertHashtableToMsParamArray( msParamArray_t *var, Hashtable *env, rError_t *errmsg ) { int i; for ( i = 0; i < env->size; i++ ) { struct bucket *b = env->buckets[i]; while ( b != NULL && !IS_TVAR_NAME( b->key ) ) { Res *res = ( Res * )b->value; msParam_t *v = NULL; int needToFree = 0; int varindex; int ret; for ( varindex = 0; varindex < var->len; varindex++ ) { if ( var->msParam[varindex]->label != NULL && strcmp( var->msParam[varindex]->label, b->key ) == 0 ) { v = var->msParam[varindex]; ret = updateResToMsParam( v, res, errmsg ); break; } } if ( v == NULL ) { v = ( msParam_t * ) malloc( sizeof( msParam_t ) ); needToFree = 1; ret = convertResToMsParam( v, res, errmsg ); if ( var->msParam == NULL ) { var->len = 0; var->msParam = ( msParam_t ** ) malloc( sizeof( msParam_t * ) * ( PTR_ARRAY_MALLOC_LEN ) ); } else if ( var->len % PTR_ARRAY_MALLOC_LEN == 0 ) { var->msParam = ( msParam_t ** ) realloc( var->msParam, sizeof( msParam_t * ) * ( PTR_ARRAY_MALLOC_LEN + var->len ) ); } var->msParam[var->len++] = v; } v->label = strdup( b->key ); if ( ret != 0 ) { /* error */ /* todo free msParamArray */ if ( needToFree ) { free( v ); } return ret; } b = b->next; } } return 0; }
int updateResToMsParam(msParam_t *var, Res *res, rError_t *errmsg) { if(var->type != NULL && (strcmp(var->type, INT_MS_T) == 0 || strcmp(var->type, DOUBLE_MS_T) == 0 || strcmp(var->type, STR_MS_T) == 0)) { /* do not free msParam_t if its inOutStruct and inOutBuf are shared */ if(var->inOutStruct!=NULL) { free(var->inOutStruct); } if(var->inpOutBuf!=NULL) { free(var->inpOutBuf); } } if(var->label!=NULL) { free(var->label); } return convertResToMsParam(var, res, errmsg); }