//Librerias necesarias
#include<stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
//Prototipos
int getOptions(int,char**,char**,int*,int*);
void ayuda();
void generator(char *, char *,int, int);
//
//Funcion:	wordgenerator.c
//Description:	Genera palabras linear o recursivamente.
//Autor:	Miggs
//Date:		18/10/2006
//
int main (int argc, char *argv[])
{
	//Caracteres a usar por defecto
	char *c = "1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM";
	int len;
	//Usamos recursividad?
	int r = 0; //No a no ser que nos lo pidan...

	if(getOptions(argc,argv,&c,&len,&r)<0)
		ayuda();

	char actual[len + 1];
	actual[len] = '\0';

	if(r == 0){
		//Lineal = rapido
		int i,j;
		for(i = 0; i < len ; i ++)
			for(j = 0; j< strlen(c) ; j ++){
				actual[i] = c[j];
				printf("%s\n",actual);
			}
	}else
		//Recursividad = lento
	 	generator(c,actual,len,0);
	return 0;
}
//
//Funcion:	generator
//Description:	funcion recursiva
//Date:		18/10/2006
//
void generator(char *c,char *actual, int len, int level)
{
	int i;
	if(level < len)
	{
		for(i = 0; i < strlen(c);i = i + 1){
			actual[level] = c[i];
			generator(c,actual,len,level+1);
		}
	}
	else
		printf("%s\n",actual);
}

//
//Funcion:	getOptions
//Description:	Interpreta las opciones de la linea de comandos
//Date:		18/10/2006
//
int getOptions(int argc, char **argv, char **vC, int *l, int *r)
{
  int c;
  int retValue = -1;


  while((c = getopt(argc, argv, "l:c:r")) != -1){
    switch(c){
      case 'l':
	  *l = atoi(optarg);
	  if(*l > 0)
	  	retValue = 1;
	break;
      case 'c':	
	*vC =optarg;
	break;
      case 'r':
	*r = 1;
      default:
	break;
      }
  }
  return retValue;
}


//
//Funcion:	ayuda
//Description:	Imprime la ayuda por pantalla
//Date:		18/10/2006
//
void ayuda()
{
	printf("\n// wordGenerator 0.1 6/Feb/2008\n");
	printf("// icaix.com//\n");
	printf("\n  Uso:\n");//
//Funcion:	ayuda
//Description:	Imprime la ayuda por pantalla
//Date:		18/10/2006
//;
	printf("     ./wordGenerator [-C CaracteresAUsar] [-r] -l <longitudPalabra> \n");
	printf("\n   Generacion palabras de longitud 3, metodo lineal\n");
	printf("     ./wordGenerator -l 3\n");
	printf("\n   Generacion palabras de longitud 3, metodo recursivo\n");
	printf("     ./wordGenerator -r -l 3\n");
	printf("   Generacion palabras de longitud 3 con vocabulario abcdefghABCDEFGH\n");
	printf("     ./wordGenerator -l 3 -C abcdefghABCDEFGH\n\n");
	_exit(0);

}
