$OpenBSD$ --- cuneiform_src/Kern/rbal/src/statsearchbl.cpp.orig Sat Jul 3 17:55:39 2010 +++ cuneiform_src/Kern/rbal/src/statsearchbl.cpp Wed Jul 7 13:28:21 2010 @@ -56,27 +56,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O // StatSearchBL.cpp : implementation file // +#include #include /*#include #include */ -#include #include +#include -#if defined(__APPLE__) && defined(__MACH__) -#include -#define malloc_usable_size(a) malloc_size(a) - -#elif defined(__FreeBSD__) -#include - -#elif defined(WIN32) -#include -#define malloc_usable_size(a) _msize(a) - -#else -#include -#endif - //#include "puma.h" #include "dpuma.h" #include "statsearchbl.h" @@ -94,15 +80,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY O int16_t minrow; -void stat_def_b3_b4(CSTR_line line, CSTR_attr *p_attr, - int16_t *p_Y2Arr, int16_t *p_FreqY2Arr, int16_t *Ns3, int16_t *Ns4) +void stat_def_b3_b4(CSTR_line line, CSTR_attr *p_attr, int16_t sz_Y2Arr, int16_t *p_Y2Arr, + int16_t sz_FreqY2Arr, int16_t *p_FreqY2Arr, int16_t *Ns3, int16_t *Ns4) { if(line == 0 || p_attr == NULL || p_Y2Arr == NULL || p_FreqY2Arr == NULL) return; ROW_STRUCT row_str; - int16_t sz_FreqY2Arr = malloc_usable_size(p_FreqY2Arr) / sizeof(int16_t); - int16_t sz_Y2Arr = malloc_usable_size(p_Y2Arr) / sizeof(int16_t); // if(p_attr->number == 39) DebugBreak();// && p_attr->language == 0 //главный максимум @@ -113,7 +97,7 @@ void stat_def_b3_b4(CSTR_line line, CSTR_attr *p_attr, row_str.ValGM = p_FreqY2Arr[max_FreqY2Arr]; //правый максимум (относительно главного максимума) - int16_t right_diff = stat_Right_diff_from_max(p_FreqY2Arr, max_FreqY2Arr); + int16_t right_diff = stat_Right_diff_from_max(sz_FreqY2Arr, p_FreqY2Arr, max_FreqY2Arr); right_diff = MAX(3, right_diff); @@ -1232,15 +1216,16 @@ Bool stat_interp_bsl_by_b4(CSTR_line line, int16_t ln_ return TRUE; } -void stat_def_b1_b2(CSTR_line line, CSTR_attr *p_attr, int16_t *p_Y1Arr, - int16_t *p_Y2Arr, int16_t *p_FreqY1Arr, int16_t *Ns1, int16_t *Ns2) +void stat_def_b1_b2(CSTR_line line, CSTR_attr *p_attr, + int16_t sz_Y1Arr, int16_t *p_Y1Arr, + int16_t sz_Y2Arr, int16_t *p_Y2Arr, + int16_t sz_FreqY1Arr, int16_t *p_FreqY1Arr, + int16_t *Ns1, int16_t *Ns2) { if(line == 0 || p_attr == NULL || p_Y1Arr == NULL ||p_Y2Arr == NULL || p_FreqY1Arr == NULL) return; ROW_STRUCT row_str; - int16_t sz_FreqY1Arr = malloc_usable_size(p_FreqY1Arr) / sizeof(int16_t); - int16_t sz_Y1Arr = malloc_usable_size(p_Y1Arr) / sizeof(int16_t); int16_t min_Y1Arr = p_Y1Arr[stat_index_GlobMin(p_Y1Arr, sz_Y1Arr)]; // if(p_attr->number == 161) DebugBreak(); // && p_attr->language == 0 @@ -1303,7 +1288,7 @@ void stat_def_b1_b2(CSTR_line line, CSTR_attr *p_attr, } //правый максимум - int16_t right_diff = stat_Right_diff_from_max(p_FreqY1Arr, max_FreqY1Arr); + int16_t right_diff = stat_Right_diff_from_max(sz_FreqY1Arr, p_FreqY1Arr, max_FreqY1Arr); right_diff = MAX(right_diff, 3); int16_t rightMax_FreqY1Arr = stat_index_RightLocMax(p_FreqY1Arr, sz_FreqY1Arr, max_FreqY1Arr + right_diff); @@ -1420,13 +1405,10 @@ int16_t stat_LineLength(CSTR_line line) return i; } -void stat_FormArrays(CSTR_line line, int16_t row, int16_t *p_Y1Array, int16_t *p_Y2Array) +void stat_FormArrays(CSTR_line line, int16_t row, int16_t sz_Y1Array, int16_t *p_Y1Array, + int16_t sz_Y2Array, int16_t *p_Y2Array) { if(p_Y1Array == NULL || p_Y2Array == NULL) return; - - int16_t sz_Y1Array = malloc_usable_size(p_Y1Array) / sizeof(int16_t); - int16_t sz_Y2Array = malloc_usable_size(p_Y2Array) / sizeof(int16_t); - if(sz_Y1Array == 0 || sz_Y2Array == 0) return; CSTR_attr line_attr; @@ -1485,28 +1467,24 @@ void stat_FormArrays(CSTR_line line, int16_t row, int1 void StatSearchBL(CSTR_line line, CSTR_attr *p_attr, int16_t *Ns1, int16_t *Ns2, int16_t *Ns3, int16_t *Ns4) { - int16_t n = stat_LineLength(line); //malloc_usable_size(pY1Array) / sizeof(int16_t) - размерность pY1Array и pY2Array - int16_t *pY1Array = (int16_t *) malloc(sizeof(int16_t) * n); - int16_t *pY2Array = (int16_t *) malloc(sizeof(int16_t) * n); + int16_t n = stat_LineLength(line); + int16_t *pY1Array = (int16_t *)calloc(n, sizeof(int16_t)); + int16_t *pY2Array = (int16_t *)calloc(n, sizeof(int16_t)); if(pY2Array == NULL || pY1Array == NULL) { - p_attr = (CSTR_attr *) NULL; + free(pY1Array); + free(pY2Array); return; } // DebugBreak(); - stat_FormArrays(line, p_attr->row, pY1Array, pY2Array); + stat_FormArrays(line, p_attr->row, n, pY1Array, n, pY2Array); - if(pY1Array == NULL || pY2Array == NULL) - { - p_attr = (CSTR_attr *) NULL; - return; - } - //значения гистограммы - int16_t *pFrequencyY1Array = stat_gistoGramma(pY1Array, n); - int16_t *pFrequencyY2Array = stat_gistoGramma(pY2Array, n); + int16_t nfreq1 = n, nfreq2 = n; + int16_t *pFrequencyY1Array = stat_gistoGramma(pY1Array, &nfreq1); + int16_t *pFrequencyY2Array = stat_gistoGramma(pY2Array, &nfreq2); if(pFrequencyY1Array != NULL && pFrequencyY2Array != NULL) { @@ -1517,29 +1495,31 @@ void StatSearchBL(CSTR_line line, CSTR_attr *p_attr, if(line == 0 || p_attr->number == 0 || p_attr->number > CSTR_GetMaxNumber()) { p_attr = (CSTR_attr *) NULL; - return; + goto cleanup; } //собственно поиск БЛ - stat_def_b3_b4(line, p_attr, pY2Array, pFrequencyY2Array, Ns3, Ns4); - stat_def_b1_b2(line, p_attr, pY1Array, - pY2Array, pFrequencyY1Array, Ns1, Ns2); + stat_def_b3_b4(line, p_attr, n, pY2Array, nfreq2, pFrequencyY2Array, + Ns3, Ns4); + stat_def_b1_b2(line, p_attr, n, pY1Array, n, pY2Array, + nfreq1, pFrequencyY1Array, Ns1, Ns2); stat_def_imaginary_bl(p_attr, Ns1, Ns2, Ns4); } else { p_attr = (CSTR_attr *) NULL; - return; + goto cleanup; } free(pFrequencyY1Array); - free(pY1Array); - free(pFrequencyY2Array); - free(pY2Array); } else p_attr = (CSTR_attr *) NULL; + +cleanup: + free(pY1Array); + free(pY2Array); } int16_t stat_Hypothesis(int32_t line_number, int16_t diff_b3_bsl) @@ -1550,7 +1530,8 @@ int16_t stat_Hypothesis(int32_t line_number, int16_t d { int32_t line_start = MAX(1, line_number - LNCNST); - CSTR_attr *pCSTR_attrArray = (CSTR_attr *)malloc((line_number - line_start) * sizeof(CSTR_attr)); + CSTR_attr *pCSTR_attrArray = (CSTR_attr *)calloc(line_number - line_start, + sizeof(CSTR_attr)); if(pCSTR_attrArray != NULL) { @@ -1586,10 +1567,8 @@ Bool stat_FormCSTR_attrArray(int32_t line_start, int32 { if(line_stop > CSTR_GetMaxNumber() || pCSTR_attrArray == NULL) return FALSE; - int16_t sz = malloc_usable_size(pCSTR_attrArray) / sizeof(CSTR_attr); - if(sz < line_stop - line_start) return FALSE; - - for(int32_t l = 0; l < line_stop - line_start; l++) + int16_t sz = line_stop - line_start; + for(int32_t l = 0; l < sz; l++) { CSTR_attr m_attr; @@ -1675,8 +1654,7 @@ int16_t stat_Mode_diff_b2_b1(int32_t line_number, int1 if(pCSTR_attrArray != NULL) { - int16_t *p_diff = (int16_t *)malloc((line_number - line_start) * sizeof(int16_t)); - + int16_t *p_diff = (int16_t *)calloc(line_number - line_start, sizeof(int16_t)); if(p_diff != NULL) { Bool bRet = stat_FormCSTR_attrArray(line_start, line_number, pCSTR_attrArray); @@ -1701,10 +1679,10 @@ int16_t stat_Mode_diff_b2_b1(int32_t line_number, int1 if(jCount !=0) { p_diff = (int16_t *) realloc(p_diff, jCount * sizeof(int16_t)); - int16_t *pFrequencyArray = stat_gistoGramma(p_diff, jCount); + int16_t szFrequencyArray = jCount; + int16_t *pFrequencyArray = stat_gistoGramma(p_diff, &szFrequencyArray); if(pFrequencyArray != NULL) { - int16_t szFrequencyArray = malloc_usable_size(pFrequencyArray) / sizeof(int16_t); int16_t minArray = p_diff[stat_index_GlobMin(p_diff,jCount)]; int16_t maxFrequencyArray = stat_index_GlobMax(pFrequencyArray,szFrequencyArray, G); if(szFrequencyArray != 0) free(pFrequencyArray); @@ -1758,9 +1736,8 @@ int16_t stat_Left_diff_from_max(int16_t *p_FrequencyAr return jret; } -int16_t stat_Right_diff_from_max(int16_t *p_FrequencyArray, int16_t max_FrequencyArray) +int16_t stat_Right_diff_from_max(int16_t sz, int16_t *p_FrequencyArray, int16_t max_FrequencyArray) { - int16_t sz = malloc_usable_size(p_FrequencyArray) / sizeof(int16_t); int16_t jret = sz - max_FrequencyArray + 1; int16_t derivative = 0; int16_t i; @@ -1804,7 +1781,7 @@ int16_t stat_Mode_diff_b3_b4(int32_t line_number, int1 if(pCSTR_attrArray != NULL) { - int16_t *p_diff = (int16_t *)malloc((line_number - line_start) * sizeof(int16_t)); + int16_t *p_diff = (int16_t *)calloc(line_number - line_start, sizeof(int16_t)); if(p_diff != NULL) { @@ -1830,10 +1807,10 @@ int16_t stat_Mode_diff_b3_b4(int32_t line_number, int1 if(jCount !=0) { p_diff = (int16_t *) realloc(p_diff, jCount * sizeof(int16_t)); - int16_t *pFrequencyArray = stat_gistoGramma(p_diff, jCount); + int16_t szFrequencyArray = jCount; + int16_t *pFrequencyArray = stat_gistoGramma(p_diff, &szFrequencyArray); if(pFrequencyArray != NULL) { - int16_t szFrequencyArray = malloc_usable_size(pFrequencyArray) / sizeof(int16_t); int16_t minArray = p_diff[stat_index_GlobMin(p_diff,jCount)]; int16_t maxFrequencyArray = stat_index_GlobMax(pFrequencyArray,szFrequencyArray, G); if(szFrequencyArray != 0) free(pFrequencyArray); @@ -1868,7 +1845,7 @@ int16_t stat_Mode_diff_b2_b3(int32_t line_number, int1 if(pCSTR_attrArray != NULL) { - int16_t *p_diff = (int16_t *)malloc((line_number - line_start) * sizeof(int16_t)); + int16_t *p_diff = (int16_t *)calloc(line_number - line_start, sizeof(int16_t)); if(p_diff != NULL) { @@ -1899,10 +1876,10 @@ int16_t stat_Mode_diff_b2_b3(int32_t line_number, int1 if(jCount !=0) { p_diff = (int16_t *) realloc(p_diff, jCount * sizeof(int16_t)); - int16_t *pFrequencyArray = stat_gistoGramma(p_diff, jCount); + int16_t szFrequencyArray = jCount; + int16_t *pFrequencyArray = stat_gistoGramma(p_diff, &szFrequencyArray); if(pFrequencyArray != NULL) { - int16_t szFrequencyArray = malloc_usable_size(pFrequencyArray) / sizeof(int16_t); int16_t minArray = p_diff[stat_index_GlobMin(p_diff,jCount)]; int16_t maxFrequencyArray = stat_index_GlobMax(pFrequencyArray,szFrequencyArray, G); if(szFrequencyArray != 0) free(pFrequencyArray);