Update comment description of macros and functions
This commit is contained in:
1 parent
3d2ce63d63
commit
f4c24f07af
3 files changed
+175
-26
No files matched your search
@@ -2547,11 +2547,12 @@ m_core_hash (const void *str, size_t length)
|
|||||||
/******************** Syntax Enhancing **********************/
|
/******************** Syntax Enhancing **********************/
|
||||||
/************************************************************/
|
/************************************************************/
|
||||||
|
|
||||||
/* Define M_EACH macro allowing to iterate over a container
|
/* M_EACH enables iterating over a container using a for loop.
|
||||||
First argument will be a created pointer to the underlying type.
|
First argument will be a created pointer var to the underlying type.
|
||||||
|
Second argument is the container to iterate.
|
||||||
Third argument can be the oplist of the list or the type of the list if a global
|
Third argument can be the oplist of the list or the type of the list if a global
|
||||||
oplist has been recorded.
|
oplist has been recorded.
|
||||||
Example: for M_EACH(item, list, LIST_OPLIST) { action; }
|
USAGE: for M_EACH(item, list, LIST_OPLIST) { M_LETaction; }
|
||||||
*/
|
*/
|
||||||
#define M_EACH(item, container, oplist) \
|
#define M_EACH(item, container, oplist) \
|
||||||
M_EACHI_OPLIST(item, container, M_GLOBAL_OPLIST(oplist))
|
M_EACHI_OPLIST(item, container, M_GLOBAL_OPLIST(oplist))
|
||||||
@@ -2583,14 +2584,15 @@ m_core_hash (const void *str, size_t length)
|
|||||||
M_GET_IT_NEXT oplist (iterator))
|
M_GET_IT_NEXT oplist (iterator))
|
||||||
|
|
||||||
|
|
||||||
/* Define M_LET macro allowing to define, auto init & auto clear an object
|
/* M_LET defines, initializes & clears an object available within the next bracket.
|
||||||
within the next bracket.
|
USAGE:
|
||||||
Example:
|
M_LET(variable_list, variable_oplist|variable_type) { code }
|
||||||
M_LET(a, STRING_OPLIST) { do something with a } or
|
* variable_list can be a comma separated list of variable.
|
||||||
M_LET(a, b, c, STRING_OPLIST) { do something with a, b & c }
|
* A variable alone is initialized to its default value.
|
||||||
M_LET((a, b), c, STRING_OPLIST) { do something with a(init with b) & c }
|
* A variable with initializer (like '(var, init value...)'
|
||||||
NOTE: The user code can not perform a return or a goto within the {}
|
is initialized with this init values.
|
||||||
otherwise the clear code of the object won't be called .
|
NOTE: The code within {} can not perform return or goto command.
|
||||||
|
break is supported and will exit the braket (calling the clear method)
|
||||||
Last argument can be the oplist or the type itself if a global
|
Last argument can be the oplist or the type itself if a global
|
||||||
oplist has been recorded for this type.
|
oplist has been recorded for this type.
|
||||||
*/
|
*/
|
||||||
|
|||||||
+8
-3
@@ -232,7 +232,7 @@ m_serial_json_write_variant_end(m_serial_local_t local, m_serial_write_t serial)
|
|||||||
return n > 0 ? M_SERIAL_OK_DONE : M_SERIAL_FAIL;
|
return n > 0 ? M_SERIAL_OK_DONE : M_SERIAL_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* The exported interface. */
|
/* The internal exported interface of m_serial_write_json. */
|
||||||
static const m_serial_write_interface_t m_serial_write_json_interface = {
|
static const m_serial_write_interface_t m_serial_write_json_interface = {
|
||||||
m_serial_json_write_boolean,
|
m_serial_json_write_boolean,
|
||||||
m_serial_json_write_integer,
|
m_serial_json_write_integer,
|
||||||
@@ -252,12 +252,14 @@ static const m_serial_write_interface_t m_serial_write_json_interface = {
|
|||||||
m_serial_json_write_variant_end
|
m_serial_json_write_variant_end
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Initialize the JSON serial object for writing any object to JSON format in the given FILE */
|
||||||
static inline void m_serial_json_write_init(m_serial_write_t serial, FILE *f)
|
static inline void m_serial_json_write_init(m_serial_write_t serial, FILE *f)
|
||||||
{
|
{
|
||||||
serial->m_interface = &m_serial_write_json_interface;
|
serial->m_interface = &m_serial_write_json_interface;
|
||||||
serial->data[0].p = M_ASSIGN_CAST(void*, f);
|
serial->data[0].p = M_ASSIGN_CAST(void*, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* CLear the JSON serial object for writing*/
|
||||||
static inline void m_serial_json_write_clear(m_serial_write_t serial)
|
static inline void m_serial_json_write_clear(m_serial_write_t serial)
|
||||||
{
|
{
|
||||||
(void) serial; // Nothing to do
|
(void) serial; // Nothing to do
|
||||||
@@ -270,7 +272,7 @@ typedef m_serial_write_t m_serial_json_write_t;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* Helper function */
|
/* Helper function to skip a space */
|
||||||
static inline int
|
static inline int
|
||||||
m_serial_json_read_skip (FILE *f)
|
m_serial_json_read_skip (FILE *f)
|
||||||
{
|
{
|
||||||
@@ -534,18 +536,21 @@ static const m_serial_read_interface_t m_serial_json_read_interface = {
|
|||||||
m_serial_json_read_variant_end
|
m_serial_json_read_variant_end
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* Initialize the JSON serial object for reading any object from JSON format in the given FILE */
|
||||||
static inline void m_serial_json_read_init(m_serial_read_t serial, FILE *f)
|
static inline void m_serial_json_read_init(m_serial_read_t serial, FILE *f)
|
||||||
{
|
{
|
||||||
serial->m_interface = &m_serial_json_read_interface;
|
serial->m_interface = &m_serial_json_read_interface;
|
||||||
serial->data[0].p = M_ASSIGN_CAST(void*, f);
|
serial->data[0].p = M_ASSIGN_CAST(void*, f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clear the JSON serial object for reading from the FILE */
|
||||||
static inline void m_serial_json_read_clear(m_serial_read_t serial)
|
static inline void m_serial_json_read_clear(m_serial_read_t serial)
|
||||||
{
|
{
|
||||||
(void) serial; // Nothing to do
|
(void) serial; // Nothing to do
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Define a synonym to the JSON serializer with a proper OPLIST */
|
/* Define a synonym of m_serial_read_t
|
||||||
|
to the JSON serializer with its proper OPLIST */
|
||||||
typedef m_serial_read_t m_serial_json_read_t;
|
typedef m_serial_read_t m_serial_json_read_t;
|
||||||
#define M_OPL_m_serial_json_read_t() \
|
#define M_OPL_m_serial_json_read_t() \
|
||||||
(INIT_WITH(m_serial_json_read_init), CLEAR(m_serial_json_read_clear), TYPE(m_serial_json_read_t) )
|
(INIT_WITH(m_serial_json_read_init), CLEAR(m_serial_json_read_clear), TYPE(m_serial_json_read_t) )
|
||||||
|
|||||||
+154
-12
@@ -81,21 +81,29 @@ typedef union string_union_u {
|
|||||||
string_heap_t heap;
|
string_heap_t heap;
|
||||||
string_stack_t stack;
|
string_stack_t stack;
|
||||||
} string_union_t;
|
} string_union_t;
|
||||||
// main structure
|
|
||||||
|
// Dynamic string
|
||||||
typedef struct string_s {
|
typedef struct string_s {
|
||||||
string_union_t u;
|
string_union_t u;
|
||||||
char *ptr;
|
char *ptr;
|
||||||
} string_t[1];
|
} string_t[1];
|
||||||
|
|
||||||
|
// Pointer to a Dynamic string
|
||||||
typedef struct string_s *string_ptr;
|
typedef struct string_s *string_ptr;
|
||||||
|
|
||||||
|
// Constant pointer to a Dynamic string
|
||||||
typedef const struct string_s *string_srcptr;
|
typedef const struct string_s *string_srcptr;
|
||||||
|
|
||||||
/* Input option for the fgets function */
|
/* Input option for string_fgets
|
||||||
|
STRING_READ_LINE (read line),
|
||||||
|
STRING_READ_PURE_LINE (read line and remove CR and LF)
|
||||||
|
STRING_READ_FILE (read all file)
|
||||||
|
*/
|
||||||
typedef enum string_fgets_s {
|
typedef enum string_fgets_s {
|
||||||
STRING_READ_LINE = 0, STRING_READ_PURE_LINE = 1, STRING_READ_FILE = 2
|
STRING_READ_LINE = 0, STRING_READ_PURE_LINE = 1, STRING_READ_FILE = 2
|
||||||
} string_fgets_t;
|
} string_fgets_t;
|
||||||
|
|
||||||
/* Test if the string is stack based or heap based */
|
/* Internal method to test if the string is stack based or heap based */
|
||||||
static inline bool
|
static inline bool
|
||||||
stringi_stack_p(const string_t s)
|
stringi_stack_p(const string_t s)
|
||||||
{
|
{
|
||||||
@@ -115,6 +123,7 @@ stringi_set_size(string_t s, size_t size)
|
|||||||
s->u.heap.size = size;
|
s->u.heap.size = size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the number of characters of the string */
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_size(const string_t s)
|
string_size(const string_t s)
|
||||||
{
|
{
|
||||||
@@ -125,6 +134,7 @@ string_size(const string_t s)
|
|||||||
return stringi_stack_p(s) ? s_stack : s_heap;
|
return stringi_stack_p(s) ? s_stack : s_heap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the capacity of the string */
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_capacity(const string_t s)
|
string_capacity(const string_t s)
|
||||||
{
|
{
|
||||||
@@ -145,6 +155,7 @@ stringi_get_str(string_t v)
|
|||||||
return stringi_stack_p(v) ? ptr_stack : ptr_heap;
|
return stringi_stack_p(v) ? ptr_stack : ptr_heap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the string view a classic C string (const char *) */
|
||||||
static inline const char*
|
static inline const char*
|
||||||
string_get_cstr(const string_t v)
|
string_get_cstr(const string_t v)
|
||||||
{
|
{
|
||||||
@@ -155,6 +166,8 @@ string_get_cstr(const string_t v)
|
|||||||
return stringi_stack_p(v) ? ptr_stack : ptr_heap;
|
return stringi_stack_p(v) ? ptr_stack : ptr_heap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize the dynamic string (constructor)
|
||||||
|
and make it empty */
|
||||||
static inline void
|
static inline void
|
||||||
string_init(string_t s)
|
string_init(string_t s)
|
||||||
{
|
{
|
||||||
@@ -164,6 +177,7 @@ string_init(string_t s)
|
|||||||
STRINGI_CONTRACT(s);
|
STRINGI_CONTRACT(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Clear the Dynamic string (destructor) */
|
||||||
static inline void
|
static inline void
|
||||||
string_clear(string_t v)
|
string_clear(string_t v)
|
||||||
{
|
{
|
||||||
@@ -180,8 +194,10 @@ string_clear(string_t v)
|
|||||||
/* NOTE: Internaly used by STRING_DECL_INIT */
|
/* NOTE: Internaly used by STRING_DECL_INIT */
|
||||||
static inline void stringi_clear2(string_t *v) { string_clear(*v); }
|
static inline void stringi_clear2(string_t *v) { string_clear(*v); }
|
||||||
|
|
||||||
/* NOTE: The ownership of the data is transfered back to the caller
|
/* Clear the Dynamic string (destructor)
|
||||||
and the returned pointer has to be released by M_MEMORY_FREE. */
|
and return a heap pointer to the string.
|
||||||
|
The ownership of the data is transfered back to the caller
|
||||||
|
and the returned pointer has to be released by M_MEMORY_FREE. */
|
||||||
static inline char *
|
static inline char *
|
||||||
string_clear_get_str(string_t v)
|
string_clear_get_str(string_t v)
|
||||||
{
|
{
|
||||||
@@ -206,6 +222,7 @@ string_clear_get_str(string_t v)
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Make the string empty */
|
||||||
static inline void
|
static inline void
|
||||||
string_clean(string_t v)
|
string_clean(string_t v)
|
||||||
{
|
{
|
||||||
@@ -215,6 +232,7 @@ string_clean(string_t v)
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the selected character of the string */
|
||||||
static inline char
|
static inline char
|
||||||
string_get_char(const string_t v, size_t index)
|
string_get_char(const string_t v, size_t index)
|
||||||
{
|
{
|
||||||
@@ -223,6 +241,7 @@ string_get_char(const string_t v, size_t index)
|
|||||||
return string_get_cstr(v)[index];
|
return string_get_cstr(v)[index];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the string is empty or not */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_empty_p(const string_t v)
|
string_empty_p(const string_t v)
|
||||||
{
|
{
|
||||||
@@ -254,7 +273,7 @@ stringi_fit2size (string_t v, size_t size_alloc)
|
|||||||
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);
|
||||||
// NOTE: Return is broken...
|
// NOTE: Return is currently broken.
|
||||||
abort();
|
abort();
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
@@ -270,6 +289,8 @@ stringi_fit2size (string_t v, size_t size_alloc)
|
|||||||
return stringi_get_str(v);
|
return stringi_get_str(v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Modify the string capacity to be able to handle at least 'alloc'
|
||||||
|
characters (including final nul char) */
|
||||||
static inline void
|
static inline void
|
||||||
string_reserve(string_t v, size_t alloc)
|
string_reserve(string_t v, size_t alloc)
|
||||||
{
|
{
|
||||||
@@ -304,6 +325,7 @@ string_reserve(string_t v, size_t alloc)
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the string to the C string str */
|
||||||
static inline void
|
static inline void
|
||||||
string_set_str(string_t v, const char str[])
|
string_set_str(string_t v, const char str[])
|
||||||
{
|
{
|
||||||
@@ -316,6 +338,7 @@ string_set_str(string_t v, const char str[])
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the string to the n first characters of the C string str */
|
||||||
static inline void
|
static inline void
|
||||||
string_set_strn(string_t v, const char str[], size_t n)
|
string_set_strn(string_t v, const char str[], size_t n)
|
||||||
{
|
{
|
||||||
@@ -330,6 +353,7 @@ string_set_strn(string_t v, const char str[], size_t n)
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the string to the other one */
|
||||||
static inline void
|
static inline void
|
||||||
string_set (string_t v1, const string_t v2)
|
string_set (string_t v1, const string_t v2)
|
||||||
{
|
{
|
||||||
@@ -344,6 +368,7 @@ string_set (string_t v1, const string_t v2)
|
|||||||
STRINGI_CONTRACT (v1);
|
STRINGI_CONTRACT (v1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the string to the n first characters of other one */
|
||||||
static inline void
|
static inline void
|
||||||
string_set_n(string_t v, const string_t ref, size_t offset, size_t length)
|
string_set_n(string_t v, const string_t ref, size_t offset, size_t length)
|
||||||
{
|
{
|
||||||
@@ -358,6 +383,8 @@ string_set_n(string_t v, const string_t ref, size_t offset, size_t length)
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize the string and set it to the other one
|
||||||
|
(constructor) */
|
||||||
static inline void
|
static inline void
|
||||||
string_init_set(string_t v1, const string_t v2)
|
string_init_set(string_t v1, const string_t v2)
|
||||||
{
|
{
|
||||||
@@ -365,6 +392,8 @@ string_init_set(string_t v1, const string_t v2)
|
|||||||
string_set(v1,v2);
|
string_set(v1,v2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize the string and set it to the C string
|
||||||
|
(constructor) */
|
||||||
static inline void
|
static inline void
|
||||||
string_init_set_str(string_t v1, const char str[])
|
string_init_set_str(string_t v1, const char str[])
|
||||||
{
|
{
|
||||||
@@ -372,6 +401,9 @@ string_init_set_str(string_t v1, const char str[])
|
|||||||
string_set_str(v1, str);
|
string_set_str(v1, str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Initialize the string, set it to the other one,
|
||||||
|
and destroy the other one.
|
||||||
|
(constructor & destructor) */
|
||||||
static inline void
|
static inline void
|
||||||
string_init_move(string_t v1, string_t v2)
|
string_init_move(string_t v1, string_t v2)
|
||||||
{
|
{
|
||||||
@@ -382,6 +414,7 @@ string_init_move(string_t v1, string_t v2)
|
|||||||
STRINGI_CONTRACT (v1);
|
STRINGI_CONTRACT (v1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Swap the string */
|
||||||
static inline void
|
static inline void
|
||||||
string_swap(string_t v1, string_t v2)
|
string_swap(string_t v1, string_t v2)
|
||||||
{
|
{
|
||||||
@@ -394,6 +427,9 @@ string_swap(string_t v1, string_t v2)
|
|||||||
STRINGI_CONTRACT (v2);
|
STRINGI_CONTRACT (v2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the string to the other one,
|
||||||
|
and destroy the other one.
|
||||||
|
(destructor) */
|
||||||
static inline void
|
static inline void
|
||||||
string_move(string_t v1, string_t v2)
|
string_move(string_t v1, string_t v2)
|
||||||
{
|
{
|
||||||
@@ -401,6 +437,7 @@ string_move(string_t v1, string_t v2)
|
|||||||
string_init_move(v1,v2);
|
string_init_move(v1,v2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Push a character in a string */
|
||||||
static inline void
|
static inline void
|
||||||
string_push_back (string_t v, char c)
|
string_push_back (string_t v, char c)
|
||||||
{
|
{
|
||||||
@@ -413,6 +450,7 @@ string_push_back (string_t v, char c)
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Concatene the string with the C string */
|
||||||
static inline void
|
static inline void
|
||||||
string_cat_str(string_t v, const char str[])
|
string_cat_str(string_t v, const char str[])
|
||||||
{
|
{
|
||||||
@@ -426,6 +464,7 @@ string_cat_str(string_t v, const char str[])
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Concatene the string with the other string */
|
||||||
static inline void
|
static inline void
|
||||||
string_cat(string_t v, const string_t v2)
|
string_cat(string_t v, const string_t v2)
|
||||||
{
|
{
|
||||||
@@ -442,6 +481,8 @@ string_cat(string_t v, const string_t v2)
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Compare the string to the C string and
|
||||||
|
return the sort order (-1 if less, 0 if equal, 1 if greater) */
|
||||||
static inline int
|
static inline int
|
||||||
string_cmp_str(const string_t v1, const char str[])
|
string_cmp_str(const string_t v1, const char str[])
|
||||||
{
|
{
|
||||||
@@ -450,6 +491,8 @@ string_cmp_str(const string_t v1, const char str[])
|
|||||||
return strcmp(string_get_cstr(v1), str);
|
return strcmp(string_get_cstr(v1), str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Compare the string to the other string and
|
||||||
|
return the sort order (-1 if less, 0 if equal, 1 if greater) */
|
||||||
static inline int
|
static inline int
|
||||||
string_cmp(const string_t v1, const string_t v2)
|
string_cmp(const string_t v1, const string_t v2)
|
||||||
{
|
{
|
||||||
@@ -458,6 +501,7 @@ string_cmp(const string_t v1, const string_t v2)
|
|||||||
return strcmp(string_get_cstr(v1), string_get_cstr(v2));
|
return strcmp(string_get_cstr(v1), string_get_cstr(v2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the string is equal to the given C string */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_equal_str_p(const string_t v1, const char str[])
|
string_equal_str_p(const string_t v1, const char str[])
|
||||||
{
|
{
|
||||||
@@ -466,6 +510,7 @@ string_equal_str_p(const string_t v1, const char str[])
|
|||||||
return string_cmp_str(v1, str) == 0;
|
return string_cmp_str(v1, str) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the string is equal to the other string */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_equal_p(const string_t v1, const string_t v2)
|
string_equal_p(const string_t v1, const string_t v2)
|
||||||
{
|
{
|
||||||
@@ -475,16 +520,20 @@ string_equal_p(const string_t v1, const string_t v2)
|
|||||||
*/
|
*/
|
||||||
assert(v1 != NULL);
|
assert(v1 != NULL);
|
||||||
assert(v2 != NULL);
|
assert(v2 != NULL);
|
||||||
|
/* Optimization: both strings shall have at least the same size */
|
||||||
return string_size(v1) == string_size(v2) && string_cmp(v1, v2) == 0;
|
return string_size(v1) == string_size(v2) && string_cmp(v1, v2) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: doesn't work with UTF-8 strings...
|
/* Test if the string is equal to the C string
|
||||||
|
(case insentive according to the current locale)
|
||||||
|
Note: doesn't work with UTF-8 strings.
|
||||||
|
*/
|
||||||
static inline int
|
static inline int
|
||||||
string_cmpi_str(const string_t v1, const char p2[])
|
string_cmpi_str(const string_t v1, const char p2[])
|
||||||
{
|
{
|
||||||
STRINGI_CONTRACT (v1);
|
STRINGI_CONTRACT (v1);
|
||||||
M_ASSUME (p2 != NULL);
|
M_ASSUME (p2 != NULL);
|
||||||
// strcasecmp is POSIX
|
// strcasecmp is POSIX only
|
||||||
const char *p1 = string_get_cstr(v1);
|
const char *p1 = string_get_cstr(v1);
|
||||||
int c1, c2;
|
int c1, c2;
|
||||||
do {
|
do {
|
||||||
@@ -497,12 +546,21 @@ string_cmpi_str(const string_t v1, const char p2[])
|
|||||||
return c1 - c2;
|
return c1 - c2;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the string is equal to the other string
|
||||||
|
(case insentive according to the current locale)
|
||||||
|
Note: doesn't work with UTF-8 strings.
|
||||||
|
*/
|
||||||
static inline int
|
static inline int
|
||||||
string_cmpi(const string_t v1, const string_t v2)
|
string_cmpi(const string_t v1, const string_t v2)
|
||||||
{
|
{
|
||||||
return string_cmpi_str(v1, string_get_cstr(v2));
|
return string_cmpi_str(v1, string_get_cstr(v2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Search for the position of the character c
|
||||||
|
from the position 'start' (include) in the string
|
||||||
|
Return STRING_FAILURE if not found.
|
||||||
|
By default, start is zero.
|
||||||
|
*/
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_search_char (const string_t v, char c, size_t start)
|
string_search_char (const string_t v, char c, size_t start)
|
||||||
{
|
{
|
||||||
@@ -513,6 +571,11 @@ string_search_char (const string_t v, char c, size_t start)
|
|||||||
return p == NULL ? STRING_FAILURE : (size_t) (p-string_get_cstr(v));
|
return p == NULL ? STRING_FAILURE : (size_t) (p-string_get_cstr(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Reverse Search for the position of the character c
|
||||||
|
from the position 'start' (include) in the string
|
||||||
|
Return STRING_FAILURE if not found.
|
||||||
|
By default, start is zero.
|
||||||
|
*/
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_search_rchar (const string_t v, char c, size_t start)
|
string_search_rchar (const string_t v, char c, size_t start)
|
||||||
{
|
{
|
||||||
@@ -526,6 +589,9 @@ string_search_rchar (const string_t v, char c, size_t start)
|
|||||||
return p == NULL ? STRING_FAILURE : (size_t) (p-string_get_cstr(v));
|
return p == NULL ? STRING_FAILURE : (size_t) (p-string_get_cstr(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Search for the sub C string in the string from the position start
|
||||||
|
Return STRING_FAILURE if not found.
|
||||||
|
By default, start is zero. */
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_search_str (const string_t v, const char str[], size_t start)
|
string_search_str (const string_t v, const char str[], size_t start)
|
||||||
{
|
{
|
||||||
@@ -537,6 +603,9 @@ string_search_str (const string_t v, const char str[], size_t start)
|
|||||||
return p == NULL ? STRING_FAILURE : (size_t) (p-string_get_cstr(v));
|
return p == NULL ? STRING_FAILURE : (size_t) (p-string_get_cstr(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Search for the sub other string v2 in the string v1 from the position start
|
||||||
|
Return STRING_FAILURE if not found.
|
||||||
|
By default, start is zero. */
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_search (const string_t v1, const string_t v2, size_t start)
|
string_search (const string_t v1, const string_t v2, size_t start)
|
||||||
{
|
{
|
||||||
@@ -545,6 +614,10 @@ string_search (const string_t v1, const string_t v2, size_t start)
|
|||||||
return string_search_str(v1, string_get_cstr(v2), start);
|
return string_search_str(v1, string_get_cstr(v2), start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Search for the first matching character in the given C string
|
||||||
|
in the string v1 from the position start
|
||||||
|
Return STRING_FAILURE if not found.
|
||||||
|
By default, start is zero. */
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_search_pbrk(const string_t v1, const char first_of[], size_t start)
|
string_search_pbrk(const string_t v1, const char first_of[], size_t start)
|
||||||
{
|
{
|
||||||
@@ -556,6 +629,7 @@ string_search_pbrk(const string_t v1, const char first_of[], size_t start)
|
|||||||
return p == NULL ? STRING_FAILURE : (size_t) (p-string_get_cstr(v1));
|
return p == NULL ? STRING_FAILURE : (size_t) (p-string_get_cstr(v1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Compare the string to the C string using strcoll */
|
||||||
static inline int
|
static inline int
|
||||||
string_strcoll_str(const string_t v, const char str[])
|
string_strcoll_str(const string_t v, const char str[])
|
||||||
{
|
{
|
||||||
@@ -563,6 +637,7 @@ string_strcoll_str(const string_t v, const char str[])
|
|||||||
return strcoll(string_get_cstr(v), str);
|
return strcoll(string_get_cstr(v), str);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Compare the string to the other string using strcoll */
|
||||||
static inline int
|
static inline int
|
||||||
string_strcoll (const string_t v1, const string_t v2)
|
string_strcoll (const string_t v1, const string_t v2)
|
||||||
{
|
{
|
||||||
@@ -570,6 +645,8 @@ string_strcoll (const string_t v1, const string_t v2)
|
|||||||
return string_strcoll_str(v1, string_get_cstr(v2));
|
return string_strcoll_str(v1, string_get_cstr(v2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the number of bytes of the segment of s
|
||||||
|
that consists entirely of bytes in accept */
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_spn(const string_t v1, const char accept[])
|
string_spn(const string_t v1, const char accept[])
|
||||||
{
|
{
|
||||||
@@ -578,6 +655,8 @@ string_spn(const string_t v1, const char accept[])
|
|||||||
return strspn(string_get_cstr(v1), accept);
|
return strspn(string_get_cstr(v1), accept);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the number of bytes of the segment of s
|
||||||
|
that consists entirely of bytes not in reject */
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_cspn(const string_t v1, const char reject[])
|
string_cspn(const string_t v1, const char reject[])
|
||||||
{
|
{
|
||||||
@@ -586,6 +665,7 @@ string_cspn(const string_t v1, const char reject[])
|
|||||||
return strcspn(string_get_cstr(v1), reject);
|
return strcspn(string_get_cstr(v1), reject);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the string left truncated to the first 'index' bytes */
|
||||||
static inline void
|
static inline void
|
||||||
string_left(string_t v, size_t index)
|
string_left(string_t v, size_t index)
|
||||||
{
|
{
|
||||||
@@ -598,7 +678,7 @@ string_left(string_t v, size_t index)
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note: this is an index, not the size to keep from the right !
|
/* Return the string right truncated from the 'index' position to the last position */
|
||||||
static inline void
|
static inline void
|
||||||
string_right(string_t v, size_t index)
|
string_right(string_t v, size_t index)
|
||||||
{
|
{
|
||||||
@@ -617,6 +697,7 @@ string_right(string_t v, size_t index)
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the string from position index to size bytes */
|
||||||
static inline void
|
static inline void
|
||||||
string_mid (string_t v, size_t index, size_t size)
|
string_mid (string_t v, size_t index, size_t size)
|
||||||
{
|
{
|
||||||
@@ -624,6 +705,9 @@ string_mid (string_t v, size_t index, size_t size)
|
|||||||
string_left(v, size);
|
string_left(v, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return in the string the C string str1 into the C string str2 from start
|
||||||
|
By default, start is zero.
|
||||||
|
*/
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_replace_str (string_t v, const char str1[], const char str2[], size_t start)
|
string_replace_str (string_t v, const char str1[], const char str2[], size_t start)
|
||||||
{
|
{
|
||||||
@@ -646,6 +730,9 @@ string_replace_str (string_t v, const char str1[], const char str2[], size_t sta
|
|||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return in the string the string str1 into the string str2 from start
|
||||||
|
By default, start is zero.
|
||||||
|
*/
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_replace (string_t v, const string_t v1, const string_t v2, size_t start)
|
string_replace (string_t v, const string_t v1, const string_t v2, size_t start)
|
||||||
{
|
{
|
||||||
@@ -655,6 +742,8 @@ string_replace (string_t v, const string_t v1, const string_t v2, size_t start)
|
|||||||
return string_replace_str(v, string_get_cstr(v1), string_get_cstr(v2), start);
|
return string_replace_str(v, string_get_cstr(v1), string_get_cstr(v2), start);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Replace tin the string the sub-string at position 'pos' for 'len' bytes
|
||||||
|
into the C string str2. */
|
||||||
static inline void
|
static inline void
|
||||||
string_replace_at (string_t v, size_t pos, size_t len, const char str2[])
|
string_replace_at (string_t v, size_t pos, size_t len, const char str2[])
|
||||||
{
|
{
|
||||||
@@ -677,6 +766,7 @@ string_replace_at (string_t v, size_t pos, size_t len, const char str2[])
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Format in the string the given printf format */
|
||||||
static inline int
|
static inline int
|
||||||
string_printf (string_t v, const char format[], ...)
|
string_printf (string_t v, const char format[], ...)
|
||||||
{
|
{
|
||||||
@@ -706,6 +796,7 @@ string_printf (string_t v, const char format[], ...)
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Append to the string the formatted string of the given printf format */
|
||||||
static inline int
|
static inline int
|
||||||
string_cat_printf (string_t v, const char format[], ...)
|
string_cat_printf (string_t v, const char format[], ...)
|
||||||
{
|
{
|
||||||
@@ -740,6 +831,7 @@ string_cat_printf (string_t v, const char format[], ...)
|
|||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get a line/pureline/file from the FILE and store it in the string */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_fgets(string_t v, FILE *f, string_fgets_t arg)
|
string_fgets(string_t v, FILE *f, string_fgets_t arg)
|
||||||
{
|
{
|
||||||
@@ -774,6 +866,10 @@ string_fgets(string_t v, FILE *f, string_fgets_t arg)
|
|||||||
return retcode; /* Abnormal terminaison */
|
return retcode; /* Abnormal terminaison */
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Get a word from the FILE and store it in the string.
|
||||||
|
Words are supposed to be separated each other by the given list of separator
|
||||||
|
separator shall be a CONSTANT C array.
|
||||||
|
*/
|
||||||
static inline bool
|
static inline bool
|
||||||
string_fget_word (string_t v, const char separator[], FILE *f)
|
string_fget_word (string_t v, const char separator[], FILE *f)
|
||||||
{
|
{
|
||||||
@@ -827,6 +923,7 @@ string_fget_word (string_t v, const char separator[], FILE *f)
|
|||||||
return retcode;
|
return retcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Put the string in the given FILE without formatting */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_fputs(FILE *f, const string_t v)
|
string_fputs(FILE *f, const string_t v)
|
||||||
{
|
{
|
||||||
@@ -835,6 +932,7 @@ string_fputs(FILE *f, const string_t v)
|
|||||||
return fputs(string_get_cstr(v), f) >= 0;
|
return fputs(string_get_cstr(v), f) >= 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the string starts with the given C string */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_start_with_str_p(const string_t v, const char str[])
|
string_start_with_str_p(const string_t v, const char str[])
|
||||||
{
|
{
|
||||||
@@ -850,6 +948,7 @@ string_start_with_str_p(const string_t v, const char str[])
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the string starts with the other string */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_start_with_string_p(const string_t v, const string_t v2)
|
string_start_with_string_p(const string_t v, const string_t v2)
|
||||||
{
|
{
|
||||||
@@ -857,6 +956,7 @@ string_start_with_string_p(const string_t v, const string_t v2)
|
|||||||
return string_start_with_str_p (v, string_get_cstr(v2));
|
return string_start_with_str_p (v, string_get_cstr(v2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the string ends with the C string */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_end_with_str_p(const string_t v, const char str[])
|
string_end_with_str_p(const string_t v, const char str[])
|
||||||
{
|
{
|
||||||
@@ -874,6 +974,7 @@ string_end_with_str_p(const string_t v, const char str[])
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the string ends with the other string */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_end_with_string_p(const string_t v, const string_t v2)
|
string_end_with_string_p(const string_t v, const string_t v2)
|
||||||
{
|
{
|
||||||
@@ -881,6 +982,7 @@ string_end_with_string_p(const string_t v, const string_t v2)
|
|||||||
return string_end_with_str_p (v, string_get_cstr(v2));
|
return string_end_with_str_p (v, string_get_cstr(v2));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Compute a hash for the string */
|
||||||
static inline size_t
|
static inline size_t
|
||||||
string_hash(const string_t v)
|
string_hash(const string_t v)
|
||||||
{
|
{
|
||||||
@@ -899,6 +1001,8 @@ stringi_strim_char(char c, const char charac[])
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Remove any characters from charac that are present
|
||||||
|
in the begining of the string and the end of the string. */
|
||||||
static inline void
|
static inline void
|
||||||
string_strim(string_t v, const char charac[])
|
string_strim(string_t v, const char charac[])
|
||||||
{
|
{
|
||||||
@@ -920,12 +1024,14 @@ string_strim(string_t v, const char charac[])
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the string is equal to the OOR value */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_oor_equal_p(const string_t s, unsigned char n)
|
string_oor_equal_p(const string_t s, unsigned char n)
|
||||||
{
|
{
|
||||||
return (s->ptr == NULL) & (s->u.heap.alloc == ~(size_t)n);
|
return (s->ptr == NULL) & (s->u.heap.alloc == ~(size_t)n);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the unitialized string to the OOR value */
|
||||||
static inline void
|
static inline void
|
||||||
string_oor_set(string_t s, unsigned char n)
|
string_oor_set(string_t s, unsigned char n)
|
||||||
{
|
{
|
||||||
@@ -938,6 +1044,9 @@ string_oor_set(string_t s, unsigned char n)
|
|||||||
Replace " by \" within the string (and \ to \\)
|
Replace " by \" within the string (and \ to \\)
|
||||||
\n, \t & \r by their standard representation
|
\n, \t & \r by their standard representation
|
||||||
and other not printable character with \0xx */
|
and other not printable character with \0xx */
|
||||||
|
|
||||||
|
/* Transform the string 'v2' into a formatted string
|
||||||
|
and set it to (or append in) the string 'v'. */
|
||||||
static inline void
|
static inline void
|
||||||
string_get_str(string_t v, const string_t v2, bool append)
|
string_get_str(string_t v, const string_t v2, bool append)
|
||||||
{
|
{
|
||||||
@@ -988,6 +1097,8 @@ string_get_str(string_t v, const string_t v2, bool append)
|
|||||||
STRINGI_CONTRACT (v);
|
STRINGI_CONTRACT (v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Transform the string 'v2' into a formatted string
|
||||||
|
and output it in the given FILE */
|
||||||
static inline void
|
static inline void
|
||||||
string_out_str(FILE *f, const string_t v)
|
string_out_str(FILE *f, const string_t v)
|
||||||
{
|
{
|
||||||
@@ -1022,6 +1133,9 @@ string_out_str(FILE *f, const string_t v)
|
|||||||
fputc('"', f);
|
fputc('"', f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read the formatted string from the FILE
|
||||||
|
and set the converted value in the string 'v'.
|
||||||
|
Return true in case of success */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_in_str(string_t v, FILE *f)
|
string_in_str(string_t v, FILE *f)
|
||||||
{
|
{
|
||||||
@@ -1066,6 +1180,11 @@ string_in_str(string_t v, FILE *f)
|
|||||||
return c == '"';
|
return c == '"';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read the formatted string from the C string
|
||||||
|
and set the converted value in the string 'v'.
|
||||||
|
Return true in case of success
|
||||||
|
If endptr is not null, update the position of the parsing.
|
||||||
|
*/
|
||||||
static inline bool
|
static inline bool
|
||||||
string_parse_str(string_t v, const char str[], const char **endptr)
|
string_parse_str(string_t v, const char str[], const char **endptr)
|
||||||
{
|
{
|
||||||
@@ -1114,6 +1233,10 @@ string_parse_str(string_t v, const char str[], const char **endptr)
|
|||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Transform the string 'v2' into a formatted string
|
||||||
|
and output it in the given serializer
|
||||||
|
See serialization for return code.
|
||||||
|
*/
|
||||||
static inline m_serial_return_code_t
|
static inline m_serial_return_code_t
|
||||||
string_out_serial(m_serial_write_t serial, const string_t v)
|
string_out_serial(m_serial_write_t serial, const string_t v)
|
||||||
{
|
{
|
||||||
@@ -1121,6 +1244,10 @@ string_out_serial(m_serial_write_t serial, const string_t v)
|
|||||||
return serial->m_interface->write_string(serial, string_get_cstr(v));
|
return serial->m_interface->write_string(serial, string_get_cstr(v));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Read the formatted string from the serializer
|
||||||
|
and set the converted value in the string 'v'.
|
||||||
|
See serialization for return code.
|
||||||
|
*/
|
||||||
static inline m_serial_return_code_t
|
static inline m_serial_return_code_t
|
||||||
string_in_serial(string_t v, m_serial_read_t serial)
|
string_in_serial(string_t v, m_serial_read_t serial)
|
||||||
{
|
{
|
||||||
@@ -1128,7 +1255,7 @@ string_in_serial(string_t v, m_serial_read_t serial)
|
|||||||
return serial->m_interface->read_string(serial, v);
|
return serial->m_interface->read_string(serial, v);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* UTF8 Handling */
|
/* State of the UTF8 decoding machine state */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
STRINGI_UTF8_STARTING = 0,
|
STRINGI_UTF8_STARTING = 0,
|
||||||
STRINGI_UTF8_DECODING_1 = 8,
|
STRINGI_UTF8_DECODING_1 = 8,
|
||||||
@@ -1137,7 +1264,10 @@ typedef enum {
|
|||||||
STRINGI_UTF8_ERROR = 32
|
STRINGI_UTF8_ERROR = 32
|
||||||
} stringi_utf8_state_e;
|
} stringi_utf8_state_e;
|
||||||
|
|
||||||
|
/* An unicode value */
|
||||||
typedef unsigned int string_unicode_t;
|
typedef unsigned int string_unicode_t;
|
||||||
|
|
||||||
|
/* Error in case of decoding */
|
||||||
#define STRING_UNICODE_ERROR (-1U)
|
#define STRING_UNICODE_ERROR (-1U)
|
||||||
|
|
||||||
/* UTF8 character classification:
|
/* UTF8 character classification:
|
||||||
@@ -1158,7 +1288,8 @@ typedef unsigned int string_unicode_t;
|
|||||||
* 3|I2IIIIII
|
* 3|I2IIIIII
|
||||||
* I|IIIIIIII
|
* I|IIIIIIII
|
||||||
*/
|
*/
|
||||||
/* The use of a string allows the compiler/linker to factorize it. */
|
|
||||||
|
/* The use of a string enables the compiler/linker to factorize it. */
|
||||||
#define STRINGI_UTF8_STATE_TAB \
|
#define STRINGI_UTF8_STATE_TAB \
|
||||||
"\000\040\010\020\030\040\040\040" \
|
"\000\040\010\020\030\040\040\040" \
|
||||||
"\040\000\040\040\040\040\040\040" \
|
"\040\000\040\040\040\040\040\040" \
|
||||||
@@ -1266,6 +1397,9 @@ string_it(string_it_t it, const string_t str)
|
|||||||
it->u = 0;
|
it->u = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the iterator to the end of string
|
||||||
|
The iterator references therefore nothong.
|
||||||
|
*/
|
||||||
static inline void
|
static inline void
|
||||||
string_it_end(string_it_t it, const string_t str)
|
string_it_end(string_it_t it, const string_t str)
|
||||||
{
|
{
|
||||||
@@ -1276,6 +1410,7 @@ string_it_end(string_it_t it, const string_t str)
|
|||||||
it->u = 0;
|
it->u = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Set the iterator to the same position than the other one */
|
||||||
static inline void
|
static inline void
|
||||||
string_it_set(string_it_t it, const string_it_t itsrc)
|
string_it_set(string_it_t it, const string_it_t itsrc)
|
||||||
{
|
{
|
||||||
@@ -1285,6 +1420,7 @@ string_it_set(string_it_t it, const string_it_t itsrc)
|
|||||||
it->u = itsrc->u;
|
it->u = itsrc->u;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the iterator has reached the end of the string */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_end_p (string_it_t it)
|
string_end_p (string_it_t it)
|
||||||
{
|
{
|
||||||
@@ -1303,6 +1439,7 @@ string_end_p (string_it_t it)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Test if the iterator is equal to the other one */
|
||||||
static inline bool
|
static inline bool
|
||||||
string_it_equal_p(const string_it_t it1, const string_it_t it2)
|
string_it_equal_p(const string_it_t it1, const string_it_t it2)
|
||||||
{
|
{
|
||||||
@@ -1312,6 +1449,7 @@ string_it_equal_p(const string_it_t it1, const string_it_t it2)
|
|||||||
return it1->ptr == it2->ptr;
|
return it1->ptr == it2->ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Advance the iterator to the next UTF8 unicode character */
|
||||||
static inline void
|
static inline void
|
||||||
string_next (string_it_t it)
|
string_next (string_it_t it)
|
||||||
{
|
{
|
||||||
@@ -1319,6 +1457,7 @@ string_next (string_it_t it)
|
|||||||
it->ptr = it->next_ptr;
|
it->ptr = it->next_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the unicode value associated to the iterator */
|
||||||
static inline string_unicode_t
|
static inline string_unicode_t
|
||||||
string_get_cref (const string_it_t it)
|
string_get_cref (const string_it_t it)
|
||||||
{
|
{
|
||||||
@@ -1326,6 +1465,7 @@ string_get_cref (const string_it_t it)
|
|||||||
return it->u;
|
return it->u;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Return the unicode value associated to the iterator */
|
||||||
static inline const string_unicode_t *
|
static inline const string_unicode_t *
|
||||||
string_cref (const string_it_t it)
|
string_cref (const string_it_t it)
|
||||||
{
|
{
|
||||||
@@ -1447,13 +1587,15 @@ namespace m_string {
|
|||||||
m_string::m_aligned_string<sizeof (s)>(s).string
|
m_string::m_aligned_string<sizeof (s)>(s).string
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* Initialize and set a string to the given formatted value */
|
||||||
#define STRING_INIT_PRINTF(v, ...) \
|
#define STRING_INIT_PRINTF(v, ...) \
|
||||||
(string_init (v), string_printf (v, __VA_ARGS__) )
|
(string_init (v), string_printf (v, __VA_ARGS__) )
|
||||||
|
|
||||||
/* NOTE: Use GCC extension FIXME: To keep? */
|
/* NOTE: Use GCC extension (OBSOLETE) */
|
||||||
#define STRING_DECL_INIT(v) \
|
#define STRING_DECL_INIT(v) \
|
||||||
string_t v __attribute__((cleanup(stringi_clear2))) = {{ 0, 0, NULL}}
|
string_t v __attribute__((cleanup(stringi_clear2))) = {{ 0, 0, NULL}}
|
||||||
|
|
||||||
|
/* NOTE: Use GCC extension (OBSOLETE) */
|
||||||
#define STRING_DECL_INIT_PRINTF(v, format, ...) \
|
#define STRING_DECL_INIT_PRINTF(v, format, ...) \
|
||||||
STRING_DECL_INIT(v); \
|
STRING_DECL_INIT(v); \
|
||||||
string_printf (v, format, __VA_ARGS__)
|
string_printf (v, format, __VA_ARGS__)
|
||||||
|
|||||||
Reference in new issue
Block a user