注释转换

注释转换(c++项目)

有时在一个系统中,有的使用 C++注释方式// ,有的使用 C 语言注释方式/* */, 要求把所有的注释统一,若是C++工程,则使用//进行注释,若是 C 语言工程时,使用/* */注释,针对一个大工程而言,不可能纯手工进行修改,我们需要一个自动化的转换工具

开发环境:Linux

职责描述:c++改为c注释

头文件 utili.h

主要封装一些头文件,枚举、宏定义

#ifndef _UTILI_H_
#define _UTILI_H_

#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;

typedef enum
{
	ARGUMENT_ERROR = -1,
	OPEN_ERROR = -2,
	OK = 0
}STATUS;


#endif

ConvertComment.h文件

主要写函数声明、枚举、宏定义

#ifndef _CONVERT_COMMENT_H
#define _CONVERT_COMMENT_H
#include"utili.h"

typedef enum
{
	NO_COMMENT_STATE,
	CPP_COMMENT_STATE,
	C_COMMENT_STATE,
	STR_STATE,    //针对于字符串的状态
	END_STATE
}STATUS_ENUM;

typedef struct 
{
	FILE *inputfile;
	FILE *outputfile;
	STATUS_ENUM ulstate;
}STATUS_MACHINE;         //有限状态机

//函数声明
STATUS ConvertComment(FILE *inputfile,FILE *outputfile);
void EventPro(char ch);
void EventProAtNo(char ch);
void EventProAtCpp(char ch);
void EventProAtC(char ch);
void EventProAtStr(char ch);

FILE* OpenFile(const char *pathname, const char *mode);
void CloseFile(FILE *fp);
void WriteData(char ch, FILE *fp);
void WriteData(char ch1, char ch2, FILE *fp);
void WriteDoubleSpace(FILE *fp);



#endif

 ConvertComment.cpp文件

    主要写函数实现

#include"ConvertComment.h"
#include"assert.h"

static STATUS_MACHINE g_state;
static STATUS_ENUM g_pre_state;

FILE* OpenFile(const char *pathname, const char *mode)
{
	FILE *fp = fopen(pathname, mode);
	assert(fp != NULL);
	return fp;
}
void CloseFile(FILE *fp)
{
	fclose(fp);
}
 
void WriteData(char ch, FILE *fp)//封装 直观的表现函数功能并缩减代码
{
	fputc(ch, fp);
}
void WriteData(char ch1, char ch2, FILE *fp)
{
	fputc(ch1, fp);
	fputc(ch2, fp);
}
void WriteDoubleData(FILE *fp)
{
	fputc(' ',fp);
	fputc(' ',fp);
}
char ReadData(FILE *fp)
{
	char ch = fgetc(fp);
	return ch;
}


STATUS ConvertComment(FILE *inputfile,FILE *outputfile)
{
	if(inputfile==NULL || outputfile==NULL)
	{
		printf("Argument Is Invalid.\n");
		return ARGUMENT_ERROR;
	}
	g_state.inputfile = inputfile;
    g_state.outputfile = outputfile;
	g_state.ulstate = NO_COMMENT_STATE;
    char ch;
	while(g_state.ulstate != END_STATE)
	{
		//ch = fgetc(g_state.inputfile);
        ch = ReadData(g_state.inputfile);
		EventPro(ch);
	}
	return OK;
}

void EventPro(char ch)
{
	switch(g_state.ulstate)
	{
	case NO_COMMENT_STATE:
		EventProAtNo(ch);
		break;
	case C_COMMENT_STATE:
		EventProAtC(ch);
		break;
	case CPP_COMMENT_STATE:
		EventProAtCpp(ch);
		break;
	case STR_STATE: //字符串状态
		EventProAtStr(ch);
		break;
	default:
		break;
	}
}
 
