Update comments
This commit is contained in:
1 parent
9baca84825
commit
530cc8d2a2
1 file changed
+28
-6
+28
-6
@@ -261,7 +261,7 @@ m_string_reset(m_string_t v)
|
|||||||
M_STR1NG_CONTRACT (v);
|
M_STR1NG_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Return the selected character of the string */
|
/* Return the selected byte-character of the string */
|
||||||
static inline char
|
static inline char
|
||||||
m_string_get_char(const m_string_t v, size_t index)
|
m_string_get_char(const m_string_t v, size_t index)
|
||||||
{
|
{
|
||||||
@@ -270,7 +270,7 @@ m_string_get_char(const m_string_t v, size_t index)
|
|||||||
return m_string_get_cstr(v)[index];
|
return m_string_get_cstr(v)[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Set the selected character of the string */
|
/* Set the selected byte-character of the string */
|
||||||
static inline void
|
static inline void
|
||||||
m_string_set_char(m_string_t v, size_t index, const char c)
|
m_string_set_char(m_string_t v, size_t index, const char c)
|
||||||
{
|
{
|
||||||
@@ -304,11 +304,13 @@ m_str1ng_fit2size (m_string_t v, size_t size_alloc)
|
|||||||
// for very short constant strings.
|
// for very short constant strings.
|
||||||
M_ASSUME(old_alloc >= sizeof (m_str1ng_heap_ct) - 1);
|
M_ASSUME(old_alloc >= sizeof (m_str1ng_heap_ct) - 1);
|
||||||
if (M_UNLIKELY (size_alloc > old_alloc)) {
|
if (M_UNLIKELY (size_alloc > old_alloc)) {
|
||||||
|
// Insufficient current allocation to store the new string
|
||||||
|
// Perform an allocation on the heap.
|
||||||
size_t alloc = size_alloc + size_alloc / 2;
|
size_t alloc = size_alloc + size_alloc / 2;
|
||||||
if (M_UNLIKELY (alloc <= old_alloc)) {
|
if (M_UNLIKELY (alloc <= old_alloc)) {
|
||||||
/* Overflow in alloc computation */
|
/* Overflow in alloc computation */
|
||||||
M_MEMORY_FULL(sizeof (char) * alloc);
|
M_MEMORY_FULL(sizeof (char) * alloc);
|
||||||
// NOTE: Return is broken...
|
// NOTE: Return is currently broken.
|
||||||
abort();
|
abort();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -319,14 +321,18 @@ m_str1ng_fit2size (m_string_t v, size_t size_alloc)
|
|||||||
abort();
|
abort();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
// The pointer cannot be the stack buffer of the string.
|
||||||
|
// as it is heap allocated
|
||||||
M_ASSERT(ptr != &v->u.stack.buffer[0]);
|
M_ASSERT(ptr != &v->u.stack.buffer[0]);
|
||||||
if (m_str1ng_stack_p(v)) {
|
if (m_str1ng_stack_p(v)) {
|
||||||
|
// The string was stack allocated.
|
||||||
/* Copy the stack allocation into the new heap allocation */
|
/* Copy the stack allocation into the new heap allocation */
|
||||||
const size_t size = (size_t) v->u.stack.buffer[sizeof (m_str1ng_heap_ct) - 1] + 1U;
|
const size_t size = (size_t) v->u.stack.buffer[sizeof (m_str1ng_heap_ct) - 1] + 1U;
|
||||||
M_ASSERT( size <= alloc);
|
M_ASSERT( size <= alloc);
|
||||||
M_ASSERT( size <= sizeof (v->u.stack.buffer)-1);
|
M_ASSERT( size <= sizeof (v->u.stack.buffer)-1);
|
||||||
memcpy(ptr, &v->u.stack.buffer[0], size);
|
memcpy(ptr, &v->u.stack.buffer[0], size);
|
||||||
}
|
}
|
||||||
|
// The string cannot be stack allocated anymore.
|
||||||
v->ptr = ptr;
|
v->ptr = ptr;
|
||||||
v->u.heap.alloc = alloc;
|
v->u.heap.alloc = alloc;
|
||||||
return ptr;
|
return ptr;
|
||||||
@@ -335,7 +341,8 @@ m_str1ng_fit2size (m_string_t v, size_t size_alloc)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Modify the string capacity to be able to handle at least 'alloc'
|
/* Modify the string capacity to be able to handle at least 'alloc'
|
||||||
characters (including final nul char) */
|
characters (including final nul char).
|
||||||
|
It may reduce the allocation of the string if possible */
|
||||||
static inline void
|
static inline void
|
||||||
m_string_reserve(m_string_t v, size_t alloc)
|
m_string_reserve(m_string_t v, size_t alloc)
|
||||||
{
|
{
|
||||||
@@ -361,6 +368,8 @@ m_string_reserve(m_string_t v, size_t alloc)
|
|||||||
} else {
|
} else {
|
||||||
// Allocation cannot fit in the stack space
|
// Allocation cannot fit in the stack space
|
||||||
// Need to allocate in heap space
|
// Need to allocate in heap space
|
||||||
|
// If the string is stack allocated, v->ptr is NULL
|
||||||
|
// and it will therefore perform the initial allocation
|
||||||
char *ptr = M_MEMORY_REALLOC (char, v->ptr, alloc);
|
char *ptr = M_MEMORY_REALLOC (char, v->ptr, alloc);
|
||||||
if (M_UNLIKELY (ptr == NULL) ) {
|
if (M_UNLIKELY (ptr == NULL) ) {
|
||||||
M_MEMORY_FULL(sizeof (char) * alloc);
|
M_MEMORY_FULL(sizeof (char) * alloc);
|
||||||
@@ -386,6 +395,7 @@ m_string_set_str(m_string_t v, const char str[])
|
|||||||
M_ASSERT(str != NULL);
|
M_ASSERT(str != NULL);
|
||||||
size_t size = strlen(str);
|
size_t size = strlen(str);
|
||||||
char *ptr = m_str1ng_fit2size(v, size+1);
|
char *ptr = m_str1ng_fit2size(v, size+1);
|
||||||
|
// The memcpy will also copy the final null char of the string
|
||||||
memcpy(ptr, str, size+1);
|
memcpy(ptr, str, size+1);
|
||||||
m_str1ng_set_size(v, size);
|
m_str1ng_set_size(v, size);
|
||||||
M_STR1NG_CONTRACT (v);
|
M_STR1NG_CONTRACT (v);
|
||||||
@@ -400,6 +410,7 @@ m_string_set_strn(m_string_t v, const char str[], size_t n)
|
|||||||
size_t len = strlen(str);
|
size_t len = strlen(str);
|
||||||
size_t size = M_MIN (len, n);
|
size_t size = M_MIN (len, n);
|
||||||
char *ptr = m_str1ng_fit2size(v, size+1);
|
char *ptr = m_str1ng_fit2size(v, size+1);
|
||||||
|
// The memcpy will not copy the final null char of the string
|
||||||
memcpy(ptr, str, size);
|
memcpy(ptr, str, size);
|
||||||
ptr[size] = 0;
|
ptr[size] = 0;
|
||||||
m_str1ng_set_size(v, size);
|
m_str1ng_set_size(v, size);
|
||||||
@@ -430,6 +441,7 @@ m_string_set_n(m_string_t v, const m_string_t ref, size_t offset, size_t length)
|
|||||||
M_ASSERT_INDEX (offset, m_string_size(ref) + 1);
|
M_ASSERT_INDEX (offset, m_string_size(ref) + 1);
|
||||||
size_t size = M_MIN (m_string_size(ref) - offset, length);
|
size_t size = M_MIN (m_string_size(ref) - offset, length);
|
||||||
char *ptr = m_str1ng_fit2size(v, size+1);
|
char *ptr = m_str1ng_fit2size(v, size+1);
|
||||||
|
// v may be equal to ref, so a memmove is needed instead of a memcpy
|
||||||
memmove(ptr, m_string_get_cstr(ref) + offset, size);
|
memmove(ptr, m_string_get_cstr(ref) + offset, size);
|
||||||
ptr[size] = 0;
|
ptr[size] = 0;
|
||||||
m_str1ng_set_size(v, size);
|
m_str1ng_set_size(v, size);
|
||||||
@@ -473,6 +485,8 @@ m_string_swap(m_string_t v1, m_string_t v2)
|
|||||||
{
|
{
|
||||||
M_STR1NG_CONTRACT (v1);
|
M_STR1NG_CONTRACT (v1);
|
||||||
M_STR1NG_CONTRACT (v2);
|
M_STR1NG_CONTRACT (v2);
|
||||||
|
// Even if it is stack based, we swap the heap representation
|
||||||
|
// which alias the stack based
|
||||||
M_SWAP (size_t, v1->u.heap.size, v2->u.heap.size);
|
M_SWAP (size_t, v1->u.heap.size, v2->u.heap.size);
|
||||||
M_SWAP (size_t, v1->u.heap.alloc, v2->u.heap.alloc);
|
M_SWAP (size_t, v1->u.heap.alloc, v2->u.heap.alloc);
|
||||||
M_SWAP (char *, v1->ptr, v2->ptr);
|
M_SWAP (char *, v1->ptr, v2->ptr);
|
||||||
@@ -490,7 +504,7 @@ m_string_move(m_string_t v1, m_string_t v2)
|
|||||||
m_string_init_move(v1,v2);
|
m_string_init_move(v1,v2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Push the character 'c' in the string 'v' */
|
/* Push the byte-character 'c' in the string 'v' */
|
||||||
static inline void
|
static inline void
|
||||||
m_string_push_back (m_string_t v, char c)
|
m_string_push_back (m_string_t v, char c)
|
||||||
{
|
{
|
||||||
@@ -1706,7 +1720,11 @@ m_string_it_set(m_string_it_t it, const m_string_it_t itsrc)
|
|||||||
it->u = itsrc->u;
|
it->u = itsrc->u;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Test if the iterator has reached the end of the string */
|
/* Test if the iterator has reached the end of the string.
|
||||||
|
As it is where we perform the UTF8 decoding, the user
|
||||||
|
needs to call this function at least once before any other
|
||||||
|
function, which is normally the case as the user shall test
|
||||||
|
if the stream is not empty before reading it. */
|
||||||
static inline bool
|
static inline bool
|
||||||
m_string_end_p (m_string_it_t it)
|
m_string_end_p (m_string_it_t it)
|
||||||
{
|
{
|
||||||
@@ -1720,7 +1738,9 @@ m_string_end_p (m_string_it_t it)
|
|||||||
m_str1ng_utf8_decode(*str, &state, &u);
|
m_str1ng_utf8_decode(*str, &state, &u);
|
||||||
str++;
|
str++;
|
||||||
} while (state != M_STR1NG_UTF8_STARTING && state != M_STR1NG_UTF8_ERROR && *str != 0);
|
} while (state != M_STR1NG_UTF8_STARTING && state != M_STR1NG_UTF8_ERROR && *str != 0);
|
||||||
|
// Save where the current unicode value ends in the UTF8 steam
|
||||||
it->next_ptr = str;
|
it->next_ptr = str;
|
||||||
|
// Save the decoded unicode value
|
||||||
it->u = M_UNLIKELY (state == M_STR1NG_UTF8_ERROR) ? M_STRING_UNICODE_ERROR : u;
|
it->u = M_UNLIKELY (state == M_STR1NG_UTF8_ERROR) ? M_STRING_UNICODE_ERROR : u;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -1740,6 +1760,8 @@ static inline void
|
|||||||
m_string_next (m_string_it_t it)
|
m_string_next (m_string_it_t it)
|
||||||
{
|
{
|
||||||
M_ASSERT (it != NULL);
|
M_ASSERT (it != NULL);
|
||||||
|
// We already decoded the UTF8 stream
|
||||||
|
// Read the decoded value
|
||||||
it->ptr = it->next_ptr;
|
it->ptr = it->next_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in new issue
Block a user