$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 <malloc.h>
#include <memory.h>
/*#include <windows.h>
#include <Winbase.h>*/
-#include <string.h>
#include <stdlib.h>
+#include <string.h>
-#if defined(__APPLE__) && defined(__MACH__)
-#include <malloc/malloc.h>
-#define malloc_usable_size(a) malloc_size(a)
-
-#elif defined(__FreeBSD__)
-#include <malloc_np.h>
-
-#elif defined(WIN32)
-#include <malloc.h>
-#define malloc_usable_size(a) _msize(a)
-
-#else
-#include <malloc.h>
-#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);