From e32987c408fdfc488b25080de80a35cd0f0fcf33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Tue, 5 Aug 2025 13:37:53 +0800 Subject: [PATCH] JsonConfig: make all non-module keys case-sensitive --- src/options/display.c | 46 ++++++++++++++++++++----------------------- src/options/general.c | 20 +++++++++---------- src/options/logo.c | 37 +++++++++++++++------------------- 3 files changed, 47 insertions(+), 56 deletions(-) diff --git a/src/options/display.c b/src/options/display.c index 1f0d22a2b..6bd4498f8 100644 --- a/src/options/display.c +++ b/src/options/display.c @@ -13,13 +13,11 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va if (!object) return NULL; if (!yyjson_is_obj(object)) return "Property 'display' must be an object"; - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(object, idx, max, key_, val) + yyjson_obj_foreach(object, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - - if (ffStrEqualsIgnCase(key, "stat")) + if (unsafe_yyjson_equals_str(key, "stat")) { if (yyjson_is_bool(val)) { @@ -39,21 +37,21 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else return "display.stat must be a boolean or a positive integer"; } - else if (ffStrEqualsIgnCase(key, "pipe")) + else if (unsafe_yyjson_equals_str(key, "pipe")) options->pipe = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "showErrors")) + else if (unsafe_yyjson_equals_str(key, "showErrors")) options->showErrors = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "disableLinewrap")) + else if (unsafe_yyjson_equals_str(key, "disableLinewrap")) options->disableLinewrap = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "hideCursor")) + else if (unsafe_yyjson_equals_str(key, "hideCursor")) options->hideCursor = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "separator")) + else if (unsafe_yyjson_equals_str(key, "separator")) ffStrbufSetJsonVal(&options->keyValueSeparator, val); - else if (ffStrEqualsIgnCase(key, "color")) + else if (unsafe_yyjson_equals_str(key, "color")) { if (yyjson_is_str(val)) { - ffOptionParseColor(yyjson_get_str(val), &options->colorKeys); + ffOptionParseColor(unsafe_yyjson_get_str(val), &options->colorKeys); ffStrbufSet(&options->colorTitle, &options->colorKeys); } else if (yyjson_is_obj(val)) @@ -74,9 +72,9 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else return "display.color must be either a string or an object"; } - else if (ffStrEqualsIgnCase(key, "brightColor")) + else if (unsafe_yyjson_equals_str(key, "brightColor")) options->brightColor = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "duration")) + else if (unsafe_yyjson_equals_str(key, "duration")) { if (!yyjson_is_obj(val)) return "display.duration must be an object"; @@ -98,7 +96,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va options->durationSpaceBeforeUnit = (FFSpaceBeforeUnitType) value; } } - else if (ffStrEqualsIgnCase(key, "size")) + else if (unsafe_yyjson_equals_str(key, "size")) { if (!yyjson_is_obj(val)) return "display.size must be an object"; @@ -154,7 +152,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va options->sizeSpaceBeforeUnit = (FFSpaceBeforeUnitType) value; } } - else if (ffStrEqualsIgnCase(key, "temp")) + else if (unsafe_yyjson_equals_str(key, "temp")) { if (!yyjson_is_obj(val)) return "display.temp must be an object"; @@ -211,7 +209,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va options->tempSpaceBeforeUnit = (FFSpaceBeforeUnitType) value; } } - else if (ffStrEqualsIgnCase(key, "percent")) + else if (unsafe_yyjson_equals_str(key, "percent")) { if (!yyjson_is_obj(val)) return "display.percent must be an object"; @@ -259,7 +257,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va yyjson_val* width = yyjson_obj_get(val, "width"); if (width) options->percentWidth = (uint8_t) yyjson_get_uint(width); } - else if (ffStrEqualsIgnCase(key, "bar")) + else if (unsafe_yyjson_equals_str(key, "bar")) { if (yyjson_is_obj(val)) { @@ -369,7 +367,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else return "display.bar must be an object"; } - else if (ffStrEqualsIgnCase(key, "fraction")) + else if (unsafe_yyjson_equals_str(key, "fraction")) { if (yyjson_is_obj(val)) { @@ -386,11 +384,9 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else return "display.fraction must be an object"; } - else if (ffStrEqualsIgnCase(key, "noBuffer")) + else if (unsafe_yyjson_equals_str(key, "noBuffer")) options->noBuffer = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "keyWidth")) - return "display.keyWidth has been renamed to display.key.width"; - else if (ffStrEqualsIgnCase(key, "key")) + else if (unsafe_yyjson_equals_str(key, "key")) { if (yyjson_is_obj(val)) { @@ -420,7 +416,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va else return "display.key must be an object"; } - else if (ffStrEqualsIgnCase(key, "constants")) + else if (unsafe_yyjson_equals_str(key, "constants")) { if (!yyjson_is_arr(val)) return "display.constants must be an array"; @@ -429,7 +425,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va yyjson_arr_foreach(val, idx, max, item) ffStrbufInitJsonVal(ffListAdd(&options->constants), item); } - else if (ffStrEqualsIgnCase(key, "freq")) + else if (unsafe_yyjson_equals_str(key, "freq")) { if (!yyjson_is_obj(val)) return "display.freq must be an object"; diff --git a/src/options/general.c b/src/options/general.c index 479bb9a10..f5d584f4d 100644 --- a/src/options/general.c +++ b/src/options/general.c @@ -12,30 +12,28 @@ const char* ffOptionsParseGeneralJsonConfig(FFOptionsGeneral* options, yyjson_va if (!object) return NULL; if (!yyjson_is_obj(object)) return "Property 'general' must be an object"; - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(object, idx, max, key_, val) + yyjson_obj_foreach(object, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - - if (ffStrEqualsIgnCase(key, "thread")) + if (unsafe_yyjson_equals_str(key, "thread")) options->multithreading = yyjson_get_bool(val); - else if (ffStrEqualsIgnCase(key, "processingTimeout")) + else if (unsafe_yyjson_equals_str(key, "processingTimeout")) options->processingTimeout = (int32_t) yyjson_get_int(val); - else if (ffStrEqualsIgnCase(key, "preRun")) + else if (unsafe_yyjson_equals_str(key, "preRun")) { if (!yyjson_is_str(val)) return "general.preRun must be a string"; if (system(unsafe_yyjson_get_str(val)) < 0) return "Failed to execute preRun command"; } - else if (ffStrEqualsIgnCase(key, "detectVersion")) + else if (unsafe_yyjson_equals_str(key, "detectVersion")) options->detectVersion = yyjson_get_bool(val); #if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) - else if (ffStrEqualsIgnCase(key, "playerName")) + else if (unsafe_yyjson_equals_str(key, "playerName")) ffStrbufSetJsonVal(&options->playerName, val); - else if (ffStrEqualsIgnCase(key, "dsForceDrm")) + else if (unsafe_yyjson_equals_str(key, "dsForceDrm")) { if (yyjson_is_str(val)) { @@ -127,6 +125,8 @@ void ffOptionsGenerateGeneralJsonConfig(FFOptionsGeneral* options, yyjson_mut_do yyjson_mut_obj_add_int(doc, obj, "processingTimeout", options->processingTimeout); + yyjson_mut_obj_add_bool(doc, obj, "detectVersion", options->detectVersion); + #if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__) yyjson_mut_obj_add_strbuf(doc, obj, "playerName", &options->playerName); diff --git a/src/options/logo.c b/src/options/logo.c index 34e420182..2e93dd518 100644 --- a/src/options/logo.c +++ b/src/options/logo.c @@ -269,13 +269,11 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo if (!yyjson_is_obj(object)) return "Property 'logo' must be an object"; - yyjson_val *key_, *val; + yyjson_val *key, *val; size_t idx, max; - yyjson_obj_foreach(object, idx, max, key_, val) + yyjson_obj_foreach(object, idx, max, key, val) { - const char* key = yyjson_get_str(key_); - - if (ffStrEqualsIgnCase(key, "type")) + if (unsafe_yyjson_equals_str(key, "type")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -302,22 +300,21 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo options->type = (FFLogoType) value; continue; } - else if (ffStrEqualsIgnCase(key, "source")) + else if (unsafe_yyjson_equals_str(key, "source")) { ffStrbufSetJsonVal(&options->source, val); continue; } - else if (ffStrEqualsIgnCase(key, "color")) + else if (unsafe_yyjson_equals_str(key, "color")) { if (!yyjson_is_obj(val)) return "Property 'color' must be an object"; - yyjson_val *key_c, *valc; + yyjson_val *keyc, *valc; size_t idxc, maxc; - yyjson_obj_foreach(val, idxc, maxc, key_c, valc) + yyjson_obj_foreach(val, idxc, maxc, keyc, valc) { - const char* keyc = yyjson_get_str(key_c); - uint32_t index = (uint32_t) strtoul(keyc, NULL, 10); + uint32_t index = (uint32_t) strtoul(unsafe_yyjson_get_str(keyc), NULL, 10); if (index < 1 || index > FASTFETCH_LOGO_MAX_COLORS) return "Keys of property 'color' must be a number between 1 to 9"; @@ -325,7 +322,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo } continue; } - else if (ffStrEqualsIgnCase(key, "width")) + else if (unsafe_yyjson_equals_str(key, "width")) { if (yyjson_is_null(val)) options->width = 0; @@ -338,7 +335,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo } continue; } - else if (ffStrEqualsIgnCase(key, "height")) + else if (unsafe_yyjson_equals_str(key, "height")) { if (yyjson_is_null(val)) options->height = 0; @@ -351,7 +348,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo } continue; } - else if (ffStrEqualsIgnCase(key, "padding")) + else if (unsafe_yyjson_equals_str(key, "padding")) { if (!yyjson_is_obj(val)) return "Logo padding must be an object"; @@ -370,24 +367,22 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo #undef FF_PARSE_PADDING_POSITON continue; } - else if (ffStrEqualsIgnCase(key, "printRemaining")) + else if (unsafe_yyjson_equals_str(key, "printRemaining")) { options->printRemaining = yyjson_get_bool(val); continue; } - else if (ffStrEqualsIgnCase(key, "preserveAspectRatio")) + else if (unsafe_yyjson_equals_str(key, "preserveAspectRatio")) { options->preserveAspectRatio = yyjson_get_bool(val); continue; } - else if (ffStrEqualsIgnCase(key, "recache")) + else if (unsafe_yyjson_equals_str(key, "recache")) { options->recache = yyjson_get_bool(val); continue; } - else if(ffStrEqualsIgnCase(key, "separate")) - return "logo.separate has been renamed to logo.position\n"; - else if (ffStrEqualsIgnCase(key, "position")) + else if (unsafe_yyjson_equals_str(key, "position")) { int value; const char* error = ffJsonConfigParseEnum(val, &value, (FFKeyValuePair[]) { @@ -401,7 +396,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo options->position = (FFLogoPosition) value; continue; } - else if (ffStrEqualsIgnCase(key, "chafa")) + else if (unsafe_yyjson_equals_str(key, "chafa")) { if (!yyjson_is_obj(val)) return "Chafa config must be an object";