Open-Source-Software-Entwicklung und Downloads

Browse Subversion Repository

Diff of /trunk/TTXSamples/TTXKcodeChange/TTXKcodeChange.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

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

Legend:
Removed from v.3221  
changed lines
  Added in v.3227

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