[BACK]Return to patch-cuneiform_src_Kern_rbal_src_statsearchbl_cpp CVS log [TXT][DIR] Up to [local] / ports / graphics / cuneiform / patches

File: [local] / ports / graphics / cuneiform / patches / patch-cuneiform_src_Kern_rbal_src_statsearchbl_cpp (download)

Revision 1.1, Sat Oct 23 12:25:59 2010 UTC (13 years, 7 months ago) by yason
Branch: MAIN
CVS Tags: HEAD

patches from Vadim Zhukov

$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);