2025
01
18
2012
02
29
emacsの表示色数の確認
自分の環境だとGUIで547色(行)、CUIで8色と出力されました
やり方
# パターン1 (547色) emacs # emacsを普通に開く (開いた後) M-x list-colors-display # パターン2 (8色) emacs -nw # emacsをno window オプションで開く (開いた後) M-x list-colors-display
実行結果(emacs -nw時)
検索用タグ emacs 表示色数
PR
2012/02/29 (Wed.) Comment(0) emacs
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言語
2012/02/26 (Sun.) Comment(0) C言語
2012
02
26
カーネルモジュールのコンパイル環境を整える(Scientific Linux 6.2)
カーネルモジュールをコンパイルするためには、Linuxのソースコードが必要&適切なパスの場所に ソースコードを展開しなければいけない。 書きだしてみると結構面倒。。
注意
HDD15GB程度だとカーネルコンパイル時に容量が足りなくなりました
手順
#1 再構築に必要なパッケージをインストール (rpmdev-setuptreeのため) yum install rpmdevtools yum-utils #2 パッケージ再構築の準備 (rpmbuildディレクトリを正しく作るため) # ホームディレクトリの中にrpmbuildディレクトリが作成される。 # BUILD RPMS SOURCES SPECS SRPMS rpmdev-setuptree ls ~/rpmbuild/ # 確認 #3 カーネルソースのダウンロード yumdownloader --source kernel ls ./ # 確認 kernel-****.src.rpmファイルができているはず #4 カーネルソースの再構築に必要となるパッケージをインストール yum-builddep kernel-****.src.rpm #5 カーネルソースのインストール # これにより、rpmdev-setuptreeコマンドによって作成された # ~/rpmbuildディレクトリ下にカーネルソースが展開される rpm -Uhv kernel-****.src.rpm #6 カーネルソースのツリーを準備 # ツリーは~/rpmbuild/BUILD/kernel-<バージョン>/ # linux-<バージョン>.<アーキテクチャ>ディレクトリに作成される cd ~/rpmbuild/SPECS rpmbuild -bp --target=`uname -m` kernel.spec #7 いろいろ足りないと言われる なので必要なものを入れる # 筆者実行時エラー #************************************************************************ #[root@sl62-64bit SPECS]# rpmbuild -bp --target=`uname -m` kernel.spec #Building target platforms: x86_64 #Building for target x86_64 #error: Failed build dependencies: # elfutils-libelf-devel is needed by kernel-2.6.32-220.4.2.el6.x86_64 # zlib-devel is needed by kernel-2.6.32-220.4.2.el6.x86_64 # binutils-devel is needed by kernel-2.6.32-220.4.2.el6.x86_64 # newt-devel is needed by kernel-2.6.32-220.4.2.el6.x86_64 # python-devel is needed by kernel-2.6.32-220.4.2.el6.x86_64 # perl(ExtUtils::Embed) is needed by kernel-2.6.32-220.4.2.el6.x86_64 #************************************************************************ yum install elfutils-libelf-devel yum install zlib-devel yum install binutils-devel yum install newt-devel yum install python-devel yum install perl-ExtUtils-Embed # 名前そのままじゃないから、ちょっと引っかかった #8 改めてカーネルソースのツリーを準備 # ### Now generating a PGP key pair to be used for signing modules. # のところで時間かかるのですが、バッググラウンドで # rngd -r /dev/urandomするとすぐ終わります cd ~/rpmbuild/SPECS rpmbuild -bp --target=`uname -m` kernel.spec #9 現在使っているカーネルの.configファイルを使うために # ファイルをコピーしてくる cp /boot/config***** ~/rpmbuild/BUILD/kernel-****/linux-**++/.config #10 現行の設定をそのまま使う (この作業いらない?) cd ~/rpmbuild/BUILD/kernel-****/linux-**++/ make oldconfig #11 先の.configを元にカーネルソースのコンパイルをする # -j オプションを使うとMakefileに従った処理のうち依存関係が無く # 直列に処理しなくても済む部分を,複数のプロセスを生成し並行処理する make -j8 #12 カーネルソースへのリンクを適切に設定する cd /lib/module/(kernel)/ ln -s ~/rpmbuild/BUILD/kernel-****/linux-**++/ ./build ls -l # 確認 #13 hello.cとMakefileがあるフォルダへ移動 cd helloフォルダ
上記の手順で、makeもinsmodでカーネルにモジュールを組み込むこともできるようになると思います。
その他注意
上記の手順で、最も面倒な設定は済んでいますが、それでも失敗する場合は、 以下のところを気にしてください。 ・Makefileのタブがスペースになっている ・リンクの設定が正しいか ・権限がないか など
検索用タグ Linuxドライバ デバイスドライバ Linuxカーネル
2012/02/26 (Sun.) Comment(0) Linuxデバイスドライバ
2012
02
26
このブログについて
開発中調べた事柄や調べて役に立ったことなどをまとめているブログです。
忍者ブログ、カテゴリーだけで、タグを複数付けられないみたいなので、
記事内にタグを明示的につけていますので、ブログ内検索窓で検索すれば
芋づる式にページが出てきます!
2012/02/26 (Sun.) Comment(0) このブログについて
2012
02
25
使用中のシェルを確認する
echo $SHELL (Scientific Linux6.2 & Ubuntu10.04で確認)
検索用タグ Linux シェル
2012/02/25 (Sat.) Comment(0) Linux