#include "options.h" #include "unitnumber.h" #include "number.h" #include #include Options::Options( int argc, char *argv[] ) : iScale( 0 ), iRadix( 10 ) { addOption( iRadix, 'r', "radix", Bu::String("Set the radix (default: %1)").arg( iRadix ) ); addOption( iScale, 's', "scale", Bu::String("Set the scale (default: %1)").arg( iScale ) ); addOption( Bu::slot(this, &Options::selfTest), "self-test", "Run a series of tests to ensure everything is working correctly."); addOption( Bu::slot(this, &Options::textPrimes), "text-primes", "Generate primes in base 36 that only have digits > 9 in them."); addOption( Bu::slot(this, &Options::isPrime), 'p', "is-prime", "Tests every parameter after to see if it is prime then prints out " "the ones that are prime. Set radix first."); addHelpOption('h', "help", "This help"); parse( argc, argv ); } Options::~Options() { } int Options::selfTest( Bu::StringArray ) { UnitNumber().run(); exit( 0 ); return 0; } bool hasDigits( const Bu::String &s ) { for( Bu::String::const_iterator i = s.begin(); i; i++ ) { if( *i >= '0' && *i <= '9' ) return true; } return false; } int Options::textPrimes( Bu::StringArray ) { Number tst( 0, 36 ); Number max( 0, 36 ); Number j( 0, 36 ); Number one( 0, 36 ); Number fact( 0, 36 ); one = "1"; fact = "2"; for( tst = "1";; tst = tst + one ) { if( hasDigits( tst.toString() ) ) continue; max = tst / fact; bool bPrime = true; for( j = "2"; j < max; j = j + one ) { if( (tst%j).isZero() ) { bPrime = false; break; } } if( bPrime ) { Bu::println("%1").arg( tst ); } } exit( 0 ); return 0; } int Options::isPrime( Bu::StringArray aArgs ) { Number tst( 0, iRadix ); Number max( 0, iRadix ); Number j( 0, iRadix ); Number one( 0, iRadix ); Number fact( 0, iRadix ); one = "1"; fact = "2"; for( Bu::StringArray::iterator i = aArgs.begin()+1; i; i++ ) { tst = *i; max = tst / fact; bool bPrime = true; for( j = "2"; j < max; j = j + one ) { if( (tst%j).isZero() ) { bPrime = false; break; } } if( bPrime ) { Bu::println("%1").arg( tst ); } } exit( 0 ); return aArgs.getSize(); }