// Multable Version 0.5
// Coded by William Donaldson
// If you modify this source code,
// please keep these comments intact,
// and create a new comment with
// your information on it.

// If you enjoy this software, please
// feel free to email me and congratulate
// me on my good work! You can email me
// at wdonaldson AT dyo-ecksdee DOT com.
// Knowing people like my software is
// all that I need. 


#include <iostream>
using namespace std;


int interactive(int default_across, int default_down);
int maketable(int across0, int down0);


int main(int argc, char *argv[]) {
	int version_major = 0;
	int version_minor = 5;
	int default_across = 12;
	int default_down = 10;
	
	if (argc > 1) { // see which arguments are being passed
		int argtype[argc];
		for (int checkarg = 1; checkarg < argc; checkarg++) { //check for arguments
			if (strcmp(argv[checkarg],"-h") == 0) argtype[checkarg] = 0; // set to help argtype
			else if (strcmp(argv[checkarg],"-i") == 0) argtype[checkarg] = 1; // set to interactive argtype
			else argtype[checkarg] = -1; // set to be a number
			switch (argtype[checkarg]) {
				case -1:
					if (argtype[checkarg - 1] != -1) {
						if (checkarg + 1 < argc) {
							if (argtype[checkarg + 1] != -1) {
								maketable(atoi(argv[checkarg]), atoi(argv[checkarg + 1]));
							}
						}
						else cout<<"Please specify two numbers.\n";
					}
					break;					
				case 0:
					cout<<"Multable v"<<version_major<<"."<<version_minor<<"\n";
					cout<<"Usage: "<<argv[0]<<" [-hi] [across] [down]\n";
					cout<<"Arguments:\n";
					cout<<"	-h		Show Help\n";
					cout<<"	-i		Interactive Mode\n";
					break;
				case 1:
					interactive(default_across, default_down);
					break;
				default:
					cout<<argv[checkarg]<<": Unknown argument\n";
					break;
			}
		}
	}
	else {
		maketable(default_across, default_down);
	}
	
	return 0;
}

int interactive(int _across, int _down) {
		
	int across;
	int down;
	char which;
	
	
	
	cout<<"Use defaults (across = "<<_across<<", down = "<<_down<<")? (y/n) ";
	cin>>which;
	
	if (which == 'n') {
		cout<<"Input the amount you want across. ";
		cin>>across;
		cout<<"Input the amount you want down. ";
		cin>>down;
	}
	else {
		across = _across;
		down = _down;
	}

	cout<<"Outputting "<<across<<" rows, "<<down<<" columns.\n\n";
	
	maketable(across, down);


				

	return 0;
}

int maketable(int across0, int down0) {
	int maxchar = 1;
	int maxcharmult = 10;
	for (maxchar = 1, maxcharmult = 10; across0 * down0 > maxcharmult; maxchar = maxchar + 1, maxcharmult = maxcharmult * 10);
	
	/* create table */
	int out; // create holder for number
	for (int down1 = 0; down1 <= down0; down1++) { // make a column
		for (int across1 = 0; across1 <= across0; across1++) { // fill column in rows
			if (across1 == 0) {
				out = down1;
			}
			else if (down1 == 0) {
				out = across1;
			}
			else {
				out = across1 * down1;
			}
			cout<<out;
			
			int charspernum = 1;
			int multmax = 10;
	
			for (charspernum = 1, multmax = 10; out >= multmax; charspernum = charspernum + 1, multmax = multmax * 10);
			int hms = maxchar - charspernum + 1;
			for (int space = 1; space <= hms; space++) {cout<<" ";}
		}
		cout<<"\n";
	}
	return 0;
}

