Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Annotation of /trunk/TTXSamples/TTXKcodeChange/TTXKcodeChange.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 101 - (hide annotations) (download) (as text)
Wed Nov 5 13:05:50 2008 UTC (15 years, 6 months ago) by doda
Original Path: TTXSamples/trunk/TTXKcodeChange/TTXKcodeChange.c
File MIME type: text/x-csrc
File size: 8528 byte(s)
・不用なコードを削除
・タイトル変更要求を無視しきれない可能性があったのを修正(実用上は問題になる事はまずなかったけれど)

1 doda 95 #include <stdlib.h>
2     #include <stdio.h>
3     #include <string.h>
4     #include "teraterm.h"
5     #include "tttypes.h"
6     #include "ttplugin.h"
7     #include "tt_res.h"
8    
9     #ifndef NO_INET6
10     #include <winsock2.h>
11     #include <ws2tcpip.h>
12     #else
13     #include <winsock.h>
14     #endif /* NO_INET6 */
15    
16     #define ORDER 4800
17    
18     #define IdModeFirst 0
19     #define IdModeESC 1
20     #define IdModeOSC 2
21     #define IdModeESC2 3
22     #define IdModeProc 4
23    
24     static HANDLE hInst; /* Instance handle of TTX*.DLL */
25    
26     typedef struct {
27     PTTSet ts;
28     PComVar cv;
29     Trecv origPrecv;
30     Tsend origPsend;
31     TReadFile origPReadFile;
32     TWriteFile origPWriteFile;
33     } TInstVar;
34    
35     static TInstVar FAR * pvar;
36     static TInstVar InstVar;
37    
38     static void PASCAL FAR TTXInit(PTTSet ts, PComVar cv) {
39     pvar->ts = ts;
40     pvar->cv = cv;
41     pvar->origPrecv = NULL;
42     pvar->origPsend = NULL;
43     pvar->origPReadFile = NULL;
44     pvar->origPWriteFile = NULL;
45     }
46    
47     void CommOut(char *str, int len) {
48     int outlen, c;
49     char *p;
50    
51     if (len > OutBuffSize - pvar->cv->OutBuffCount)
52     outlen = OutBuffSize - pvar->cv->OutBuffCount;
53     else
54     outlen = len;
55    
56     if (pvar->cv->OutPtr > 0) {
57     memmove(pvar->cv->OutBuff, &(pvar->cv->OutBuff[pvar->cv->OutPtr]), pvar->cv->OutBuffCount);
58     pvar->cv->OutPtr = 0;
59     }
60    
61     c = pvar->cv->OutBuffCount;
62     for (p = str; outlen>0; p++, outlen--) {
63     switch (*p) {
64     case 0x0d:
65     switch (pvar->cv->CRSend) {
66     case IdCR:
67     pvar->cv->OutBuff[c++] = 0x0d;
68     if (c < OutBuffSize && pvar->cv->TelFlag && ! pvar->cv->TelBinSend) {
69     pvar->cv->OutBuff[c++] = 0;
70     }
71     break;
72     case IdLF:
73     pvar->cv->OutBuff[c++] = 0x0a;
74     break;
75     case IdCRLF:
76     pvar->cv->OutBuff[c++] = 0x0d;
77     if (c < OutBuffSize) {
78     pvar->cv->OutBuff[c++] = 0x0a;
79     }
80     break;
81     }
82     if (c + outlen > OutBuffSize) {
83     outlen--;
84     }
85     break;
86     case 0xff:
87     if (pvar->cv->TelFlag) {
88     if (c < OutBuffSize - 1) {
89     pvar->cv->OutBuff[c++] = 0xff;
90     pvar->cv->OutBuff[c++] = 0xff;
91     }
92     }
93     else {
94     pvar->cv->OutBuff[c++] = 0xff;
95     }
96     if (c + outlen > OutBuffSize) {
97     outlen--;
98     }
99     break;
100     default:
101     pvar->cv->OutBuff[c++] = *p;
102     }
103     }
104    
105     pvar->cv->OutBuffCount = c;
106     }
107    
108     void ParseInputStr(char *rstr, int rcount) {
109     static WORD mode = IdModeFirst;
110     static char buff[InBuffSize];
111     static unsigned int blen;
112     char *p, *p2;
113     int i;
114     unsigned int func;
115    
116     #define AcceptC1Control \
117     ((pvar->cv->KanjiCodeEcho == IdEUC || pvar->cv->KanjiCodeEcho == IdJIS) && \
118     pvar->ts->TerminalID >= IdVT220J && (pvar->ts->TermFlag & TF_ACCEPT8BITCTRL) != 0)
119    
120     for (i=0; i<rcount; i++) {
121     switch (mode) {
122     case IdModeFirst:
123     if (rstr[i] == ESC) {
124     mode = IdModeESC;
125     }
126     else if (rstr[i] == OSC && AcceptC1Control) {
127     mode = IdModeOSC;
128     }
129     break;
130     case IdModeESC:
131     if (rstr[i] == ']') {
132     mode = IdModeOSC;
133     }
134     else {
135     mode = IdModeFirst;
136     }
137     break;
138     case IdModeOSC:
139     if (rstr[i] == ESC) {
140     mode = IdModeESC2;
141     }
142     else if (rstr[i] == '\a' || rstr[i] == ST && AcceptC1Control) {
143     mode = IdModeProc;
144     i--;
145     }
146     else if (blen < InBuffSize - 1) {
147     buff[blen++] = rstr[i];
148     }
149     if (blen >= InBuffSize - 1) {
150     mode = IdModeProc;
151     i--;
152     }
153     break;
154     case IdModeESC2:
155     if (rstr[i] == '\\') {
156     mode = IdModeProc;
157     i--;
158     }
159     else {
160     if (blen < InBuffSize - 1) {
161     buff[blen++] = ESC;
162     buff[blen++] = rstr[i];
163     }
164     if (blen >= InBuffSize - 1) {
165     mode = IdModeProc;
166     i--;
167     }
168     else {
169     mode = IdModeOSC;
170     }
171     }
172     break;
173     case IdModeProc:
174     i++;
175     buff[(blen<InBuffSize)?blen:InBuffSize-1] = '\0';
176     p = buff;
177    
178     for (p=buff, func=0; isdigit(*p); p++) {
179     func = func * 10 + *p - '0';
180     }
181 doda 101 if (*p != ';' || p == buff) {
182 doda 95 blen = 0;
183     mode = IdModeFirst;
184     break;
185     }
186     p++;
187     switch (func) {
188     case 5963:
189     while (p && *p) {
190     if ((p2 = strchr(p, ';')) != NULL)
191     *p2++ = '\0';
192     if (_strnicmp(p, "kt=", 3) == 0) {
193     p+= 3;
194     if (_stricmp(p, "SJIS") == 0)
195     pvar->cv->KanjiCodeSend = pvar->ts->KanjiCodeSend = IdSJIS;
196     else if (_stricmp(p, "EUC") == 0)
197     pvar->cv->KanjiCodeSend = pvar->ts->KanjiCodeSend = IdEUC;
198     else if (_stricmp(p, "JIS") == 0)
199     pvar->cv->KanjiCodeSend = pvar->ts->KanjiCodeSend = IdJIS;
200     else if (_stricmp(p, "UTF8") == 0 || _stricmp(p, "UTF-8") == 0)
201     pvar->cv->KanjiCodeSend = pvar->ts->KanjiCodeSend = IdUTF8;
202     }
203     else if (_strnicmp(p, "kr=", 3) == 0) {
204     p += 3;
205     if (_stricmp(p, "SJIS") == 0)
206     pvar->cv->KanjiCodeEcho = pvar->ts->KanjiCode = IdSJIS;
207     else if (_stricmp(p, "EUC") == 0)
208     pvar->cv->KanjiCodeEcho = pvar->ts->KanjiCode = IdEUC;
209     else if (_stricmp(p, "JIS") == 0)
210     pvar->cv->KanjiCodeEcho = pvar->ts->KanjiCode = IdJIS;
211     else if (_stricmp(p, "UTF8") == 0 || _stricmp(p, "UTF-8") == 0)
212     pvar->cv->KanjiCodeEcho = pvar->ts->KanjiCode = IdUTF8;
213     else if (_stricmp(p, "UTF8m") == 0 || _stricmp(p, "UTF-8m") == 0)
214     pvar->cv->KanjiCodeEcho = pvar->ts->KanjiCode = IdUTF8m;
215     }
216     p = p2;
217     }
218     break;
219     case 5964:
220     while (p && *p) {
221     if ((p2 = strchr(p, ';')) != NULL)
222     *p2++ = '\0';
223     if (_stricmp(p, "kt") == 0) {
224     switch (pvar->cv->KanjiCodeSend) {
225     case IdSJIS:
226     CommOut("kt=SJIS;", 8);
227     break;
228     case IdEUC:
229     CommOut("kt=EUC;", 7);
230     break;
231     case IdJIS:
232     CommOut("kt=JIS;", 7);
233     break;
234     case IdUTF8:
235     CommOut("kt=UTF8;", 8);
236     break;
237     }
238     }
239     else if (_stricmp(p, "kr") == 0) {
240     switch (pvar->cv->KanjiCodeEcho) {
241     case IdSJIS:
242     CommOut("kr=SJIS;", 8);
243     break;
244     case IdEUC:
245     CommOut("kr=EUC;", 7);
246     break;
247     case IdJIS:
248     CommOut("kr=JIS;", 7);
249     break;
250     case IdUTF8:
251     CommOut("kr=UTF8;", 8);
252     break;
253     case IdUTF8m:
254     CommOut("kr=UTF8m;", 9);
255     break;
256     }
257     }
258     p = p2;
259     }
260     CommOut("\r", 1);
261     break;
262     default:
263 doda 101 ; /* nothing to do */
264 doda 95 }
265     blen = 0;
266     mode = IdModeFirst;
267     default:
268     ; /* not reached */
269     }
270     }
271     }
272    
273     int PASCAL FAR TTXrecv(SOCKET s, char FAR *buff, int len, int flags) {
274     int rlen;
275    
276     if ((rlen = pvar->origPrecv(s, buff, len, flags)) > 0) {
277     ParseInputStr(buff, rlen);
278     }
279     return rlen;
280     }
281    
282     BOOL PASCAL FAR TTXReadFile(HANDLE fh, LPVOID buff, DWORD len, LPDWORD rbytes, LPOVERLAPPED rol) {
283     BOOL result;
284    
285     if ((result = pvar->origPReadFile(fh, buff, len, rbytes, rol)) != FALSE)
286     ParseInputStr(buff, *rbytes);
287     return result;
288     }
289    
290     static void PASCAL FAR TTXOpenTCP(TTXSockHooks FAR * hooks) {
291     pvar->origPrecv = *hooks->Precv;
292     *hooks->Precv = TTXrecv;
293     }
294    
295     static void PASCAL FAR TTXCloseTCP(TTXSockHooks FAR * hooks) {
296     if (pvar->origPrecv) {
297     *hooks->Precv = pvar->origPrecv;
298     }
299     }
300    
301     static void PASCAL FAR TTXOpenFile(TTXFileHooks FAR * hooks) {
302     pvar->origPReadFile = *hooks->PReadFile;
303     *hooks->PReadFile = TTXReadFile;
304     }
305    
306     static void PASCAL FAR TTXCloseFile(TTXFileHooks FAR * hooks) {
307     if (pvar->origPReadFile) {
308     *hooks->PReadFile = pvar->origPReadFile;
309     }
310     }
311    
312     static TTXExports Exports = {
313     sizeof(TTXExports),
314     ORDER,
315    
316     TTXInit,
317     NULL, // TTXGetUIHooks,
318     NULL, // TTXGetSetupHooks,
319     TTXOpenTCP,
320     TTXCloseTCP,
321     NULL, // TTXSetWinSize,
322     NULL, // TTXModifyMenu,
323     NULL, // TTXModifyPopupMenu,
324     NULL, // TTXProcessCommand,
325     NULL, // TTXEnd,
326     NULL, // TTXSetCommandLine,
327     TTXOpenFile,
328     TTXCloseFile
329     };
330    
331     BOOL __declspec(dllexport) PASCAL FAR TTXBind(WORD Version, TTXExports FAR * exports) {
332     int size = sizeof(Exports) - sizeof(exports->size);
333    
334     if (size > exports->size) {
335     size = exports->size;
336     }
337     memcpy((char FAR *)exports + sizeof(exports->size),
338     (char FAR *)&Exports + sizeof(exports->size),
339     size);
340     return TRUE;
341     }
342    
343     BOOL WINAPI DllMain(HANDLE hInstance,
344     ULONG ul_reason_for_call,
345     LPVOID lpReserved)
346     {
347     switch( ul_reason_for_call ) {
348     case DLL_THREAD_ATTACH:
349     /* do thread initialization */
350     break;
351     case DLL_THREAD_DETACH:
352     /* do thread cleanup */
353     break;
354     case DLL_PROCESS_ATTACH:
355     /* do process initialization */
356     hInst = hInstance;
357     pvar = &InstVar;
358     break;
359     case DLL_PROCESS_DETACH:
360     /* do process cleanup */
361     break;
362     }
363     return TRUE;
364     }

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26