C注释到C++注释转换工具

状态分析图:

CommentConvert.h

#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__

#define  _CRT_SECURE_NO_WARNINGS


#include <xpu.h>
#include <Windows.h>

enum State{
	NUL_STATE, //无注释状态
	C_STATE, //C注释状态
	CPP_STATE,//C++注释状态
	END_STATE, //结束状态
};

//注释转换的函数
void CommentConver(FILE *pfIn,FILE *pfOut);

//无状态的处理函数
void DoNulState(FILE *pfIn,FILE *pfOut,enum State *ps);

//C注释的处理函数
void DoCState(FILE *pfIn,FILE *pfOut,enum State *ps);

//C++ 状态的处理函数
void DoCppState(FILE *pfIn,FILE *pfOut,enum State *ps);

#endif //__COMMENT_CONVERT_H__

CommentConvert.c

#include "CommentConvert.h"

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

	case EOF:	//到了文件结束
		{
			fputc(first,pfOut);
			*ps = END_STATE;
			break;
		}
	default:
		fputc(first,pfOut);
		break;
	}
}

void DoCState(FILE *pfIn,FILE *pfOut,enum State *ps)
{
	int first = fgetc(pfIn);
	switch(first)
	{
	case '*':
		{
			int second = fgetc(pfIn);
			switch(second)
			{
			case '/':
				{
					int third = fgetc(pfIn);
					if(third == '\n')
					{
						fputc(third,pfOut);
					}
					else //不是换行的需要手动加换行
					{
						fputc('\n',pfOut);
						ungetc(third,pfIn);//把将来做判断的字符送回流中
					}
					*ps = NUL_STATE;
				}
				break;
			default:
				{
					putc(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 = fgetc(pfIn);
	switch(first)
	{
	case '\n':
		{
			fputc(first,pfOut);
			*ps = NUL_STATE;
		}
		break;
	case EOF:
		*ps = END_STATE;
		break;
	default:
		fputc(first,pfOut);
		break;
	}
}

void CommentConver(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;
		}

	}
}

Github上的地址,请多多指教:

https://github.com/zouchanglin/CommentConvert

猜你喜欢

转载自blog.csdn.net/m0_38032942/article/details/80770401
今日推荐