Revisão | bd67de4ef8b5cc67b7321d9767f328309664302a (tree) |
---|---|
Hora | 2019-07-05 14:55:07 |
Autor | tfuruka1 <tfuruka1 at nifty dot com> |
Commiter | tfuruka1 |
mktemp 系の関数が mingw と gcc で統一出来なかったので、条件コンパイルにしました。
クリップボードをサポートしました。
@@ -1,6 +1,6 @@ | ||
1 | 1 | /* |
2 | 2 | * Copyright(C) 2005 T.Furukawa |
3 | - * $Id: base64.c,v 1.1 2005/08/03 01:33:47 tfuruka1 Exp $ | |
3 | + * $Id$ | |
4 | 4 | * |
5 | 5 | * Base64関連 |
6 | 6 | * |
@@ -1,15 +1,8 @@ | ||
1 | -/* -*- mode: c++; coding: sjis; -*- | |
1 | +/* | |
2 | 2 | * Copyright (C) 2005 Tadamegu Furukawa |
3 | - * $Id: base64.h,v 1.1 2005/08/03 01:33:47 tfuruka1 Exp $ | |
4 | - * $Name: $ | |
5 | - * | |
6 | - * Base64関連 | |
7 | - * | |
8 | - * $Log: base64.h,v $ | |
9 | - * Revision 1.1 2005/08/03 01:33:47 tfuruka1 | |
10 | - * Face対応の前準備としてBase64のデコードとImagiMagicのconvert.exeを指定 | |
11 | - * できるように対応。 | |
3 | + * $Id$ | |
12 | 4 | * |
5 | + * Base64髢「騾」 | |
13 | 6 | */ |
14 | 7 | #ifndef _BASE64_H_ |
15 | 8 | #define _BASE64_H_ |
@@ -18,37 +11,37 @@ | ||
18 | 11 | #include <string.h> |
19 | 12 | |
20 | 13 | /* |
21 | - * Base64にエンコードします。エンコード結果格納域は、元データの 4/3 倍 | |
22 | - * のエリアが必要になります(3バイトが4バイトになります)。エンコード後 | |
23 | - * のデータ長は必ずの4の倍数になります。また、最後にnullストップを付与 | |
24 | - * しますので、さらに一バイト余分に必要になります。 | |
14 | + * Base64縺ォ繧ィ繝ウ繧ウ繝シ繝峨@縺セ縺吶?ゅお繝ウ繧ウ繝シ繝臥オ先棡譬シ邏榊沺縺ッ縲∝?繝??繧ソ縺ョ 4/3 蛟 | |
15 | + * 縺ョ繧ィ繝ェ繧「縺悟ソ?ヲ√↓縺ェ繧翫∪縺?3繝舌う繝医′4繝舌う繝医↓縺ェ繧翫∪縺?縲ゅお繝ウ繧ウ繝シ繝牙セ | |
16 | + * 縺ョ繝??繧ソ髟キ縺ッ蠢?★縺ョ4縺ョ蛟肴焚縺ォ縺ェ繧翫∪縺吶?ゅ∪縺溘?∵怙蠕後↓null繧ケ繝医ャ繝励r莉倅ク | |
17 | + * 縺励∪縺吶?縺ァ縲√&繧峨↓荳?繝舌う繝井ス吝?縺ォ蠢?ヲ√↓縺ェ繧翫∪縺吶? | |
25 | 18 | */ |
26 | 19 | char * |
27 | 20 | EncodeBase64( |
28 | - unsigned char *lpData, // エンコードデータ | |
29 | - size_t cbData, // バイト数 | |
30 | - char *lpszEncode // エンコード結果(文字列) | |
21 | + unsigned char *lpData, // 繧ィ繝ウ繧ウ繝シ繝峨ョ繝シ繧ソ | |
22 | + size_t cbData, // 繝舌う繝域焚 | |
23 | + char *lpszEncode // 繧ィ繝ウ繧ウ繝シ繝臥オ先棡(譁?ュ怜?) | |
31 | 24 | ); |
32 | 25 | |
33 | 26 | /* |
34 | - * Base64でデコードします。デコードされる元の文字列長は必ず4の倍数であ | |
35 | - * る必要があります。デコード後のバイト数を返却します。デコード前のエ | |
36 | - * リアとデコード後のエリアは同じアドレスを指定する事が可能です。 | |
27 | + * Base64縺ァ繝?さ繝シ繝峨@縺セ縺吶?ゅョ繧ウ繝シ繝峨&繧後k蜈??譁?ュ怜?髟キ縺ッ蠢?★4縺ョ蛟肴焚縺ァ縺 | |
28 | + * 繧句ソ?ヲ√′縺ゅj縺セ縺吶?ゅョ繧ウ繝シ繝牙セ後?繝舌う繝域焚繧定ソ泌唆縺励∪縺吶?ゅョ繧ウ繝シ繝牙燕縺ョ繧ィ | |
29 | + * 繝ェ繧「縺ィ繝?さ繝シ繝牙セ後?繧ィ繝ェ繧「縺ッ蜷後§繧「繝峨Ξ繧ケ繧呈欠螳壹☆繧倶コ九′蜿ッ閭ス縺ァ縺吶? | |
37 | 30 | */ |
38 | 31 | long |
39 | 32 | DecodeBase64( |
40 | - char *lpszData, // 必ず4の倍数である事 | |
41 | - unsigned char *lpData // デコード結果 | |
33 | + char *lpszData, // 蠢?★4縺ョ蛟肴焚縺ァ縺ゅk莠 | |
34 | + unsigned char *lpData // 繝?さ繝シ繝臥オ先棡 | |
42 | 35 | ); |
43 | 36 | |
44 | 37 | /* |
45 | - * Base64でエンコードされたファイルをデコードし、ファイルに出力します。 | |
46 | - * 入力ファイルと出力ファイルを同じにする事はできません。 | |
38 | + * Base64縺ァ繧ィ繝ウ繧ウ繝シ繝峨&繧後◆繝輔ぃ繧、繝ォ繧偵ョ繧ウ繝シ繝峨@縲√ヵ繧。繧、繝ォ縺ォ蜃コ蜉帙@縺セ縺吶? | |
39 | + * 蜈・蜉帙ヵ繧。繧、繝ォ縺ィ蜃コ蜉帙ヵ繧。繧、繝ォ繧貞酔縺倥↓縺吶k莠九?縺ァ縺阪∪縺帙s縲 | |
47 | 40 | */ |
48 | 41 | long |
49 | 42 | DecodeBase64File( |
50 | - char *lpszBase64FileName, // 入力ファイル名 | |
51 | - char *lpszOutFileName // 出力ファイル名 | |
43 | + char *lpszBase64FileName, // 蜈・蜉帙ヵ繧。繧、繝ォ蜷 | |
44 | + char *lpszOutFileName // 蜃コ蜉帙ヵ繧。繧、繝ォ蜷 | |
52 | 45 | ); |
53 | 46 | |
54 | 47 | #endif |
@@ -0,0 +1,105 @@ | ||
1 | +/* -*- mode: c; coding: utf-8 -*- | |
2 | + * | |
3 | + * --input-charset=utf-8 --exec-charset=cp932 | |
4 | + * | |
5 | + */ | |
6 | + | |
7 | +#if defined(WINDOWS) && (WINDOWS > 0) | |
8 | + | |
9 | +#include <windows.h> | |
10 | +#include <stdio.h> | |
11 | +#include <sys/stat.h> | |
12 | +#include <io.h> | |
13 | + | |
14 | +/* | |
15 | + * ファイル名は一時的なバッファです。 | |
16 | + */ | |
17 | +char * | |
18 | +makeTempFile() | |
19 | +{ | |
20 | + static char template[] = "TAGXXXXXX"; | |
21 | + | |
22 | + strcpy(template, "TAGXXXXXX"); | |
23 | + | |
24 | + _mktemp(template); | |
25 | + | |
26 | + return template; | |
27 | +} | |
28 | + | |
29 | +BOOL | |
30 | +SetClipbordFromFile(char *lpFilename) | |
31 | +{ | |
32 | + HGLOBAL hMem; // 設定用のメモリ変数 | |
33 | + LPTSTR lpBuff; // 複写用のポインタ | |
34 | + DWORD dwSize; // 複写元の長さ | |
35 | + | |
36 | + struct stat stat_buf; | |
37 | + FILE *fp; | |
38 | + | |
39 | + if (0 != stat(lpFilename, &stat_buf)) { | |
40 | + perror(lpFilename); | |
41 | + return FALSE; | |
42 | + } | |
43 | + dwSize = (DWORD) stat_buf.st_size + 1; | |
44 | + if (!(fp = fopen(lpFilename, "rb"))) { | |
45 | + int err = errno; | |
46 | + fprintf(stderr, "%s(%d): %s: %s\n", | |
47 | + __FILE__, __LINE__, strerror(err), lpFilename); | |
48 | + return FALSE; | |
49 | + } | |
50 | + | |
51 | + // クリップボードにデータを設定 | |
52 | + if (NULL == (hMem = GlobalAlloc((GHND|GMEM_SHARE), dwSize))){ | |
53 | + return FALSE; | |
54 | + } | |
55 | + if (NULL == (lpBuff = (LPTSTR)GlobalLock(hMem))){ | |
56 | + GlobalFree(hMem); // ロックできないとき解放 | |
57 | + fclose(fp); | |
58 | + return FALSE; | |
59 | + } | |
60 | + | |
61 | + fread(lpBuff, 1, (size_t) stat_buf.st_size, fp); | |
62 | + fclose(fp); | |
63 | + | |
64 | + GlobalUnlock(hMem); | |
65 | + | |
66 | + if (!OpenClipboard(NULL) ){ | |
67 | + GlobalFree(hMem); // クリップボードが開けないとき解放 | |
68 | + return FALSE; | |
69 | + } | |
70 | + EmptyClipboard(); | |
71 | + SetClipboardData(CF_TEXT, hMem); // データを設定 | |
72 | + CloseClipboard(); | |
73 | + // Windows によって管理されるのでメモリの解放は不要 | |
74 | + | |
75 | + return TRUE; | |
76 | +} | |
77 | + | |
78 | +#else | |
79 | + | |
80 | +#include <stdio.h> | |
81 | +#include <stdlib.h> | |
82 | +#include <string.h> | |
83 | + | |
84 | +/* | |
85 | + * ファイル名は一時的なバッファです。 | |
86 | + */ | |
87 | +char * | |
88 | +makeTempFile() | |
89 | +{ | |
90 | + static char template[] = "TAGXXXXXX"; | |
91 | + | |
92 | + strcpy(template, "TAGXXXXXX"); | |
93 | + | |
94 | + mkstemp(template); | |
95 | + | |
96 | + return template; | |
97 | +} | |
98 | + | |
99 | +int | |
100 | +SetClipbordFromFile(char *lpFilename) | |
101 | +{ | |
102 | + printf("未サポートです。(%s)\n", lpFilename); | |
103 | + return 0; | |
104 | +} | |
105 | +#endif //WIN |
@@ -1,33 +1,52 @@ | ||
1 | 1 | /* |
2 | + * Copyright (C) 2017 T.Furukawa | |
2 | 3 | * $Id$ |
3 | 4 | * |
4 | - * オプションスイッチは以下に準拠したつもりです。 | |
5 | + * 久々にコード書いた。スクリプトで書いた方が簡単なんだけど。 | |
6 | + * | |
7 | + * オプションスイッチは以下に準拠したつもりです。っていうか、オプション | |
8 | + * 無いし。 | |
9 | + | |
5 | 10 | * http://www.gnu.org/prep/standards/html_node/Option-Table.html |
6 | 11 | */ |
7 | 12 | |
8 | 13 | #include <stdio.h> |
14 | +#include <stdlib.h> | |
9 | 15 | #include <string.h> |
10 | 16 | #include <errno.h> |
11 | 17 | #include <getopt.h> |
18 | +#include <unistd.h> | |
12 | 19 | |
13 | 20 | #include "base64.h" |
14 | 21 | |
15 | 22 | #define VERSION "1.00" |
16 | -#define BUILD "(internal: $Rev$ Build: " __DATE__ " " __TIME__ ")" | |
23 | +#define BUILD "(Build: " __DATE__ " " __TIME__ ")" | |
24 | + | |
25 | +#ifndef TRUE | |
26 | +# define TRUE 1 | |
27 | +# define FALSE 0 | |
28 | +#endif | |
17 | 29 | |
18 | 30 | typedef struct { |
19 | 31 | const char *lpszMimeType; |
20 | 32 | unsigned char magic[3]; |
21 | 33 | } IMG_MAGIC, *PIMG_MAGIC; |
22 | 34 | |
35 | +int | |
36 | +SetClipbordFromFile(char *lpFinename); | |
37 | + | |
38 | +char * | |
39 | +makeTempFile(); | |
40 | + | |
23 | 41 | static void |
24 | 42 | help() |
25 | 43 | { |
26 | 44 | printf( |
27 | 45 | "Usage: img2html [options] [画像ファイル...]" |
28 | 46 | "\n画像ファイルから html の img タグを作成します。\n" |
29 | - "\n --help このメッセージを表示します。" | |
30 | - "\n -v, --version version情報を表示して終了します。" | |
47 | + "\n -c, --clipboard 結果をクリップボードにコピーします。" | |
48 | + "\n -h, --help このメッセージを表示します。" | |
49 | + "\n -v, --version version情報を表示して終了します。" | |
31 | 50 | "\n\n画像データを標準入力から得る場合は画像ファイルに" |
32 | 51 | " - を指定します。" |
33 | 52 | "\n\n" BUILD |
@@ -62,7 +81,7 @@ getMimeType(const unsigned char* buf) | ||
62 | 81 | } |
63 | 82 | |
64 | 83 | static int |
65 | -generate(const char *filename) | |
84 | +generate(const char *filename, FILE *out) | |
66 | 85 | { |
67 | 86 | FILE *fp; |
68 | 87 | unsigned char buf[4]; |
@@ -70,7 +89,7 @@ generate(const char *filename) | ||
70 | 89 | int c; |
71 | 90 | int cb; |
72 | 91 | |
73 | - printf("<!-- %s -->", filename); | |
92 | + fprintf(out, "<!-- %s -->", filename); | |
74 | 93 | |
75 | 94 | if (0 == strcmp("-", filename)) { |
76 | 95 | fp = stdin; |
@@ -91,24 +110,24 @@ generate(const char *filename) | ||
91 | 110 | const char *lpszMime = getMimeType(buf); |
92 | 111 | |
93 | 112 | if (!lpszMime) { |
94 | - printf("<!-- unknown image file -->"); | |
113 | + fprintf(out, "<!-- unknown image file -->"); | |
95 | 114 | break; |
96 | 115 | } |
97 | - printf("<img src=\"data:image/%s;base64,", lpszMime); | |
116 | + fprintf(out, "<img src=\"data:image/%s;base64,", lpszMime); | |
98 | 117 | } |
99 | 118 | |
100 | 119 | EncodeBase64(buf, (size_t) ((cb % 3) + 1), szB64); |
101 | - printf("%s", szB64); | |
120 | + fprintf(out, "%s", szB64); | |
102 | 121 | } |
103 | 122 | cb++; |
104 | 123 | } |
105 | 124 | |
106 | 125 | if (0 != (cb % 3)) { |
107 | 126 | EncodeBase64(buf, (size_t) ((cb % 3)), szB64); |
108 | - printf("%s", szB64); | |
127 | + fprintf(out, "%s", szB64); | |
109 | 128 | } |
110 | 129 | |
111 | - printf("\" />\n"); | |
130 | + fprintf(out, "\" />\n"); | |
112 | 131 | |
113 | 132 | fclose(fp); |
114 | 133 | return 0; |
@@ -121,17 +140,21 @@ int | ||
121 | 140 | main(int argc, char *argv[]) |
122 | 141 | { |
123 | 142 | int i; |
143 | + int bClip = FALSE; | |
144 | + char *tmpfile; | |
145 | + FILE *fp = stdout; | |
124 | 146 | |
125 | 147 | while (1) { |
126 | 148 | int c; |
127 | 149 | static struct option long_options[] = { |
150 | + {"clipboard", no_argument, 0, 'c'}, | |
128 | 151 | {"help", no_argument, 0, 'h'}, |
129 | 152 | {"version", no_argument, 0, 'v'}, |
130 | 153 | {0, 0, 0, 0,} |
131 | 154 | }; |
132 | 155 | |
133 | 156 | int option_index = 0; |
134 | - if (-1 == (c = getopt_long(argc, argv, "hv", | |
157 | + if (-1 == (c = getopt_long(argc, argv, "chv", | |
135 | 158 | long_options, &option_index))) { |
136 | 159 | break; |
137 | 160 | } |
@@ -143,19 +166,43 @@ main(int argc, char *argv[]) | ||
143 | 166 | case 'h': |
144 | 167 | help(); |
145 | 168 | return 0; |
169 | + case 'c': | |
170 | + bClip = TRUE; | |
171 | + break; | |
146 | 172 | default: |
147 | 173 | fprintf(stderr, "不明なオプション[%c]\n", c); |
148 | 174 | return 1; |
149 | 175 | } |
150 | 176 | } |
151 | 177 | |
178 | + if (bClip) { | |
179 | + tmpfile = makeTempFile(); | |
180 | + if ('\0' == *tmpfile) { | |
181 | + perror("mktemp"); | |
182 | + return 1; | |
183 | + } | |
184 | + if (!(fp = fopen(tmpfile, "w+"))) { | |
185 | + perror(tmpfile); | |
186 | + return 1; | |
187 | + } | |
188 | + } | |
152 | 189 | for (i = optind; i < argc; i++) { |
153 | 190 | int err; |
154 | - if (0 != (err = generate(argv[i]))) { | |
191 | + if (0 != (err = generate(argv[i], fp))) { | |
192 | + fclose(fp); | |
193 | + unlink(tmpfile); | |
155 | 194 | return err; |
156 | 195 | } |
157 | 196 | } |
158 | 197 | |
198 | + if (bClip) { | |
199 | + fclose(fp); | |
200 | + | |
201 | + SetClipbordFromFile(tmpfile); | |
202 | + | |
203 | + unlink(tmpfile); | |
204 | + } | |
205 | + | |
159 | 206 | return 0; |
160 | 207 | } |
161 | 208 | /* |
@@ -1,16 +1,42 @@ | ||
1 | +# | |
2 | +# Copyright (C) 2017 T.Furukawa | |
1 | 3 | # $Id$ |
2 | 4 | # |
5 | +# img2html の makefile です。 | |
6 | +# | |
7 | +# WindowsでBuildする場合は、mingwを使用して下さい。また、Windows だと実 | |
8 | +# 行時の文字コードや実行ファイル名の名称にも制限がありますので、環境変 | |
9 | +# 数 WIN を定義してbuildして下さい。纏めると | |
10 | +# | |
11 | +# make CC=i586-mingw32msvc-gcc WIN=1 | |
12 | +# | |
13 | +# といった感じで。mingwのパスは環境によって異なると思いますので、適宜修 | |
14 | +# 正してください。 | |
15 | + | |
16 | +WINDOWS=0 | |
17 | +EXEC_CHARSET=utf-8 | |
3 | 18 | |
4 | 19 | CFLAGS = -g -Wall -W -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strings \ |
5 | - -Wconversion -Wfloat-equal -Wpointer-arith | |
20 | + -Wconversion -Wfloat-equal -Wpointer-arith \ | |
21 | + -DWINDOWS=$(WINDOWS) \ | |
22 | + --input-charset=utf-8 \ | |
23 | + --exec-charset=$(EXEC_CHARSET) | |
6 | 24 | |
7 | -OBJS = main.o base64.o | |
25 | +OBJS = main.o base64.o clipboard.o | |
8 | 26 | |
9 | 27 | EXE = img2html |
10 | 28 | |
29 | +ifdef WIN | |
30 | + EXE = img2html.exe | |
31 | + EXEC_CHARSET=cp932 | |
32 | + WINDOWS=$(WIN) | |
33 | +endif | |
34 | + | |
11 | 35 | $(EXE) : $(OBJS) |
12 | 36 | $(CC) -o $@ $(OBJS) |
13 | 37 | |
38 | +$(OBJS) : makefile | |
39 | + | |
14 | 40 | etags : |
15 | 41 | etags *.[ch] |
16 | 42 |
@@ -18,4 +44,9 @@ clean : | ||
18 | 44 | rm -f *~ *.o |
19 | 45 | |
20 | 46 | clean-all : clean |
21 | - rm -f $(EXE) | |
47 | + rm -f $(EXE) $(EXE).exe | |
48 | + | |
49 | +# Local Variables: | |
50 | +# mode: makefile | |
51 | +# coding: utf-8-unix | |
52 | +# End: |