注释转换(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"