#include <stdio.h>

#define NORM 0
#define QUOTE 1
#define DOLLARS 2
#define COM 3
#define BSLASH 4
#define DQUOTE 5

#define RIEN -1

char sortie(int courant, char entree){
  switch (courant) {
    case NORM:
      if (entree == '#')
        return RIEN;
      else
        return entree;
    case COM:
      if (entree == '\n')
        return entree;
      else
        return RIEN;
    default:
      return entree;
  }
}

int transition(int courant, char entree){
  switch (courant) {
    case NORM:
      switch(entree) {
        case '#':
          return COM;
        case '\'':
          return QUOTE;
        case '"':
          return DQUOTE;
        case '$':
        case '\\':
          return DOLLARS;
        default:  
          return NORM;
      }
    case QUOTE:
      if (entree == '\'')
        return NORM;
      break;
    case DOLLARS:
      if (entree != '$' && entree != '\\')
        return NORM;
    case COM:
      if (entree == '\n')
        return NORM;
      break;
    case DQUOTE:
      switch (entree) {
        case '"':
          return NORM;
        case '\\':
          return BSLASH;
        break;
      }
    case BSLASH:
      return DQUOTE;
  }
  return courant;
}



int main(int argc, char *argv[]){
  FILE *e=stdin,*s=stdout;
  int courant=NORM, suivant;
  char c, res;

  switch (argc) {
    case 3:
      s = fopen(argv[2], "w");
    case 2:
      e = fopen(argv[1], "r");
    case 1:
      break;
    default:
      fprintf(stderr, "Il y a trop d'arguments.\n");
      return 1;
  }

  if (s == NULL || e == NULL) {
    fprintf(stderr, "Erreur d'ouverture d'un fichier.\n");
    return 1;
  }

  // exécution de l'automate
  fscanf(e, "%c", &c);
  while (!feof(e)) {
    suivant = transition(courant, c);
    res = sortie(courant, c);
    courant = suivant;
    if (res != RIEN)
      fprintf(s, "%c", res);
    fscanf(e, "%c", &c);
  }

  fclose(e);
  fclose(s);

  return 0;
}

