/* pwgen.c : Password generator - Jon Mayo - PUBLIC DOMAIN - June 1, 2003 */
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include <limits.h>

int main(int argc, char **argv)
{
	const char pwtab_hard[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ`!@#$%^&*()_+-=[]\\{}|;':\",./<>?";
	const char pwtab_easy[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	const char pwtab_simple[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
	const char pwtab_trivial[] = "0123456789abcdefghijklmnopqrstuvwxyz";
	const char pwtab_pathetic[] = "abcdefghijklmnopqrstuvwxyz";
	const char pwtab_joke[] = "0123456789";
	const char *pwtab;
	int pwtab_len;
	int min=6;
	int max=8;
	int cnt;
	int i;
	int easyness=0;
	srand(time(NULL)+getpid());
	
	for(i=1;i<argc;i++)
	{
		int j;
		char ch;
		if(argv[i][0]=='-') {
			for(j=1;argv[i][j];j++) {
				switch(ch=argv[i][j]) {
					case 'V': /* version */
						fprintf(stderr,"Version 1.0\nThis software is under PUBLIC DOMAIN.\n");
						exit(EXIT_SUCCESS);
						break;
					case 'h': /* help */
						fprintf(stderr,"usage: %s [-hVs] [-m min] [-l max]\n\n-V\tversion\n-h\tThis help\n-s\tmake the password simplier(specify multiple times for very simple)\n\t(hard, easy, simple, trivial, pathetic, joke)\n-m\tminimum length\n-l\tmaximum length\n\n",argv[0]);
						exit(EXIT_SUCCESS);
						break;
					case 's':
						easyness++; /* simplier */
						break;
					case 'm':
						i++;
						min=strtol(argv[i],NULL,0);
						j=-1;
						break;
					case 'l':
						i++;
						max=strtol(argv[i],NULL,0);
						j=-1;
						break;
					default:
						fprintf(stderr,"Option %c unknown.\n",ch);
				}
				if(j==-1) break; /* bleh */
			}
		}
	}

	
	if(max<min) max=min;
	if(min<=0) { 
		fprintf(stderr,"min and max must be between 1 and %d\n",INT_MAX);
		return EXIT_FAILURE; /* bleh */
	}
	cnt=(rand() % (max-min+1)) + min;	
	switch(easyness) {
		case 0: /* hard */
			pwtab=pwtab_hard;
			pwtab_len=sizeof pwtab_hard - 1;
			break;
		case 1: /* easy */
			pwtab=pwtab_easy;
			pwtab_len=sizeof pwtab_easy - 1;
			break;
		case 2: /* simple */
			pwtab=pwtab_simple;
			pwtab_len=sizeof pwtab_simple - 1;
			break;
		case 3: /* trivial */
			pwtab=pwtab_trivial;
			pwtab_len=sizeof pwtab_trivial - 1;
			break;
		case 4: /* pathetic */
			pwtab=pwtab_pathetic;
			pwtab_len=sizeof pwtab_pathetic - 1;
			break;
		default:
		case 5: /* joke */
			pwtab=pwtab_joke;
			pwtab_len=sizeof pwtab_joke - 1;
			break;
	}
	for(i=0;i<cnt;i++) {
		printf("%c",pwtab[rand() % (pwtab_len)]);
	}
	printf("\n");
	return EXIT_SUCCESS;
}