简单的注释转换

来源:互联网 发布:胜通软件 编辑:程序博客网 时间:2024/06/05 03:22

CommentConvert.h

#ifndef __COMMENT_CONVERT_H__
#define __COMMENT_CONVERT_H__
//#define INPUTNAME "input.c"
//#define OUTPUTNAME "output.c"

#include<stdio.h>
#include<stdlib.h>
enum STATE
{
 NUL_STATE,
 C_STATE,
 CPP_STATE,
 END_STATE
};
void DoConvertWork(FILE* pfIn,FILE* pfOut);
void DoNulState(FILE* pfIn,FILE* pfOut);
void DoCState(FILE* pfIn,FILE* pfOut);
void DoCppState(FILE* pfIn,FILE* pfOut);
#endif

CommentConvert.c

#include"CommentConver.h"
enum STATE state=NUL_STATE;

void DoNulState(FILE* pfIn,FILE* pfOut)
{
 int first=0;
 int second=0;
 first=fgetc(pfIn);
 switch(first)
 {
 case '/':
  {
   second=fgetc(pfIn);
   if(second=='*')
   {
    fputc('/',pfOut);
    fputc('/',pfOut);
    state=C_STATE;
   }
   else if(second=='/')
   {
    fputc(first,pfOut);
    fputc(second,pfOut);
    state=CPP_STATE;
   }
   else
   {
    fputc(first,pfOut);
    fputc(second,pfOut);
   }
  }
  break;
 case EOF:
  state=END_STATE;
    default:
  fputc(first,pfOut);
  break;
 }
}
void DoCState(FILE* pfIn,FILE* pfOut)
{
 int first=0;
 int second=0;
 int third=0;
 first=fgetc(pfIn);
 switch(first)
 {
  case '*':
   {
    second=fgetc(pfIn);
                switch(second)
    {
    case '*':
     third=fgetc(pfIn);
     fputc(first,pfOut);
    if(third=='/')
    {
     state=NUL_STATE;
    }
    break;
    
    case '/':
     third=fgetc(pfIn);
     if(third!='\n')
     {
     fputc('\n',pfOut);
     }
     if(third=='/')
     {
      ungetc('/',pfIn);
      state=NUL_STATE;
      break;
    }
     fputc(third,pfOut);
     state=NUL_STATE;
     break;
        default:
     fputc(first,pfOut);
     fputc(second,pfOut);
     break;
    }
   
   break;
  case '\n':
   fputc('\n',pfOut);
   fputc('/',pfOut);
   fputc('/',pfOut);
   break;
  case EOF:
   state=END_STATE;
   break;
  default:
   fputc(first,pfOut);
   break;
 }
 }
}
 void DoCppState(FILE* pfIn,FILE* pfOut)
{
 int first=0;
    first=fgetc(pfIn);
 switch(first)
 {
 case '\n':
  fputc(first,pfOut);
  state=NUL_STATE;
  break;
 case EOF:
  state=END_STATE;
  break;
 default:
  fputc(first,pfOut);
  break;
 }
}
void DoConvertWork(FILE* pfIn,FILE* pfOut)
{
 while(state!=END_STATE)
 {
  switch(state)
  {
      case NUL_STATE:
       DoNulState(pfIn,pfOut);
       break;
   case C_STATE:
    DoCState(pfIn,pfOut);
          break;
   case CPP_STATE:
    DoCppState(pfIn,pfOut);
    break;
   case END_STATE:
    break;
   default:
    break;
  }
 }
}

test.c

#include"CommentConver.h"

#include<windows.h>
int main()
{
 FILE *PfIn=NULL;
 FILE *PfOut=NULL;
 printf("转换开始\n");
 PfIn=fopen("input.c","r");
 if(NULL==PfIn)
 {
  perror("open file for read");
  exit(0);
 }
 PfOut=fopen("output.c","w+");
 if(NULL==PfOut)
 {
  fclose(PfIn);
  perror("open file for write");
  exit(0);
 }
 DoConvertWork(PfIn,PfOut);
 printf("转换结束\n");
 fclose(PfIn);
 fclose(PfOut);
    system("pause");
 return 0;
}

 

0 0