C与C++的注释转换

·CommentConvert.c

#include "CommentConvert.h"

void DoNulState(FILE*pfIn, FILE*pfOut, enum State* ps)
{
	int first=fgetc(pfIn);
	int second=0;
	switch(first)
	{
	case '/':
		{
			second=fgetc(pfIn);
			switch(second)
			{
			case '/':
				{
					fputc(first,pfOut);
					fputc(second,pfOut);
					*ps=CPP_STATE;
					break;
				}
			case '*':
				{
					fputc('/',pfOut);
					fputc('/',pfOut);
					*ps=C_STATE;
					break;
				}
			default :
				{
					fputc(first,pfOut);
					fputc(second,pfOut);
					break;
				}
			}
			break;
		}
	case EOF:
		{
			*ps=END_STATE;
		}
	default:
		{
			fputc(first,pfOut);
			break;
		}
	}
}

void DoCState(FILE*pfIn, FILE*pfOut, enum State* ps)
{
	int first=fgetc(pfIn);
	int second=0;
	int third=0;
	switch(first)  
    {  
    case '*':
        {  
            second = fgetc(pfIn);
            switch(second) 
            {  
            case '/':  
                {  
                    third =fgetc(pfIn);   
                    if(third == '\n')
                    {  
                        fputc(third,pfOut);  
                    }  
                    else  
                    {  
                        fputc('\n',pfOut);
                        ungetc(third,pfIn);  
                    }  
                    *ps = NUL_STATE; 
                }  
                break;  
            default :  
                {  
                fputc(first,pfOut);  
                ungetc(second,pfIn); 
                }  
            break;  
            }  
        }  
        break;    
      
    case '\n':  
        {  
            fputc(first,pfOut);  
            fputc('/',pfOut);  
            fputc('/',pfOut);  
        }  
        break;  
    default:  
        fputc(first,pfOut);
        break;  
    }  
}

void DoCppState(FILE*pfIn, FILE*pfOut, enum State* ps)
{  
    int first = 0;  
    int second = 0;  
    int third= 0;  
    first = fgetc(pfIn);
    switch(first)  
    {  
    case '\n' :   
        {  
            fputc(first,pfOut);  
            *ps = NUL_STATE;
        }  
        break;  
    default :  
        fputc(first,pfOut);  
        break;  
    }  
}  

·test.c

#include "CommentConvert.h"

void DoCommentConvert(FILE*pfIn, FILE*pfOut)
{
	enum State state=NUL_STATE;
	while(state!=END_STATE)
	{
		switch(state)
		{
		case NUL_STATE:
			DoNulState(pfIn,pfOut,&state);
			break;
		case C_STATE:
			DoCState(pfIn,pfOut,&state);
			break;
		case CPP_STATE:
			DoCppState(pfIn,pfOut,&state);
			break;
		}
	}
}

void test()
{
	FILE *pfIn=NULL;
	FILE *pfOut=NULL;
	pfIn=fopen("input.c","r");
	if(pfIn==NULL)
	{
		perror("open file for read");
		exit(EXIT_FAILURE);
	}
	pfOut=fopen("output.c","w");
	if(pfOut==NULL)
	{
		fclose(pfIn);
		perror("open file for write");
		exit(EXIT_FAILURE);
	}

	DoCommentConvert(pfIn,pfOut);

	fclose(pfIn);
	fclose(pfOut);
}

int main()
{
	test();
	printf("转换成功\n");
	return 0;
}

猜你喜欢

转载自blog.csdn.net/q302989778/article/details/84252126