#include "prehtml.h"

int debug=0;

void init_traitement_fichier(void){ /* initialisation avant traitement fichier*/
  /* on initialise l'imbrication */
  imbriqueactu=monalloc(sizeof(imbrique));
  imbriqueactu->type=MAIN;
  /* on définit une fonction pour séparer les arguments shell */
  execshell("liste_shell() { while [ $# -gt 0 ]; do echo $1; shift; done; }");
}

void traite_fichier_principal(void){ /* fait tout ce qu'il y a à faire */
  int c,i;
  /* initialisations */
  chut=0;
  affiche=1;
  while(1){ // boucle principale: lecture du fichier source
    c=decode();
    if (c==EOF){ // fin du fichier, on vérifie qu'il n'y a pas d'imbrication
      i=imbriqueactu->type;
      if (i!=MAIN) erreur("EOF rencontré alors qu'on est dans un bloc <%s>",
			  (i==IF?"if":(i==FOR?"for":(i==WHILE?"while":
						     "inconnu")))
			  );
      break; /* fin de fichier sans problème: on sort de la boucle*/
    }
    if (c!=EST_FONCTION) {/* caractère normal*/
      put(c);
      continue;
    }
    /* donc on est là en face d'une fonction */
    traitefonction();
  }
}

char *fich_out,*fich_temp;

void fait_tout_ce_qu_il_faut_pour_un_fichier(char *nom){
  int i,pc,dec;
  FILE *f1,*f2;
  int i1,i2;
  char ligne[LONGUEUR_LIGNE];
  
  init_pipe();
  ouvrir_fichier(nom);
  i=strlen(nom);dec=0;
  if (!strcasecmp(nom+i-5,".phtm")) {pc=i-4;dec=1;}
  else if (!strcasecmp(nom+i-6,".phtml")) {pc=i-5;dec=1;}
  else if (!strcasecmp(nom+i-7,".prehtm")) {pc=i-6;dec=3;}
  else if (!strcasecmp(nom+i-8,".prehtml")) {pc=i-7;dec=3;}
  else erreur("Le fichier \"%s\" n'est ni .phtm ni .phtml",nom);
  fich_out=strdup(nom);
  strcpy(fich_out+pc,fich_out+pc+dec); /* transforme en .htm ou .html */
  /* j'enregistre le nom du fichier de sortie dans $dest */
  snprintf(ligne,LONGUEUR_LIGNE,"dest='%s'",fich_out); envoieshell(ligne);
  while(recoitshell(ligne,0));
  fich_temp=monalloc(i+6);
  strcpy(fich_temp,fich_out);
  strcat(fich_temp,".tmp");
  creetemp(fich_temp); /* fichier à effacer si arrêt d'urgence */
  sortie=fopen(fich_temp,"w"); /* on crée un fichier temporaire */
    if (!sortie) erreur("Impossible de créer le fichier %s",fich_temp);
  init_generate(); /* indispensable pour que GENERATE marche */
  init_traitement_fichier();
  traite_fichier_principal();
  fin_pipe(); /* à refermer pour qu'on puisse recommencer */
  fclose(sortie);
  fin_generate(); /* conclut le traitement des GENERATE */
  if (engenerate==0){ /* si on a fait GENERATE, c'est traité dans generate.c */
    /* on compare l'ancien (si existant) et le nouveau fichier */
    f1=fopen(fich_out,"rb");
    i1=0;i1=1;
    if (f1){
      f2=fopen(fich_temp,"rb");
      if (!f2) erreur("Le fichier %s n'a pas été créé",fich_temp);
      do{
	i1=getc(f1); i2=getc(f2);
      }while(i1==i2 && i1!=EOF);
      fclose(f2);fclose(f1);
    }
    if (i1!=i2){
      if (rename(fich_temp,fich_out))
	erreur("Impossible de renommer %s en %s",fich_temp,fich_out);
    }
    else unlink(fich_temp); /* fichiers identiques: je l'enlève
			     * pour ne pas changer la date */
  }
  free(fich_temp);
  free(fich_out);
}

int main(int argc,char *argv[]){
  if (argc<2) {
    fprintf(stderr,"prehtml: Syntaxe: prehtml [-d] <fichier(s).prehtml>\n"
	    "-d : debug, sortie également dans stdout\n");
    exit(1);
  }
  argc--;
  while (argc--){
    argv++;
    if (!strcmp(*argv,"-d")){
      debug=1;
      continue;
    }
    fait_tout_ce_qu_il_faut_pour_un_fichier(*argv);
  }
  return 0;
}
