/**************************************
tab をスペースに変換．
適当なプログラム．一応動作する．
容赦なく変換するので，使用する場合は注意すること
**************************************/

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

#define REPLACE          0x10
#define TAB_SPACE        0x08

#define AUTHOR   "Haruaki TAMADA <tamada@oikaze.com>"
#define VERSION  "1.0.0"


void usage(char *prog){
  fprintf(stdout, "Usage: %s [-t <0-15>] [-r] [files...]\n", prog);
}

void version(char *prog){
  fprintf(stdout, "%s Version: %s\n", prog, VERSION);
}

void help(char *prog){
  usage(prog);
  fprintf(stdout, "   -t <0-15>: tab の桁数. デフォルトは 8. 範囲は 0〜15\n");
  fprintf(stdout, "          -s: このフラグがセットされるとファイルが置き換わる。\n");
  fprintf(stdout, "              標準入力からの入力の場合、このフラグはセットできない。\n");
}

int option(int argc, char *argv[]){
  int i, j;
  
  int flag = TAB_SPACE;

#ifdef DEBUG
  fprintf(stderr, "option\n");
#endif

  for(i = 1; i < argc; i++){
    if(argv[i][0] == '-'){
      if(strcmp(argv[i], "-t") == 0){
        int space;
        i++;
        if(i >= argc){
          usage(argv[0]);
          exit(1);
        }
        space = atoi(argv[i]);
        if(space > 0xf || space <= 0){
          help(argv[0]);
          exit(1);
        }
        flag = flag & 0xfff0;
        flag = flag | (space&0xf);
      }
      else if(strcmp(argv[i], "-r") == 0){
        flag = flag | REPLACE;
      }
      else if(strcmp(argv[i], "-h") == 0){
        help(argv[0]);
        exit(0);
      }
      else if(strcmp(argv[i], "-v") == 0){
        version(argv[0]);
        exit(0);
      }
    }
  }
#ifdef DEBUG
  fprintf(stderr, "option: flag: %x\n", flag);
#endif
  return flag;
}

void doit(FILE *in, FILE *out, int space){
  int data;
  int i;

  while((data = fgetc(in)) != EOF){
    if(data == '\t'){
      for(i = 0; i < space; i++) fputc(' ', out);
    }
    else fputc(data, out);
  }
}

void tab2space(char *file, int flag, int space){
  FILE *fp;
  FILE *out;
  int i;
  char *tmpfile;

#ifdef DEBUG
  fprintf(stderr, "tab2space(%s, %x, %d)\n", file, flag, space);
#endif
  if((fp = fopen(file, "r")) == NULL){
    perror(file);
    exit(1);
  }
  if((flag & REPLACE) == REPLACE){
    if((tmpfile = mktemp(".")) == NULL){
      perror(".");
      return;
    }
#ifdef DEBUG
    fprintf(stderr, "tmpfile: %s\n", tmpfile);
#endif
    if((out = fopen(tmpfile, "w")) == NULL){
      perror(tmpfile);
      return;
    }
  }
  else{
    out = stdout;
  }

  doit(fp, out, space);

  fclose(fp);

  if((flag & REPLACE) == REPLACE){
    int data;

    fclose(out);
    fp = fopen(tmpfile, "r");
    out = fopen(file, "w");

    while((data = fgetc(fp)) != EOF) fputc(data, out);
    fclose(fp);
  }
  fclose(out);
}

void tab2space_main(int argc, char *argv[], int flag){
  int i, doitflag = 0;
  int space = flag & 0xf;

  for(i = 1; i < argc; i++){
    if(argv[i][0] != '-'){
      tab2space(argv[i], flag, space);
      doitflag = 1;
    }
    if(strcmp(argv[i], "-t") == 0) i++;
  }
  if(doitflag == 0){
    if((flag & REPLACE) == REPLACE){
      help(argv[0]);
      exit(1);
    }
    doit(stdin, stdout, space);
  }
}

int main(int argc, char *argv[]){
  int flag;

  flag = option(argc, argv);

  tab2space_main(argc, argv, flag);
}
