忍者ブログ

2024
05
18

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

2024/05/18 (Sat.)

2012
02
26

C言語のコメント/*~*/を削除するプログラム

実行オプションで特定文字列を変えるorソースコード内の#defineをいじれば、「/*」 「*/」以外の
範囲を消すこともできます。
注意:特定文字列は2文字まで。

ソースコード

/* del_comment.c */
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

#define NAME_MAX 256

/* Default setting */
#define INPUT_DEFAULT  "./input.c"
#define OUTPUT_DEFAULT "./output.c"
#define START_DEFAULT  "/*"
#define END_DEFAULT    "*/"

typedef struct del_comment {
	char in_name[NAME_MAX];
	char out_name[NAME_MAX];
	char start[3];
	char end[3];
} del_comment_t;

void analyze_option(del_comment_t *p, int argc, char *argv[]);
void print_info(del_comment_t *p);
void print_usage(void);

int main(int argc, char *argv[])
{
	int flag = 0;
	char str[3], c, str0_keep, str1_keep;
	FILE *in, *out;
	fpos_t fpos_in_keep;
	del_comment_t p;

	strcpy(p.in_name, INPUT_DEFAULT);
	strcpy(p.out_name, OUTPUT_DEFAULT);
	strcpy(p.start, START_DEFAULT);
	strcpy(p.end, END_DEFAULT);

	analyze_option(&p, argc, argv);
	print_info(&p);

	/* 入出力ファイルオープン */
	if ((in = fopen(p.in_name, "r")) == NULL) {
		printf("open error! [in]\n");
		exit(EXIT_FAILURE);
	}
	if ((out = fopen(p.out_name, "w")) == NULL) {
		printf("open error! [out]\n");
		fclose(in);
		exit(EXIT_FAILURE);
	}

	/* 最初の一回目だけの特殊な処理 */
	if ((str[0] = fgetc(in)) == EOF) {
		printf("EOF. No changed.\n");
		goto eof;
	}
	if ((str[1] = fgetc(in)) == EOF) {
		printf("EOF. No changed.\n");
		goto eof;
	}
	if ((str[0] == p.start[0]) && (str[1] == p.start[1])) {
		flag = 1;
	}
	if (flag == 1) {
		fgetpos(in, &fpos_in_keep);
		str0_keep = str[0];
		str1_keep = str[1];
		do {
			str[0] = str[1];
			str[1] = fgetc(in);
			if (str[1] == EOF) {
				printf("EOF. Changed, but incomplete.\n");
				fsetpos(in, &fpos_in_keep);
				fputc(str0_keep, out);
				fputc(str1_keep, out);
				while ((c = fgetc(in)) != EOF) {
					fputc(c, out);
				}
				goto eof;
			}
			if ((str[0] == p.end[0]) && (str[1] == p.end[1])) {
				flag = 0;
			}
		} while (flag == 1);
		str[1] = fgetc(in);
	} else {
		fputc(str[0], out);
	}

	/* 2回目以降の処理 */
	do {
		str[0] = str[1];
		str[1] = fgetc(in);
		if (str[1] == EOF) {
			fputc(str[0], out);
			printf("EOF, Changed all\n");
			goto eof;
		}
		if ((str[0] == p.start[0]) && (str[1] == p.start[1])) {
			flag = 1;
		}
		if (flag == 1) {
			fgetpos(in, &fpos_in_keep);
			str0_keep = str[0];
			str1_keep = str[1];
			do {
				str[0] = str[1];
				str[1] = fgetc(in);
				if (str[1] == EOF) {
					printf("EOF. Changed, but incomplete.\n");
					fsetpos(in, &fpos_in_keep);
					fputc(str0_keep, out);
					fputc(str1_keep, out);
					while ((c = fgetc(in)) != EOF) {
						fputc(c, out);
					}
					goto eof;
				}
				if ((str[0] == p.end[0]) && (str[1] == p.end[1])) {
					flag = 0;
				}
			} while (flag == 1);
			str[1] = fgetc(in);
		} else {
			fputc(str[0], out);
		}
	} while (1);

eof:
	fclose(in);
	fclose(out);
	return 0;
}

void analyze_option(del_comment_t *p, int argc, char *argv[])
{
	int result;

	while ((result=getopt(argc,argv,"i:o:s:e:h")) != -1) {
		switch (result) {
		case 'i':
			strcpy(p->in_name, optarg);
			break;
		case 'o':
			strcpy(p->out_name, optarg);
			break;
		case 's':
			if (strlen(optarg) == 2) {
				strcpy(p->start, optarg);
			} else {
				printf("-s option keyword must length 2.\n");
				printf("Use default [%s]\n", START_DEFAULT);
			}
			break;
		case 'e':
			if (strlen(optarg) == 2) {
				strcpy(p->end, optarg);
			} else {
				printf("-e option keyword must length 2.\n");
				printf("Use default [%s]\n", END_DEFAULT);
			}
			break;
		case 'h':
			print_usage();
			break;
		case '?':
			fprintf(stdout,"unknown\n");
			break;
		}
	}
}

void print_info(del_comment_t *p)
{
	printf("------Information---------------\n");
	printf("input_file  = [%s]\n", p->in_name);
	printf("output_file = [%s]\n", p->out_name);
	printf("start = [%s]\n", p->start);
	printf("end   = [%s]\n", p->end);
	printf("--------------------------------\n");
}

void print_usage(void)
{
	printf("-------------------Usage--------------------------------------------\n");
	printf("./program.exe -i [input_file] -o [output_file] -s [start] -e [end]\n");
	printf("--------------------------------------------------------------------\n");
	printf("option is not necessary.\n");
	printf("default [input_file] is [%s]\n", INPUT_DEFAULT);
	printf("default [output_file] is [%s]\n", OUTPUT_DEFAULT);
	printf("default [start] is [%s]\n", START_DEFAULT);
	printf("default [end] is [%s]\n", END_DEFAULT);
	printf("--------------------------------------------------------------------\n");
	exit(EXIT_SUCCESS);
}

