| // SPDX-License-Identifier: MediaTekProprietary | 
 | /* MediaTek Inc. (C) 2016. All rights reserved. | 
 |  * | 
 |  * Copyright Statement: | 
 |  * This software/firmware and related documentation ("MediaTek Software") are | 
 |  * protected under relevant copyright laws. The information contained herein is | 
 |  * confidential and proprietary to MediaTek Inc. and/or its licensors. Without | 
 |  * the prior written permission of MediaTek inc. and/or its licensors, any | 
 |  * reproduction, modification, use or disclosure of MediaTek Software, and | 
 |  * information contained herein, in whole or in part, shall be strictly | 
 |  * prohibited. | 
 |  */ | 
 |  | 
 | /* | 
 |  * Description: | 
 |  *   Implement ParamInfo & FieldInfo related APIs | 
 |  */ | 
 |  | 
 | #include "AudioParamParserPriv.h" | 
 |  | 
 | EXPORT size_t paramInfoGetNumOfFieldInfo(ParamInfo *paramInfo) { | 
 |     if (!paramInfo) { | 
 |         ERR_LOG("paramInfo is NULL!\n"); | 
 |         return 0; | 
 |     } | 
 |  | 
 |     return HASH_COUNT(paramInfo->fieldInfoHash); | 
 | } | 
 |  | 
 | EXPORT FieldInfo *paramInfoGetFieldInfoByIndex(ParamInfo *paramInfo, size_t index) { | 
 |     FieldInfo *fieldInfo = NULL; | 
 |     size_t i = 0; | 
 |  | 
 |     if (!paramInfo) { | 
 |         ERR_LOG("paramInfo is NULL!\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     for (fieldInfo = paramInfo->fieldInfoHash; fieldInfo ; fieldInfo = fieldInfo->hh.next) { | 
 |         if (index == i++) { | 
 |             return fieldInfo; | 
 |         } | 
 |     } | 
 |  | 
 |     return NULL; | 
 | } | 
 |  | 
 | EXPORT FieldInfo *paramInfoGetFieldInfoByName(ParamInfo *paramInfo, const char *fieldName) { | 
 |     FieldInfo *fieldInfo; | 
 |  | 
 |     if (!paramInfo) { | 
 |         ERR_LOG("paramInfo is NULL!\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     /* Query Param name */ | 
 |     HASH_FIND_STR(paramInfo->fieldInfoHash, fieldName, fieldInfo); | 
 |  | 
 |     return fieldInfo; | 
 | } | 
 |  | 
 | EXPORT ParamInfo *paramInfoCreate(const char *name, DATA_TYPE dataType, AudioType *audioType) { | 
 |     ParamInfo *paramInfo = (ParamInfo *)malloc(sizeof(ParamInfo)); | 
 |     if (!paramInfo) { | 
 |         ERR_LOG("malloc fail!\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     paramInfo->audioType = audioType; | 
 |     paramInfo->name = strdup(name); | 
 |     paramInfo->dataType = dataType; | 
 |     paramInfo->fieldInfoHash = NULL; | 
 |     return paramInfo; | 
 | } | 
 |  | 
 | EXPORT FieldInfo *fieldInfoCreate(const char *fieldName, unsigned int arrayIndex, int startBit, int endBit, const char *checkList, ParamInfo *paramInfo) { | 
 |     FieldInfo *fieldInfo = (FieldInfo *)malloc(sizeof(FieldInfo)); | 
 |  | 
 |     if (!fieldInfo) { | 
 |         ERR_LOG("malloc fail!\n"); | 
 |         return NULL; | 
 |     } | 
 |  | 
 |     /* Setup members */ | 
 |     fieldInfo->name = strdup(fieldName); | 
 |     fieldInfo->arrayIndex = arrayIndex; | 
 |     fieldInfo->startBit = startBit; | 
 |     fieldInfo->endBit = endBit; | 
 |     fieldInfo->paramInfo = paramInfo; | 
 |  | 
 |  | 
 |     if (checkList) { | 
 |         fieldInfo->checkListStr = strdup(checkList); | 
 |     } else { | 
 | #ifdef WIN32 | 
 |         fieldInfo->checkListStr = utilGenCheckList(endBit - startBit + 1); | 
 | #else | 
 |         /* Reduce memory usage, don't generate check list automatically */ | 
 |         fieldInfo->checkListStr = strdup(""); | 
 | #endif | 
 |     } | 
 |  | 
 |     return fieldInfo; | 
 | } | 
 |  | 
 | EXPORT void paramInfoRelease(ParamInfo *paramInfo) { | 
 |     if (paramInfo == NULL) { | 
 |         return; | 
 |     } | 
 |  | 
 |     if (paramInfo->fieldInfoHash) { | 
 |         FieldInfo *tmp = NULL, *item = NULL; | 
 |         HASH_ITER(hh, paramInfo->fieldInfoHash, item, tmp) { | 
 |             if (paramInfo->fieldInfoHash) { | 
 |                 HASH_DEL(paramInfo->fieldInfoHash, item); | 
 |                 fieldInfoRelease(item); | 
 |             } | 
 |         } | 
 |     } | 
 |  | 
 |     free(paramInfo->name); | 
 |     free(paramInfo); | 
 | } | 
 |  | 
 | EXPORT void fieldInfoRelease(FieldInfo *fieldInfo) { | 
 |     if (fieldInfo == NULL) { | 
 |         return; | 
 |     } | 
 |  | 
 |     if (fieldInfo->checkListStr) { | 
 |         free(fieldInfo->checkListStr); | 
 |     } | 
 |  | 
 |     free(fieldInfo->name); | 
 |     free(fieldInfo); | 
 | } | 
 |  | 
 | EXPORT APP_STATUS fieldInfoGetCheckListValue(FieldInfo *fieldInfo, const char *checkName, unsigned int *checkVal) { | 
 |     char *checkList = NULL; | 
 |     char *valStr = NULL; | 
 |     char *nameStr = NULL; | 
 |     char *restOfStr = NULL; | 
 |     if (!fieldInfo) { | 
 |         ERR_LOG("fieldInfo is NULL\n"); | 
 |         return APP_ERROR; | 
 |     } | 
 |  | 
 |     if (!checkName) { | 
 |         ERR_LOG("checkName is NULL\n"); | 
 |         return APP_ERROR; | 
 |     } | 
 |  | 
 |     if (!checkVal) { | 
 |         ERR_LOG("checkVal is NULL\n"); | 
 |         return APP_ERROR; | 
 |     } | 
 |  | 
 |     checkList = strdup(fieldInfo->checkListStr); | 
 |     valStr = utilStrtok(checkList, ARRAY_SEPERATOR, &restOfStr); | 
 |     if (!valStr) { | 
 |         ERR_LOG("Cannot parse valStr\n"); | 
 |         free(checkList); | 
 |         return APP_ERROR; | 
 |     } | 
 |  | 
 |     while ((nameStr = utilStrtok(NULL, ARRAY_SEPERATOR, &restOfStr)) != NULL) { | 
 |         if (!strncmp(nameStr, checkName, strlen(checkName) + 1)) { | 
 |             *checkVal = strtoul(valStr, NULL, 0); | 
 |             free(checkList); | 
 |             return APP_NO_ERROR; | 
 |         } | 
 |  | 
 |         valStr = utilStrtok(NULL, ARRAY_SEPERATOR, &restOfStr); | 
 |         if (!valStr) { | 
 |             ERR_LOG("Cannot parse valStr\n"); | 
 |             free(checkList); | 
 |             return APP_ERROR; | 
 |         } | 
 |     } | 
 |  | 
 |     free(checkList); | 
 |     return APP_ERROR; | 
 | } |