aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README.md2
-rw-r--r--ini_file.c110
-rw-r--r--ini_file.h8
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);