#include <stdio.h>
#define OK 0
#define ERR 1
typedef enum {NONE, C_STYLE, CPP_STYLE, STR, END_OF_FILE } STATE;
STATE ProcessStateNone(char ch, FILE **fpIn, FILE **fpOut);
STATE ProcessStateCPPStyle(char ch, FILE **fpIn, FILE **fpOut);
STATE ProcessStateCStyle(char ch, FILE **fpIn, FILE **fpOut);
STATE ProcessStateSTR(char ch, FILE **fpIn, FILE **fpOut);
void ProcessStateEOF(STATE state, FILE **fpOut);
int main(void)
{
FILE *fpIn, *fpOut;
char ch;
STATE state = NONE;
fpIn = fopen("D:/testFile.c","r");
if(NULL == fpIn)
{
printf("can't open source file\n");
fclose(fpIn);
return ERR;
}
fpOut = fopen("D:/testFile2.c","w");
if(NULL == fpOut)
{
printf("can't open destination file\n");
fclose(fpIn);
fclose(fpOut);
return ERR;
}
ch = fgetc(fpIn);
while(ch != EOF)
{
switch(state)
{
case NONE: state = ProcessStateNone(ch, &fpIn, &fpOut);break;
case C_STYLE: state = ProcessStateCStyle(ch, &fpIn, &fpOut);break;
case CPP_STYLE: state = ProcessStateCPPStyle(ch, &fpIn, &fpOut);break;
case STR: state = ProcessStateSTR(ch, &fpIn, &fpOut);break;
}
ch = fgetc(fpIn);
}
ProcessStateEOF(state, &fpOut);
fclose(fpIn);
fclose(fpOut);
system("pause");
return OK;
}
STATE ProcessStateNone(char ch, FILE **fpIn, FILE **fpOut)
{
STATE stateTemp;
char cTemp;
if(ch == '/')
{
cTemp = fgetc(*fpIn);
if(cTemp == '/') // 遇到 "//"
{
stateTemp = CPP_STYLE;
fputc(ch, *fpOut);
fputc('*', *fpOut);
return stateTemp;
}
if(cTemp == '*') // 遇到 "/*"
{
stateTemp = C_STYLE;
fputc(ch, *fpOut);
fputc(cTemp, *fpOut);
return stateTemp;
}
// 遇到 "/其他字符"
stateTemp = NONE;
fputc(ch, *fpOut);
fputc(cTemp, *fpOut);
return stateTemp;
}
if(ch == '"') // 遇到 字符串 " 双引号
{
stateTemp = STR;
fputc(ch, *fpOut);
return stateTemp;
}
// 遇到 其他字符
stateTemp = NONE;
fputc(ch, *fpOut);
return stateTemp;
}
STATE ProcessStateCPPStyle(char ch, FILE **fpIn, FILE **fpOut)
{
STATE stateTemp;
char cTemp;
if(ch == '\n') // 遇到 '\n'
{
stateTemp = NONE;
fputc('*', *fpOut);
fputc('/', *fpOut);
fputc(ch, *fpOut);
return stateTemp;
}
if(ch == '/')
{
cTemp = fgetc(*fpIn);
if(cTemp == '/') // 遇到 "//"
{
stateTemp = CPP_STYLE;
fputc(' ', *fpOut);
return stateTemp;
}
if(cTemp == '*') // 遇到 "/*"
{
stateTemp = CPP_STYLE;
fputc(' ', *fpOut);
return stateTemp;
}
}
if(ch == '*')
{
cTemp = fgetc(*fpIn);
if(cTemp == '/') // 遇到 "*/"
{
stateTemp = CPP_STYLE;
fputc(' ', *fpOut);
return stateTemp;
}
}
//default
stateTemp = CPP_STYLE;
fputc(ch, *fpOut);
return stateTemp;
}
STATE ProcessStateCStyle(char ch, FILE **fpIn, FILE **fpOut)
{
STATE stateTemp;
char cTemp;
if(ch == '/')
{
cTemp = fgetc(*fpIn);
if(cTemp == '/') // 遇到 "//"
{
stateTemp = C_STYLE;
fputc(' ', *fpOut);
return stateTemp;
}
}
if(ch == '*')
{
cTemp = fgetc(*fpIn);
if(cTemp == '/') // 遇到 "*/"
{
stateTemp = NONE;
fputc('*', *fpOut);
fputc('/', *fpOut);
return stateTemp;
}
}
//default
stateTemp = C_STYLE;
fputc(ch, *fpOut);
return stateTemp;
}
STATE ProcessStateSTR(char ch, FILE **fpIn, FILE **fpOut)
{
STATE stateTemp;
char cTemp;
if(ch == '"') //遇到字符串 " 双引号
{
stateTemp = NONE;
fputc(ch, *fpOut);
return stateTemp;
}
if(ch == '\\')
{
cTemp = fgetc(*fpIn);
if(cTemp = '"') //遇到 "\""
{
stateTemp = STR;
fputc(ch, *fpOut);
fputc(cTemp, *fpOut);
return stateTemp;
}
}
//default
stateTemp = STR;
fputc(ch, *fpOut);
return stateTemp;
}
void ProcessStateEOF(STATE state, FILE **fpOut)
{
if(state == CPP_STYLE) // c++ 风格注释处理
{
fputc('*', *fpOut);
fputc('/', *fpOut);
return;
}
}