#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stat.h>

#define VERSION "4.1f Amiga RELEASE"

char oldcurdir[200];

char *remote=0, *domail=0, *pwl=0,*fgnd=0,*nice=0,*rcvr=0,*verbose=0;

char outinit[200],inputfile[200],univbuffer[200];

int inputline(FILE *fp,char *buffer)
{
  int i,c;

  for(i=0;i<200;i++) {
    c=fgetc(fp);
    if(c==EOF) break;
    if(c=='\n') break;
    buffer[i]=c;
  }
  buffer[i]=0;
  return(c);
}
long filesize(char *fn)
{
  struct stat *st;

  if(st=malloc(sizeof(struct stat))) {
    if(stat(fn,st)==0) {
      return(st->st_size);
    }
  }
  return(0);
}
int pwcmp(char **entry1,char **entry2)
{
  int i,j=0,k;
  char *e1,*e2;

  e1=*entry1;
  e2=*entry2;

  for(i=0;e1[i]!=0;i++) {
    if(e1[i]==':') {
      if(j==0) j++;
    } else {
      break;
    }
  }
  for(k=j=0;e2[k]!=0;k++) {
    if(e2[k]==':') {
      if(j==0) j++;
    } else {
      return(strcmp(&e1[j],&e2[k]));
    }
  }
  return(0);
}

int pwsort(char *filename,int (*cmp)(char **,char **))
{
  FILE *fp;
  char *file;
  int size;
  int i,j;
  int entryc=0;
  char **entries;

  size=filesize(filename);
  if(file=malloc(size+2)) {
    if(fp=fopen(filename,"r")) {
      fread(file,size,1,fp);
      file[size]=0;
      file[size+1]=0;
      fclose(fp);
      for(i=0;i<size;i++) {
        if(file[i]=='\n') {
          entryc++;
          file[i]=0;
        }
      }
      if(entries=malloc(sizeof(char *)*(entryc+1))) {
        for(i=j=0;i<size;i++) {
          if(file[i]==0) {
            j++;
            entries[j]=&file[i+1];
          }
        }
        entries[0]=file;
        qsort(entries,entryc,4,cmp);
        if(fp=fopen(filename,"w")) {
          for(i=0;i<entryc;i++) {
            fprintf(fp,"%s\n",entries[i]);
          }
          fclose(fp);
        }
        free(entries);
      }
    }
    free(file);
  }
  return(1);
}
char *getfieldno(int field,char *buffer)
{
  char *buffer2;
  int i;

  buffer2=buffer;

  for(i=0;i<field;i++) {
    buffer2=buffer2+strlen(buffer2)+1;
  }
  return(buffer2);
}

char guessable=0;

int uniq(char *infilename,char *outfilename)
{
  FILE *in,*out;
  char buffer[2][200];
  char bufno=0;
  int retval=0;

  if(in=fopen(infilename,"r")) {
    if(out=fopen(outfilename,"w")) {
      while(inputline(in,buffer[bufno])!=EOF) {
        if((buffer[bufno][19]=='Y' || guessable==0) && strcmp(buffer[0],buffer[1])) {
          fprintf(out,"%s\n",buffer[bufno]);
        }
        bufno^=1;
      }
      retval=1;
      fclose(out);
    }
    fclose(in);
  }
  return(retval);
}
int main(int argc,char *argv[])
{
  char buffer[200],buffer2[200];

  printf("Are you sure you want to do this ? (no)\n");
  gets(buffer);
  if((buffer[0]=='y' || buffer[0]=='Y') && buffer[1]==0) {
    system("Delete out.#? Dicts/bigdict Dicts/.lockfile");
    printf("Saving all CRACKABLE passwords.\n");
    printf("Do you also want to save your UNCRACKABLE passwords ?\n");
    printf("Answer NO if you have changed some rules or modified source dictionaries\n");
    printf("(default: yes) \n");
    gets(buffer);
    if((buffer[0]=='n' || buffer[0]=='N') && buffer[1]==0) {
      guessable=1;
    }
    tmpnam(buffer);
    sprintf(buffer2,"type Runtime/F#? >%s",buffer);
    system(buffer2);
    pwsort(buffer,(int (*)(char **,char **))&strcmp);
    uniq(buffer,"Runtime/F.merged");
    system("Delete Runtime/~(F.merged)");
    remove(buffer);
  }
}