shithub: candycrisis

ref: 1ae6334bfaeb53c301a553e45733ad2a50b74689
dir: /Source/RegGenerator.cpp/

View raw version
///
///  RegGenerator.cpp
///
///  Command-line tool for generating registration codes.
///
///  John Stiles, 2002/11/1
///


#include <stdio.h>
#include "RegAlgorithm.h"


static void GenerateCode( const char* name, char* outCode )
{
	int          pool;
	char         flatName[256];
	unsigned int value;
	
	CopyFlattened( flatName, name );
	
	switch( flatName[0] )
	{
		case 'A': case 'B': pool = 0;  break;
		case 'C': case 'D': pool = 1;  break;
		case 'E': case 'F': pool = 2;  break;
		case 'G': case 'H': pool = 3;  break;
		case 'I': case 'J': pool = 4;  break;
		case 'K': case 'L': pool = 5;  break;
		case 'M': case 'N': pool = 6;  break;
		case 'O': case 'P': pool = 7;  break;
		case 'Q': case 'R': pool = 8;  break;
		case 'S': case 'T': pool = 9;  break;
		case 'U': case 'V': pool = 10; break;
		case 'W': case 'X': pool = 11; break;
		case 'Y': case 'Z': pool = 12; break;
	}
	
	int flatLength = strlen(flatName);
    
	value = hash( (unsigned char*) flatName, flatLength, keylist[pool] );

	sprintf( outCode, "%c%c%c%c-%c%c%c%c",
						scrambleKey[ (value >> 28) & 0xf ],
						scrambleKey[ (value >> 24) & 0xf ],
						scrambleKey[ (value >> 20) & 0xf ],
						scrambleKey[ (value >> 16) & 0xf ],
						scrambleKey[ (value >> 12) & 0xf ],
						scrambleKey[ (value >>  8) & 0xf ],
						scrambleKey[ (value >>  4) & 0xf ],
						scrambleKey[ (value >>  0) & 0xf ]  );						
}


int main( int argc, char* argv[] )
{
	char code[64];
	
	if( argc != 2 )
	{
		fprintf( stderr, "usage: crisisgen \"User Name\"\n" );
		exit(1);
	}
	
	if( strlen(argv[1]) < 4 )
    {
        fprintf( stderr, "ERROR: name too short\n" );
        exit(1);
    }
    
	GenerateCode( argv[1], code );
 
    if( !ValidateCode( argv[1], code ) )
    {
        fprintf( stderr, "ERROR: code generation failure for name \"%s\"!", argv[1] );
        exit(1);
    }   
    
	printf( "%s\n", code );
	
	return 0;
}