コンパイル例

gcc -o del_comment del_comment.c

使い方

# オプションは必ず必要なわけではない
# デフォルト設定
# 入力ファイル名:
# 出力ファイル名:
# 削除開始キーワード:/*
# 削除終了キーワード:*/
./program.exe -i [input_file] -o [output_file] -s [start] -e [end]

検索用タグ C言語

拍手[1回]

PR

2012/02/26 (Sun.) Comment(0) C言語

Comments

名前
メールアドレス
URL
コメント
PASS  Vodafone絵文字 i-mode絵文字 Ezweb絵文字

ブログ内検索

最新記事

カテゴリー

アーカイブ

フリーエリア





プロフィール

HN:
nex2t
年齢:
8
性別:
男性
誕生日:
2016/01/01
職業:
開発エンジニア(ソフト)
趣味:
ラグビー 犬 将棋 ラーメン サーフィン(ネット)
自己紹介:
入社2年目の組込みエンジニア
好きな言語:C言語
エディタ:emacs
シェル:zsh
ディストリ:Scientific Linux, Ubuntu
略歴
お仕事のほう
2011/3 調布にある大学卒業
2011/4~6月 研修
2011/7~12月? 10GのLANドライバをがんばる
2012/1~2012/4月? VDCPデーモンを作る
2012/5~2012/10月? genlockデーモンを作る
~(現在) 装置テストなど

趣味などのほう
~2012年4月 自由気ままに。仕事の勉強など。歯医者に時間を取られる。
2012年4月~2012年6月 機動力が増す(バイクの免許&バイク(125ccの原付をゲットする)
2012年6月~2012年8月 将棋のネットゲームを作る(引きこもる)((こころざし半ば)
2012年7月~2012年8月 通勤途中にバイクでこけて('自損)、1か月チャリ通の刑になる
2012年9月~現在(2013年3月) DDRばかりする(主にDP)

(↑2013/3/10更新)

DDRのほう
------------------------------------------
・199?年 小学校高学年。
よく遊ぶ友達内でDDRが流行る。
3rdが家にあり、家庭用マットもあったが、ゲーセンでプレイすることは皆無。
(コロコロコミックとガブリチュウを買うと小遣いがなくなるぐらいしかお金がない)
Burtyfly、DAM DARIRAMとかの誰でも聞いたことあるような曲、DEAD END、Paranoia Rebirth、AFRONOVAとかちょっと難しい曲、
BUMBLE BEE、End of the Centuryとかいい感じで印象に残っている。
GRADIUSIC CYBERが当時意味不明で難しいなと思っていた。
ハンドクラップの他にもメトロノームとかついてた気がする。
スコアとかを気にしたことはなかった。
------------------------------------------
・199?年 中学。
4thを中古で購入。半年に1回ぐらいプレイしてた?(手でやるだけ)。
ワンダ・古畑・HERO・ピンクダイナソー・オリオン・DROP OUT(当時とても速かった)とかが印象に残っている。
---------------------------------------------
・200?年 高校。
MAXを中古で買って、たまにやっていた。ゲーセンに1クレだけ踏みに行ったりしてた。
SO DEEP、天ヒー、象さん、ウィッチドクター、トワイライトゾーン、MAX300が印象に残っている。
この頃、MAX300 SPのリズム(ダンダン ダダンダ(ry)が体に染みついた模様笑。
なおMAXは友人に貸したままの模様。
------------------------------------------
・200?年 大学。
数か月に1回、ストレス発散がてら踏んでいた。確かXとかX2だった気がする。
踏むのは決まって8分でけっこう踏んだ気になる、AFRONOVA、天ヒー、象さん。
Aランクとか出せたことがなかった。
---------------------------------------------
・2012年9月 社会人 X3
コミケ準備のため引きこもっていた反動で、外出ばかりする。
ゲーセンで久々にプレイするととても楽しい(画面もきれいでパネルの反応も良い)。
今まで適当にやってきたが、少しシステムとかスコアを気にし始める。
自分のお金ということもあり、ゲーセンで千円単位でお金を使うことが自然になり、
真面目にDDRをするようになる。
------------------------------------------
・2012年12月 X3
SPしかやったことがなかったが、当時よく通ったゲーセンがDPする人が多く、
楽しそうだったので、DPをやり始める、足の裏の皮がむける。
---------------------------------------------
・2013年4月? X3終了。 DDR2013へ
X3はSP足鳳凰、DP足龍で終了。DPは足12以下の好きな曲のみフルコンができるような具合だった。
------------------------------------------
・2013年7月 ついったーで記録をつけるようになる。
8月4日 足10以下の激譜面AA埋め達成。鬼鯖初クリア
8月10日 足11以下の激譜面AA埋め達成。
8月24日 DDR2013 1000クレ行く。
9月8日 足12以下の激譜面AA埋め達成。
10月   (私用でドタバタする。)
11月2日 Skill pointが1000行く。
11月3日 岐阜のDDR大会 DPノンバー部門参加(予選通過ならず)
11月16日 DP足鳳凰。(エレクリDDPフルコン)
11月22日 足13以下の激譜面AA埋め達成。
11月24日 DP足紙さま?。(苺プリンDDPフルコン、鬼鯖810k同時だった)
Double AA Line 14になる。
現在~  足14のAA埋め、足15のA取得、足13の鳥取りを頑張り中。
------------------------------------------
(↑2013/11/28追加)

最新CM

[06/01 履歴書の書き方]

カウンター