Skip to content

Commit 0fca825

Browse files
committed
cvarlist_rd: add arguments for default/current values and CSV format print, and strip help text
1 parent 2325335 commit 0fca825

1 file changed

Lines changed: 144 additions & 38 deletions

File tree

src/game/client/swarm/rd_convar_hacks.cpp

Lines changed: 144 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ static class CRD_Convar_Hacks final : public CAutoGameSystem
193193

194194

195195

196+
196197
static bool ConCommandBaseSortFunc( const ConCommandBase* const &hLeftCMD, const ConCommandBase* const &hRightCMD )
197198
{
198199
const char* szLeftCMDName = hLeftCMD->GetName();
@@ -206,9 +207,56 @@ static bool ConCommandBaseSortFunc( const ConCommandBase* const &hLeftCMD, const
206207
return ( Q_stricmp( szLeftCMDName, szRightCMDName ) < 0 );
207208
}
208209

209-
CON_COMMAND( cvarlist_rd, "Prints a list of all cvars, with correct values (unlike normal cvarlist)." )
210+
static char *StripTabsAndReturns( const char *inbuffer, char *outbuffer, int outbufferSize )
211+
{
212+
char *out = outbuffer;
213+
const char *i = inbuffer;
214+
char *o = out;
215+
216+
out[ 0 ] = 0;
217+
218+
while ( *i && o - out < outbufferSize - 1 )
219+
{
220+
if ( *i == '\n' ||
221+
*i == '\r' ||
222+
*i == '\t' )
223+
{
224+
*o++ = ' ';
225+
i++;
226+
continue;
227+
}
228+
if ( *i == '\"' )
229+
{
230+
*o++ = '\'';
231+
i++;
232+
continue;
233+
}
234+
235+
*o++ = *i++;
236+
}
237+
238+
*o = '\0';
239+
240+
return out;
241+
}
242+
243+
CON_COMMAND( cvarlist_rd, "Prints a list of all cvars, with correct values (unlike normal cvarlist). No argument - current values, arg being 1 - default values, arg being 2 - current values in csv format, arg being 3 - default values in csv format" )
210244
{
211-
ConMsg( "cvar list\n--------------\n" );
245+
bool bDefault = false;
246+
bool bCSV = false;
247+
int nArgs = args.ArgC();
248+
if ( nArgs >= 2 )
249+
{
250+
int nArg1 = atoi( args[1] );
251+
252+
bDefault = nArg1 == 1 || nArg1 == 3;
253+
bCSV = nArg1 >= 2;
254+
}
255+
256+
if ( !bCSV )
257+
ConMsg( "cvar list\n--------------\n" );
258+
else
259+
ConMsg( "\"Name\",\"Value\",\"GAMEDLL\",\"CLIENTDLL\",\"PROTECTED\",\"SPONLY\",\"ARCHIVE\",\"NOTIFY\",\"USERINFO\",\"PRINTABLEONLY\",\"UNLOGGED\",\"NEVER_AS_STRING\",\"REPLICATED\",\"CHEAT\",\"SS\",\"DEMO\",\"DONTRECORD\",\"SS_ADDED\",,\"Help Text\"\n" );
212260

213261
const ConCommandBase* pCMD;
214262
ICvar::Iterator cvariterator( g_pCVar );
@@ -229,50 +277,108 @@ CON_COMMAND( cvarlist_rd, "Prints a list of all cvars, with correct values (unli
229277
pCMD = cvarsorted[ i ];
230278
if ( pCMD->IsCommand() )
231279
{
232-
char tempbuff[512]{};
233-
ConMsg( "%-40s : %-8s : %-16s : %s\n", pCMD->GetName(), "cmd", "", pCMD->GetHelpText() );
280+
if ( !bCSV ) // unchanged cvarlist console output format
281+
{
282+
char tempbuff[512]{};
283+
ConMsg( "%-40s : %-8s : %-16s : %s\n", pCMD->GetName(), "cmd", "", StripTabsAndReturns( pCMD->GetHelpText(), tempbuff, sizeof( tempbuff ) ) );
284+
}
285+
else // CSV format
286+
{
287+
char tempbuff[512]{};
288+
ConMsg( "\"%s\",\"%s\",%s,\"%s\"\n", pCMD->GetName(), "cmd", ",,,,,,,,,,,,,,,,", StripTabsAndReturns( pCMD->GetHelpText(), tempbuff, sizeof( tempbuff ) ) );
289+
}
234290
}
235-
else
236-
{
237-
char szFullFlags[128]{};
291+
else
292+
{
293+
char szFullFlags[256]{};
238294

239-
constexpr static const char* s_szFlagDesc[] =
295+
if ( !bCSV ) // unchanged cvarlist console output format
240296
{
241-
"",
242-
"",
243-
"sv",
244-
"cl",
245-
"",
246-
"prot",
247-
"sp",
248-
"a",
249-
"nf",
250-
"user",
251-
"print",
252-
"log",
253-
"numeric",
254-
"rep",
255-
"cheat",
256-
"",
257-
"demo",
258-
"norecord",
259-
};
260-
261-
for ( int c = 2; c < ARRAYSIZE( s_szFlagDesc ); ++c )
262-
{
263-
char szFlag[32]{};
297+
constexpr static const char* s_szFlagDesc[] =
298+
{
299+
"",
300+
"",
301+
"sv",
302+
"cl",
303+
"",
304+
"prot",
305+
"sp",
306+
"a",
307+
"nf",
308+
"user",
309+
"print",
310+
"log",
311+
"numeric",
312+
"rep",
313+
"cheat",
314+
"",
315+
"demo",
316+
"norecord",
317+
};
318+
319+
for ( int c = 2; c < ARRAYSIZE( s_szFlagDesc ); ++c )
320+
{
321+
char szFlag[32]{};
264322

265-
if ( pCMD->IsFlagSet( 1<<c ) && sizeof( s_szFlagDesc[c] ) != sizeof( "" ) )
323+
if ( pCMD->IsFlagSet( 1 << c ) && sizeof( s_szFlagDesc[c] ) != sizeof( "" ) )
324+
{
325+
Q_snprintf( szFlag, sizeof( szFlag ), ", %s", s_szFlagDesc[c] );
326+
Q_strncat( szFullFlags, szFlag, sizeof( szFullFlags ), COPY_ALL_CHARACTERS );
327+
}
328+
}
329+
char tempbuff[512]{};
330+
ConMsg( "%-40s : %-8s : %-16s : %s\n", pCMD->GetName(), bDefault ? static_cast< const ConVar* >( pCMD )->GetDefault() : static_cast< const ConVar* >( pCMD )->GetString(), szFullFlags, StripTabsAndReturns( pCMD->GetHelpText(), tempbuff, sizeof(tempbuff) ) );
331+
}
332+
else // CSV format
333+
{
334+
constexpr static const char* s_szFlagDesc[] =
266335
{
267-
Q_snprintf( szFlag, sizeof( szFlag ), ", %s", s_szFlagDesc[c] );
268-
Q_strncat( szFullFlags, szFlag, sizeof( szFullFlags ), COPY_ALL_CHARACTERS );
336+
"",
337+
"",
338+
"GAMEDLL",
339+
"CLIENTDLL",
340+
"",
341+
"PROTECTED",
342+
"SPONLY",
343+
"ARCHIVE",
344+
"NOTIFY",
345+
"USERINFO",
346+
"PRINTABLEONLY",
347+
"UNLOGGED",
348+
"NEVER_AS_STRING",
349+
"REPLICATED",
350+
"CHEAT",
351+
"SS",
352+
"DEMO",
353+
"DONTRECORD",
354+
"SS_ADDED",
355+
};
356+
357+
for ( int c = 2; c < ARRAYSIZE( s_szFlagDesc ); ++c )
358+
{
359+
if ( c == 4 ) // FCVAR_HIDDEN, we filter those out anyway
360+
continue;
361+
362+
char szFlag[32]{};
363+
364+
if ( pCMD->IsFlagSet( 1 << c ) && sizeof( s_szFlagDesc[c] ) != sizeof( "" ) )
365+
{
366+
Q_snprintf( szFlag, sizeof( szFlag ), "\"%s\",", s_szFlagDesc[c] );
367+
Q_strncat( szFullFlags, szFlag, sizeof( szFullFlags ), COPY_ALL_CHARACTERS );
368+
}
369+
else
370+
{
371+
Q_snprintf( szFlag, sizeof( szFlag ), "," );
372+
Q_strncat( szFullFlags, szFlag, sizeof( szFullFlags ), COPY_ALL_CHARACTERS );
373+
}
269374
}
375+
376+
char tempbuff[512]{};
377+
ConMsg( "\"%s\",\"%s\",%s,\"%s\"\n", pCMD->GetName(), bDefault ? static_cast< const ConVar* >( pCMD )->GetDefault() : static_cast< const ConVar* >( pCMD )->GetString(), szFullFlags, StripTabsAndReturns( pCMD->GetHelpText(), tempbuff, sizeof(tempbuff) ) );
270378
}
271-
272-
char tempbuff[512]{};
273-
ConMsg( "%-40s : %-8s : %-16s : %s\n", pCMD->GetName(), static_cast< const ConVar* >( pCMD )->GetDefault(), szFullFlags, pCMD->GetHelpText() );
274379
}
275380
}
276381

277-
ConMsg("--------------\n%3i total convars/concommands\n", cvarsorted.Count() );
382+
if ( !bCSV )
383+
ConMsg("--------------\n%3i total convars/concommands\n", cvarsorted.Count() );
278384
}

0 commit comments

Comments
 (0)