mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-22 22:27:05 +00:00
508 lines
9.6 KiB
C++
508 lines
9.6 KiB
C++
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: vcd_sound_check.cpp : Defines the entry point for the console application.
|
||
|
//
|
||
|
//=============================================================================//
|
||
|
#include "cbase.h"
|
||
|
#include <stdio.h>
|
||
|
#include <windows.h>
|
||
|
#include <direct.h>
|
||
|
#include "tier0/dbg.h"
|
||
|
#include "utldict.h"
|
||
|
#include "KeyValues.h"
|
||
|
#include "cmdlib.h"
|
||
|
#include "scriplib.h"
|
||
|
#include "vstdlib/random.h"
|
||
|
|
||
|
bool uselogfile = true;
|
||
|
|
||
|
struct AnalysisData
|
||
|
{
|
||
|
CUtlSymbolTable symbols;
|
||
|
};
|
||
|
|
||
|
static AnalysisData g_Analysis;
|
||
|
|
||
|
static CUniformRandomStream g_Random;
|
||
|
IUniformRandomStream *random = &g_Random;
|
||
|
|
||
|
static bool spewed = false;
|
||
|
static bool preview = false;
|
||
|
static bool parallel = false;
|
||
|
|
||
|
static char g_szDesignation[ 256 ];
|
||
|
static char outdir[ 256 ];
|
||
|
static char rootdir[ 256 ];
|
||
|
static int rootoffset = 0;
|
||
|
|
||
|
int START_PAGE = 0;
|
||
|
|
||
|
#define LINE_WIDTH 80
|
||
|
#define LINES_PER_PAGE 45
|
||
|
|
||
|
char *va( const char *fmt, ... )
|
||
|
{
|
||
|
static char string[ 8192 ];
|
||
|
va_list va;
|
||
|
va_start( va, fmt );
|
||
|
vsprintf( string, fmt, va );
|
||
|
va_end( va );
|
||
|
return string;
|
||
|
}
|
||
|
|
||
|
SpewRetval_t SpewFunc( SpewType_t type, char const *pMsg )
|
||
|
{
|
||
|
spewed = true;
|
||
|
|
||
|
printf( "%s", pMsg );
|
||
|
OutputDebugString( pMsg );
|
||
|
|
||
|
if ( type == SPEW_ERROR )
|
||
|
{
|
||
|
printf( "\n" );
|
||
|
OutputDebugString( "\n" );
|
||
|
}
|
||
|
|
||
|
return SPEW_CONTINUE;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : depth -
|
||
|
// *fmt -
|
||
|
// ... -
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void vprint( int depth, const char *fmt, ... )
|
||
|
{
|
||
|
char string[ 8192 ];
|
||
|
va_list va;
|
||
|
va_start( va, fmt );
|
||
|
vsprintf( string, fmt, va );
|
||
|
va_end( va );
|
||
|
|
||
|
FILE *fp = NULL;
|
||
|
|
||
|
if ( uselogfile )
|
||
|
{
|
||
|
fp = fopen( "log.txt", "ab" );
|
||
|
}
|
||
|
|
||
|
while ( depth-- > 0 )
|
||
|
{
|
||
|
printf( " " );
|
||
|
OutputDebugString( " " );
|
||
|
if ( fp )
|
||
|
{
|
||
|
fprintf( fp, " " );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
::printf( "%s", string );
|
||
|
OutputDebugString( string );
|
||
|
|
||
|
if ( fp )
|
||
|
{
|
||
|
char *p = string;
|
||
|
while ( *p )
|
||
|
{
|
||
|
if ( *p == '\n' )
|
||
|
{
|
||
|
fputc( '\r', fp );
|
||
|
}
|
||
|
fputc( *p, fp );
|
||
|
p++;
|
||
|
}
|
||
|
fclose( fp );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void Con_Printf( const char *fmt, ... )
|
||
|
{
|
||
|
va_list args;
|
||
|
static char output[1024];
|
||
|
|
||
|
va_start( args, fmt );
|
||
|
vprintf( fmt, args );
|
||
|
vsprintf( output, fmt, args );
|
||
|
|
||
|
vprint( 0, output );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void printusage( void )
|
||
|
{
|
||
|
vprint( 0, "usage: paginate startpage \"designation\" <root directory> [<outdir>]\n\
|
||
|
\t-p = preview only\n\
|
||
|
\ne.g.: paginate -p 700000 \"Confidential\" u:/production u:/production_numbered" );
|
||
|
|
||
|
// Exit app
|
||
|
exit( 1 );
|
||
|
}
|
||
|
|
||
|
void BuildFileList_R( CUtlVector< CUtlSymbol >& files, char const *dir, char const *extension )
|
||
|
{
|
||
|
WIN32_FIND_DATA wfd;
|
||
|
|
||
|
char directory[ 256 ];
|
||
|
char filename[ 256 ];
|
||
|
HANDLE ff;
|
||
|
|
||
|
sprintf( directory, "%s\\*.*", dir );
|
||
|
|
||
|
if ( ( ff = FindFirstFile( directory, &wfd ) ) == INVALID_HANDLE_VALUE )
|
||
|
return;
|
||
|
|
||
|
int extlen = extension ? strlen( extension ) : 0 ;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if ( wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY )
|
||
|
{
|
||
|
|
||
|
if ( wfd.cFileName[ 0 ] == '.' )
|
||
|
continue;
|
||
|
|
||
|
// Recurse down directory
|
||
|
sprintf( filename, "%s\\%s", dir, wfd.cFileName );
|
||
|
BuildFileList_R( files, filename, extension );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
int len = strlen( wfd.cFileName );
|
||
|
if ( len > extlen )
|
||
|
{
|
||
|
if ( !extension || !stricmp( &wfd.cFileName[ len - extlen ], extension ) )
|
||
|
{
|
||
|
char filename[ MAX_PATH ];
|
||
|
Q_snprintf( filename, sizeof( filename ), "%s\\%s", dir, wfd.cFileName );
|
||
|
_strlwr( filename );
|
||
|
|
||
|
Q_FixSlashes( filename );
|
||
|
|
||
|
CUtlSymbol sym = g_Analysis.symbols.AddString( filename );
|
||
|
files.AddToTail( sym );
|
||
|
|
||
|
if ( !( files.Count() % 3000 ) )
|
||
|
{
|
||
|
if( extension )
|
||
|
{
|
||
|
vprint( 0, "...found %i .%s files\n", files.Count(), extension );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
vprint( 0, "...found %i files\n", files.Count() );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
} while ( FindNextFile( ff, &wfd ) );
|
||
|
}
|
||
|
|
||
|
void BuildFileList( CUtlVector< CUtlSymbol >& files, char const *rootdir, char const *extension )
|
||
|
{
|
||
|
files.RemoveAll();
|
||
|
BuildFileList_R( files, rootdir, extension );
|
||
|
}
|
||
|
|
||
|
struct PageStats_t
|
||
|
{
|
||
|
int linecount;
|
||
|
int pagecount;
|
||
|
int totalbytes;
|
||
|
};
|
||
|
|
||
|
void Paginate_CreatePath(const char *path)
|
||
|
{
|
||
|
char temppath[512];
|
||
|
Q_strncpy( temppath, path, sizeof(temppath) );
|
||
|
|
||
|
for (char *ofs = temppath+1 ; *ofs ; ofs++)
|
||
|
{
|
||
|
if (*ofs == '/' || *ofs == '\\')
|
||
|
{ // create the directory
|
||
|
char old = *ofs;
|
||
|
*ofs = 0;
|
||
|
_mkdir (temppath);
|
||
|
*ofs = old;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void PaginateFile( int startpage, PageStats_t *stats, char const *filename )
|
||
|
{
|
||
|
FILE *fp = fopen( filename, "rb" );
|
||
|
if ( !fp )
|
||
|
return;
|
||
|
|
||
|
char outfn[ 256 ];
|
||
|
|
||
|
Q_StripExtension( filename, outfn, sizeof( outfn ) );
|
||
|
|
||
|
if ( parallel )
|
||
|
{
|
||
|
Q_snprintf( outfn, sizeof( outfn ), "%s/%s", outdir, &filename[ rootoffset ] );
|
||
|
Q_FixSlashes( outfn );
|
||
|
|
||
|
if ( !preview )
|
||
|
{
|
||
|
Paginate_CreatePath( outfn );
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
Q_strncat( outfn, "_numbered.out", sizeof( outfn ), COPY_ALL_CHARACTERS );
|
||
|
}
|
||
|
|
||
|
FILE *outfile = NULL;
|
||
|
|
||
|
if ( !preview )
|
||
|
{
|
||
|
outfile = fopen( outfn, "wb" );
|
||
|
if ( !outfile )
|
||
|
{
|
||
|
vprint( 0, "Unable to open %s for writing\n", outfn );
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
fseek( fp, 0, SEEK_END );
|
||
|
int size = ftell( fp );
|
||
|
fseek( fp, 0, SEEK_SET );
|
||
|
|
||
|
char *buf = new char[ size + 1 ];
|
||
|
if ( !buf )
|
||
|
exit( -2 );
|
||
|
|
||
|
fread( buf, size, 1, fp );
|
||
|
fclose( fp );
|
||
|
|
||
|
buf[ size ] = 0;
|
||
|
|
||
|
stats->totalbytes += size;
|
||
|
|
||
|
char *in = buf;
|
||
|
|
||
|
int numlines = stats->linecount;
|
||
|
int chars_on_line = 0;
|
||
|
|
||
|
while ( 1 )
|
||
|
{
|
||
|
if ( !*in )
|
||
|
break;
|
||
|
|
||
|
if ( *in == '\n' )
|
||
|
{
|
||
|
++stats->linecount;
|
||
|
chars_on_line = 0;
|
||
|
}
|
||
|
|
||
|
if ( *in == '\t' )
|
||
|
{
|
||
|
if ( !preview )
|
||
|
{
|
||
|
fprintf( outfile, " " );
|
||
|
}
|
||
|
chars_on_line += 4;
|
||
|
++in;
|
||
|
}
|
||
|
|
||
|
if ( ( chars_on_line ) >= LINE_WIDTH )
|
||
|
{
|
||
|
chars_on_line = 0;
|
||
|
++stats->linecount;
|
||
|
}
|
||
|
|
||
|
if ( stats->linecount - numlines >= LINES_PER_PAGE )
|
||
|
{
|
||
|
++stats->pagecount;
|
||
|
numlines = stats->linecount;
|
||
|
|
||
|
if ( !preview )
|
||
|
{
|
||
|
fprintf( outfile, "\r\n%s VLV%i\r\nPAGEBREAK\r\n",
|
||
|
g_szDesignation,
|
||
|
startpage + START_PAGE + stats->pagecount );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( !preview )
|
||
|
{
|
||
|
fwrite( (void *)in, 1, 1, outfile );
|
||
|
}
|
||
|
|
||
|
++chars_on_line;
|
||
|
++in;
|
||
|
}
|
||
|
|
||
|
// Final page number
|
||
|
{
|
||
|
++stats->pagecount;
|
||
|
numlines = stats->linecount;
|
||
|
|
||
|
if ( !preview )
|
||
|
{
|
||
|
fprintf( outfile, "\r\n%s VLV%i\r\nPAGEBREAK\r\n",
|
||
|
g_szDesignation,
|
||
|
startpage + START_PAGE + stats->pagecount );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( !preview )
|
||
|
{
|
||
|
fclose( outfile );
|
||
|
}
|
||
|
|
||
|
delete[] buf;
|
||
|
}
|
||
|
|
||
|
void PaginateFilesInDirectory( char const *rootdir )
|
||
|
{
|
||
|
CUtlVector< CUtlSymbol > files;
|
||
|
BuildFileList( files, rootdir, NULL );
|
||
|
|
||
|
vprint( 0, "Found %i files\n", files.Count() );
|
||
|
|
||
|
PageStats_t stats;
|
||
|
memset( &stats, 0, sizeof( stats ) );
|
||
|
|
||
|
// Process files...
|
||
|
int c = files.Count();
|
||
|
|
||
|
vprint( 1, "%-160s\t%8s\t%10s\t%12s\t%35s\n",
|
||
|
"filename",
|
||
|
"pages",
|
||
|
"lines",
|
||
|
"size",
|
||
|
"Bates#" );
|
||
|
|
||
|
for ( int i = 0 ; i < c; ++i )
|
||
|
{
|
||
|
PageStats_t pagestats;
|
||
|
memset( &pagestats, 0, sizeof( pagestats ) );
|
||
|
char const *fn = g_Analysis.symbols.String( files[ i ] );
|
||
|
|
||
|
PaginateFile( stats.pagecount, &pagestats, fn );
|
||
|
|
||
|
char p1[ 32 ];
|
||
|
char p2[ 32 ];
|
||
|
|
||
|
Q_snprintf( p1, sizeof( p1 ), "VLV%i", START_PAGE + stats.pagecount + 1 );
|
||
|
Q_snprintf( p2, sizeof( p2 ), "VLV%i", START_PAGE + stats.pagecount + pagestats.pagecount );
|
||
|
|
||
|
vprint( 1, "%-160s\t%8i\t%10i\t%12s\t%35s\n",
|
||
|
fn,
|
||
|
pagestats.pagecount,
|
||
|
pagestats.linecount,
|
||
|
Q_pretifymem( pagestats.totalbytes, 2 ),
|
||
|
va( "%s -> %s", p1, p2 ) );
|
||
|
|
||
|
stats.linecount += pagestats.linecount;
|
||
|
stats.pagecount += pagestats.pagecount;
|
||
|
stats.totalbytes += pagestats.totalbytes;
|
||
|
|
||
|
}
|
||
|
|
||
|
vprint( 0, "Processed %s\n", Q_pretifymem( stats.totalbytes, 2 ));
|
||
|
vprint( 0, "Line count %i\n", stats.linecount );
|
||
|
vprint( 0, "Page count %i\n", stats.pagecount );
|
||
|
|
||
|
vprint( 0, "Final Bates # %d\n", START_PAGE + stats.pagecount );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CheckLogFile( void )
|
||
|
{
|
||
|
if ( uselogfile )
|
||
|
{
|
||
|
_unlink( "log.txt" );
|
||
|
vprint( 0, " Outputting to log.txt\n" );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void PrintHeader()
|
||
|
{
|
||
|
vprint( 0, "Valve Software - paginate.exe (%s)\n", __DATE__ );
|
||
|
vprint( 0, "--- Insert Bates #'s for the lawyers ---\n" );
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
// Input : argc -
|
||
|
// argv[] -
|
||
|
// Output : int
|
||
|
//-----------------------------------------------------------------------------
|
||
|
int main( int argc, char* argv[] )
|
||
|
{
|
||
|
SpewOutputFunc( SpewFunc );
|
||
|
SpewActivate( "paginate", 2 );
|
||
|
|
||
|
Q_strncpy( g_szDesignation, "Confidential - Attorney's Eyes Only", sizeof( g_szDesignation ) );
|
||
|
|
||
|
int i=1;
|
||
|
for ( i ; i<argc ; i++)
|
||
|
{
|
||
|
if ( argv[ i ][ 0 ] == '-' )
|
||
|
{
|
||
|
switch( argv[ i ][ 1 ] )
|
||
|
{
|
||
|
case 'p':
|
||
|
preview = true;
|
||
|
break;
|
||
|
default:
|
||
|
printusage();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if ( argc < 4 || ( i != argc ) )
|
||
|
{
|
||
|
PrintHeader();
|
||
|
printusage();
|
||
|
}
|
||
|
|
||
|
outdir[ 0 ] = 0;
|
||
|
|
||
|
if ( argc == 6 || ( argc == 5 && !preview ) )
|
||
|
{
|
||
|
--i;
|
||
|
Q_strncpy( outdir, argv[ argc - 1 ], sizeof( outdir ) );
|
||
|
parallel = true;
|
||
|
--argc;
|
||
|
}
|
||
|
|
||
|
START_PAGE = atoi( argv[ argc - 3 ] );
|
||
|
if ( START_PAGE == 0 )
|
||
|
{
|
||
|
PrintHeader();
|
||
|
printusage();
|
||
|
}
|
||
|
|
||
|
Q_strncpy( g_szDesignation, argv[ argc - 2 ], sizeof( g_szDesignation ) );
|
||
|
|
||
|
CheckLogFile();
|
||
|
|
||
|
PrintHeader();
|
||
|
|
||
|
vprint( 0, " Paginating and Bates numbering documents...\n" );
|
||
|
|
||
|
strcpy( rootdir, argv[ argc - 1 ] );
|
||
|
|
||
|
Q_FixSlashes( rootdir );
|
||
|
Q_strlower( rootdir );
|
||
|
Q_StripTrailingSlash( rootdir );
|
||
|
|
||
|
rootoffset = Q_strlen( rootdir ) + 1;
|
||
|
|
||
|
vprint( 0, "dir %s\n\n", rootdir );
|
||
|
|
||
|
PaginateFilesInDirectory( rootdir );
|
||
|
|
||
|
return 0;
|
||
|
}
|