summaryrefslogtreecommitdiff
path: root/3rdparty/libconfig/libconfig.c
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/libconfig/libconfig.c')
-rw-r--r--3rdparty/libconfig/libconfig.c45
1 files changed, 44 insertions, 1 deletions
diff --git a/3rdparty/libconfig/libconfig.c b/3rdparty/libconfig/libconfig.c
index 533145ac4..68dd4fdd8 100644
--- a/3rdparty/libconfig/libconfig.c
+++ b/3rdparty/libconfig/libconfig.c
@@ -174,6 +174,26 @@ static void __config_indent(FILE *stream, int depth, unsigned short w)
/* ------------------------------------------------------------------------- */
+/**
+ * converts an integer to a binary string (because itoa is not in C99)
+ */
+char *int_tobin(const unsigned long long value, char *buffer) {
+ const unsigned long long mask = 1;
+ char nonzero = 0;
+
+ for (char bit = 63; bit >= 0; --bit) {
+ if ((value & (mask << bit)) == 1) {
+ nonzero = 1;
+ *buffer++ = '1';
+ } else if (nonzero) {
+ *buffer++ = '0';
+ }
+ }
+
+ *buffer = '\0';
+ return buffer;
+}
+
static void __config_write_value(const struct config_t *config,
const union config_value_t *value, int type,
int format, int depth, FILE *stream)
@@ -195,6 +215,17 @@ static void __config_write_value(const struct config_t *config,
fprintf(stream, "0x%X", (unsigned int)(value->ival));
break;
+ case CONFIG_FORMAT_BIN:
+ {
+ char buffer[33]; // 32 bits + null
+ fprintf(stream, "0b%s", int_tobin((unsigned int)(value->ival), buffer));
+ break;
+ }
+
+ case CONFIG_FORMAT_OCT:
+ fprintf(stream, "0o%o", (unsigned int)(value->ival));
+ break;
+
case CONFIG_FORMAT_DEFAULT:
default:
fprintf(stream, "%d", value->ival);
@@ -210,6 +241,17 @@ static void __config_write_value(const struct config_t *config,
fprintf(stream, "0x" INT64_HEX_FMT "L", (unsigned long long)(value->llval));
break;
+ case CONFIG_FORMAT_BIN:
+ {
+ char buffer[65]; // 64 bits + null
+ fprintf(stream, "0b%s", int_tobin((unsigned long long)(value->llval), buffer));
+ break;
+ }
+
+ case CONFIG_FORMAT_OCT:
+ fprintf(stream, "0o" INT64_OCT_FMT "L", (unsigned long long)(value->llval));
+ break;
+
case CONFIG_FORMAT_DEFAULT:
default:
fprintf(stream, INT64_FMT "L", value->llval);
@@ -1176,7 +1218,8 @@ int config_setting_set_format(struct config_setting_t *setting, short format)
{
if(((setting->type != CONFIG_TYPE_INT)
&& (setting->type != CONFIG_TYPE_INT64))
- || ((format != CONFIG_FORMAT_DEFAULT) && (format != CONFIG_FORMAT_HEX)))
+ || ((format != CONFIG_FORMAT_DEFAULT) && (format != CONFIG_FORMAT_HEX) &&
+ (format != CONFIG_FORMAT_BIN) && (format != CONFIG_FORMAT_OCT)))
return(CONFIG_FALSE);
setting->format = format;