/***************************************************
* 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