0
点赞
收藏
分享

微信扫一扫

注释转换

witmy 2022-09-02 阅读 151



#pragma once
#include<assert.h>
#include <errno.h>

#pragma warning (disable: 4996)

typedef enum ConvertState
{
SUCCESS,
FILE_ERROR,
NO_MATCH,
}ConvertState;

typedef enum State
{
C_BEGIN,
C_END,
CPP_BEGIN,
CPP_END,
}State;

ConvertState Convert(FILE* fIn, FILE* fOut)
{
ConvertState ret = SUCCESS;

char first, second;
State tag = C_END;
assert(fIn);
assert(fOut);
do{
first = fgetc(fIn);
switch(first)
{
case '/':
second = fgetc(fIn);
if (second == '*')
{
// 3.匹配问题
if (tag == C_END)
{
fputc('/', fOut);
fputc('/', fOut);

tag = C_BEGIN;
}
else
{
fputc('/', fOut);
fputc('*', fOut);
}
}
else if(second == '/')
{
char next;
fputc('/', fOut);
fputc('/', fOut);

do{
next = fgetc(fIn);
fputc(next, fOut);

if (next == EOF)
return ret;

}while (next != '\n');
}
else
{
fputc(first, fOut);
fputc(second, fOut);
}
break;
case '\n':
// 4.多行注释问题
fputc('\n', fOut);

if (tag == C_BEGIN)
{
fputc('/', fOut);
fputc('/', fOut);
}

break;
case '*':
second = fgetc(fIn);
if (second == '/')
{
// 2.换行问题
char next = fgetc(fIn);

// 5.连续注释问题
if (next == '/')
{
fputc('\n', fOut);
fseek(fIn, -1, SEEK_CUR);
}
else if (next != '\n' && next != EOF)
{
fputc('\n', fOut);
fputc(next, fOut);
}
else
{
fputc('\n', fOut);
}

tag = C_END;
}
else if(second == '*')
{
fputc(first, fOut);
fseek(fIn, -1, SEEK_CUR);
}
else
{
fputc(first, fOut);
fputc(second, fOut);
}

break;
default:
if (first != EOF)
fputc(first, fOut);

break;
}
}while(first != EOF);

if (tag != C_END)
{
ret = NO_MATCH;
}

return ret;
}

ConvertState AnnotationConvert(const char* inputFile,
const char* outputFile)
{
ConvertState ret;
FILE* fOut, *fIn;
fIn = fopen(inputFile, "r");
if (fIn == NULL)
{
printf("打开文件%s失败, errno: %d\n", inputFile, errno);
return FILE_ERROR;
}

fOut = fopen(outputFile, "w");
if (fOut == NULL)
{
fclose(fIn);
printf("打开文件%s失败! errno: %d", outputFile, errno);
return FILE_ERROR;
}

ret = Convert(fIn, fOut);

fclose(fIn);
fclose(fOut);

return ret;
}



举报

相关推荐

0 条评论