/***************************************************
 * MT258 TMA03 Q3a
 * C Comment Remover (a function only)
 * written by Allen Lam (99043953)
 * compiled by gcc
 * March 2001
 ***************************************************/

#include <stdio.h>
#include <string.h>
#define TRUE 1
#define FALSE 0

char Copy;             
char InsideString;     
char buffer1, buffer2, buffer3; 
FILE* inF;
FILE* outF;

void findOpenComment(){
  do {
    buffer1 = getc(inF);
    if (buffer1==EOF) break;

    if (InsideString){
      switch (buffer1){
        
        case '"':
          InsideString ^= TRUE;         
          if (Copy) putc(buffer1, outF); break;
        
        case 92:
          buffer2 = getc(inF);
          
          putc(buffer1, outF);
          putc(buffer2, outF); break;
        
        case 39:
          
          do {
            buffer2 = getc(inF);
            if (buffer2=='"'){
              if ((buffer3 = getc(inF))==39){
                putc(buffer1, outF); putc(buffer2, outF); putc(buffer3, outF);
              }
              else {
                putc(buffer1, outF); putc(buffer2, outF);
                fseek(inF, -1, SEEK_SET);     
                InsideString ^= TRUE;         
              }
            }
            else if (buffer2==39) putc(buffer1, outF);
            else {putc(buffer1, outF); putc(buffer2, outF);}
          } while (buffer2==39); break;
        default : if (Copy) putc(buffer1, outF);
      }
    }
    
    else {
      switch (buffer1){
        
        case '/':
          
          do {
            buffer2 = getc(inF);
            if (buffer2=='*') Copy = FALSE;
            else if (buffer2=='/') putc(buffer1, outF);
            
            else {
              putc(buffer1, outF);
              putc(buffer2, outF);
            }
          } while (buffer2=='/'); break;
        
        case '"':
          InsideString ^= TRUE;         
          if (Copy) putc(buffer1, outF); break;
        
        case 39:
          
          do {
            buffer2 = getc(inF);
            if (buffer2=='"'){
              if ((buffer3 = getc(inF))==39){
                putc(buffer1, outF); putc(buffer2, outF); putc(buffer3, outF);
              }
              else {
                putc(buffer1, outF); putc(buffer2, outF);
                fseek(inF, -1, SEEK_SET);     
                InsideString ^= TRUE;         
              }
            }
            else if (buffer2==39) putc(buffer1, outF);
            else {putc(buffer1, outF); putc(buffer2, outF);}
          } while (buffer2==39); break;
        default : if (Copy) putc(buffer1, outF); break;
      }
    }
  } while (Copy);
}


void findCloseComment(){
  
  char star = FALSE, slash = FALSE;
  do {
    buffer1 = getc(inF);
    switch (buffer1){
      case '*': if (!InsideString) star = TRUE; break;
      case '/': if (star && !InsideString) slash = TRUE; break;
      case EOF: star = TRUE; slash = TRUE; break; 
      default : star = FALSE;
    }
    if (star && slash) Copy = TRUE;
  } while (!Copy);
}


int removeComment(){
  char inName[30], outName[30];
  int i;

  puts("/*** C COMMENT REMOVER ***/\n");
  printf("Enter input filename: "); gets(inName);
  if ((inF = fopen(inName, "r"))==NULL){
    puts("Cannot find input file."); return 1;
  }
  printf("Enter output filename: "); gets(outName);
  if (!strcmp(inName, outName)){
    puts("Input and output filenames cannot be the same."); return 1;
  }
  if ((outF = fopen(outName, "w"))==NULL){
    puts("Cannot create output file."); return 1;
  }

  
  Copy = TRUE; InsideString = FALSE;
  while (!feof(inF)){
    findOpenComment();
    if (feof(inF)) break;
    findCloseComment();
  }
  fclose(inF); fclose(outF);
}

back