Add tests and fix minor problems in specifier parser
This commit is contained in:
@@ -2,25 +2,6 @@
|
||||
#include <stddef.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
enum format_specifier_type {
|
||||
FMT_INVALID = 0,
|
||||
FMT_INTEGER,
|
||||
FMT_UNSIGNED,
|
||||
FMT_STRING,
|
||||
FMT_HEXUINT_CAPITALIZED,
|
||||
FMT_HEXUINT,
|
||||
FMT_CHAR,
|
||||
FMT_SIZE,
|
||||
FMT_PERCENT,
|
||||
};
|
||||
|
||||
struct format_specifier {
|
||||
enum format_specifier_type specifier;
|
||||
size_t length; /**< @brief lenght of formatted output.*/
|
||||
bool zero_pad;
|
||||
size_t length_of_provided_specifier;
|
||||
};
|
||||
|
||||
enum format_parser_state {
|
||||
PARSER_PERCENT = 0,
|
||||
PARSER_SECOND,
|
||||
@@ -87,7 +68,7 @@ static enum format_specifier_type resolve_specifier(char c)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void parse_format_specifier(const char *start, struct format_specifier *result)
|
||||
void parse_format_specifier(const char *start, struct format_specifier *result)
|
||||
{
|
||||
size_t fmt_len = 1ull;
|
||||
bool keep_parsing = true;
|
||||
@@ -115,15 +96,19 @@ static void parse_format_specifier(const char *start, struct format_specifier *r
|
||||
switch (state) {
|
||||
case PARSER_PERCENT:
|
||||
if (*ptr == '%') {
|
||||
advance_ptr++;
|
||||
advance_ptr = true;
|
||||
next_state = PARSER_SECOND;
|
||||
} else {
|
||||
keep_parsing = false;
|
||||
}
|
||||
break;
|
||||
case PARSER_SECOND:
|
||||
if (*ptr == '0') {
|
||||
result->zero_pad = true;
|
||||
advance_ptr++;
|
||||
advance_ptr = true;
|
||||
next_state = PARSER_NUM;
|
||||
current_token = ptr + 1;
|
||||
token_length = 0;
|
||||
} else if (*ptr > '9' || *ptr < '0') {
|
||||
/* Specifier */
|
||||
next_state = PARSER_SPECIFIER;
|
||||
|
Reference in New Issue
Block a user