@@ -193,6 +193,7 @@ static class CRD_Convar_Hacks final : public CAutoGameSystem
193193
194194
195195
196+
196197static 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