void EventProAtNo(char ch)
{
	char nextch;
	switch(ch)
	{
	case '/':
		nextch = ReadData(g_state.inputfile);
		if(nextch == '/') //C++
		{
			WriteData('/','*', g_state.outputfile);
			g_state.ulstate = CPP_COMMENT_STATE;//切换状态
		}
		else if(nextch == '*') //C
		{
			WriteData('/','*', g_state.outputfile);
			g_state.ulstate = C_COMMENT_STATE;
		}
		else
		{
			WriteData(ch,nextch, g_state.outputfile);
			g_state.ulstate = NO_COMMENT_STATE;
		}
		break;
	case '"':
		WriteData('"',g_state.outputfile);
		g_pre_state = NO_COMMENT_STATE;
		g_state.ulstate = STR_STATE;
		break;
	case EOF:
		g_state.ulstate = END_STATE;
		break;
    	case '\'':
			
				nextch=ReadData(g_state.inputfile);
				if(nextch=='"')
				{
					WriteData(ch,nextch,g_state.outputfile);
				}
				else
				{
					fputc(ch,g_state.outputfile);
					//fseek(g_state.inputfile,-1,1);
				}
			break;
	default:
		WriteData(ch, g_state.outputfile);
		break;
	}
}
void EventProAtC(char ch)  // /* abc **/
{
	char nextch;
	switch(ch)
	{
	case '*':
		nextch = ReadData(g_state.inputfile);
		if(nextch == '/')
		{
			WriteData('*','/', g_state.outputfile);
			g_state.ulstate = NO_COMMENT_STATE;
		}
		else
			WriteData(ch,nextch, g_state.outputfile);
		break;
	case '/':
		nextch = ReadData(g_state.inputfile);
		if(nextch == '/' || '*' )
		{
			WriteDoubleData(g_state.outputfile);
		}
		break;
	case '"':
		WriteData(ch,g_state.outputfile);
		g_state.ulstate = STR_STATE;
		break;
	default:
		WriteData(ch, g_state.outputfile);
		break;
	}
}
void EventProAtCpp(char ch)
{
	char nextch;
	switch(ch)
	{
	case '/':
		nextch = ReadData(g_state.inputfile);
		if(nextch == '/' || nextch == '*')  //123 //456
		{
			WriteDoubleData(g_state.outputfile);
		}
		else
		{
			fputc(ch, g_state.outputfile);
			fseek(g_state.inputfile,-1,1);
		}
		break;
	case '*':    // 123  */
		nextch = ReadData(g_state.inputfile);
		if(nextch == '/')
		{
			WriteDoubleData( g_state.outputfile);
		}
		else
		{
			fputc(ch,g_state.outputfile);
			fseek(g_state.inputfile,-1,1);
		}
		break;
	case '"':
		WriteData('"', g_state.outputfile);
		g_pre_state = CPP_COMMENT_STATE;
		g_state.ulstate = STR_STATE;
		break;
	case '\n':
		WriteData('*','/', g_state.outputfile);
		WriteData('\n', g_state.outputfile);
		g_state.ulstate = NO_COMMENT_STATE;
		break;
	case EOF:
		WriteData('*','/', g_state.outputfile);
		g_state.ulstate = END_STATE;
		break;
	default:
		WriteData(ch, g_state.outputfile);
		break;
	}
}
 
void EventProAtStr(char ch)
{
	char nextch;
	switch(ch)
	{
	case '"':
		fputc('"', g_state.outputfile);
		g_state.ulstate = g_pre_state;
		break;
	case '\n':
		//if(g_pre_state == )
		break;
	case'\0':
		{
			nextch = ReadData(g_state.inputfile);
			if(nextch == '"')
			{
				WriteData(ch,nextch,g_state.outputfile);;
				g_state.ulstate = NO_COMMENT_STATE;
			}
			else
			{
				WriteData(ch,g_state.outputfile);
			}
		}
		break;
	case EOF:
			g_state.ulstate = END_STATE;
	default:
		WriteData(ch, g_state.outputfile);
		break;
	
	}
}

 cctool.cpp文件

主要编写主函数

​
#include"ConvertComment.h"
int main(int argc,char *argv[])
{
	if(argc != 3)
	{
		printf("ConvertComment Error:Usage : %s Source_File Dest_File\n",basename(argv[0]));
		return -1;		
	}
	FILE *fpin = OpenFile(argv[1],"r");
	FILE *fpout = OpenFile(argv[2],"w");
    ConvertComment(fpin,fpout);
	CloseFile(fpin);
	CloseFile(fpout);
	return OK;
}


​

Makefile 文件

ctool:cctool.o ConvertComment.o
	g++ -o cctool cctool.o ConvertComment.o
cctool.o:cctool.cpp
	g++ -o cctool.o -c cctool.cpp -g
ConvertComment.o:ConvertComment.cpp
	g++ -o ConvertComment.o -c ConvertComment.cpp -g
.PHONY:clean
clean: 
	rm *.o cctool 

 

input.c 测试文件

//每个区由若干个内存块组成

//每个区由若干个内存块组成,//每个块是4096个字节

//int i = 0;*/              

//*//*int i = 0;            

// /**/int i = 0;           

/* int i = 0;               
 *//*
 */

/* int i = 0;
//*/int j = 0;              

/*
//每个区由若干个内存块组成,每个块是4096个字节
//每个块的第0个整数指向下个区
//所以是单链表结构
//所以每个区只有4092个字节存放真正的数据                
*/

/* int i = 0;*//*int j = 0;               
 */

/*
 *//*
 */int i =0;                             

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////     5

"abcdefghijklmn~~~~!!!!!!!!"

/////////////xyz

/////////////6/2=3

char *str = "hello //comment convert.";

//char *str = "hello //comment convert.";

//char *str = "hello //comment convert.;

/*char *str = "hello //comment convert.";*/

/*char *str = "hello //comment convert.;*/

char *str1 = "hello /* comment */ convert.";

char *str = "abc\"syz";

//char *str = "abc\"syz";

/*abc**/

//abc"xy//z"

//abc"xy*/z"

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值