• R/O
  • HTTP
  • SSH
  • HTTPS

コミット

タグ
未設定

よく使われているワード(クリックで追加)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

コミットメタ情報

リビジョンcba1bd97177f7cbad305ec4a5e50d417944c2d0d (tree)
日時2017-05-02 19:39:44
作者Tadamegu Furukawa <tfuruka1@gw.n...>
コミッターTadamegu Furukawa

ログメッセージ

clipboard support.

変更サマリ

差分

--- /dev/null
+++ b/src/clipboard.c
@@ -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
--- a/src/main.c
+++ b/src/main.c
@@ -11,28 +11,40 @@
1111 */
1212
1313 #include <stdio.h>
14+#include <stdlib.h>
1415 #include <string.h>
1516 #include <errno.h>
1617 #include <getopt.h>
18+#include <io.h>
19+#include <unistd.h>
1720
1821 #include "base64.h"
1922
2023 #define VERSION "1.00"
2124 #define BUILD "(Build: " __DATE__ " " __TIME__ ")"
2225
26+#ifndef TRUE
27+# define TRUE 1
28+# define FALSE 0
29+#endif
30+
2331 typedef struct {
2432 const char *lpszMimeType;
2533 unsigned char magic[3];
2634 } IMG_MAGIC, *PIMG_MAGIC;
2735
36+int
37+SetClipbordFromFile(char *lpFinename);
38+
2839 static void
2940 help()
3041 {
3142 printf(
3243 "Usage: img2html [options] [画像ファイル...]"
3344 "\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情報を表示して終了します。"
3648 "\n\n画像データを標準入力から得る場合は画像ファイルに"
3749 " - を指定します。"
3850 "\n\n" BUILD
@@ -67,7 +79,7 @@ getMimeType(const unsigned char* buf)
6779 }
6880
6981 static int
70-generate(const char *filename)
82+generate(const char *filename, FILE *out)
7183 {
7284 FILE *fp;
7385 unsigned char buf[4];
@@ -75,7 +87,7 @@ generate(const char *filename)
7587 int c;
7688 int cb;
7789
78- printf("<!-- %s -->", filename);
90+ fprintf(out, "<!-- %s -->", filename);
7991
8092 if (0 == strcmp("-", filename)) {
8193 fp = stdin;
@@ -96,24 +108,24 @@ generate(const char *filename)
96108 const char *lpszMime = getMimeType(buf);
97109
98110 if (!lpszMime) {
99- printf("<!-- unknown image file -->");
111+ fprintf(out, "<!-- unknown image file -->");
100112 break;
101113 }
102- printf("<img src=\"data:image/%s;base64,", lpszMime);
114+ fprintf(out, "<img src=\"data:image/%s;base64,", lpszMime);
103115 }
104116
105117 EncodeBase64(buf, (size_t) ((cb % 3) + 1), szB64);
106- printf("%s", szB64);
118+ fprintf(out, "%s", szB64);
107119 }
108120 cb++;
109121 }
110122
111123 if (0 != (cb % 3)) {
112124 EncodeBase64(buf, (size_t) ((cb % 3)), szB64);
113- printf("%s", szB64);
125+ fprintf(out, "%s", szB64);
114126 }
115127
116- printf("\" />\n");
128+ fprintf(out, "\" />\n");
117129
118130 fclose(fp);
119131 return 0;
@@ -126,17 +138,22 @@ int
126138 main(int argc, char *argv[])
127139 {
128140 int i;
141+ int bClip = FALSE;
142+ char *tmpfile;
143+ char template[] = "TAGXXXXXX";
144+ FILE *fp = stdout;
129145
130146 while (1) {
131147 int c;
132148 static struct option long_options[] = {
149+ {"clipboard", no_argument, 0, 'c'},
133150 {"help", no_argument, 0, 'h'},
134151 {"version", no_argument, 0, 'v'},
135152 {0, 0, 0, 0,}
136153 };
137154
138155 int option_index = 0;
139- if (-1 == (c = getopt_long(argc, argv, "hv",
156+ if (-1 == (c = getopt_long(argc, argv, "chv",
140157 long_options, &option_index))) {
141158 break;
142159 }
@@ -148,19 +165,44 @@ main(int argc, char *argv[])
148165 case 'h':
149166 help();
150167 return 0;
168+ case 'c':
169+ bClip = TRUE;
170+ break;
151171 default:
152172 fprintf(stderr, "不明なオプション[%c]\n", c);
153173 return 1;
154174 }
155175 }
156176
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+ }
157189 for (i = optind; i < argc; i++) {
158190 int err;
159- if (0 != (err = generate(argv[i]))) {
191+ if (0 != (err = generate(argv[i], fp))) {
192+ fclose(fp);
193+ unlink(tmpfile);
160194 return err;
161195 }
162196 }
163197
198+ if (bClip) {
199+ fclose(fp);
200+
201+ SetClipbordFromFile(tmpfile);
202+
203+ unlink(tmpfile);
204+ }
205+
164206 return 0;
165207 }
166208 /*
--- a/src/makefile
+++ b/src/makefile
@@ -13,25 +13,30 @@
1313 # といった感じで。mingwのパスは環境によって異なると思いますので、適宜修
1414 # 正してください。
1515
16+WINDOWS=0
1617 EXEC_CHARSET=utf-8
1718
1819 CFLAGS = -g -Wall -W -Wformat=2 -Wcast-qual -Wcast-align -Wwrite-strings \
1920 -Wconversion -Wfloat-equal -Wpointer-arith \
21+ -DWINDOWS=$(WINDOWS) \
2022 --input-charset=utf-8 \
2123 --exec-charset=$(EXEC_CHARSET)
2224
23-OBJS = main.o base64.o
25+OBJS = main.o base64.o clipboard.o
2426
2527 EXE = img2html
2628
2729 ifdef WIN
2830 EXE = img2html.exe
2931 EXEC_CHARSET=cp932
32+ WINDOWS=$(WIN)
3033 endif
3134
3235 $(EXE) : $(OBJS)
3336 $(CC) -o $@ $(OBJS)
3437
38+$(OBJS) : makefile
39+
3540 etags :
3641 etags *.[ch]
3742