From 9826b77f89c80fac287fa02a2fe432ac8e5ea462 Mon Sep 17 00:00:00 2001 From: Clecio Jung Date: Sat, 15 Apr 2023 11:44:47 -0300 Subject: Adding new search functions --- README.md | 2 +- ini_file.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++-------------- ini_file.h | 8 +++-- 3 files changed, 93 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index f726ed3..3c460ad 100644 --- a/README.md +++ b/README.md @@ -72,7 +72,7 @@ int main(const int argc, const char **const argv) { printf("\nThe specified key equals to: %s\n", value); /* You can search for a property and convert it directly to a number */ - if (ini_file_find_float(ini_file, "section", "key", &number) != ini_no_error) { + if (ini_file_find_double(ini_file, "section", "key", &number) != ini_no_error) { fprintf(stderr, "\nIt was not possible to find the specified key!\n"); } printf("\nThe specified key equals to: %g\n", number); diff --git a/ini_file.c b/ini_file.c index e07b9b1..91082ee 100644 --- a/ini_file.c +++ b/ini_file.c @@ -417,20 +417,15 @@ enum Ini_File_Errors ini_file_find_section(struct Ini_File *const ini_file, cons return error; } -enum Ini_File_Errors ini_file_find_property(struct Ini_File *const ini_file, const char *const section, const char *const key, char **value) { +enum Ini_File_Errors ini_section_find_property(struct Ini_Section *const ini_section, const char *const key, char **value) { enum Ini_File_Errors error; - struct Ini_Section *ini_section; size_t property_index; - if ((ini_file == NULL) || (key == NULL) || (value == NULL)) { + if ((ini_section == NULL) || (value == NULL)) { return ini_invalid_parameters; } if (key[0] == '\0') { return ini_invalid_parameters; } - error = ini_file_find_section(ini_file, section, &ini_section); - if (error != ini_no_error) { - return error; - } error = ini_file_find_key_index(ini_section, key, strlen(key), &property_index); if (error == ini_no_error) { *value = ini_section->properties[property_index].value; @@ -438,18 +433,25 @@ enum Ini_File_Errors ini_file_find_property(struct Ini_File *const ini_file, con return error; } -enum Ini_File_Errors ini_file_find_integer(struct Ini_File *const ini_file, const char *const section, const char *const key, long *integer) { - char *value, *end; - long i_value; +enum Ini_File_Errors ini_file_find_property(struct Ini_File *const ini_file, const char *const section, const char *const key, char **value) { enum Ini_File_Errors error; - if (integer == NULL) { + struct Ini_Section *ini_section; + if ((ini_file == NULL) || (key == NULL) || (value == NULL)) { return ini_invalid_parameters; } - error = ini_file_find_property(ini_file, section, key, &value); + if (key[0] == '\0') { + return ini_invalid_parameters; + } + error = ini_file_find_section(ini_file, section, &ini_section); if (error != ini_no_error) { return error; } - i_value = strtol(value, &end, 10); + return ini_section_find_property(ini_section, key, value); +} + +static enum Ini_File_Errors convert_to_integer(const char *const value, long *const integer) { + char *end; + long i_value = strtol(value, &end, 10); if (*end != '\0') { return ini_not_integer; } @@ -457,18 +459,35 @@ enum Ini_File_Errors ini_file_find_integer(struct Ini_File *const ini_file, cons return ini_no_error; } -enum Ini_File_Errors ini_file_find_unsigned(struct Ini_File *const ini_file, const char *const section, const char *const key, unsigned long *uint) { - char *value, *end; - unsigned long ui_value; +enum Ini_File_Errors ini_section_find_integer(struct Ini_Section *const ini_section, const char *const key, long *integer) { + char *value; enum Ini_File_Errors error; - if (uint == NULL) { + if (integer == NULL) { + return ini_invalid_parameters; + } + error = ini_section_find_property(ini_section, key, &value); + if (error != ini_no_error) { + return error; + } + return convert_to_integer(value, integer); +} + +enum Ini_File_Errors ini_file_find_integer(struct Ini_File *const ini_file, const char *const section, const char *const key, long *integer) { + char *value; + enum Ini_File_Errors error; + if (integer == NULL) { return ini_invalid_parameters; } error = ini_file_find_property(ini_file, section, key, &value); if (error != ini_no_error) { return error; } - ui_value = strtoul(value, &end, 10); + return convert_to_integer(value, integer); +} + +static enum Ini_File_Errors convert_to_unsigned(const char *const value, unsigned long *const uint) { + char *end; + unsigned long ui_value = strtoul(value, &end, 10); if (*end != '\0') { return ini_not_unsigned; } @@ -476,25 +495,68 @@ enum Ini_File_Errors ini_file_find_unsigned(struct Ini_File *const ini_file, con return ini_no_error; } -enum Ini_File_Errors ini_file_find_float(struct Ini_File *const ini_file, const char *const section, const char *const key, double *real) { - char *value, *end; - double d_value; +enum Ini_File_Errors ini_section_find_unsigned(struct Ini_Section *const ini_section, const char *const key, unsigned long *uint) { + char *value; enum Ini_File_Errors error; - if (real == NULL) { + if (uint == NULL) { + return ini_invalid_parameters; + } + error = ini_section_find_property(ini_section, key, &value); + if (error != ini_no_error) { + return error; + } + return convert_to_unsigned(value, uint); +} + +enum Ini_File_Errors ini_file_find_unsigned(struct Ini_File *const ini_file, const char *const section, const char *const key, unsigned long *uint) { + char *value; + enum Ini_File_Errors error; + if (uint == NULL) { return ini_invalid_parameters; } error = ini_file_find_property(ini_file, section, key, &value); if (error != ini_no_error) { return error; } - d_value = strtod(value, &end); + return convert_to_unsigned(value, uint); +} + +static enum Ini_File_Errors convert_to_double(const char *const value, double *const real) { + char *end; + double d_value = strtod(value, &end); if (*end != '\0') { - return ini_not_float; + return ini_not_double; } *real = d_value; return ini_no_error; } +enum Ini_File_Errors ini_section_find_double(struct Ini_Section *const ini_section, const char *const key, double *real) { + char *value; + enum Ini_File_Errors error; + if (real == NULL) { + return ini_invalid_parameters; + } + error = ini_section_find_property(ini_section, key, &value); + if (error != ini_no_error) { + return error; + } + return convert_to_double(value, real); +} + +enum Ini_File_Errors ini_file_find_double(struct Ini_File *const ini_file, const char *const section, const char *const key, double *real) { + char *value; + enum Ini_File_Errors error; + if (real == NULL) { + return ini_invalid_parameters; + } + error = ini_file_find_property(ini_file, section, key, &value); + if (error != ini_no_error) { + return error; + } + return convert_to_double(value, real); +} + static size_t max_size(const size_t a, const size_t b) { return ((a > b) ? a : b); } diff --git a/ini_file.h b/ini_file.h index 4978b5a..a367661 100644 --- a/ini_file.h +++ b/ini_file.h @@ -117,7 +117,7 @@ enum Ini_File_Errors { ini_no_such_property, ini_not_integer, ini_not_unsigned, - ini_not_float, + ini_not_double, NUMBER_OF_INI_FILE_ERRORS }; @@ -150,7 +150,11 @@ enum Ini_File_Errors ini_file_find_section(struct Ini_File *const ini_file, cons enum Ini_File_Errors ini_file_find_property(struct Ini_File *const ini_file, const char *const section, const char *const key, char **value); enum Ini_File_Errors ini_file_find_integer(struct Ini_File *const ini_file, const char *const section, const char *const key, long *integer); enum Ini_File_Errors ini_file_find_unsigned(struct Ini_File *const ini_file, const char *const section, const char *const key, unsigned long *uint); -enum Ini_File_Errors ini_file_find_float(struct Ini_File *const ini_file, const char *const section, const char *const key, double *real); +enum Ini_File_Errors ini_file_find_double(struct Ini_File *const ini_file, const char *const section, const char *const key, double *real); +enum Ini_File_Errors ini_section_find_property(struct Ini_Section *const ini_section, const char *const key, char **value); +enum Ini_File_Errors ini_section_find_integer(struct Ini_Section *const ini_section, const char *const key, long *integer); +enum Ini_File_Errors ini_section_find_unsigned(struct Ini_Section *const ini_section, const char *const key, unsigned long *uint); +enum Ini_File_Errors ini_section_find_double(struct Ini_Section *const ini_section, const char *const key, double *real); /* These functions returns ini_no_error = 0 if everything worked correctly */ enum Ini_File_Errors ini_file_add_section_sized(struct Ini_File *const ini_file, const char *const name, const size_t name_len); -- cgit v1.2.3