Fix HFTA operators and UDAFs broken by the last update
[com/gs-lite.git] / src / lib / gscphftaaux / hfta_runtime_library.cc
index 5cabb20..c4bcc64 100644 (file)
@@ -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;x<s1->length;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) {
@@ -591,10 +613,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 +628,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);