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

int charcmp(const void *c1, const void *c2) {
  return(*(char *)c1-*(char *)c2);
}

int main(int argc, char **argv) {
char word[256], canon[256];
char sortc[128], hname[128], vname[128];
FILE *raw, *hdict, *vdict;
char *s;
int invalid;
  sprintf(hname, "%s-h", argv[1]);
  sprintf(vname, "%s-v", argv[1]);
  sprintf(sortc, "gnusort %s > %s", hname, vname);
  raw = fopen(argv[1], "r");
  hdict = fopen(hname, "w");
  for (;;) {
    if (fgets(word, 128, raw) == NULL) break;
    word[strlen(word)-1] = '\0';
    strcpy(canon, word);
    qsort(canon, strlen(canon), sizeof(char), charcmp);
    invalid = (0!=0);
    s = word;
    while (*s != '\0') {
      if ((*s > 'z') || (*s < 'a')) {
        invalid = (0==0);
        break;
      }
      s += 1;
    }
    if (!invalid) fprintf(hdict, "%s%s\n", canon, word);
  }
  fclose(raw);
  fclose(hdict);
  system(sortc);
  vdict = fopen(vname, "r");
  raw = fopen(argv[1], "w");
  for (;;) {
    if (fgets(word, 128, vdict) == NULL) break;
    word[strlen(word)-1] = '\0';
    fprintf(raw, "%s\n", word + (strlen(word)/2));
  }
  fclose(hdict);
  fclose(vdict);
  remove(hname);
  remove(vname);
  return(0);
}
