• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

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

Commit MetaInfo

Revisãobd67de4ef8b5cc67b7321d9767f328309664302a (tree)
Hora2019-07-05 14:55:07
Autortfuruka1 <tfuruka1 at nifty dot com>
Commitertfuruka1

Mensagem de Log

mktemp 系の関数が mingw と gcc で統一出来なかったので、条件コンパイルにしました。

クリップボードをサポートしました。

Mudança Sumário

Diff

--- a/src/base64.c
+++ b/src/base64.c
@@ -1,6 +1,6 @@
11 /*
22 * Copyright(C) 2005 T.Furukawa
3- * $Id: base64.c,v 1.1 2005/08/03 01:33:47 tfuruka1 Exp $
3+ * $Id$
44 *
55 * Base64関連
66 *
--- a/src/base64.h
+++ b/src/base64.h
@@ -1,15 +1,8 @@
1-/* -*- mode: c++; coding: sjis; -*-
1+/*
22 * 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$
124 *
5+ * Base64髢「騾」
136 */
147 #ifndef _BASE64_H_
158 #define _BASE64_H_
@@ -18,37 +11,37 @@
1811 #include <string.h>
1912
2013 /*
21- * Base64にエンコードします。エンコード結果格納域は、元データの 4/3 倍
22- * のエリアが必要になります(3バイトが4バイトになります)。エンコード後
23- * のデータ長は必ずの4の倍数になります。また、最後にnullストップを付与
24- * しますので、さらに一バイト余分に必要になります。
14+ * Base64縺ォ繧ィ繝ウ繧ウ繝シ繝峨@縺セ縺吶?ゅお繝ウ繧ウ繝シ繝臥オ先棡譬シ邏榊沺縺ッ縲∝?繝??繧ソ縺ョ 4/3 蛟
15+ * 縺ョ繧ィ繝ェ繧「縺悟ソ?ヲ√↓縺ェ繧翫∪縺?3繝舌う繝医′4繝舌う繝医↓縺ェ繧翫∪縺?縲ゅお繝ウ繧ウ繝シ繝牙セ
16+ * 縺ョ繝??繧ソ髟キ縺ッ蠢?★縺ョ4縺ョ蛟肴焚縺ォ縺ェ繧翫∪縺吶?ゅ∪縺溘?∵怙蠕後↓null繧ケ繝医ャ繝励r莉倅ク
17+ * 縺励∪縺吶?縺ァ縲√&繧峨↓荳?繝舌う繝井ス吝?縺ォ蠢?ヲ√↓縺ェ繧翫∪縺吶?
2518 */
2619 char *
2720 EncodeBase64(
28- unsigned char *lpData, // エンコードデータ
29- size_t cbData, // バイト数
30- char *lpszEncode // エンコード結果(文字列)
21+ unsigned char *lpData, // 繧ィ繝ウ繧ウ繝シ繝峨ョ繝シ繧ソ
22+ size_t cbData, // 繝舌う繝域焚
23+ char *lpszEncode // 繧ィ繝ウ繧ウ繝シ繝臥オ先棡(譁?ュ怜?)
3124 );
3225
3326 /*
34- * Base64でデコードします。デコードされる元の文字列長は必ず4の倍数であ
35- * る必要があります。デコード後のバイト数を返却します。デコード前のエ
36- * リアとデコード後のエリアは同じアドレスを指定する事が可能です。
27+ * Base64縺ァ繝?さ繝シ繝峨@縺セ縺吶?ゅョ繧ウ繝シ繝峨&繧後k蜈??譁?ュ怜?髟キ縺ッ蠢?★4縺ョ蛟肴焚縺ァ縺
28+ * 繧句ソ?ヲ√′縺ゅj縺セ縺吶?ゅョ繧ウ繝シ繝牙セ後?繝舌う繝域焚繧定ソ泌唆縺励∪縺吶?ゅョ繧ウ繝シ繝牙燕縺ョ繧ィ
29+ * 繝ェ繧「縺ィ繝?さ繝シ繝牙セ後?繧ィ繝ェ繧「縺ッ蜷後§繧「繝峨Ξ繧ケ繧呈欠螳壹☆繧倶コ九′蜿ッ閭ス縺ァ縺吶?
3730 */
3831 long
3932 DecodeBase64(
40- char *lpszData, // 必ず4の倍数である事
41- unsigned char *lpData // デコード結果
33+ char *lpszData, // 蠢?★4縺ョ蛟肴焚縺ァ縺ゅk莠
34+ unsigned char *lpData // 繝?さ繝シ繝臥オ先棡
4235 );
4336
4437 /*
45- * Base64でエンコードされたファイルをデコードし、ファイルに出力します。
46- * 入力ファイルと出力ファイルを同じにする事はできません。
38+ * Base64縺ァ繧ィ繝ウ繧ウ繝シ繝峨&繧後◆繝輔ぃ繧、繝ォ繧偵ョ繧ウ繝シ繝峨@縲√ヵ繧。繧、繝ォ縺ォ蜃コ蜉帙@縺セ縺吶?
39+ * 蜈・蜉帙ヵ繧。繧、繝ォ縺ィ蜃コ蜉帙ヵ繧。繧、繝ォ繧貞酔縺倥↓縺吶k莠九?縺ァ縺阪∪縺帙s縲
4740 */
4841 long
4942 DecodeBase64File(
50- char *lpszBase64FileName, // 入力ファイル名
51- char *lpszOutFileName // 出力ファイル名
43+ char *lpszBase64FileName, // 蜈・蜉帙ヵ繧。繧、繝ォ蜷
44+ char *lpszOutFileName // 蜃コ蜉帙ヵ繧。繧、繝ォ蜷
5245 );
5346
5447 #endif
--- /dev/null
+++ b/src/clipboard.c
@@ -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
--- a/src/main.c
+++ b/src/main.c
@@ -1,33 +1,52 @@
11 /*
2+ * Copyright (C) 2017 T.Furukawa
23 * $Id$
34 *
4- * オプションスイッチは以下に準拠したつもりです。
5+ * 久々にコード書いた。スクリプトで書いた方が簡単なんだけど。
6+ *
7+ * オプションスイッチは以下に準拠したつもりです。っていうか、オプション
8+ * 無いし。
9+
510 * http://www.gnu.org/prep/standards/html_node/Option-Table.html
611 */
712
813 #include <stdio.h>
14+#include <stdlib.h>
915 #include <string.h>
1016 #include <errno.h>
1117 #include <getopt.h>
18+#include <unistd.h>
1219
1320 #include "base64.h"
1421
1522 #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
1729
1830 typedef struct {
1931 const char *lpszMimeType;
2032 unsigned char magic[3];
2133 } IMG_MAGIC, *PIMG_MAGIC;
2234
35+int
36+SetClipbordFromFile(char *lpFinename);
37+
38+char *
39+makeTempFile();
40+
2341 static void
2442 help()
2543 {
2644 printf(
2745 "Usage: img2html [options] [画像ファイル...]"
2846 "\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情報を表示して終了します。"
3150 "\n\n画像データを標準入力から得る場合は画像ファイルに"
3251 " - を指定します。"
3352 "\n\n" BUILD
@@ -62,7 +81,7 @@ getMimeType(const unsigned char* buf)
6281 }
6382
6483 static int
65-generate(const char *filename)
84+generate(const char *filename, FILE *out)
6685 {
6786 FILE *fp;
6887 unsigned char buf[4];
@@ -70,7 +89,7 @@ generate(const char *filename)
7089 int c;
7190 int cb;
7291
73- printf("<!-- %s -->", filename);
92+ fprintf(out, "<!-- %s -->", filename);
7493
7594 if (0 == strcmp("-", filename)) {
7695 fp = stdin;
@@ -91,24 +110,24 @@ generate(const char *filename)
91110 const char *lpszMime = getMimeType(buf);
92111
93112 if (!lpszMime) {
94- printf("<!-- unknown image file -->");
113+ fprintf(out, "<!-- unknown image file -->");
95114 break;
96115 }
97- printf("<img src=\"data:image/%s;base64,", lpszMime);
116+ fprintf(out, "<img src=\"data:image/%s;base64,", lpszMime);
98117 }
99118
100119 EncodeBase64(buf, (size_t) ((cb % 3) + 1), szB64);
101- printf("%s", szB64);
120+ fprintf(out, "%s", szB64);
102121 }
103122 cb++;
104123 }
105124
106125 if (0 != (cb % 3)) {
107126 EncodeBase64(buf, (size_t) ((cb % 3)), szB64);
108- printf("%s", szB64);
127+ fprintf(out, "%s", szB64);
109128 }
110129
111- printf("\" />\n");
130+ fprintf(out, "\" />\n");
112131
113132 fclose(fp);
114133 return 0;
@@ -121,17 +140,21 @@ int
121140 main(int argc, char *argv[])
122141 {
123142 int i;
143+ int bClip = FALSE;
144+ char *tmpfile;
145+ FILE *fp = stdout;
124146
125147 while (1) {
126148 int c;
127149 static struct option long_options[] = {
150+ {"clipboard", no_argument, 0, 'c'},
128151 {"help", no_argument, 0, 'h'},
129152 {"version", no_argument, 0, 'v'},
130153 {0, 0, 0, 0,}
131154 };
132155
133156 int option_index = 0;
134- if (-1 == (c = getopt_long(argc, argv, "hv",
157+ if (-1 == (c = getopt_long(argc, argv, "chv",
135158 long_options, &option_index))) {
136159 break;
137160 }
@@ -143,19 +166,43 @@ main(int argc, char *argv[])
143166 case 'h':
144167 help();
145168 return 0;
169+ case 'c':
170+ bClip = TRUE;
171+ break;
146172 default:
147173 fprintf(stderr, "不明なオプション[%c]\n", c);
148174 return 1;
149175 }
150176 }
151177
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+ }
152189 for (i = optind; i < argc; i++) {
153190 int err;
154- if (0 != (err = generate(argv[i]))) {
191+ if (0 != (err = generate(argv[i], fp))) {
192+ fclose(fp);
193+ unlink(tmpfile);
155194 return err;
156195 }
157196 }
158197
198+ if (bClip) {
199+ fclose(fp);
200+
201+ SetClipbordFromFile(tmpfile);
202+
203+ unlink(tmpfile);
204+ }
205+
159206 return 0;
160207 }
161208 /*
--- a/src/makefile
+++ b/src/makefile
@@ -1,16 +1,42 @@
1+#
2+# Copyright (C) 2017 T.Furukawa
13 # $Id$
24 #
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
318
419 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)
624
7-OBJS = main.o base64.o
25+OBJS = main.o base64.o clipboard.o
826
927 EXE = img2html
1028
29+ifdef WIN
30+ EXE = img2html.exe
31+ EXEC_CHARSET=cp932
32+ WINDOWS=$(WIN)
33+endif
34+
1135 $(EXE) : $(OBJS)
1236 $(CC) -o $@ $(OBJS)
1337
38+$(OBJS) : makefile
39+
1440 etags :
1541 etags *.[ch]
1642
@@ -18,4 +44,9 @@ clean :
1844 rm -f *~ *.o
1945
2046 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: