#include"CommentConvert.h"
enum STATE state=NUL_STATE;
int first=0;
int second =0;
int third=0;
void Do_NUL_State(FILE *pfread,FILE *pfwrite)
{
first=fgetc(pfread);
switch(first)
{
case '/':
second=fgetc(pfread);
if(second == '*') //C注释转化为C++注释
{
fputc('/',pfwrite);
fputc('/',pfwrite);
state=C_STATE;
}
else if(second == '/') //C++注释直接输出并进入C++模式
{
fputc(first,pfwrite);
fputc(second,pfwrite);
state=CPP_STATE;
}
else //是其他字符直接输出
{
fputc(first,pfwrite);
fputc(second,pfwrite);
}
break;
case EOF: //文件结束标志
state=END_STATE;
break;
default : //不是注释的字符
fputc(first,pfwrite);
break;
}
}
void Do_C_State(FILE *pfread,FILE *pfwrite)
{
first=fgetc(pfread);
switch(first)
{
case '*':
second=fgetc(pfread);
switch(second)
{
case '*': // 6.连续的/***/问题
third=fgetc(pfread);
fputc(first,pfwrite);
if(third == '/')
{
state=NUL_STATE;
}
break;
case '/':
third=fgetc(pfread);
if(third != '\n') // /* int i = 0; */int j = 0;
{
fputc('\n',pfwrite);
}
if(third == '/') //5.连续的注释问题/**//**/
{
ungetc('/',pfread);
state=NUL_STATE;
break;
}
fputc(third,pfwrite); // /* int i = 0; */ \n int j = 0;
state=NUL_STATE;
break;
default: //不是注释的字符
fputc(first,pfwrite);
fputc(second,pfwrite);
break;
}
break;
case '\n': //4.C注释中的多行注释
fputc('\n',pfwrite);
fputc('/',pfwrite);
fputc('/',pfwrite);
break;
case EOF: //文件结束标志
state=END_STATE;
break;
default: //不是注释的字符
fputc(first,pfwrite);
break;
}
}
void Do_CPP_State(FILE *pfread,FILE *pfwrite)
{
first=fgetc(pfread);
switch(first)
{
case '\n':
fputc(first,pfwrite);
state=NUL_STATE;
break;
case EOF:
state=END_STATE;
break;
default : //7.不是注释的字符
fputc(first,pfwrite);
break;
}
}
void CommentConvert(FILE *pfread,FILE * pfwrite)
{
while(state != END_STATE)
{
switch(state)
{
case NUL_STATE:
Do_NUL_State(pfread,pfwrite);
break;
case C_STATE:
Do_C_State(pfread,pfwrite);
break;
case CPP_STATE:
Do_CPP_State(pfread,pfwrite);
break;
case END_STATE:
break;
}
}
}