|
|
//========= 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; }
|