c言語項目―注釈変換(c――c++)


タイトルの要件:
すべてのc言語スタイルの注釈をc++スタイルの注釈に変換するには、下図のようにinput.cファイルは注釈変換プログラムによりoutputに変換する.cファイルに示す.
これはテスト結果です.
まず、このテーマを分析してみましょう.このプロジェクトをするとき、有限状態機という概念を導入する必要があります.では、まず有限状態機とは何かを理解しましょう.
有限状態機FSMはソフトウェア上でよく使われる処理方法であり,複雑な制御ロジックを有限安定状態に分け,各状態で処理する.
状態図を描きましょう.
だから私たちはこのプロジェクトをこのいくつかの状態に分けました.
NUL_STATE, C_STATE,  CPP_STATE,  EMD_STATE

今、このプロジェクトを実現しましょう.
"CommentConvert.h"
#ifndef  __COMMENT_CONVERT_H__
#define  __COMMENT_CONVERT_H__
#include<stdio.h>
#include<stdlib.h>
#define INPUTFILENAME "input.c"
#define OUTPUTFILENAME "output.c"
enum STATE
{
NUL_STATE,
C_STATE,
CPP_STATE,
EMD_STATE
};
void CommentConvert(FILE *pRead,FILE *pWrite);
void do_nul_state(FILE *pRead,FILE *pWrite);
void do_c_state(FILE *pRead,FILE *pWrite);
void do_cpp_state(FILE *pRead,FILE *pWrite);
#endif //__COMMENT_CONVERT_H__

"CommentConvert.c"
#include"CommentConvert.h"
enum STATE state;
void CommentConvert(FILE *pRead,FILE *pWrite)
{
while(state!=EMD_STATE)
{
switch(state)
{
case NUL_STATE:
do_nul_state(pRead,pWrite);
break;
case C_STATE:
do_c_state(pRead,pWrite);
break;
case CPP_STATE:
do_cpp_state(pRead,pWrite);
break;
case EMD_STATE:
break;
}
}
}
void do_nul_state(FILE *pRead,FILE *pWrite)
{
int first=0;
int second=0;
first = fgetc(pRead);
switch(first)
{
case '/':
{
second=fgetc(pRead);
if(second=='*')
{
fputc('/',pWrite);
fputc('/',pWrite);
state=C_STATE;
}
else if(second=='/')
{
fputc(first,pWrite);
fputc(second,pWrite);
state=CPP_STATE;
}
else
{
fputc(first,pWrite);
fputc(second,pWrite);
}
}
break;
case EOF:
state=EMD_STATE;
break;
default:
fputc(first,pWrite);
break;
}
}
void do_c_state(FILE *pRead,FILE *pWrite)
{
int first=0;
int second=0;
int third=0;
first = fgetc(pRead);
switch(first)
{
case '*':
        {
second=fgetc(pRead);
switch(second)
{
case '/':
third=fgetc(pRead);
if(third!='
') { fputc('
',pWrite); //fputc('/',pWrite); //fputc('/',pWrite); state=CPP_STATE; }     if(third=='/') { ungetc(third,pRead); state=NUL_STATE; break; } else { fputc(third,pWrite); state=NUL_STATE; break; } case'*': third=fgetc(pRead); fputc(first,pWrite); if(third=='/') { state=NUL_STATE; } break; default: fputc(first,pWrite); fputc(second,pWrite); break; } break; case'
': fputc(first,pWrite); fputc('/',pWrite); fputc('/',pWrite); break; case EOF: state=EMD_STATE; break; default: fputc(first,pWrite); break; } } } void do_cpp_state(FILE *pRead,FILE *pWrite) { int first=0; first = fgetc(pRead); switch(first) { case '
': { fputc(first,pWrite); //fputc('/',pWrite); //fputc('/',pWrite); state=NUL_STATE; } break; case EOF: state=EMD_STATE; break;     default: fputc(first,pWrite); break; } }

“test.c”
#include"CommentConvert.h"
int main()
{
FILE *pRead = NULL;
FILE *pWrite = NULL;
printf("      :");
pRead=fopen(INPUTFILENAME,"r");
if(NULL ==pRead)
{
perror("open file for read
"); exit(EXIT_FAILURE); } pWrite=fopen(OUTPUTFILENAME,"w"); if(NULL ==pWrite) { fclose(pRead); perror("open file for write
"); exit(EXIT_FAILURE); } CommentConvert(pRead,pWrite); printf(" :"); return 0; }

これでアノテーション変換項目が完了します.