JsonConfig: refactor string buffer JSON handling for robustness

This commit is contained in:
李通洲
2025-08-02 17:41:19 +08:00
parent 6d86813647
commit 3cef51ec4a
21 changed files with 90 additions and 64 deletions
+20 -20
View File
@@ -48,7 +48,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va
else if (ffStrEqualsIgnCase(key, "hideCursor"))
options->hideCursor = yyjson_get_bool(val);
else if (ffStrEqualsIgnCase(key, "separator"))
ffStrbufSetS(&options->keyValueSeparator, yyjson_get_str(val));
ffStrbufSetJsonVal(&options->keyValueSeparator, val);
else if (ffStrEqualsIgnCase(key, "color"))
{
if (yyjson_is_str(val))
@@ -58,18 +58,18 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va
}
else if (yyjson_is_obj(val))
{
const char* colorKeys = yyjson_get_str(yyjson_obj_get(val, "keys"));
yyjson_val* colorKeys = yyjson_obj_get(val, "keys");
if (colorKeys)
ffOptionParseColor(colorKeys, &options->colorKeys);
const char* colorTitle = yyjson_get_str(yyjson_obj_get(val, "title"));
ffOptionParseColor(yyjson_get_str(colorKeys), &options->colorKeys);
yyjson_val* colorTitle = yyjson_obj_get(val, "title");
if (colorTitle)
ffOptionParseColor(colorTitle, &options->colorTitle);
const char* colorOutput = yyjson_get_str(yyjson_obj_get(val, "output"));
ffOptionParseColor(yyjson_get_str(colorTitle), &options->colorTitle);
yyjson_val* colorOutput = yyjson_obj_get(val, "output");
if (colorOutput)
ffOptionParseColor(colorOutput, &options->colorOutput);
const char* colorSeparator = yyjson_get_str(yyjson_obj_get(val, "separator"));
ffOptionParseColor(yyjson_get_str(colorOutput), &options->colorOutput);
yyjson_val* colorSeparator = yyjson_obj_get(val, "separator");
if (colorSeparator)
ffOptionParseColor(colorSeparator, &options->colorSeparator);
ffOptionParseColor(yyjson_get_str(colorSeparator), &options->colorSeparator);
}
else
return "display.color must be either a string or an object";
@@ -268,21 +268,21 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va
{
if (!yyjson_is_obj(char_)) return "display.bar.char must be an object";
const char* charElapsed = yyjson_get_str(yyjson_obj_get(char_, "elapsed"));
yyjson_val* charElapsed = yyjson_obj_get(char_, "elapsed");
if (charElapsed)
ffStrbufSetS(&options->barCharElapsed, charElapsed);
ffStrbufSetJsonVal(&options->barCharElapsed, charElapsed);
const char* charTotal = yyjson_get_str(yyjson_obj_get(char_, "total"));
yyjson_val* charTotal = yyjson_obj_get(char_, "total");
if (charTotal)
ffStrbufSetS(&options->barCharTotal, charTotal);
ffStrbufSetJsonVal(&options->barCharTotal, charTotal);
}
else
{
const char* charElapsed = yyjson_get_str(yyjson_obj_get(val, "charElapsed"));
yyjson_val* charElapsed = yyjson_obj_get(val, "charElapsed");
if (charElapsed)
return "display.bar.charElapsed has been renamed to display.bar.char.elapsed.";
const char* charTotal = yyjson_get_str(yyjson_obj_get(val, "charTotal"));
yyjson_val* charTotal = yyjson_obj_get(val, "charTotal");
if (charTotal)
return "display.bar.charTotal has been renamed to display.bar.char.total.";
}
@@ -303,19 +303,19 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va
yyjson_val* borderLeft = yyjson_obj_get(border, "left");
if (borderLeft)
ffStrbufSetS(&options->barBorderLeft, yyjson_get_str(borderLeft));
ffStrbufSetJsonVal(&options->barBorderLeft, borderLeft);
yyjson_val* borderRight = yyjson_obj_get(border, "right");
if (borderRight)
ffStrbufSetS(&options->barBorderRight, yyjson_get_str(borderRight));
ffStrbufSetJsonVal(&options->barBorderRight, borderRight);
yyjson_val* borderLeftElapsed = yyjson_obj_get(border, "leftElapsed");
if (borderLeftElapsed)
ffStrbufSetS(&options->barBorderLeftElapsed, yyjson_get_str(borderLeftElapsed));
ffStrbufSetJsonVal(&options->barBorderLeftElapsed, borderLeftElapsed);
yyjson_val* borderRightElapsed = yyjson_obj_get(border, "rightElapsed");
if (borderRightElapsed)
ffStrbufSetS(&options->barBorderRightElapsed, yyjson_get_str(borderRightElapsed));
ffStrbufSetJsonVal(&options->barBorderRightElapsed, borderRightElapsed);
}
}
else
@@ -418,7 +418,7 @@ const char* ffOptionsParseDisplayJsonConfig(FFOptionsDisplay* options, yyjson_va
yyjson_val* item;
size_t idx, max;
yyjson_arr_foreach(val, idx, max, item)
ffStrbufInitS(ffListAdd(&options->constants), yyjson_get_str(item));
ffStrbufInitJsonVal(ffListAdd(&options->constants), item);
}
else if (ffStrEqualsIgnCase(key, "freq"))
{
+5 -3
View File
@@ -18,13 +18,15 @@ const char* ffOptionsParseGeneralJsonConfig(FFOptionsGeneral* options, yyjson_va
{
const char* key = yyjson_get_str(key_);
if (ffStrEqualsIgnCase(key, "thread") || ffStrEqualsIgnCase(key, "multithreading"))
if (ffStrEqualsIgnCase(key, "thread"))
options->multithreading = yyjson_get_bool(val);
else if (ffStrEqualsIgnCase(key, "processingTimeout"))
options->processingTimeout = (int32_t) yyjson_get_int(val);
else if (ffStrEqualsIgnCase(key, "preRun"))
{
if (system(yyjson_get_str(val)) < 0)
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"))
@@ -32,7 +34,7 @@ const char* ffOptionsParseGeneralJsonConfig(FFOptionsGeneral* options, yyjson_va
#if defined(__linux__) || defined(__FreeBSD__) || defined(__sun) || defined(__OpenBSD__) || defined(__NetBSD__) || defined(__HAIKU__)
else if (ffStrEqualsIgnCase(key, "playerName"))
ffStrbufSetS(&options->playerName, yyjson_get_str(val));
ffStrbufSetJsonVal(&options->playerName, val);
else if (ffStrEqualsIgnCase(key, "dsForceDrm"))
{
if (yyjson_is_str(val))
+3 -4
View File
@@ -263,8 +263,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo
if (yyjson_is_str(object))
{
const char* value = yyjson_get_str(object);
ffStrbufSetS(&options->source, value);
ffStrbufSetJsonVal(&options->source, object);
return NULL;
}
@@ -305,7 +304,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo
}
else if (ffStrEqualsIgnCase(key, "source"))
{
ffStrbufSetS(&options->source, yyjson_get_str(val));
ffStrbufSetJsonVal(&options->source, val);
continue;
}
else if (ffStrEqualsIgnCase(key, "color"))
@@ -403,7 +402,7 @@ const char* ffOptionsParseLogoJsonConfig(FFOptionsLogo* options, yyjson_val* roo
yyjson_val* symbols = yyjson_obj_get(val, "symbols");
if (symbols)
ffStrbufSetS(&options->chafaSymbols, yyjson_get_str(symbols));
ffStrbufSetJsonVal(&options->chafaSymbols, symbols);
yyjson_val* canvasMode = yyjson_obj_get(val, "canvasMode");
if (canvasMode)