リビジョン | cba1bd97177f7cbad305ec4a5e50d417944c2d0d (tree) |
---|---|
日時 | 2017-05-02 19:39:44 |
作者 | Tadamegu Furukawa <tfuruka1@gw.n...> |
コミッター | Tadamegu Furukawa |
clipboard support.
@@ -0,0 +1,72 @@ | ||
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 | + | |
13 | +BOOL | |
14 | +SetClipbordFromFile(char *lpFilename) | |
15 | +{ | |
16 | + HGLOBAL hMem; // 設定用のメモリ変数 | |
17 | + LPTSTR lpBuff; // 複写用のポインタ | |
18 | + DWORD dwSize; // 複写元の長さ | |
19 | + | |
20 | + struct stat stat_buf; | |
21 | + FILE *fp; | |
22 | + | |
23 | + if (0 != stat(lpFilename, &stat_buf)) { | |
24 | + perror(lpFilename); | |
25 | + return FALSE; | |
26 | + } | |
27 | + dwSize = (DWORD) stat_buf.st_size + 1; | |
28 | + if (!(fp = fopen(lpFilename, "rb"))) { | |
29 | + int err = errno; | |
30 | + fprintf(stderr, "%s(%d): %s: %s\n", | |
31 | + __FILE__, __LINE__, strerror(err), lpFilename); | |
32 | + return FALSE; | |
33 | + } | |
34 | + | |
35 | + // クリップボードにデータを設定 | |
36 | + if (NULL == (hMem = GlobalAlloc((GHND|GMEM_SHARE), dwSize))){ | |
37 | + return FALSE; | |
38 | + } | |
39 | + if (NULL == (lpBuff = (LPTSTR)GlobalLock(hMem))){ | |
40 | + GlobalFree(hMem); // ロックできないとき解放 | |
41 | + fclose(fp); | |
42 | + return FALSE; | |
43 | + } | |
44 | + | |
45 | + fread(lpBuff, 1, (size_t) stat_buf.st_size, fp); | |
46 | + fclose(fp); | |
47 | + | |
48 | + GlobalUnlock(hMem); | |
49 | + | |
50 | + if (!OpenClipboard(NULL) ){ | |
51 | + GlobalFree(hMem); // クリップボードが開けないとき解放 | |
52 | + return FALSE; | |
53 | + } | |
54 | + EmptyClipboard(); | |
55 | + SetClipboardData(CF_TEXT, hMem); // データを設定 | |
56 | + CloseClipboard(); | |
57 | + // Windows によって管理されるのでメモリの解放は不要 | |
58 | + | |
59 | + return TRUE; | |
60 | +} | |
61 | + | |
62 | +#else | |
63 | + | |
64 | +#include <stdio.h> | |
65 | + | |
66 | +int | |
67 | +SetClipbordFromFile(char *lpFilename) | |
68 | +{ | |
69 | + printf("未サポートです。\n"); | |
70 | + return 0; | |
71 | +} | |
72 | +#endif //WIN |
@@ -11,28 +11,40 @@ | ||
11 | 11 | */ |
12 | 12 | |
13 | 13 | #include <stdio.h> |
14 | +#include <stdlib.h> | |
14 | 15 | #include <string.h> |
15 | 16 | #include <errno.h> |
16 | 17 | #include <getopt.h> |
18 | +#include <io.h> | |
19 | +#include <unistd.h> | |
17 | 20 | |
18 | 21 | #include "base64.h" |
19 | 22 | |
20 | 23 | #define VERSION "1.00" |
21 | 24 | #define BUILD "(Build: " __DATE__ " " __TIME__ ")" |
22 | 25 | |
26 | +#ifndef TRUE | |
27 | +# define TRUE 1 | |
28 | +# define FALSE 0 | |
29 | +#endif | |
30 | + | |
23 | 31 | typedef struct { |
24 | 32 | const char *lpszMimeType; |
25 | 33 | unsigned char magic[3]; |
26 | 34 | } IMG_MAGIC, *PIMG_MAGIC; |
27 | 35 | |
36 | +int | |
37 | +SetClipbordFromFile(char *lpFinename); | |
38 | + | |
28 | 39 | static void |
29 | 40 | help() |
30 | 41 | { |
31 | 42 | printf( |
32 | 43 | "Usage: img2html [options] [画像ファイル...]" |
33 | 44 | "\n画像ファイルから html の img タグを作成します。\n" |
34 | - "\n --help このメッセージを表示します。" | |
35 | - "\n -v, --version version情報を表示して終了します。" | |
45 | + "\n -c, --clipboard 結果をクリップボードにコピーします。" | |
46 | + "\n -h, --help このメッセージを表示します。" | |
47 | + "\n -v, --version version情報を表示して終了します。" | |
36 | 48 | "\n\n画像データを標準入力から得る場合は画像ファイルに" |
37 | 49 | " - を指定します。" |
38 | 50 | "\n\n" BUILD |
@@ -67,7 +79,7 @@ getMimeType(const unsigned char* buf) | ||
67 | 79 | } |
68 | 80 | |
69 | 81 | static int |
70 | -generate(const char *filename) | |
82 | +generate(const char *filename, FILE *out) | |
71 | 83 | { |
72 | 84 | FILE *fp; |
73 | 85 | unsigned char buf[4]; |
@@ -75,7 +87,7 @@ generate(const char *filename) | ||
75 | 87 | int c; |
76 | 88 | int cb; |
77 | 89 | |
78 | - printf("<!-- %s -->", filename); | |
90 | + fprintf(out, "<!-- %s -->", filename); | |
79 | 91 | |
80 | 92 | if (0 == strcmp("-", filename)) { |
81 | 93 | fp = stdin; |
@@ -96,24 +108,24 @@ generate(const char *filename) | ||
96 | 108 | const char *lpszMime = getMimeType(buf); |
97 | 109 | |
98 | 110 | if (!lpszMime) { |
99 | - printf("<!-- unknown image file -->"); | |
111 | + fprintf(out, "<!-- unknown image file -->"); | |
100 | 112 | break; |
101 | 113 | } |
102 | - printf("<img src=\"data:image/%s;base64,", lpszMime); | |
114 | + fprintf(out, "<img src=\"data:image/%s;base64,", lpszMime); | |
103 | 115 | } |
104 | 116 | |
105 | 117 | EncodeBase64(buf, (size_t) ((cb % 3) + 1), szB64); |
106 | - printf("%s", szB64); | |
118 | + fprintf(out, "%s", szB64); | |
107 | 119 | } |
108 | 120 | cb++; |
109 | 121 | } |
110 | 122 | |
111 | 123 | if (0 != (cb % 3)) { |
112 | 124 | EncodeBase64(buf, (size_t) ((cb % 3)), szB64); |
113 | - printf("%s", szB64); | |
125 | + fprintf(out, "%s", szB64); | |
114 | 126 | } |
115 | 127 | |
116 | - printf("\" />\n"); | |
128 | + fprintf(out, "\" />\n"); | |
117 | 129 | |
118 | 130 | fclose(fp); |
119 | 131 | return 0; |
@@ -126,17 +138,22 @@ int | ||
126 | 138 | main(int argc, char *argv[]) |
127 | 139 | { |
128 | 140 | int i; |
141 | + int bClip = FALSE; | |
142 | + char *tmpfile; | |
143 | + char template[] = "TAGXXXXXX"; | |
144 | + FILE *fp = stdout; | |
129 | 145 | |
130 | 146 | while (1) { |
131 | 147 | int c; |
132 | 148 | static struct option long_options[] = { |
149 | + {"clipboard", no_argument, 0, 'c'}, | |
133 | 150 | {"help", no_argument, 0, 'h'}, |
134 | 151 | {"version", no_argument, 0, 'v'}, |
135 | 152 | {0, 0, 0, 0,} |
136 | 153 | }; |
137 | 154 | |
138 | 155 | int option_index = 0; |
139 | - if (-1 == (c = getopt_long(argc, argv, "hv", | |
156 | + if (-1 == (c = getopt_long(argc, argv, "chv", | |
140 | 157 | long_options, &option_index))) { |
141 | 158 | break; |
142 | 159 | } |
@@ -148,19 +165,44 @@ main(int argc, char *argv[]) | ||
148 | 165 | case 'h': |
149 | 166 | help(); |
150 | 167 | return 0; |
168 | + case 'c': | |
169 | + bClip = TRUE; | |
170 | + break; | |
151 | 171 | default: |
152 | 172 | fprintf(stderr, "不明なオプション[%c]\n", c); |
153 | 173 | return 1; |
154 | 174 | } |
155 | 175 | } |
156 | 176 | |
177 | + if (bClip) { | |
178 | + tmpfile = template; | |
179 | + mkstemp(template); | |
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 | + } | |
157 | 189 | for (i = optind; i < argc; i++) { |
158 | 190 | int err; |
159 | - if (0 != (err = generate(argv[i]))) { | |
191 | + if (0 != (err = generate(argv[i], fp))) { | |
192 | + fclose(fp); | |
193 | + unlink(tmpfile); | |
160 | 194 | return err; |
161 | 195 | } |
162 | 196 | } |
163 | 197 | |
198 | + if (bClip) { | |
199 | + fclose(fp); | |
200 | + | |
201 | + SetClipbordFromFile(tmpfile); | |
202 | + | |
203 | + unlink(tmpfile); | |
204 | + } | |
205 | + | |
164 | 206 | return 0; |
165 | 207 | } |
166 | 208 | /* |
@@ -13,25 +13,30 @@ | ||
13 | 13 | # といった感じで。mingwのパスは環境によって異なると思いますので、適宜修 |
14 | 14 | # 正してください。 |
15 | 15 | |
16 | +WINDOWS=0 | |
16 | 17 | EXEC_CHARSET=utf-8 |
17 | 18 | |
18 | 19 | CFLAGS = -g -Wall -W -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strings \ |
19 | 20 | -Wconversion -Wfloat-equal -Wpointer-arith \ |
21 | + -DWINDOWS=$(WINDOWS) \ | |
20 | 22 | --input-charset=utf-8 \ |
21 | 23 | --exec-charset=$(EXEC_CHARSET) |
22 | 24 | |
23 | -OBJS = main.o base64.o | |
25 | +OBJS = main.o base64.o clipboard.o | |
24 | 26 | |
25 | 27 | EXE = img2html |
26 | 28 | |
27 | 29 | ifdef WIN |
28 | 30 | EXE = img2html.exe |
29 | 31 | EXEC_CHARSET=cp932 |
32 | + WINDOWS=$(WIN) | |
30 | 33 | endif |
31 | 34 | |
32 | 35 | $(EXE) : $(OBJS) |
33 | 36 | $(CC) -o $@ $(OBJS) |
34 | 37 | |
38 | +$(OBJS) : makefile | |
39 | + | |
35 | 40 | etags : |
36 | 41 | etags *.[ch] |
37 | 42 |