|
|
| version 1.1.1.1, 2011/06/08 07:09:12 | version 1.1.1.2, 2012/02/17 12:50:03 |
|---|---|
| Line 1504 char * __axl_stream_get_untilv_wide (axlStream * strea | Line 1504 char * __axl_stream_get_untilv_wide (axlStream * strea |
| } | } |
| /* in the case a memory chunk is being read */ | /* in the case a memory chunk is being read */ |
| if (stream->accept_terminator) | if (stream->accept_terminator) { |
| stream->stream_index += length; | stream->stream_index += length; |
| stream->global_index += length; | |
| } | |
| stream->stream_index += index; | stream->stream_index += index; |
| stream->global_index += index; | stream->global_index += index; |
| stream->previous_inspect = 0; | stream->previous_inspect = 0; |
| Line 2424 char * axl_stream_strdup_n (const char * chunk, i | Line 2426 char * axl_stream_strdup_n (const char * chunk, i |
| */ | */ |
| int axl_stream_vprintf_len (const char * format, va_list args) | int axl_stream_vprintf_len (const char * format, va_list args) |
| { | { |
| /** IMPLEMENTATION NOTE: in the case this code is update, | |
| * update exarg_vprintf_len **/ | |
| #if defined (AXL_OS_WIN32) && ! defined (__GNUC__) | #if defined (AXL_OS_WIN32) && ! defined (__GNUC__) |
| # if HAVE_VSCPRINTF | # if HAVE_VSCPRINTF |
| if (format == NULL) | if (format == NULL) |
| Line 2597 char * axl_stream_strdup_printf (const char * c | Line 2602 char * axl_stream_strdup_printf (const char * c |
| * | * |
| * @return A newly allocated string. | * @return A newly allocated string. |
| * | * |
| * IMPLEMENTATION NOTE: This function have a fundamental bug due to | * IMPLEMENTATION NOTE: This function may have a fundamental bug due |
| * the design of va_list arguments under amd64 platforms. In short, a | * to the design of va_list arguments under amd64 platforms. In short, |
| * function receiving a va_list argument can't use it twice. In you | * a function receiving a va_list argument can't use it twice. In you |
| * are running amd64, check your axl_config.h did find | * are running amd64, check your axl_config.h did find |
| * AXL_HAVE_VASPRINTF. | * AXL_HAVE_VASPRINTF. |
| */ | */ |
| char * axl_stream_strdup_printfv (const char * chunk, va_list args) | char * axl_stream_strdup_printfv (const char * chunk, va_list args) |
| { | { |
| Line 2612 char * axl_stream_strdup_printfv (const char * chu | Line 2617 char * axl_stream_strdup_printfv (const char * chu |
| int size; | int size; |
| #endif | #endif |
| char * result = NULL; | char * result = NULL; |
| int new_size = -1; | |
| axl_return_val_if_fail (chunk, NULL); | axl_return_val_if_fail (chunk, NULL); |
| #ifdef AXL_HAVE_VASPRINTF | #ifdef AXL_HAVE_VASPRINTF |
| /* do the operation using the GNU extension */ | /* do the operation using the GNU extension */ |
| new_size = vasprintf (&result, chunk, args); | if (vasprintf (&result, chunk, args) == -1) |
| return NULL; | |
| #else | #else |
| /* get the amount of memory to be allocated */ | /* get the amount of memory to be allocated */ |
| size = axl_stream_vprintf_len (chunk, args); | size = axl_stream_vprintf_len (chunk, args); |
| Line 2634 char * axl_stream_strdup_printfv (const char * chu | Line 2639 char * axl_stream_strdup_printfv (const char * chu |
| /* copy current size */ | /* copy current size */ |
| # if defined(AXL_OS_WIN32) && ! defined (__GNUC__) | # if defined(AXL_OS_WIN32) && ! defined (__GNUC__) |
| new_size = _vsnprintf_s (result, size + 1, size, chunk, args); | _vsnprintf_s (result, size + 1, size, chunk, args); |
| # else | # else |
| new_size = vsnprintf (result, size + 1, chunk, args); | vsnprintf (result, size + 1, chunk, args); |
| # endif | # endif |
| #endif | #endif |
| /* return the result */ | /* return the result */ |
| Line 3001 char * axl_stream_join (char ** s | Line 3006 char * axl_stream_join (char ** s |
| /* return string created */ | /* return string created */ |
| return result; | return result; |
| } | |
| /** | |
| * @brief Allows to replace the provided string by the provided | |
| * replacement on the provided source string, doing the replacement in | |
| * an effective manner. | |
| * | |
| * @param source The source string where to look and replace. The | |
| * result will be reported as a new pointer on this parameter. The | |
| * function will dealloc previous string (passed in source). | |
| * | |
| * @param source_len The replace function can handle binary | |
| * strings. This parameter signals the function how many bytes are | |
| * found on the source pointer. | |
| * | |
| * @param string The string that will be looked for replacement. The | |
| * string can be binary data but its length must be configured. | |
| * | |
| * @param string_len String length or -1. The string parameter can be | |
| * binary data (may include \0) but length must be especified. If -1 | |
| * is provided, the function will use strlen () to get current string | |
| * size. | |
| * | |
| * @param replacement The replace string. The replacement can be | |
| * binary data but its length must be configured. | |
| * | |
| * @param replacement_len Replacement string length or -1. The | |
| * replacement parameter can be binary data (may include \0) but | |
| * length must be especified. If -1 is provided, the function will use | |
| * strlen () to get current string size. | |
| * | |
| * @return The function returns the new size of the string. The | |
| * function returns the same source length when no replacement was | |
| * done. The function return source_len in the case some argument is NULL. | |
| */ | |
| int axl_stream_replace (char ** source, int source_len, | |
| const char * string, int string_len, | |
| const char * replacement, int replacement_len) | |
| { | |
| int iterator; | |
| int iterator2; | |
| int count; | |
| char * result; | |
| int old_source_len; | |
| /* check arguments */ | |
| axl_return_val_if_fail (source && string && replacement, source_len); | |
| /* get sizes if not configured */ | |
| if (source_len == -1) | |
| source_len = strlen (*source); | |
| if (string_len == -1) | |
| string_len = strlen (string); | |
| if (replacement_len == -1) | |
| replacement_len = strlen (replacement); | |
| /* find how many strings must be replaced */ | |
| iterator = 0; | |
| count = 0; | |
| while ((iterator + string_len - 1) < source_len) { | |
| /* check if the string is found */ | |
| if (axl_memcmp ((*source) + iterator, string, string_len)) { | |
| /* string found ! */ | |
| count++; | |
| /* skip these bytes */ | |
| iterator += string_len; | |
| continue; | |
| } | |
| /* next position */ | |
| iterator++; | |
| } /* end while */ | |
| /* check if we have found some to replace */ | |
| if (count == 0) | |
| return source_len; | |
| /* update source length */ | |
| old_source_len = source_len; | |
| source_len = source_len - (string_len * count) + (replacement_len * count); | |
| /* alloc memory for the replacement */ | |
| result = axl_new (char, source_len + 1); | |
| /* do replacement */ | |
| iterator = 0; | |
| iterator2 = 0; | |
| while (iterator < old_source_len) { | |
| /* check if the string is found */ | |
| if (((iterator + string_len - 1) < old_source_len) && axl_memcmp ((*source) + iterator, string, string_len)) { | |
| /* string found!, replace */ | |
| memcpy (result + iterator2, replacement, replacement_len); | |
| /* skip these bytes */ | |
| iterator += string_len; | |
| iterator2 += replacement_len; | |
| continue; | |
| } | |
| /* copy byte by byte */ | |
| result[iterator2] = (*source)[iterator]; | |
| /* next position */ | |
| iterator++; | |
| iterator2++; | |
| } /* end while */ | |
| /* release and report new string */ | |
| axl_free (*source); | |
| *source = result; | |
| return source_len; | |
| } | } |
| /** | /** |