//Programa Gerador de Dicionario
//Feito por: Samir Piccolotto
//Versão: Alfa (0.0.1)
//Free & Open-Source
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

void gerador(char const *const pprim,char *const p,
               char const *const pult,char const *const alfab)
{
  for (*p = alfab[0]; *p; *p = strchr(alfab,*p)[1])
    {
      if (p == pult)
        puts(pprim);
      else
        gerador(pprim,p+1,pult,alfab);
    }
}

int main(int argc, char **argv)
{
  char strg[64 + 1] = {0};
  char *pteste;
  char teste;

  teste=*(argv[3]);
  pteste = &teste;

  if ( (argc<3) || ( (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h" ) == 0) ) )
    {
      printf("Programa criado por Samir Piccolotto, para fins educativos APENAS!\n");
      printf("(ou para Adm. de Sistemas)\n\n");
      printf("\nGerador de dicionario (Versão Alfa: 0.0.1)\n\n");
      printf("\nUso: dict opcoes > arquivo de saida\n\n");
      printf("Opcoes:\n");
      printf("-------\n\n");
      printf("-h, --help          Imprime este texto e sai.\n");
      printf("1o argumento:       Numero de caracteres de cada palavra.\n");
      printf("2o argumento:       Letras/numeros/simbolos a serem usados no dicionario.\n");
      printf("3o argumento:       Letra/numero/simbolo inicial do dicionario.\n");
      printf("CASO ALGUMA ENTRADA INVALIDA SEJA FORNECIDA,\n");
      printf("O PROGRAMA RETORNA UM 'seg fault'!!!!!!!!\n\n\n");
      printf("Exemplo de utilização:\n");
      printf("----------------------\n");
      printf("dict 5 0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz s > passwd.txt\n\n");
      printf("O programa dict ira criar um dicionario de '5' letras, com todas as combinacoes de 0 a Z\n");
      printf("(maiusculas e minusculas), iniciando com a letra s (minuscula) e jogara a saida em um \n");
      printf("arquivo chamado passwd.txt no diretorio atual.\n\n");
      printf("No exemplo acima, o arquivo possuira cerca de 88 MegaBytes, APENAS para as palavras que\n");
      printf("comecem com a letra s, com 5 letras.\n");
      printf("Para um dicionario como o acima, porém, de 8 letras, o arquivo terá mais de 80 GigaBytes.\n\n\n");
      printf("Qualquer duvida, sugestao, melhorias, bug reports, etc, mandar email para:\n");
      printf("samir666@gmail.com\n");
      printf("Homepage    http://ps3linux.radiolivre.org\n\n");
      printf("Gostou do projeto? Gostaria de fazer uma doacao via PayPal? Visite o site acima.\n\n");
      exit(1);
    }

  else
    gerador(pteste,strg,strg + strtoul(argv[1],0,10) - 2,argv[2]);


  return(0);
}

