X-Git-Url: https://gerrit.o-ran-sc.org/r/gitweb?a=blobdiff_plain;f=src%2Flib%2Fgscphftaaux%2Fhfta_runtime_library.cc;h=65a0a2c399683fa1690409971fee24fd3632999c;hb=HEAD;hp=5cabb200d7a379ee0f7c789d65417e827c701d44;hpb=f6db93ae9480bc87fb36b61cec0bf17e6082b7c1;p=com%2Fgs-lite.git diff --git a/src/lib/gscphftaaux/hfta_runtime_library.cc b/src/lib/gscphftaaux/hfta_runtime_library.cc index 5cabb20..65a0a2c 100644 --- a/src/lib/gscphftaaux/hfta_runtime_library.cc +++ b/src/lib/gscphftaaux/hfta_runtime_library.cc @@ -59,14 +59,19 @@ void hfta_vstr_destroy(vstring * str) { str->length = 0; } +// Make the vstring safe to destroy even if its never initialized +// (e.g. stack-allocated groups containing strings) +void hfta_vstr_init(vstring * str) { + str->length = 0; +} gs_retval_t hfta_vstr_length(vstring *str) { return str->length; } // Assume that SRC is either INTERNAL or SHALLOW_COPY -void hfta_vstr_assign_with_copy_in_tuple(vstring32 * target, vstring * src, - gs_sp_t data_offset, gs_retval_t int_offset) { +void hfta_vstr_assign_with_copy_in_tuple(vstring32 * target, + const vstring * src, gs_sp_t data_offset, gs_retval_t int_offset) { target->length = src->length; target->offset = int_offset; target->reserved = PACKED; @@ -77,7 +82,7 @@ void hfta_vstr_assign_with_copy_in_tuple(vstring32 * target, vstring * src, // Ted wrote the following function. // make deep copy of src. Assume that dst is already empty. // Assume that SRC is either INTERNAL or SHALLOW_COPY -void hfta_vstr_assign_with_copy(vstring *dst, vstring *src){ +void hfta_vstr_assign_with_copy(vstring *dst, const vstring *src){ dst->length=src->length; if(src->length){ dst->offset=(gs_p_t)malloc(dst->length); @@ -89,7 +94,7 @@ void hfta_vstr_assign_with_copy(vstring *dst, vstring *src){ // Ted wrote the following function. // Make a deep copy of src. garbage collect dst if needed. // Assume that SRC is either INTERNAL or SHALLOW_COPY -void hfta_vstr_replace(vstring *dst, vstring *src){ +void hfta_vstr_replace(vstring *dst, const vstring *src){ hfta_vstr_destroy(dst); hfta_vstr_assign_with_copy(dst,src); } @@ -171,6 +176,23 @@ gs_retval_t hfta_vstr_compare(const vstring * s1, const vstring * s2) { return(s1->length - s2->length); } +gs_retval_t hfta_vstr_equal(const vstring * s1, const vstring * s2) { + gs_int32_t x; + + if(s1->length != s2->length) + return -1; + +// cmp_ret=memcmp((void *)s1->offset,(void *)s2->offset,s1->length); + for(x=0;xlength;x++) { + if (((char *)(s1->offset))[x]!=((char *)(s2->offset))[x]) { + return -1; + } + } + + + return 0; +} + gs_param_handle_t register_handle_for_str_regex_match_slot_1(vstring* pattern) { @@ -335,6 +357,54 @@ gs_retval_t deregister_handle_for_str_extract_regex_slot_1(gs_param_handle_t han return 0; } +// ------------------------------------------------- +// More substring functions + +// get last n bytes, if available +// getting the prefix is done by str_truncate, defined in the include file +gs_retval_t str_suffix(vstring *result, vstring *s, gs_uint32_t n){ + register gs_p_t st = (gs_p_t)s->offset; + int prefix = (n > s->length) ? 0 : s->length-n; + result->offset = st + prefix; + result->length = s->length-prefix; + result->reserved = SHALLOW_COPY; + return 0; +} + + +// Split the string on sep, get the i'th substring, if any +gs_retval_t get_list_entry(vstring *result, vstring *l, vstring *sep, gs_uint32_t pos){ + char s; + gs_int32_t c; + + result->offset = l->offset; // empty return string + result->reserved = SHALLOW_COPY; + result->length = 0; + + if(sep->length > 0){ // get the sep char, ensure the string is nonempty + s = ((gs_sp_t)(sep->offset))[0]; + }else{ + return 0; + } + + for(c=0;c < l->length && pos>0; ++c){ + if(((gs_sp_t)(l->offset))[c] == s){ + pos--; + } + } + + if(pos>0 || c >= l->length-1){ // not enough seps, or final string is empty + return 0; + } + + result->offset = l->offset + c; + for(; clength && ((gs_sp_t)(l->offset))[c] != s; ++c, ++result->length); + + return 0; +} + + +// ------------------------------------------------- static gs_uint32_t nextint(struct vstring *str , gs_uint32_t * offset, gs_uint32_t *res) { gs_uint8_t * s = (gs_uint8_t *)(str->offset); @@ -354,6 +424,7 @@ static gs_uint32_t nextint(struct vstring *str , gs_uint32_t * offset, gs_uint32 return v; } + gs_uint32_t strtoi(gs_uint32_t * r, struct vstring * s) { gs_uint32_t offset; @@ -591,10 +662,12 @@ gs_param_handle_t register_handle_for_int_to_string_map_slot_1(vstring *filename return 0; } - char buf[10000], buf_str[10000]; - gs_int32_t buflen; + gs_int32_t buflen = 10000; + char buf[buflen], buf_str[buflen]; gs_int64_t val; - while(fgets(buf, buflen, fl) > 0){ + char *fret; + fret = fgets(buf, buflen, fl); + while(fret != NULL){ int nvals = sscanf(buf, "%lld,%s", &val, buf_str); if(nvals >= 2){ vstring new_str; @@ -604,6 +677,7 @@ gs_param_handle_t register_handle_for_int_to_string_map_slot_1(vstring *filename memcpy((char *)new_str.offset, buf_str, new_str.length); map_struct->i2s_map[val] = new_str; } + fret = fgets(buf, buflen, fl); } fclose(fl); @@ -636,3 +710,79 @@ gs_param_handle_t deregister_handle_for_int_to_string_map_slot_1(gs_param_handle delete map_struct; } +// --------------------------------------------------- +// Return a (binary, non-ascii) string in its hex representation + +static char hexmap[16] = { + '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f' +}; + +gs_retval_t to_hex_string(vstring *result, vstring *val){ + result->length = 2*(val->length); + result->offset = (gs_p_t)malloc(result->length); + result->reserved = INTERNAL; + unsigned char *rs = (unsigned char *)(result->offset); + unsigned char *vs = (unsigned char *)(val->offset); + + for(int c=0;clength; ++c){ + rs[2*c] = hexmap[vs[c] >> 4]; + rs[2*c+1] = hexmap[vs[c] & 0x0f]; + } + + return 0; +} + + +// --------------------------------------------- +// sum up unsigned integers expressed as a string with separators, +// e.g. on input '34|45|56' and sep '|', return 135. +// This kind of thing is common in Nokia PCMD data. +// gracefully handle empty entries, e.g. '|8|' should return 8 +gs_int64_t sum_uint_in_list(struct vstring *list, struct vstring *sepchar){ + gs_int64_t ret = 0; + gs_int64_t val = 0; + char sep; + char v; + int c; + + if(sepchar->length < 1) + return 0; + sep = ((char *)(sepchar->offset))[0]; + + for(c=0;clength;++c){ + v = ((char *)(list->offset))[c]; + if(v==sep){ + ret+=val; + val = 0; + }else{ + val = 10*val + (v>='0' && v<='9')*(v-'0'); + } + } + ret += val; + return ret; +} + +// Convert an string to an integer +gs_int64_t to_llong(vstring *v){ + gs_int64_t ret=0; + gs_uint8_t d; + int c; + int neg=1; + + if(v->length < 1) + return 0; + d = ((char *)(v->offset))[0]; + if(d=='-'){ + neg=-1; + }else{ + ret = (d>='0' && d<='9')*(d-'0'); + } + + for(c=1;clength;++c){ + d = ((char *)(v->offset))[c]; + ret = 10*ret+(d>='0' && d<='9')*(d-'0'); + } + + return neg*ret; +} +