X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Flib%2Fgscphftaaux%2Fhfta_runtime_library.cc;fp=src%2Flib%2Fgscphftaaux%2Fhfta_runtime_library.cc;h=5cabb200d7a379ee0f7c789d65417e827c701d44;hb=f6db93ae9480bc87fb36b61cec0bf17e6082b7c1;hp=ccae6e389adba79c592bbe3238ab8ffa60cfdeb9;hpb=811ec19e8829c72e0171ed9aee77942baecb6f90;p=com%2Fgs-lite.git diff --git a/src/lib/gscphftaaux/hfta_runtime_library.cc b/src/lib/gscphftaaux/hfta_runtime_library.cc index ccae6e3..5cabb20 100644 --- a/src/lib/gscphftaaux/hfta_runtime_library.cc +++ b/src/lib/gscphftaaux/hfta_runtime_library.cc @@ -31,6 +31,8 @@ extern "C" { #include #include +#include + // for htonl,ntohl #include @@ -551,3 +553,86 @@ gs_uint32_t byte_match_offset( gs_uint32_t offset, gs_uint32_t val,vstring *s2) } +// ------------------------------------------------------- +// map_int_to_string and its support functions, structs + +struct int_to_string_map_struct{ + std::map i2s_map; + std::string fname; + vstring empty_string; +}; + +gs_param_handle_t register_handle_for_int_to_string_map_slot_1(vstring *filename){ + int_to_string_map_struct *map_struct; + + map_struct = new int_to_string_map_struct(); + if(map_struct == NULL){ + gslog(LOG_EMERG, "int_to_string_map:: Could not allocate handle memory\n"); + return 0; + } + + map_struct->empty_string.offset = (gs_p_t)malloc(1); + map_struct->empty_string.reserved = INTERNAL; + map_struct->empty_string.length = 0; + + gs_sp_t filenamec; + filenamec = (gs_sp_t)alloca(filename->length+1); + if (filenamec==0) { + gslog(LOG_EMERG, "int_to_string_map:: Could not allocate filename memory\n"); + return 0; + } + memcpy(filenamec,(gs_sp_t)filename->offset,filename->length); + filenamec[filename->length]=0; + map_struct->fname = filenamec; + + FILE *fl = fopen(filenamec, "r"); + if(fl==NULL){ + gslog(LOG_EMERG, "int_to_string_map:: Could not open regex file %s \n",filename); + return 0; + } + + char buf[10000], buf_str[10000]; + gs_int32_t buflen; + gs_int64_t val; + while(fgets(buf, buflen, fl) > 0){ + int nvals = sscanf(buf, "%lld,%s", &val, buf_str); + if(nvals >= 2){ + vstring new_str; + new_str.reserved = SHALLOW_COPY; + new_str.length = strlen(buf_str); + new_str.offset = (gs_p_t)malloc(new_str.length); + memcpy((char *)new_str.offset, buf_str, new_str.length); + map_struct->i2s_map[val] = new_str; + } + } + + fclose(fl); + + return (gs_param_handle_t) map_struct; +} + +gs_retval_t int_to_string_map(vstring *result, gs_int64_t val, gs_param_handle_t handle){ + int_to_string_map_struct *map_struct = (int_to_string_map_struct *)handle; + if(map_struct->i2s_map.count(val)>0){ + vstring ret = map_struct->i2s_map[val]; + result->offset = ret.offset; + result->reserved = ret.reserved; + result->length = ret.length; + }else{ + result->offset = map_struct->empty_string.offset; + result->reserved = map_struct->empty_string.reserved; + result->length = map_struct->empty_string.length; + } + + return 0; +} + +gs_param_handle_t deregister_handle_for_int_to_string_map_slot_1(gs_param_handle_t handle){ + int_to_string_map_struct *map_struct = (int_to_string_map_struct *)handle; + for(std::map::iterator i2si = map_struct->i2s_map.begin(); i2si!=map_struct->i2s_map.end(); ++i2si){ + free((void *)((*i2si).second.offset)); + } + free((void *)(map_struct->empty_string.offset)); + delete map_struct; +} +