From 169785a8bb426dc9b672bdbb5f45a1bb8a4b3641 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E9=80=9A=E6=B4=B2?= Date: Fri, 10 Mar 2023 14:14:32 +0800 Subject: [PATCH] Kernel: support JSON config --- CMakeLists.txt | 2 +- src/common/init.c | 4 +- src/fastfetch.c | 4 +- src/fastfetch.h | 3 +- src/flashfetch.c | 2 +- src/modules/jsonconfig/jsonconfig.c | 1 + src/modules/kernel.c | 30 ----------- src/modules/kernel/kernel.c | 83 +++++++++++++++++++++++++++++ src/modules/kernel/kernel.h | 14 +++++ src/modules/kernel/option.h | 11 ++++ src/modules/modules.h | 1 + src/modules/options.h | 1 + 12 files changed, 118 insertions(+), 38 deletions(-) delete mode 100644 src/modules/kernel.c create mode 100644 src/modules/kernel/kernel.c create mode 100644 src/modules/kernel/kernel.h create mode 100644 src/modules/kernel/option.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 60acb6ca4..a3f582051 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -281,7 +281,7 @@ set(LIBFASTFETCH_SRC src/modules/host/host.c src/modules/icons.c src/modules/gamepad.c - src/modules/kernel.c + src/modules/kernel/kernel.c src/modules/locale.c src/modules/localip.c src/modules/memory.c diff --git a/src/common/init.c b/src/common/init.c index 1441b84c8..4dace7205 100644 --- a/src/common/init.c +++ b/src/common/init.c @@ -80,7 +80,7 @@ static void defaultConfig(FFinstance* instance) initModuleArg(&instance->config.brightness); initModuleArg(&instance->config.chassis); ffInitCommandOptions(&instance->config.command); - initModuleArg(&instance->config.kernel); + ffInitKernelOptions(&instance->config.kernel); initModuleArg(&instance->config.uptime); initModuleArg(&instance->config.processes); initModuleArg(&instance->config.packages); @@ -319,7 +319,7 @@ static void destroyConfig(FFinstance* instance) destroyModuleArg(&instance->config.board); destroyModuleArg(&instance->config.chassis); ffDestroyCommandOptions(&instance->config.command); - destroyModuleArg(&instance->config.kernel); + ffDestroyKernelOptions(&instance->config.kernel); destroyModuleArg(&instance->config.uptime); destroyModuleArg(&instance->config.processes); destroyModuleArg(&instance->config.packages); diff --git a/src/fastfetch.c b/src/fastfetch.c index d6a31b5a4..2c1582950 100644 --- a/src/fastfetch.c +++ b/src/fastfetch.c @@ -1139,7 +1139,7 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con else if(optionParseModuleArgs(key, value, "board", &instance->config.board)) {} else if(optionParseModuleArgs(key, value, "chassis", &instance->config.chassis)) {} else if(ffParseCommandCommandOptions(&instance->config.command, key, value)) {} - else if(optionParseModuleArgs(key, value, "kernel", &instance->config.kernel)) {} + else if(ffParseKernelCommandOptions(&instance->config.kernel, key, value)) {} else if(optionParseModuleArgs(key, value, "uptime", &instance->config.uptime)) {} else if(optionParseModuleArgs(key, value, "processes", &instance->config.processes)) {} else if(optionParseModuleArgs(key, value, "packages", &instance->config.packages)) {} @@ -1395,7 +1395,7 @@ static void parseStructureCommand(FFinstance* instance, FFdata* data, const char else if(strcasecmp(line, "chassis") == 0) ffPrintChassis(instance); else if(strcasecmp(line, "kernel") == 0) - ffPrintKernel(instance); + ffPrintKernel(instance, &instance->config.kernel); else if(strcasecmp(line, "uptime") == 0) ffPrintUptime(instance); else if(strcasecmp(line, "processes") == 0) diff --git a/src/fastfetch.h b/src/fastfetch.h index 3f405892b..c91395b06 100644 --- a/src/fastfetch.h +++ b/src/fastfetch.h @@ -134,7 +134,7 @@ typedef struct FFconfig FFModuleArgs brightness; FFModuleArgs chassis; FFCommandOptions command; - FFModuleArgs kernel; + FFKernelOptions kernel; FFModuleArgs uptime; FFModuleArgs processes; FFModuleArgs packages; @@ -289,7 +289,6 @@ void ffPrintBreak(FFinstance* instance); void ffPrintBios(FFinstance* instance); void ffPrintBoard(FFinstance* instance); void ffPrintChassis(FFinstance* instance); -void ffPrintKernel(FFinstance* instance); void ffPrintUptime(FFinstance* instance); void ffPrintProcesses(FFinstance* instance); void ffPrintPackages(FFinstance* instance); diff --git a/src/flashfetch.c b/src/flashfetch.c index 8942113d9..034fea0ff 100644 --- a/src/flashfetch.c +++ b/src/flashfetch.c @@ -27,7 +27,7 @@ int main(int argc, char** argv) //ffPrintBios(&instance); //ffPrintBoard(&instance); //ffPrintChassis(&instance); - ffPrintKernel(&instance); + ffPrintKernel(&instance, &instance.config.kernel); ffPrintUptime(&instance); //ffPrintProcesses(&instance); ffPrintPackages(&instance); diff --git a/src/modules/jsonconfig/jsonconfig.c b/src/modules/jsonconfig/jsonconfig.c index 55d9df3b6..8b2876db3 100644 --- a/src/modules/jsonconfig/jsonconfig.c +++ b/src/modules/jsonconfig/jsonconfig.c @@ -18,6 +18,7 @@ static inline bool parseModuleJsonObject(FFinstance* instance, const char* type, ffParseDateTimeJsonObject(instance, type, data, module) || ffParseDisplayJsonObject(instance, type, data, module) || ffParseHostJsonObject(instance, type, data, module) || + ffParseKernelJsonObject(instance, type, data, module) || ffParseOSJsonObject(instance, type, data, module) || ffParseSeparatorJsonObject(instance, type, data, module) || false; diff --git a/src/modules/kernel.c b/src/modules/kernel.c deleted file mode 100644 index bc1139833..000000000 --- a/src/modules/kernel.c +++ /dev/null @@ -1,30 +0,0 @@ -#include "fastfetch.h" -#include "common/printing.h" - -#define FF_KERNEL_MODULE_NAME "Kernel" -#define FF_KERNEL_NUM_FORMAT_ARGS 4 - -void ffPrintKernel(FFinstance* instance) -{ - if(instance->config.kernel.outputFormat.length == 0) - { - ffPrintLogoAndKey(instance, FF_KERNEL_MODULE_NAME, 0, &instance->config.kernel.key); - ffStrbufWriteTo(&instance->state.platform.systemRelease, stdout); - - #ifdef _WIN32 - if(instance->state.platform.systemVersion.length > 0) - printf(" (%s)", instance->state.platform.systemVersion.chars); - #endif - - putchar('\n'); - } - else - { - ffPrintFormat(instance, FF_KERNEL_MODULE_NAME, 0, &instance->config.kernel, FF_KERNEL_NUM_FORMAT_ARGS, (FFformatarg[]){ - {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemName}, - {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemRelease}, - {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemVersion}, - {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemArchitecture} - }); - } -} diff --git a/src/modules/kernel/kernel.c b/src/modules/kernel/kernel.c new file mode 100644 index 000000000..31f206581 --- /dev/null +++ b/src/modules/kernel/kernel.c @@ -0,0 +1,83 @@ +#include "fastfetch.h" +#include "common/printing.h" +#include "modules/kernel/kernel.h" + +#define FF_KERNEL_MODULE_NAME "Kernel" +#define FF_KERNEL_NUM_FORMAT_ARGS 4 + +void ffPrintKernel(FFinstance* instance, FFKernelOptions* options) +{ + if(options->moduleArgs.outputFormat.length == 0) + { + ffPrintLogoAndKey(instance, FF_KERNEL_MODULE_NAME, 0, &options->moduleArgs.key); + ffStrbufWriteTo(&instance->state.platform.systemRelease, stdout); + + #ifdef _WIN32 + if(instance->state.platform.systemVersion.length > 0) + printf(" (%s)", instance->state.platform.systemVersion.chars); + #endif + + putchar('\n'); + } + else + { + ffPrintFormat(instance, FF_KERNEL_MODULE_NAME, 0, &options->moduleArgs, FF_KERNEL_NUM_FORMAT_ARGS, (FFformatarg[]){ + {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemName}, + {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemRelease}, + {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemVersion}, + {FF_FORMAT_ARG_TYPE_STRBUF, &instance->state.platform.systemArchitecture} + }); + } +} + +void ffInitKernelOptions(FFKernelOptions* options) +{ + options->moduleName = FF_KERNEL_MODULE_NAME; + ffOptionInitModuleArg(&options->moduleArgs); +} + +bool ffParseKernelCommandOptions(FFKernelOptions* options, const char* key, const char* value) +{ + const char* subKey = ffOptionTestPrefix(key, FF_KERNEL_MODULE_NAME); + if (!subKey) return false; + if (ffOptionParseModuleArgs(key, subKey, value, &options->moduleArgs)) + return true; + + return false; +} + +void ffDestroyKernelOptions(FFKernelOptions* options) +{ + ffOptionDestroyModuleArg(&options->moduleArgs); +} + +#ifdef FF_HAVE_JSONC +bool ffParseKernelJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module) +{ + if (strcasecmp(type, FF_KERNEL_MODULE_NAME) != 0) + return false; + + FFKernelOptions __attribute__((__cleanup__(ffDestroyKernelOptions))) options; + ffInitKernelOptions(&options); + + if (module) + { + struct lh_entry* entry; + lh_foreach(data->ffjson_object_get_object(module), entry) + { + const char* key = (const char *)lh_entry_k(entry); + if (strcasecmp(key, "type") == 0) + continue; + json_object* val = (struct json_object *)lh_entry_v(entry); + + if (ffJsonConfigParseModuleArgs(data, key, val, &options.moduleArgs)) + continue; + + ffPrintError(instance, FF_KERNEL_MODULE_NAME, 0, &options.moduleArgs, "Unknown JSON key %s", key); + } + } + + ffPrintKernel(instance, &options); + return true; +} +#endif diff --git a/src/modules/kernel/kernel.h b/src/modules/kernel/kernel.h new file mode 100644 index 000000000..7d3b55b35 --- /dev/null +++ b/src/modules/kernel/kernel.h @@ -0,0 +1,14 @@ +#pragma once + +#include "fastfetch.h" +#include "modules/kernel/option.h" + +void ffPrintKernel(FFinstance* instance, FFKernelOptions* options); +void ffInitKernelOptions(FFKernelOptions* options); +bool ffParseKernelCommandOptions(FFKernelOptions* options, const char* key, const char* value); +void ffDestroyKernelOptions(FFKernelOptions* options); + +#ifdef FF_HAVE_JSONC +#include "common/config.h" +bool ffParseKernelJsonObject(FFinstance* instance, const char* type, JSONCData* data, json_object* module); +#endif diff --git a/src/modules/kernel/option.h b/src/modules/kernel/option.h new file mode 100644 index 000000000..434c3069d --- /dev/null +++ b/src/modules/kernel/option.h @@ -0,0 +1,11 @@ +#pragma once + +// This file will be included in "fastfetch.h", do NOT put unnecessary things here + +#include "common/option.h" + +typedef struct FFKernelOptions +{ + const char* moduleName; + FFModuleArgs moduleArgs; +} FFKernelOptions; diff --git a/src/modules/modules.h b/src/modules/modules.h index 4bbddcb83..cbfdc0ca6 100644 --- a/src/modules/modules.h +++ b/src/modules/modules.h @@ -8,6 +8,7 @@ #include "modules/datetime/datetime.h" #include "modules/display/display.h" #include "modules/host/host.h" +#include "modules/kernel/kernel.h" #include "modules/separator/separator.h" #include "modules/title/title.h" #include "modules/jsonconfig/jsonconfig.h" diff --git a/src/modules/options.h b/src/modules/options.h index 7a2509aa5..2bf008d66 100644 --- a/src/modules/options.h +++ b/src/modules/options.h @@ -7,6 +7,7 @@ #include "modules/datetime/option.h" #include "modules/display/option.h" #include "modules/host/option.h" +#include "modules/kernel/option.h" #include "modules/os/option.h" #include "modules/separator/option.h" #include "modules/title/option.h"