Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 21 additions & 0 deletions doc/json_schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -1392,6 +1392,27 @@
}
}
},
"global": {
"type": "object",
"additionalProperties": false,
"description": "Set global fallback values for display formatting",
"properties": {
"ndigits": {
"oneOf": [
{
"type": "integer",
"description": "Set the default number of digits to keep after the decimal point for all value types. Can be overridden per category (size, temp, percent, freq, fraction)",
"minimum": 0,
"maximum": 9
},
{
"type": "null",
"description": "Use the normal fallback behavior instead of forcing a global default number of digits"
}
]
}
}
},
"noBuffer": {
"type": "boolean",
"description": "Whether to disable the stdout application buffer",
Expand Down
4 changes: 2 additions & 2 deletions src/common/impl/format.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,10 +30,10 @@ void ffFormatAppendFormatArg(FFstrbuf* buffer, const FFformatarg* formatarg) {
ffStrbufAppend(buffer, (const FFstrbuf*) formatarg->value);
break;
case FF_ARG_TYPE_FLOAT:
ffStrbufAppendDouble(buffer, *(float*) formatarg->value, instance.config.display.fractionNdigits, instance.config.display.fractionTrailingZeros != FF_FRACTION_TRAILING_ZEROS_TYPE_NEVER);
ffStrbufAppendDouble(buffer, *(float*) formatarg->value, ffNdigitsResolveInt8(instance.config.display.fractionNdigits, instance.config.display.globalNdigits, 2), instance.config.display.fractionTrailingZeros != FF_FRACTION_TRAILING_ZEROS_TYPE_NEVER);
break;
case FF_ARG_TYPE_DOUBLE:
ffStrbufAppendDouble(buffer, *(double*) formatarg->value, instance.config.display.fractionNdigits, instance.config.display.fractionTrailingZeros != FF_FRACTION_TRAILING_ZEROS_TYPE_NEVER);
ffStrbufAppendDouble(buffer, *(double*) formatarg->value, ffNdigitsResolveInt8(instance.config.display.fractionNdigits, instance.config.display.globalNdigits, 2), instance.config.display.fractionTrailingZeros != FF_FRACTION_TRAILING_ZEROS_TYPE_NEVER);
break;
case FF_ARG_TYPE_BOOL:
ffStrbufAppendS(buffer, *(bool*) formatarg->value ? "true" : "false");
Expand Down
2 changes: 2 additions & 0 deletions src/common/impl/frequency.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ bool ffFreqAppendNum(uint32_t mhz, FFstrbuf* result) {
const FFOptionsDisplay* options = &instance.config.display;
bool spaceBeforeUnit = options->freqSpaceBeforeUnit != FF_SPACE_BEFORE_UNIT_NEVER;
int8_t ndigits = options->freqNdigits;
if (ndigits == INT8_MIN)
ndigits = (options->globalNdigits >= 0) ? options->globalNdigits : 2;

if (ndigits >= 0) {
ffStrbufAppendDouble(result, mhz / 1000., ndigits, true);
Expand Down
2 changes: 1 addition & 1 deletion src/common/impl/percent.c
Original file line number Diff line number Diff line change
Expand Up @@ -190,7 +190,7 @@ void ffPercentAppendNum(FFstrbuf* buffer, double percent, FFPercentageModuleConf
}
}
}
ffStrbufAppendF(buffer, "%*.*f%s%%", options->percentWidth, options->percentNdigits, percent, options->percentSpaceBeforeUnit == FF_SPACE_BEFORE_UNIT_ALWAYS ? " " : "");
ffStrbufAppendF(buffer, "%*.*f%s%%", options->percentWidth, ffNdigitsResolve(options->percentNdigits, options->globalNdigits, 0), percent, options->percentSpaceBeforeUnit == FF_SPACE_BEFORE_UNIT_ALWAYS ? " " : "");

if (colored && !options->pipe) {
ffStrbufAppendS(buffer, FASTFETCH_TEXT_MODIFIER_RESET);
Expand Down
2 changes: 1 addition & 1 deletion src/common/impl/size.c
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ static void appendNum(FFstrbuf* result, uint64_t bytes, uint32_t base, const cha
if (counter == 0) {
ffStrbufAppendUInt(result, bytes);
} else {
ffStrbufAppendDouble(result, size, (int8_t) options->sizeNdigits, true);
ffStrbufAppendDouble(result, size, (int8_t) ffNdigitsResolve(options->sizeNdigits, options->globalNdigits, 2), true);
}
if (options->sizeSpaceBeforeUnit != FF_SPACE_BEFORE_UNIT_NEVER) {
ffStrbufAppendC(result, ' ');
Expand Down
6 changes: 3 additions & 3 deletions src/common/impl/temps.c
Original file line number Diff line number Diff line change
Expand Up @@ -38,13 +38,13 @@ void ffTempsAppendNum(double celsius, FFstrbuf* buffer, FFColorRangeConfig confi
switch (options->tempUnit) {
case FF_TEMPERATURE_UNIT_DEFAULT:
case FF_TEMPERATURE_UNIT_CELSIUS:
ffStrbufAppendF(buffer, "%.*f%s°C", options->tempNdigits, celsius, options->tempSpaceBeforeUnit == FF_SPACE_BEFORE_UNIT_ALWAYS ? " " : "");
ffStrbufAppendF(buffer, "%.*f%s°C", ffNdigitsResolve(options->tempNdigits, options->globalNdigits, 1), celsius, options->tempSpaceBeforeUnit == FF_SPACE_BEFORE_UNIT_ALWAYS ? " " : "");
break;
case FF_TEMPERATURE_UNIT_FAHRENHEIT:
ffStrbufAppendF(buffer, "%.*f%s°F", options->tempNdigits, celsius * 1.8 + 32, options->tempSpaceBeforeUnit == FF_SPACE_BEFORE_UNIT_ALWAYS ? " " : "");
ffStrbufAppendF(buffer, "%.*f%s°F", ffNdigitsResolve(options->tempNdigits, options->globalNdigits, 1), celsius * 1.8 + 32, options->tempSpaceBeforeUnit == FF_SPACE_BEFORE_UNIT_ALWAYS ? " " : "");
break;
case FF_TEMPERATURE_UNIT_KELVIN:
ffStrbufAppendF(buffer, "%.*f%sK", options->tempNdigits, celsius + 273.15, options->tempSpaceBeforeUnit == FF_SPACE_BEFORE_UNIT_NEVER ? "" : " ");
ffStrbufAppendF(buffer, "%.*f%sK", ffNdigitsResolve(options->tempNdigits, options->globalNdigits, 1), celsius + 273.15, options->tempSpaceBeforeUnit == FF_SPACE_BEFORE_UNIT_NEVER ? "" : " ");
break;
}

Expand Down
4 changes: 2 additions & 2 deletions src/modules/localip/localip.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,10 @@ static void formatKey(const FFLocalIpOptions* options, FFLocalIpResult* ip, uint

static void appendSpeed(FFLocalIpResult* ip, FFstrbuf* strbuf) {
if (ip->speed >= 1000000) {
ffStrbufAppendDouble(strbuf, ip->speed / 1e6, instance.config.display.fractionNdigits, instance.config.display.fractionTrailingZeros == FF_FRACTION_TRAILING_ZEROS_TYPE_ALWAYS);
ffStrbufAppendDouble(strbuf, ip->speed / 1e6, ffNdigitsResolveInt8(instance.config.display.fractionNdigits, instance.config.display.globalNdigits, 2), instance.config.display.fractionTrailingZeros == FF_FRACTION_TRAILING_ZEROS_TYPE_ALWAYS);
ffStrbufAppendS(strbuf, " Tbps");
} else if (ip->speed >= 1000) {
ffStrbufAppendDouble(strbuf, ip->speed / 1e3, instance.config.display.fractionNdigits, instance.config.display.fractionTrailingZeros == FF_FRACTION_TRAILING_ZEROS_TYPE_ALWAYS);
ffStrbufAppendDouble(strbuf, ip->speed / 1e3, ffNdigitsResolveInt8(instance.config.display.fractionNdigits, instance.config.display.globalNdigits, 2), instance.config.display.fractionTrailingZeros == FF_FRACTION_TRAILING_ZEROS_TYPE_ALWAYS);
ffStrbufAppendS(strbuf, " Gbps");
} else {
ffStrbufAppendF(strbuf, "%u Mbps", (unsigned) ip->speed);
Expand Down
101 changes: 82 additions & 19 deletions src/options/display.c
Original file line number Diff line number Diff line change
Expand Up @@ -511,6 +511,26 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va
}
options->freqSpaceBeforeUnit = (FFSpaceBeforeUnitType) value;
}
} else if (unsafe_yyjson_equals_str(key, "global")) {
if (!yyjson_is_obj(val)) {
return "display.global must be an object";
}

yyjson_val* ndigits = yyjson_obj_get(val, "ndigits");
if (ndigits) {
if (yyjson_is_null(ndigits)) {
options->globalNdigits = -1;
} else {
if (!yyjson_is_uint(ndigits)) {
return "display.global.ndigits must be an unsigned integer";
}
uint64_t val = yyjson_get_uint(ndigits);
if (val > 9) {
return "display.global.ndigits must be between 0 and 9";
}
options->globalNdigits = (int8_t) val;
}
}
} else {
return "Unknown display property";
}
Expand Down Expand Up @@ -619,7 +639,12 @@ bool ffOptionsParseDisplayCommandLine(FFOptionsDisplay* options, const char* key
if (ffStrEqualsIgnCase(subkey, "binary-prefix")) {
options->sizeBinaryPrefix = (FFSizeBinaryPrefixType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { { "iec", FF_SIZE_BINARY_PREFIX_TYPE_IEC }, { "si", FF_SIZE_BINARY_PREFIX_TYPE_SI }, { "jedec", FF_SIZE_BINARY_PREFIX_TYPE_JEDEC }, {} });
} else if (ffStrEqualsIgnCase(subkey, "ndigits")) {
options->sizeNdigits = (uint8_t) ffOptionParseUInt32(key, value);
uint32_t ndigits = ffOptionParseUInt32(key, value);
if (ndigits > 9) {
fprintf(stderr, "Error: %s must be between 0 and 9\n", key);
exit(477);
}
options->sizeNdigits = (uint8_t) ndigits;
} else if (ffStrEqualsIgnCase(subkey, "max-prefix")) {
options->sizeMaxPrefix = (uint8_t) ffOptionParseEnum(key, value, (FFKeyValuePair[]) { { "B", 0 }, { "kB", 1 }, { "MB", 2 }, { "GB", 3 }, { "TB", 4 }, { "PB", 5 }, { "EB", 6 }, { "ZB", 7 }, { "YB", 8 }, {} });
} else if (ffStrEqualsIgnCase(subkey, "space-before-unit")) {
Expand Down Expand Up @@ -647,7 +672,12 @@ bool ffOptionsParseDisplayCommandLine(FFOptionsDisplay* options, const char* key
{},
});
} else if (ffStrEqualsIgnCase(subkey, "ndigits")) {
options->tempNdigits = (uint8_t) ffOptionParseUInt32(key, value);
uint32_t ndigits = ffOptionParseUInt32(key, value);
if (ndigits > 9) {
fprintf(stderr, "Error: %s must be between 0 and 9\n", key);
exit(477);
}
options->tempNdigits = (uint8_t) ndigits;
} else if (ffStrEqualsIgnCase(subkey, "color-green")) {
ffOptionParseColor(value, &options->tempColorGreen);
} else if (ffStrEqualsIgnCase(subkey, "color-yellow")) {
Expand All @@ -669,7 +699,12 @@ bool ffOptionsParseDisplayCommandLine(FFOptionsDisplay* options, const char* key
if (ffStrEqualsIgnCase(subkey, "type")) {
options->percentType = (uint8_t) ffOptionParseUInt32(key, value);
} else if (ffStrEqualsIgnCase(subkey, "ndigits")) {
options->percentNdigits = (uint8_t) ffOptionParseUInt32(key, value);
uint32_t ndigits = ffOptionParseUInt32(key, value);
if (ndigits > 9) {
fprintf(stderr, "Error: %s must be between 0 and 9\n", key);
exit(477);
}
options->percentNdigits = (uint8_t) ndigits;
} else if (ffStrEqualsIgnCase(subkey, "color-green")) {
ffOptionParseColor(value, &options->percentColorGreen);
} else if (ffStrEqualsIgnCase(subkey, "color-yellow")) {
Expand All @@ -689,7 +724,19 @@ bool ffOptionsParseDisplayCommandLine(FFOptionsDisplay* options, const char* key
return false;
}
} else if (ffStrEqualsIgnCase(key, "--fraction-ndigits")) {
options->fractionNdigits = (int8_t) ffOptionParseInt32(key, value);
int32_t ndigits = ffOptionParseInt32(key, value);
if (ndigits < -1 || ndigits > 9) {
fprintf(stderr, "Error: %s must be between -1 and 9\n", key);
exit(477);
}
options->fractionNdigits = (int8_t) ndigits;
} else if (ffStrEqualsIgnCase(key, "--ndigits")) {
uint32_t ndigits = ffOptionParseUInt32(key, value);
if (ndigits > 9) {
fprintf(stderr, "Error: %s must be between 0 and 9\n", key);
exit(477);
}
options->globalNdigits = (int8_t) ndigits;
} else if (ffStrEqualsIgnCase(key, "--fraction-trailing-zeros")) {
options->fractionTrailingZeros = (FFFractionTrailingZerosType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) {
{ "default", FF_FRACTION_TRAILING_ZEROS_TYPE_DEFAULT },
Expand Down Expand Up @@ -733,7 +780,12 @@ bool ffOptionsParseDisplayCommandLine(FFOptionsDisplay* options, const char* key
} else if (ffStrStartsWithIgnCase(key, "--freq-")) {
const char* subkey = key + strlen("--freq-");
if (ffStrEqualsIgnCase(subkey, "ndigits")) {
options->freqNdigits = (int8_t) ffOptionParseInt32(key, value);
int32_t ndigits = ffOptionParseInt32(key, value);
if (ndigits < -1 || ndigits > 9) {
fprintf(stderr, "Error: %s must be between -1 and 9\n", key);
exit(477);
}
options->freqNdigits = (int8_t) ndigits;
} else if (ffStrEqualsIgnCase(subkey, "space-before-unit")) {
options->freqSpaceBeforeUnit = (FFSpaceBeforeUnitType) ffOptionParseEnum(key, value, (FFKeyValuePair[]) {
{ "default", FF_SPACE_BEFORE_UNIT_DEFAULT },
Expand Down Expand Up @@ -771,7 +823,7 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) {
options->durationSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_DEFAULT;
options->hideCursor = false;
options->sizeBinaryPrefix = FF_SIZE_BINARY_PREFIX_TYPE_IEC;
options->sizeNdigits = 2;
options->sizeNdigits = UINT8_MAX;
options->sizeMaxPrefix = 8; // YB
options->sizeSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_DEFAULT;

Expand All @@ -782,7 +834,7 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) {
options->keyType = FF_MODULE_KEY_TYPE_STRING;

options->tempUnit = FF_TEMPERATURE_UNIT_DEFAULT;
options->tempNdigits = 1;
options->tempNdigits = UINT8_MAX;
ffStrbufInitStatic(&options->tempColorGreen, FF_COLOR_FG_GREEN);
ffStrbufInitStatic(&options->tempColorYellow, instance.state.terminalLightTheme ? FF_COLOR_FG_YELLOW : FF_COLOR_FG_LIGHT_YELLOW);
ffStrbufInitStatic(&options->tempColorRed, instance.state.terminalLightTheme ? FF_COLOR_FG_RED : FF_COLOR_FG_LIGHT_RED);
Expand All @@ -802,16 +854,17 @@ void ffOptionsInitDisplay(FFOptionsDisplay* options) {
options->durationAbbreviation = false;
options->durationSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_DEFAULT;
options->percentType = 9;
options->percentNdigits = 0;
options->percentNdigits = UINT8_MAX;
ffStrbufInitStatic(&options->percentColorGreen, FF_COLOR_FG_GREEN);
ffStrbufInitStatic(&options->percentColorYellow, instance.state.terminalLightTheme ? FF_COLOR_FG_YELLOW : FF_COLOR_FG_LIGHT_YELLOW);
ffStrbufInitStatic(&options->percentColorRed, instance.state.terminalLightTheme ? FF_COLOR_FG_RED : FF_COLOR_FG_LIGHT_RED);
options->percentSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_DEFAULT;
options->percentWidth = 0;

options->freqNdigits = 2;
options->freqNdigits = INT8_MIN;
options->freqSpaceBeforeUnit = FF_SPACE_BEFORE_UNIT_DEFAULT;
options->fractionNdigits = 2;
options->fractionNdigits = INT8_MIN;
options->globalNdigits = -1;
options->fractionTrailingZeros = FF_FRACTION_TRAILING_ZEROS_TYPE_DEFAULT;

ffListInit(&options->constants, sizeof(FFstrbuf));
Expand Down Expand Up @@ -901,7 +954,8 @@ void ffOptionsGenerateDisplayJsonConfig(FFdata* data, FFOptionsDisplay* options)
yyjson_mut_obj_add_str(doc, size, "binaryPrefix", "jedec");
break;
}
yyjson_mut_obj_add_uint(doc, size, "ndigits", options->sizeNdigits);
if (options->sizeNdigits != UINT8_MAX)
yyjson_mut_obj_add_uint(doc, size, "ndigits", options->sizeNdigits);
switch (options->sizeSpaceBeforeUnit) {
case FF_SPACE_BEFORE_UNIT_DEFAULT:
yyjson_mut_obj_add_str(doc, size, "spaceBeforeUnit", "default");
Expand Down Expand Up @@ -931,7 +985,8 @@ void ffOptionsGenerateDisplayJsonConfig(FFdata* data, FFOptionsDisplay* options)
yyjson_mut_obj_add_str(doc, obj, "unit", "K");
break;
}
yyjson_mut_obj_add_uint(doc, temperature, "ndigits", options->tempNdigits);
if (options->tempNdigits != UINT8_MAX)
yyjson_mut_obj_add_uint(doc, temperature, "ndigits", options->tempNdigits);
{
yyjson_mut_val* color = yyjson_mut_obj_add_obj(doc, temperature, "color");
yyjson_mut_obj_add_strbuf(doc, color, "green", &options->tempColorGreen);
Expand Down Expand Up @@ -971,14 +1026,15 @@ void ffOptionsGenerateDisplayJsonConfig(FFdata* data, FFOptionsDisplay* options)
yyjson_mut_arr_add_str(doc, type, "bar-monochrome");
}
}
yyjson_mut_obj_add_uint(doc, percent, "ndigits", options->percentNdigits);
if (options->percentNdigits != UINT8_MAX)
yyjson_mut_obj_add_uint(doc, percent, "ndigits", options->percentNdigits);
{
yyjson_mut_val* color = yyjson_mut_obj_add_obj(doc, percent, "color");
yyjson_mut_obj_add_strbuf(doc, color, "green", &options->percentColorGreen);
yyjson_mut_obj_add_strbuf(doc, color, "yellow", &options->percentColorYellow);
yyjson_mut_obj_add_strbuf(doc, color, "red", &options->percentColorRed);
}
switch (options->percentSpaceBeforeUnit) {
switch (options->freqSpaceBeforeUnit) {
case FF_SPACE_BEFORE_UNIT_DEFAULT:
yyjson_mut_obj_add_str(doc, percent, "spaceBeforeUnit", "default");
break;
Expand Down Expand Up @@ -1016,10 +1072,11 @@ void ffOptionsGenerateDisplayJsonConfig(FFdata* data, FFOptionsDisplay* options)
{
yyjson_mut_val* fraction = yyjson_mut_obj_add_obj(doc, obj, "fraction");

if (options->fractionNdigits < 0) {
yyjson_mut_obj_add_null(doc, fraction, "ndigits");
} else {
yyjson_mut_obj_add_uint(doc, fraction, "ndigits", (uint8_t) options->fractionNdigits);
if (options->fractionNdigits != INT8_MIN) {
if (options->fractionNdigits < 0)
yyjson_mut_obj_add_null(doc, fraction, "ndigits");
else
yyjson_mut_obj_add_uint(doc, fraction, "ndigits", (uint8_t) options->fractionNdigits);
}
}

Expand Down Expand Up @@ -1048,7 +1105,8 @@ void ffOptionsGenerateDisplayJsonConfig(FFdata* data, FFOptionsDisplay* options)

{
yyjson_mut_val* freq = yyjson_mut_obj_add_obj(doc, obj, "freq");
yyjson_mut_obj_add_int(doc, freq, "ndigits", options->freqNdigits);
if (options->freqNdigits != INT8_MIN)
yyjson_mut_obj_add_int(doc, freq, "ndigits", options->freqNdigits);
switch (options->percentSpaceBeforeUnit) {
case FF_SPACE_BEFORE_UNIT_DEFAULT:
yyjson_mut_obj_add_str(doc, freq, "spaceBeforeUnit", "default");
Expand All @@ -1062,6 +1120,11 @@ void ffOptionsGenerateDisplayJsonConfig(FFdata* data, FFOptionsDisplay* options)
}
}

if (options->globalNdigits >= 0) {
yyjson_mut_val* global = yyjson_mut_obj_add_obj(doc, obj, "global");
yyjson_mut_obj_add_uint(doc, global, "ndigits", (uint8_t) options->globalNdigits);
}

{
yyjson_mut_val* constants = yyjson_mut_obj_add_arr(doc, obj, "constants");
FF_LIST_FOR_EACH (FFstrbuf, item, options->constants) {
Expand Down
Loading
Loading