예제 #1
0
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;
}
예제 #2
0
파일: conversion.c 프로젝트: petrrr/irods
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);
}