66#include "modules/swap/swap.h"
77#include "util/stringUtils.h"
88
9- void ffPrintSwap (FFSwapOptions * options )
9+ void printSwap (FFSwapOptions * options , uint8_t index , FFSwapResult * storage )
1010{
11- FFSwapResult storage = {};
12- const char * error = ffDetectSwap (& storage );
11+ FF_STRBUF_AUTO_DESTROY key = ffStrbufCreate ();
1312
14- if ( error )
13+ if ( options -> moduleArgs . key . length == 0 )
1514 {
16- ffPrintError (FF_SWAP_MODULE_NAME , 0 , & options -> moduleArgs , FF_PRINT_TYPE_DEFAULT , "%s" , error );
17- return ;
15+ if (storage -> name .length > 0 )
16+ ffStrbufSetF (& key , "%s (%s)" , FF_SWAP_MODULE_NAME , storage -> name .chars );
17+ else
18+ ffStrbufSetS (& key , FF_SWAP_MODULE_NAME );
19+ }
20+ else
21+ {
22+ ffStrbufClear (& key );
23+ FF_PARSE_FORMAT_STRING_CHECKED (& key , & options -> moduleArgs .key , ((FFformatarg []) {
24+ FF_FORMAT_ARG (index , "index" ),
25+ FF_FORMAT_ARG (storage -> name , "name" ),
26+ FF_FORMAT_ARG (options -> moduleArgs .keyIcon , "icon" ),
27+ }));
1828 }
1929
2030 FF_STRBUF_AUTO_DESTROY usedPretty = ffStrbufCreate ();
21- ffParseSize (storage . bytesUsed , & usedPretty );
31+ ffParseSize (storage -> bytesUsed , & usedPretty );
2232
2333 FF_STRBUF_AUTO_DESTROY totalPretty = ffStrbufCreate ();
24- ffParseSize (storage . bytesTotal , & totalPretty );
34+ ffParseSize (storage -> bytesTotal , & totalPretty );
2535
26- double percentage = storage . bytesTotal == 0
36+ double percentage = storage -> bytesTotal == 0
2737 ? 0
28- : (double ) storage . bytesUsed / (double ) storage . bytesTotal * 100.0 ;
38+ : (double ) storage -> bytesUsed / (double ) storage -> bytesTotal * 100.0 ;
2939
3040 FFPercentageTypeFlags percentType = options -> percent .type == 0 ? instance .config .display .percentType : options -> percent .type ;
3141 if (options -> moduleArgs .outputFormat .length == 0 )
3242 {
33- ffPrintLogoAndKey (FF_SWAP_MODULE_NAME , 0 , & options -> moduleArgs , FF_PRINT_TYPE_DEFAULT );
43+ ffPrintLogoAndKey (key . chars , 0 , & options -> moduleArgs , FF_PRINT_TYPE_NO_CUSTOM_KEY );
3444 FF_STRBUF_AUTO_DESTROY str = ffStrbufCreate ();
3545
36- if (storage . bytesTotal == 0 )
46+ if (storage -> bytesTotal == 0 )
3747 {
3848 if (percentType & FF_PERCENTAGE_TYPE_BAR_BIT )
3949 {
@@ -71,15 +81,56 @@ void ffPrintSwap(FFSwapOptions* options)
7181 FF_STRBUF_AUTO_DESTROY percentageBar = ffStrbufCreate ();
7282 if (percentType & FF_PERCENTAGE_TYPE_BAR_BIT )
7383 ffPercentAppendBar (& percentageBar , percentage , options -> percent , & options -> moduleArgs );
74- FF_PRINT_FORMAT_CHECKED (FF_SWAP_MODULE_NAME , 0 , & options -> moduleArgs , FF_PRINT_TYPE_DEFAULT , ((FFformatarg []){
84+ FF_PRINT_FORMAT_CHECKED (key . chars , index , & options -> moduleArgs , FF_PRINT_TYPE_NO_CUSTOM_KEY , ((FFformatarg []){
7585 FF_FORMAT_ARG (usedPretty , "used" ),
7686 FF_FORMAT_ARG (totalPretty , "total" ),
7787 FF_FORMAT_ARG (percentageNum , "percentage" ),
7888 FF_FORMAT_ARG (percentageBar , "percentage-bar" ),
89+ FF_FORMAT_ARG (storage -> name , "name" ),
7990 }));
8091 }
8192}
8293
94+ void ffPrintSwap (FFSwapOptions * options )
95+ {
96+ FF_LIST_AUTO_DESTROY result = ffListCreate (sizeof (FFSwapResult ));
97+ const char * error = ffDetectSwap (& result );
98+
99+ if (error )
100+ {
101+ ffPrintError (FF_SWAP_MODULE_NAME , 0 , & options -> moduleArgs , FF_PRINT_TYPE_DEFAULT , "%s" , error );
102+ return ;
103+ }
104+
105+ if (options -> separate )
106+ {
107+ uint8_t index = 0 ;
108+ FF_LIST_FOR_EACH (FFSwapResult , storage , result )
109+ {
110+ ++ index ;
111+ printSwap (options , index , storage );
112+ }
113+ }
114+ else
115+ {
116+ FFSwapResult total = {
117+ .name = ffStrbufCreate (),
118+ };
119+ FF_LIST_FOR_EACH (FFSwapResult , storage , result )
120+ {
121+ total .bytesUsed += storage -> bytesUsed ;
122+ total .bytesTotal += storage -> bytesTotal ;
123+ }
124+ printSwap (options , 0 , & total );
125+ ffStrbufDestroy (& total .name );
126+ }
127+
128+ FF_LIST_FOR_EACH (FFSwapResult , storage , result )
129+ {
130+ ffStrbufDestroy (& storage -> name );
131+ }
132+ }
133+
83134bool ffParseSwapCommandOptions (FFSwapOptions * options , const char * key , const char * value )
84135{
85136 const char * subKey = ffOptionTestPrefix (key , FF_SWAP_MODULE_NAME );
@@ -90,6 +141,12 @@ bool ffParseSwapCommandOptions(FFSwapOptions* options, const char* key, const ch
90141 if (ffPercentParseCommandOptions (key , subKey , value , & options -> percent ))
91142 return true;
92143
144+ if (ffStrEqualsIgnCase (subKey , "separate" ))
145+ {
146+ options -> separate = ffOptionParseBoolean (value );
147+ return true;
148+ }
149+
93150 return false;
94151}
95152
@@ -109,6 +166,12 @@ void ffParseSwapJsonObject(FFSwapOptions* options, yyjson_val* module)
109166 if (ffPercentParseJsonObject (key , val , & options -> percent ))
110167 continue ;
111168
169+ if (ffStrEqualsIgnCase (key , "separate" ))
170+ {
171+ options -> separate = yyjson_get_bool (val );
172+ continue ;
173+ }
174+
112175 ffPrintError (FF_SWAP_MODULE_NAME , 0 , & options -> moduleArgs , FF_PRINT_TYPE_DEFAULT , "Unknown JSON key %s" , key );
113176 }
114177}
@@ -125,18 +188,28 @@ void ffGenerateSwapJsonConfig(FFSwapOptions* options, yyjson_mut_doc* doc, yyjso
125188
126189void ffGenerateSwapJsonResult (FF_MAYBE_UNUSED FFSwapOptions * options , yyjson_mut_doc * doc , yyjson_mut_val * module )
127190{
128- FFSwapResult storage = {} ;
129- const char * error = ffDetectSwap (& storage );
191+ FF_LIST_AUTO_DESTROY result = ffListCreate ( sizeof ( FFSwapResult )) ;
192+ const char * error = ffDetectSwap (& result );
130193
131194 if (error )
132195 {
133196 yyjson_mut_obj_add_str (doc , module , "error" , error );
134197 return ;
135198 }
136199
137- yyjson_mut_val * obj = yyjson_mut_obj_add_obj (doc , module , "result" );
138- yyjson_mut_obj_add_uint (doc , obj , "total" , storage .bytesTotal );
139- yyjson_mut_obj_add_uint (doc , obj , "used" , storage .bytesUsed );
200+ yyjson_mut_val * arr = yyjson_mut_obj_add_arr (doc , module , "result" );
201+ FF_LIST_FOR_EACH (FFSwapResult , storage , result )
202+ {
203+ yyjson_mut_val * obj = yyjson_mut_arr_add_obj (doc , arr );
204+ yyjson_mut_obj_add_strbuf (doc , obj , "name" , & storage -> name );
205+ yyjson_mut_obj_add_uint (doc , obj , "used" , storage -> bytesUsed );
206+ yyjson_mut_obj_add_uint (doc , obj , "total" , storage -> bytesTotal );
207+ }
208+
209+ FF_LIST_FOR_EACH (FFSwapResult , storage , result )
210+ {
211+ ffStrbufDestroy (& storage -> name );
212+ }
140213}
141214
142215static FFModuleBaseInfo ffModuleInfo = {
@@ -152,6 +225,7 @@ static FFModuleBaseInfo ffModuleInfo = {
152225 {"Total size" , "total" },
153226 {"Percentage used (num)" , "percentage" },
154227 {"Percentage used (bar)" , "percentage-bar" },
228+ {"Name" , "name" },
155229 }))
156230};
157231
@@ -160,6 +234,7 @@ void ffInitSwapOptions(FFSwapOptions* options)
160234 options -> moduleInfo = ffModuleInfo ;
161235 ffOptionInitModuleArg (& options -> moduleArgs , "" );
162236 options -> percent = (FFPercentageModuleConfig ) { 50 , 80 , 0 };
237+ options -> separate = false;
163238}
164239
165240void ffDestroySwapOptions (FFSwapOptions * options )
0 commit comments