summaryrefslogtreecommitdiffstats
path: root/libvideoeditor/osal/src/M4OSA_String_priv.c
diff options
context:
space:
mode:
Diffstat (limited to 'libvideoeditor/osal/src/M4OSA_String_priv.c')
-rwxr-xr-xlibvideoeditor/osal/src/M4OSA_String_priv.c1136
1 files changed, 1136 insertions, 0 deletions
diff --git a/libvideoeditor/osal/src/M4OSA_String_priv.c b/libvideoeditor/osal/src/M4OSA_String_priv.c
new file mode 100755
index 0000000..07cef33
--- /dev/null
+++ b/libvideoeditor/osal/src/M4OSA_String_priv.c
@@ -0,0 +1,1136 @@
+/*
+ * Copyright (C) 2004-2011 NXP Software
+ * Copyright (C) 2011 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+/**
+ ************************************************************************
+ * @file M4OSA_String_priv.c
+ ************************************************************************
+*/
+
+#include "M4OSA_Debug.h"
+#include "M4OSA_Types.h"
+#include "M4OSA_Memory.h"
+#include "M4OSA_Error.h"
+#include "M4OSA_String_priv.h"
+#include "M4OSA_String.h"
+
+/**
+ ************************************************************************
+ * @brief This function replaces a string buffer by a new "C-String"
+ * and manage memory if needed
+ * @note
+ * @param pstr_src
+ * @param pac_in
+ * @return M4OSA_ERROR
+ ************************************************************************
+ */
+M4OSA_ERR M4OSA_strPrivRealloc(M4OSA_strStruct* str,
+ M4OSA_UInt32 ui32_length)
+{
+ M4OSA_UInt32 ui32_size;
+ M4OSA_Char* buffer;
+
+ M4OSA_TRACE2_2("M4OSA_strPrivRealloc\t\tM4OSA_strStruct* 0x%x\t"
+ "M4OSA_UInt32* %d", str, ui32_length);
+
+ ui32_size = str->ui32_size;
+
+ /* Realloc if size is not sufficient to contain it entirely */
+ if(ui32_length >= ui32_size)
+ {
+ if(ui32_size == 0)
+ {
+ ui32_size = 16;
+ }
+
+ while(ui32_length >= ui32_size)
+ {
+ ui32_size <<= 1;
+ }
+
+ buffer = str->pui8_buffer;
+
+ if(buffer != M4OSA_NULL)
+ {
+ M4OSA_free((M4OSA_MemAddr32)buffer);
+ }
+
+ /* Allocate the actual M4OSA_String content */
+ buffer = (M4OSA_Char*)M4OSA_malloc(ui32_size * sizeof(M4OSA_Char),
+ M4OSA_STRING, (M4OSA_Char*)"M4OSA_strPrivRealloc");
+
+ /* Check memory allocation error */
+ if(buffer == M4OSA_NULL)
+ {
+ M4OSA_DEBUG(M4ERR_ALLOC, "M4OSA_strPrivRealloc");
+
+ str->pui8_buffer = M4OSA_NULL;
+ str->ui32_size = 0;
+ str->ui32_length = 0;
+
+ return M4ERR_ALLOC;
+ }
+
+ str->pui8_buffer = buffer;
+ str->ui32_size = ui32_size;
+ }
+
+ return M4NO_ERROR;
+}
+
+/**
+ ************************************************************************
+ * @brief This function replaces a string buffer by a new "C-String"
+ * and manage memory if needed
+ * @note
+ * @param pstr_src
+ * @param pac_in
+ * @return M4OSA_ERROR
+ ************************************************************************
+ */
+M4OSA_ERR M4OSA_strPrivReallocCopy(M4OSA_strStruct* str,
+ M4OSA_UInt32 ui32_length)
+{
+ M4OSA_UInt32 ui32_size;
+ M4OSA_Char* buffer;
+ M4OSA_Char* pui8_buffer;
+
+ M4OSA_TRACE2_2("M4OSA_strPrivReallocCopy\t\tM4OSA_strStruct* 0x%x\t"
+ "M4OSA_UInt32* %d", str, ui32_length);
+
+
+ ui32_size = str->ui32_size;
+
+ /* Realloc if size is not sufficient to contain it entirely */
+ if(ui32_length >= ui32_size)
+ {
+ if(ui32_size == 0)
+ {
+ ui32_size = 16;
+ }
+
+ while(ui32_length >= ui32_size)
+ {
+ ui32_size <<= 1;
+ }
+
+ /* Allocate the actual M4OSA_String content */
+ buffer = (M4OSA_Char*)M4OSA_malloc(ui32_size * sizeof(M4OSA_Char),
+ M4OSA_STRING, (M4OSA_Char*)"M4OSA_strPrivReallocCopy");
+
+ /* Check memory allocation error */
+ if(buffer == M4OSA_NULL)
+ {
+ M4OSA_DEBUG(M4ERR_ALLOC, "M4OSA_strPrivReallocCopy");
+
+ str->pui8_buffer = M4OSA_NULL;
+ str->ui32_size = 0;
+ str->ui32_length = 0;
+
+ return M4ERR_ALLOC;
+ }
+
+ pui8_buffer = str->pui8_buffer;
+
+ if(pui8_buffer != M4OSA_NULL)
+ {
+ M4OSA_memcpy(buffer, pui8_buffer, str->ui32_length + 1);
+
+ M4OSA_free((M4OSA_MemAddr32)pui8_buffer);
+ }
+
+ str->pui8_buffer = buffer;
+ str->ui32_size = ui32_size;
+ }
+
+ return M4NO_ERROR;
+}
+
+
+M4OSA_ERR M4OSA_strPrivDuplicate(M4OSA_strStruct** ostr,
+ M4OSA_strStruct* istr)
+{
+ M4OSA_strStruct* str;
+ M4OSA_ERR err_code;
+
+ M4OSA_TRACE2_2("M4OSA_strPrivDuplicate\t\tM4OSA_strStruct** 0x%x\t"
+ "M4OSA_strStruct** 0x%x", ostr, istr);
+
+ /* Allocate the output M4OSA_String */
+ str = (M4OSA_strStruct*)M4OSA_malloc(sizeof(M4OSA_strStruct), M4OSA_STRING,
+ (M4OSA_Char*)"M4OSA_strPrivDuplicate: output string");
+
+ /* Check memory allocation error */
+ if(str == M4OSA_NULL)
+ {
+ *ostr = M4OSA_NULL ;
+
+ M4OSA_DEBUG(M4ERR_ALLOC, "M4OSA_strPrivDuplicate");
+
+ return M4ERR_ALLOC;
+ }
+
+ str->coreID = M4OSA_STRING;
+ str->pui8_buffer = M4OSA_NULL;
+ str->ui32_length = 0;
+ str->ui32_size = 0;
+
+ err_code = M4OSA_strPrivSet(str, istr->pui8_buffer, istr->ui32_length);
+
+ if(err_code != M4NO_ERROR)
+ {
+ return err_code;
+ }
+
+ *ostr = str;
+
+ return M4NO_ERROR;
+}
+
+/**
+ ************************************************************************
+ * @brief This function replaces a string buffer by a new "C-String"
+ * and manage memory if needed
+ * @note
+ * @param pstr_src
+ * @param pac_in
+ * @return M4OSA_ERROR
+ ************************************************************************
+*/
+M4OSA_ERR M4OSA_strPrivSet(M4OSA_strStruct* str,
+ M4OSA_Char* pchar,
+ M4OSA_UInt32 ui32_length)
+{
+ M4OSA_UInt32 length;
+ M4OSA_Char* buffer;
+
+ M4OSA_TRACE2_3("M4OSA_strPrivSet\t\tM4OSA_strStruct* 0x%x\tM4OSA_Char* "
+ "0x%x\tM4OSA_UInt32 %d", str, pchar, ui32_length);
+
+ if(ui32_length != 0)
+ {
+ length = M4OSA_chrLength(pchar);
+
+ if(length < ui32_length)
+ {
+ ui32_length = length;
+ }
+
+ if(M4OSA_strPrivRealloc(str, ui32_length) != M4NO_ERROR)
+ {
+ M4OSA_DEBUG(M4ERR_ALLOC, "M4OSA_strPrivSet");
+
+ return M4ERR_ALLOC;
+ }
+
+ buffer = str->pui8_buffer;
+
+ /* Fill the actual M4OSA_String content */
+ M4OSA_memcpy(buffer, pchar, ui32_length);
+
+ buffer[ui32_length] = '\0';
+ }
+ else if(str->pui8_buffer != M4OSA_NULL)
+ {
+ str->pui8_buffer[0] = '\0';
+ }
+
+ str->ui32_length = ui32_length;
+
+ return M4NO_ERROR;
+}
+
+/**
+ ************************************************************************
+ * @brief This function replaces a string buffer by a new "C-String"
+ * and manage memory if needed
+ * @note
+ * @param pstr_src
+ * @param pac_in
+ * @return M4OSA_ERROR
+ ************************************************************************
+*/
+M4OSA_Int32 M4OSA_strPrivFindLastSubStr(M4OSA_strStruct* str1,
+ M4OSA_strStruct* str2,
+ M4OSA_UInt32 ui32_pos)
+{
+ M4OSA_Char *pchar;
+ M4OSA_Char *buffer1;
+ M4OSA_Char *buffer2;
+ M4OSA_Int32 i32_result;
+ M4OSA_UInt32 length1, length2;
+ M4OSA_Int32 dist;
+
+ M4OSA_TRACE2_3("M4OSA_strPrivFindLastSubStr\t\tM4OSA_strStruct* 0x%x\t"
+ "M4OSA_strStruct* 0x%x\tM4OSA_UInt32 %d",
+ str1, str2, ui32_pos);
+
+ length1 = str1->ui32_length;
+ length2 = str2->ui32_length;
+
+ if((length1 == 0) || (length2 == 0))
+ {
+ return -1;
+ }
+
+ buffer1 = str1->pui8_buffer;
+ buffer2 = str2->pui8_buffer;
+
+ dist = length1 - length2;
+
+ if(dist < 0)
+ {
+ return -1;
+ }
+
+ if((M4OSA_Int32)ui32_pos > dist)
+ {
+ ui32_pos = dist;
+ }
+
+ for(pchar = buffer1 + ui32_pos; pchar != buffer1; pchar--)
+ {
+ M4OSA_chrNCompare(pchar, buffer2, length2, &i32_result);
+
+ if(i32_result == 0)
+ {
+ return pchar - buffer1;
+ }
+ }
+
+ return -1;
+}
+
+/**
+ ************************************************************************
+ * @brief This function replaces a string buffer by a new "C-String"
+ * and manage memory if needed
+ * @note
+ * @param pstr_src
+ * @param pac_in
+ * @return M4OSA_ERROR
+ ************************************************************************
+ */
+M4OSA_ERR M4OSA_strPrivSetAndRepleceStr(M4OSA_strStruct* istr,
+ M4OSA_UInt32 ui32_pos,
+ M4OSA_UInt32 olength,
+ M4OSA_Char* nbuff,
+ M4OSA_UInt32 nlength)
+{
+ M4OSA_Char* buffer;
+ M4OSA_Char* ibuffer;
+ M4OSA_UInt32 ui32_length, ui32_size, ui32_lend, ui32_poso, ui32_posn;
+
+ M4OSA_TRACE2_5("M4OSA_strPrivSetAndRepleceStr\t\tM4OSA_strStruct* 0x%x\t"
+ "M4OSA_UInt32 %d\tM4OSA_UInt32 %d\tM4OSA_Char* 0x%x\t"
+ "M4OSA_UInt32 %d", istr, ui32_pos, olength, nbuff, nlength);
+
+ ui32_length = istr->ui32_length - olength + nlength;
+
+ ibuffer = istr->pui8_buffer;
+
+ /* string to replace has the same this that new string */
+ if(nlength == olength)
+ {
+ if(nlength == 0)
+ {
+ return M4NO_ERROR;
+ }
+
+ M4OSA_memcpy(ibuffer + ui32_pos, nbuff, nlength);
+ }
+ else
+ {
+ ui32_lend = istr->ui32_length - ui32_pos - olength;
+ ui32_poso = ui32_pos + olength;
+ ui32_posn = ui32_pos + nlength;
+
+ /* string to replace is bigger that new string */
+ if(nlength < olength)
+ {
+ if(nlength > 0)
+ {
+ M4OSA_memcpy(ibuffer + ui32_pos, nbuff, nlength);
+ }
+
+ if((olength - nlength) >= ui32_lend)
+ {
+ M4OSA_memcpy(ibuffer + ui32_posn, ibuffer + ui32_poso, ui32_lend);
+ }
+ else
+ {
+ buffer = (M4OSA_Char*)M4OSA_malloc(ui32_lend * sizeof(M4OSA_Char),
+ M4OSA_STRING, (M4OSA_Char*)"M4OSA_strPrivSetAndRepleceStr");
+
+ M4OSA_CHECK_MALLOC(buffer, "M4OSA_strPrivSetAndRepleceStr");
+ M4OSA_memcpy(buffer, ibuffer + ui32_poso, ui32_lend);
+ M4OSA_memcpy(ibuffer + ui32_posn, buffer, ui32_lend);
+ M4OSA_free((M4OSA_MemAddr32)buffer);
+ }
+ }
+ /* string to replace is smaller that new string */
+ else
+ {
+ ui32_size = istr->ui32_size;
+
+ /* check if there is enough memory allocated in istr */
+ if(ui32_length >= ui32_size)
+ {
+ if(ui32_size == 0)
+ {
+ ui32_size = 16;
+ }
+
+ while(ui32_length >= ui32_size)
+ {
+ ui32_size <<= 1;
+ }
+
+ buffer = (M4OSA_Char*)M4OSA_malloc(ui32_size * sizeof(M4OSA_Char),
+ M4OSA_STRING, (M4OSA_Char*)"M4OSA_strPrivSetAndRepleceStr");
+
+ M4OSA_CHECK_MALLOC(buffer, "M4OSA_strPrivSetAndRepleceStr");
+
+ M4OSA_memcpy(buffer, ibuffer, ui32_pos);
+
+ M4OSA_memcpy(buffer + ui32_pos, nbuff, nlength);
+
+ M4OSA_memcpy(buffer + ui32_posn, ibuffer + ui32_poso, ui32_lend);
+
+ M4OSA_free((M4OSA_MemAddr32)ibuffer);
+
+ istr->pui8_buffer = buffer;
+
+ istr->ui32_size = ui32_size;
+ }
+ else
+ {
+ buffer = (M4OSA_Char*)M4OSA_malloc(ui32_lend * sizeof(M4OSA_Char),
+ M4OSA_STRING, (M4OSA_Char*)"M4OSA_strPrivSetAndRepleceStr");
+
+ M4OSA_CHECK_MALLOC(buffer, "M4OSA_strPrivSetAndRepleceStr");
+
+ M4OSA_memcpy(buffer, ibuffer + ui32_poso, ui32_lend);
+
+ M4OSA_memcpy(ibuffer + ui32_pos, nbuff, nlength);
+
+ M4OSA_memcpy(ibuffer + ui32_posn, buffer, ui32_lend);
+
+ M4OSA_free((M4OSA_MemAddr32)buffer);
+ }
+ }
+ }
+
+
+ istr->pui8_buffer[ui32_length] = '\0';
+
+ istr->ui32_length = ui32_length;
+
+ return M4NO_ERROR;
+}
+
+/**
+ ************************************************************************
+ * @brief This function replaces a string buffer by a new "C-String"
+ * and manage memory if needed
+ * @note
+ * @param pstr_src
+ * @param pac_in
+ * @return M4OSA_ERROR
+ ************************************************************************
+ */
+M4OSA_ERR M4OSA_strPrivReplaceSameSizeStr(M4OSA_strStruct* istr,
+ M4OSA_strStruct* ostr,
+ M4OSA_strStruct* nstr,
+ M4OSA_strMode mode)
+{
+ M4OSA_Char* ibuffer;
+ M4OSA_Char* obuffer;
+ M4OSA_Char* nbuffer;
+ M4OSA_Char* ptr;
+ M4OSA_UInt32 ilength, nlength;
+ M4OSA_Int32 i32_pos;
+ M4OSA_ERR err_code;
+
+ M4OSA_TRACE2_4("M4OSA_strPrivReplaceSameSizeStr\t\tM4OSA_strStruct* 0x%x\t"
+ "M4OSA_strStruct* 0x%x\tM4OSA_strStruct* 0x%x\t"
+ "M4OSA_strMode %d", istr, ostr, nstr, mode);
+
+ ibuffer = istr->pui8_buffer;
+ obuffer = ostr->pui8_buffer;
+ nbuffer = nstr->pui8_buffer;
+
+ ilength = istr->ui32_length;
+ nlength = nstr->ui32_length;
+
+ if(mode != M4OSA_kstrEnd)
+ {
+ err_code = M4OSA_chrFindPattern(ibuffer, obuffer, &ptr);
+
+ M4OSA_DEBUG_IF2(M4OSA_ERR_IS_ERROR(err_code), err_code,
+ "M4OSA_strPrivReplaceSameSizeStr");
+
+ if(err_code == M4WAR_CHR_NOT_FOUND)
+ {
+ return M4WAR_STR_NOT_FOUND;
+ }
+
+ if(mode == M4OSA_kstrAll)
+ {
+ do
+ {
+ M4OSA_memcpy(ptr, nbuffer, nlength);
+
+ err_code = M4OSA_chrFindPattern(ptr+nlength, obuffer, &ptr);
+
+ M4OSA_DEBUG_IF2(M4OSA_ERR_IS_ERROR(err_code), err_code,
+ "M4OSA_strPrivReplaceSameSizeStr");
+
+ } while(err_code != M4WAR_CHR_NOT_FOUND);
+ }
+ else
+ {
+ M4OSA_memcpy(ptr, nbuffer, nlength);
+ }
+ }
+ else
+ {
+ i32_pos = M4OSA_strPrivFindLastSubStr(istr, ostr, ilength-1);
+
+ if(i32_pos < 0)
+ {
+ return M4WAR_STR_NOT_FOUND;
+ }
+
+ M4OSA_memcpy(ibuffer + i32_pos, nbuffer, nlength);
+ }
+
+
+ return M4NO_ERROR;
+}
+
+/**
+ ************************************************************************
+ * @brief This function replaces a string buffer by a new "C-String"
+ * and manage memory if needed
+ * @note
+ * @param pstr_src
+ * @param pac_in
+ * @return M4OSA_ERROR
+ ************************************************************************
+ */
+M4OSA_ERR M4OSA_strPrivReplaceSmallerStr(M4OSA_strStruct* istr,
+ M4OSA_strStruct* ostr,
+ M4OSA_strStruct* nstr,
+ M4OSA_strMode mode)
+{
+ M4OSA_Char* ibuffer;
+ M4OSA_Char* obuffer;
+ M4OSA_Char* nbuffer;
+ M4OSA_Char* buffer;
+ M4OSA_Char* ptr_src;
+ M4OSA_Char* ptr_dest;
+ M4OSA_UInt32 ilength, nlength, olength, size, length;
+ M4OSA_Int32 i32_pos;
+ M4OSA_ERR err_code;
+
+ M4OSA_TRACE2_4("M4OSA_strPrivReplaceSmallerStr\t\tM4OSA_strStruct* 0x%x\t"
+ "M4OSA_strStruct* 0x%x\tM4OSA_strStruct* 0x%x\t"
+ "M4OSA_strMode %d", istr, ostr, nstr, mode);
+
+ ibuffer = istr->pui8_buffer;
+ obuffer = ostr->pui8_buffer;
+ nbuffer = nstr->pui8_buffer;
+
+ ilength = istr->ui32_length;
+ olength = ostr->ui32_length;
+ nlength = nstr->ui32_length;
+
+ length = ilength;
+
+ if(mode == M4OSA_kstrAll)
+ {
+ err_code = M4OSA_chrFindPattern(ibuffer, obuffer, &ptr_src);
+
+ M4OSA_DEBUG_IF2(M4OSA_ERR_IS_ERROR(err_code), err_code,
+ "M4OSA_strPrivReplaceSameSizeStr");
+
+ if(err_code == M4WAR_CHR_NOT_FOUND)
+ {
+ return M4WAR_STR_NOT_FOUND;
+ }
+
+ /* Allocate the actual M4OSA_String content */
+ buffer = (M4OSA_Char*)M4OSA_malloc(istr->ui32_size * sizeof(M4OSA_Char),
+ M4OSA_STRING, (M4OSA_Char*)"M4OSA_strPrivReplaceSmallerStr");
+
+ M4OSA_CHECK_MALLOC(buffer, "M4OSA_strPrivReplaceSmallerStr");
+
+ ptr_dest = buffer;
+
+ do
+ {
+ size = (M4OSA_UInt32)ptr_src - (M4OSA_UInt32)ibuffer;
+
+ length += (nlength - olength);
+
+ M4OSA_memcpy(ptr_dest, ibuffer, size);
+
+ ptr_dest += size;
+
+ M4OSA_memcpy(ptr_dest, nbuffer, nlength);
+
+ ptr_dest += nlength;
+
+ ibuffer += (size + olength);
+
+ err_code = M4OSA_chrFindPattern(ibuffer, obuffer, &ptr_src);
+
+ M4OSA_DEBUG_IF2(M4OSA_ERR_IS_ERROR(err_code), err_code,
+ "M4OSA_strPrivReplaceSameSizeStr");
+
+ } while(err_code != M4WAR_CHR_NOT_FOUND);
+
+ size = ilength - (M4OSA_UInt32)(ibuffer - istr->pui8_buffer);
+
+ M4OSA_memcpy(ptr_dest, ibuffer, size);
+
+ M4OSA_free((M4OSA_MemAddr32)istr->pui8_buffer);
+
+ istr->ui32_length = length ;
+
+ buffer[length] = '\0';
+
+ istr->pui8_buffer = buffer;
+ }
+ else
+ {
+ if(mode == M4OSA_kstrBegin)
+ {
+ err_code = M4OSA_chrFindPattern(ibuffer, obuffer, &ptr_src);
+
+ M4OSA_DEBUG_IF2(M4OSA_ERR_IS_ERROR(err_code), err_code,
+ "M4OSA_strPrivReplaceSameSizeStr");
+
+ if(err_code == M4WAR_CHR_NOT_FOUND)
+ {
+ return M4WAR_STR_NOT_FOUND;
+ }
+
+ i32_pos = (M4OSA_UInt32)ptr_src - (M4OSA_UInt32)ibuffer;
+ }
+ else
+ {
+ i32_pos = M4OSA_strPrivFindLastSubStr(istr, ostr, ilength-1);
+
+ if(i32_pos == -1)
+ {
+ return M4WAR_STR_NOT_FOUND;
+ }
+ }
+
+ err_code = M4OSA_strPrivSetAndRepleceStr(istr, i32_pos, olength,
+ nbuffer, nlength);
+
+ if(M4OSA_ERR_IS_ERROR(err_code))
+ {
+ M4OSA_DEBUG(err_code, "M4OSA_strPrivReplaceSmallerStr");
+
+ return err_code;
+ }
+ }
+
+ return M4NO_ERROR;
+}
+
+/**
+ ************************************************************************
+ * @brief This function replaces a string buffer by a new "C-String"
+ * and manage memory if needed
+ * @note
+ * @param pstr_src
+ * @param pac_in
+ * @return M4OSA_ERROR
+ ************************************************************************
+ */
+M4OSA_ERR M4OSA_strPrivReplaceBiggerStr(M4OSA_strStruct* istr,
+ M4OSA_strStruct* ostr,
+ M4OSA_strStruct* nstr,
+ M4OSA_strMode mode)
+{
+ M4OSA_Char* ibuffer;
+ M4OSA_Char* obuffer;
+ M4OSA_Char* nbuffer;
+ M4OSA_Char* buffer;
+ M4OSA_Char* ptr;
+ M4OSA_UInt32 ilength, nlength, olength, length;
+ M4OSA_Int32 i32_pos;
+ M4OSA_ERR err_code;
+
+ M4OSA_TRACE2_4("M4OSA_strPrivReplaceBiggerStr\t\tM4OSA_strStruct* 0x%x\t"
+ "M4OSA_strStruct* 0x%x\tM4OSA_strStruct* 0x%x\t"
+ "M4OSA_strMode %d", istr, ostr, nstr, mode);
+
+ ibuffer = istr->pui8_buffer;
+ obuffer = ostr->pui8_buffer;
+ nbuffer = nstr->pui8_buffer;
+
+ ilength = istr->ui32_length;
+ olength = ostr->ui32_length;
+ nlength = nstr->ui32_length;
+
+
+ if(mode == M4OSA_kstrAll)
+ {
+ M4OSA_UInt32 n=0, i;
+ M4OSA_Int32* patterns;
+ M4OSA_UInt32 pos=0, size;
+ M4OSA_UInt32 max_pattern = ilength / olength;
+ M4OSA_UInt32 ui32_size = istr->ui32_size;
+ M4OSA_Char* src;
+ M4OSA_Char* dest;
+
+ /* Allocate the actual M4OSA_String content */
+ patterns = (M4OSA_Int32*)M4OSA_malloc(max_pattern * sizeof(M4OSA_UInt32),
+ M4OSA_STRING, (M4OSA_Char*)"M4OSA_strPrivReplaceBiggerStr");
+
+ M4OSA_CHECK_MALLOC(patterns, (M4OSA_Char*)"M4OSA_strPrivReplaceBiggerStr");
+
+
+ err_code = M4OSA_chrFindPattern(ibuffer, obuffer, &ptr);
+
+ M4OSA_DEBUG_IF2(M4OSA_ERR_IS_ERROR(err_code), err_code,
+ "M4OSA_strPrivReplaceBiggerStr");
+
+ if(err_code == M4WAR_CHR_NOT_FOUND)
+ {
+ return M4WAR_STR_NOT_FOUND;
+ }
+
+ do
+ {
+ patterns[n] = (M4OSA_UInt32)ptr - (M4OSA_UInt32)ibuffer;
+
+ n++;
+
+ err_code = M4OSA_chrFindPattern(ptr + olength, obuffer, &ptr);
+
+ M4OSA_DEBUG_IF2(M4OSA_ERR_IS_ERROR(err_code), err_code,
+ "M4OSA_strPrivReplaceBiggerStr");
+
+ } while(err_code != M4WAR_CHR_NOT_FOUND);
+
+ length = ilength - (n * olength) + (n * nlength);
+
+
+ if(length >= ui32_size)
+ {
+ do
+ {
+ ui32_size <<= 1;
+
+ } while(length >= ui32_size);
+ }
+
+ /* Allocate the actual M4OSA_String content */
+ buffer = (M4OSA_Char*)M4OSA_malloc(ui32_size * sizeof(M4OSA_Char),
+ M4OSA_STRING, (M4OSA_Char*)"M4OSA_strPrivReplaceBiggerStr");
+
+ M4OSA_CHECK_MALLOC(buffer, "M4OSA_strPrivReplaceBiggerStr");
+
+ src = ibuffer;
+ dest = buffer;
+
+ for(i=0; i<n; i++)
+ {
+ size = patterns[i] - pos;
+
+ M4OSA_memcpy(dest, src, size);
+
+ pos = patterns[i] + olength;
+
+ src = ibuffer + pos;
+
+ dest += size;
+
+ M4OSA_memcpy(dest, nbuffer, nlength);
+
+ dest += nlength;
+ }
+
+ size = ilength - (M4OSA_UInt32)(src - ibuffer);
+
+ M4OSA_memcpy(dest, src, size);
+
+ M4OSA_free((M4OSA_MemAddr32)patterns);
+
+ M4OSA_free((M4OSA_MemAddr32)ibuffer);
+
+ istr->ui32_length = length;
+
+ istr->pui8_buffer = buffer;
+
+ istr->pui8_buffer[length] = '\0';
+ }
+ else
+ {
+ if(mode == M4OSA_kstrBegin)
+ {
+ err_code = M4OSA_chrFindPattern(ibuffer, obuffer, &ptr);
+
+ M4OSA_DEBUG_IF2(M4OSA_ERR_IS_ERROR(err_code), err_code,
+ "M4OSA_strPrivReplaceSameSizeStr");
+
+ if(err_code == M4WAR_CHR_NOT_FOUND)
+ {
+ return M4WAR_STR_NOT_FOUND;
+ }
+
+ i32_pos = (M4OSA_UInt32)ptr - (M4OSA_UInt32)ibuffer;
+ }
+ else
+ {
+ i32_pos = M4OSA_strPrivFindLastSubStr(istr, ostr, ilength-1);
+
+ if(i32_pos == -1)
+ {
+ return M4WAR_STR_NOT_FOUND;
+ }
+ }
+
+ err_code = M4OSA_strPrivSetAndRepleceStr(istr, i32_pos, olength,
+ nbuffer, nlength);
+
+ if(M4OSA_ERR_IS_ERROR(err_code))
+ {
+ M4OSA_DEBUG(err_code, "M4OSA_strPrivReplaceSmallerStr");
+
+ return err_code;
+ }
+ }
+
+ return M4NO_ERROR;
+}
+
+
+M4OSA_ERR M4OSA_strPrivSPrintf(M4OSA_strStruct* str,
+ M4OSA_Char *format,
+ va_list marker)
+{
+ M4OSA_Char *temp;
+ M4OSA_Char *percentPointer;
+ M4OSA_Char *newFormat;
+ M4OSA_Char* strOut = str->pui8_buffer + str->ui32_length;
+ M4OSA_UInt32 strOutMaxLen = str->ui32_size-1;
+ M4OSA_Int32 newFormatLength = 0;
+ M4OSA_UInt32 count_ll = 0;
+ M4OSA_UInt32 count_tm = 0;
+ M4OSA_UInt32 count_aa = 0;
+ M4OSA_UInt32 count;
+ M4OSA_UInt32 nbChar;
+ M4OSA_Int32 iResult;
+
+ M4OSA_Int32 err;
+ M4OSA_Char flagChar[] = "'-+ #0";
+ M4OSA_Char widthOrPrecisionChar[] = "*0123456789";
+ M4OSA_Char otherPrefixChar[] = "hlL";
+ M4OSA_Char conversionChar[] = "diouxXnfeEgGcCsSp%";
+
+ M4OSA_TRACE2_2("M4OSA_strSPrintf\t\tM4OSA_String 0x%x\tM4OSA_Char* 0x%x",
+ str, format);
+
+
+ /* count the number of %[flags][width][.precision]ll[conversion] */
+ temp = format;
+
+ while(*temp)
+ {
+ /* get the next percent character */
+ err = M4OSA_chrFindChar (temp, '%', &percentPointer);
+
+ if((!percentPointer) || (M4WAR_CHR_NOT_FOUND == err))
+ {
+ break; /* "This is the End", (c) J. Morrisson */
+ }
+
+ temp = percentPointer+1; /* span it */
+ if(!*temp) /* "This is the End", (c) J. Morrisson */
+ {
+ break;
+ }
+
+ /* span the optional flags */
+ M4OSA_chrSpan(format, conversionChar, &nbChar);
+ temp += nbChar;
+
+ if(!*temp) /* "This is the End", (c) J. Morrisson */
+ {
+ break;
+ }
+
+ /* span the optional width */
+ M4OSA_chrSpan(temp, widthOrPrecisionChar, &nbChar);
+ temp += nbChar;
+ if(!*temp) /* "This is the End", (c) J. Morrisson */
+ {
+ break;
+ }
+
+ if(*temp=='.')
+ {
+ /* span the optional precision */
+ M4OSA_chrSpan(++temp, widthOrPrecisionChar, &nbChar);
+ temp += nbChar;
+ }
+ if(!*temp) /* "This is the End", (c) J. Morrisson */
+ {
+ break;
+ }
+
+ if(M4OSA_chrLength(temp)>=2)
+ {
+
+ M4OSA_chrNCompare(temp, (M4OSA_Char*)"ll",2, &iResult);
+ if (iResult != 0)
+ {
+ count_ll++; /* I got ONE */
+ temp +=2; /* span the "ll" prefix */
+ }
+ else
+ {
+ M4OSA_chrNCompare(temp, (M4OSA_Char*)"tm",2, &iResult);
+ if (iResult != 0) /* à voir si ce n'est pas == 0 */
+ {
+ count_tm++;
+ temp +=2;
+ }
+ else
+ {
+ M4OSA_chrNCompare(temp, (M4OSA_Char*)"aa",2, &iResult);
+ if (iResult != 0) /* à voir si ce n'est pas == 0 */
+ {
+ count_aa++;
+ temp +=2;
+ }
+ }
+ }
+ }
+
+ /* span the other optional prefix */
+ M4OSA_chrSpan(temp, otherPrefixChar, &nbChar);
+ temp += nbChar;
+ if(!*temp) /* "This is the End", (c) J. Morrisson */
+ {
+ break;
+ }
+
+ M4OSA_chrSpan(temp, conversionChar, &nbChar);
+ temp += nbChar;
+ if(!*temp) /* "This is the End", (c) J. Morrisson */
+ {
+ break;
+ }
+
+ }
+
+ count = count_ll + count_tm + count_aa;
+
+ if(!count)
+ {
+ err = M4OSA_chrSPrintf(strOut,strOutMaxLen,format,marker);
+
+ if(M4ERR_CHR_STR_OVERFLOW == err)
+ {
+ return M4ERR_STR_OVERFLOW;
+ }
+
+ return M4NO_ERROR;
+ }
+
+
+ newFormatLength = M4OSA_chrLength(format) + 1;
+
+#ifdef M4OSA_64BITS_SUPPORTED
+#ifdef M4OSA_FILE_POS_64_BITS_SUPPORTED
+ newFormatLength += (count_ll+count_tm+count_aa);
+#else
+ newFormatLength += (count_ll+count_tm-count_aa);
+#endif
+#elif defined M4OSA_64BITS_NOT_SUPPORTED
+ newFormatLength -= (count_ll+count_tm+count_aa);
+#else
+ return M4ERR_NOT_IMPLEMENTED;
+#endif
+
+ newFormat =(M4OSA_Char*)M4OSA_malloc(newFormatLength,
+ M4OSA_CHARSTAR, (M4OSA_Char*)"M4OSA_chrPrintf: newFormat");
+ if(newFormat == M4OSA_NULL) return M4ERR_ALLOC;
+ newFormat[newFormatLength-1] = '\0';
+ temp = newFormat;
+ /* copy format to newFormat, replacing
+ %[flags][width][.precision]ll[conversion]
+ by %[flags][width][.precision]I64[conversion] */
+ while(*format)
+ {
+ M4OSA_chrSpanComplement(format, (M4OSA_Char*)"%", &nbChar);
+ if(nbChar)
+ {
+ M4OSA_chrNCopy(temp,format,nbChar); /* copy characters before the % character */
+ format +=nbChar;
+ temp +=nbChar;
+ }
+ if(!*format)
+ {
+ break;
+ }
+ *temp++ = *format++; /* copy the % character */
+
+ M4OSA_chrSpan(format, flagChar, &nbChar);
+ if(nbChar)
+ {
+ M4OSA_chrNCopy(temp,format,nbChar); /* copy the flag characters */
+ format +=nbChar;
+ temp +=nbChar;
+ }
+ if(!*format)
+ {
+ break;
+ }
+
+ M4OSA_chrSpan(format, widthOrPrecisionChar, &nbChar);
+ if(nbChar)
+ {
+ M4OSA_chrNCopy(temp,format,nbChar); /* copy the width characters */
+ format +=nbChar;
+ temp +=nbChar;
+ }
+ if(!*format)
+ {
+ break;
+ }
+ if(*format=='.')
+ {
+ *temp++ = *format++; /* copy the dot character */
+ if(!*format)
+ {
+ break;
+ }
+
+ M4OSA_chrSpan(format, widthOrPrecisionChar, &nbChar);
+ if(nbChar)
+ {
+ M4OSA_chrNCopy(temp,format,nbChar); /* copy the width characters */
+ format +=nbChar;
+ temp +=nbChar;
+ }
+ if(!*format)
+ {
+ break;
+ }
+ }
+ if(M4OSA_chrLength(format)>=2)
+ {
+
+ M4OSA_chrNCompare(format, (M4OSA_Char*)"ll",2, &iResult);
+ if (iResult != 0)
+ {
+#ifdef M4OSA_64BITS_SUPPORTED
+ *temp++ = 'I'; /* %I64 */
+ *temp++ = '6';
+ *temp++ = '4';
+#else
+ *temp++ = 'l'; /* %l */
+#endif
+ format +=2; /* span the "ll" prefix */
+ }
+ else
+ {
+ M4OSA_chrNCompare(format, (M4OSA_Char*)"tm",2, &iResult);
+ if (iResult != 0)
+ {
+#ifdef M4OSA_64BITS_SUPPORTED
+ *temp++ = 'I'; /* %I64 */
+ *temp++ = '6';
+ *temp++ = '4';
+#else
+ *temp++ = 'l'; /* %l */
+#endif
+ format +=2; /* span the "tm" prefix */
+ }
+ else
+ {
+ M4OSA_chrNCompare(format, (M4OSA_Char*)"aa",2, &iResult);
+ if (iResult != 0) /* à voir si ce n'est pas != 0 */
+ {
+#ifdef M4OSA_64BITS_SUPPORTED
+#ifdef M4OSA_FILE_POS_64_BITS_SUPPORTED
+ *temp++ = 'I'; /* %I64 */
+ *temp++ = '6';
+ *temp++ = '4';
+#else
+ *temp++ = 'l';
+#endif
+#else
+ *temp++ = 'l';
+#endif
+ format +=2; /* span the "aa" prefix */
+ }
+ }
+ }
+ }
+
+ M4OSA_chrSpan(format, otherPrefixChar, &nbChar);
+
+ if(nbChar)
+ {
+ M4OSA_chrNCopy(temp,format,nbChar); /* copy the other Prefix */
+ format +=nbChar;
+ temp +=nbChar;
+ }
+
+ if(!*format)
+ {
+ break;
+ }
+
+ M4OSA_chrSpan(format, conversionChar, &nbChar);
+ if(nbChar)
+ {
+ M4OSA_chrNCopy(temp,format,nbChar);
+ format += nbChar;
+ temp += nbChar;
+ }
+
+ if(!*format)
+ {
+ break;
+ }
+ }
+
+ err = M4OSA_chrSPrintf(strOut,strOutMaxLen,newFormat,marker);
+
+ M4OSA_free((M4OSA_MemAddr32)newFormat);
+
+ if (M4ERR_CHR_STR_OVERFLOW == err)
+ {
+ return M4ERR_STR_OVERFLOW;
+ }
+ else
+ {
+ return M4NO_ERROR;
+ }
+}
+