Add tests and fix minor problems in specifier parser

This commit is contained in:
2023-06-01 22:39:10 +02:00
parent ae9425d433
commit 35ef94162b
5 changed files with 168 additions and 29 deletions

View File

@@ -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;