Develop and Download Open Source Software

Browse Subversion Repository

Annotation of /trunk/teraterm/ttpcmn/ttcmn.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 10130 - (hide annotations) (download) (as text)
Tue Aug 9 01:08:44 2022 UTC (20 months ago) by zmatsuo
File MIME type: text/x-csrc
File size: 29315 byte(s)
ttpcmn.dll 内の関数の一部分を ttermpro.exe へ移動

- 文字列などヒープ領域を使用する箇所
  - ttcmn_static.c,h へまとめたて、ttermpro.exeへ移動
- この移動で、ttpcmn.dllとtermpro.exeでモジュールをまたいだヒープの操作はなくなった

ticket #45330
1 doda 6806 /*
2     * Copyright (C) 1994-1998 T. Teranishi
3 nmaya 9048 * (C) 2004- TeraTerm Project
4 doda 6806 * All rights reserved.
5     *
6 doda 6841 * Redistribution and use in source and binary forms, with or without
7     * modification, are permitted provided that the following conditions
8     * are met:
9 doda 6806 *
10 doda 6841 * 1. Redistributions of source code must retain the above copyright
11     * notice, this list of conditions and the following disclaimer.
12     * 2. Redistributions in binary form must reproduce the above copyright
13     * notice, this list of conditions and the following disclaimer in the
14     * documentation and/or other materials provided with the distribution.
15     * 3. The name of the author may not be used to endorse or promote products
16     * derived from this software without specific prior written permission.
17 doda 6806 *
18 doda 6841 * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
19     * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20     * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21     * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
22     * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23     * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24     * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25     * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26     * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27     * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 doda 6806 */
29 maya 3227
30     /* TTCMN.DLL, main */
31     #include <string.h>
32     #include <stdio.h>
33     #include <windows.h>
34     #include <setupapi.h>
35 maya 5308 #include <htmlhelp.h>
36 doda 8445 #include <assert.h>
37 zmatsuo 10130 #define _CRTDBG_MAP_ALLOC
38     #include <stdlib.h>
39 doda 8445 #include <crtdbg.h>
40 maya 3227
41 zmatsuo 7536 #define DllExport __declspec(dllexport)
42     #include "language.h"
43     #undef DllExport
44    
45     #include "teraterm.h"
46     #include "tttypes.h"
47     #include "ttlib.h"
48 zmatsuo 7412 #include "codeconv.h"
49 doda 8445 #include "compat_win.h"
50 zmatsuo 9568 #include "win32helper.h"
51 zmatsuo 9598 #include "../teraterm/unicode.h"
52 maya 3227
53 zmatsuo 10130 #include "ttcmn_shared_memory.h"
54 zmatsuo 7536 #include "ttcommon.h"
55 zmatsuo 10130 #include "ttcmn_i.h"
56 zmatsuo 7536
57 maya 3227 static PMap pm;
58    
59 zmatsuo 9292 #define VTCLASSNAME "VTWin32"
60     #define TEKCLASSNAME "TEKWin32"
61 maya 3227
62 yutakapon 5299 enum window_style {
63     WIN_CASCADE,
64     WIN_STACKED,
65     WIN_SIDEBYSIDE,
66     };
67    
68 zmatsuo 7305 void WINAPI SetCOMFlag(int Com)
69 maya 3227 {
70     pm->ComFlag[(Com-1)/CHAR_BIT] |= 1 << ((Com-1)%CHAR_BIT);
71     }
72    
73 zmatsuo 7305 void WINAPI ClearCOMFlag(int Com)
74 maya 3227 {
75     pm->ComFlag[(Com-1)/CHAR_BIT] &= ~(1 << ((Com-1)%CHAR_BIT));
76     }
77    
78 zmatsuo 7305 int WINAPI CheckCOMFlag(int Com)
79 maya 3227 {
80     return ((pm->ComFlag[(Com-1)/CHAR_BIT] & 1 << (Com-1)%CHAR_BIT) > 0);
81     }
82    
83 zmatsuo 7305 int WINAPI RegWin(HWND HWinVT, HWND HWinTEK)
84 maya 3227 {
85     int i, j;
86    
87     if (pm->NWin>=MAXNWIN)
88     return 0;
89     if (HWinVT==NULL)
90     return 0;
91     if (HWinTEK!=NULL) {
92     i = 0;
93     while ((i<pm->NWin) && (pm->WinList[i]!=HWinVT))
94     i++;
95     if (i>=pm->NWin)
96     return 0;
97     for (j=pm->NWin-1 ; j>i ; j--)
98     pm->WinList[j+1] = pm->WinList[j];
99     pm->WinList[i+1] = HWinTEK;
100     pm->NWin++;
101     return 0;
102     }
103     pm->WinList[pm->NWin++] = HWinVT;
104 yutakapon 5223 memset(&pm->WinPrevRect[pm->NWin - 1], 0, sizeof(pm->WinPrevRect[pm->NWin - 1])); // RECT clear
105 maya 3392 if (pm->NWin==1) {
106 maya 3227 return 1;
107 maya 3392 }
108     else {
109 maya 3227 return (int)(SendMessage(pm->WinList[pm->NWin-2],
110 maya 3392 WM_USER_GETSERIALNO,0,0)+1);
111     }
112 maya 3227 }
113    
114 zmatsuo 7305 void WINAPI UnregWin(HWND HWin)
115 maya 3227 {
116     int i, j;
117    
118     i = 0;
119 maya 3392 while ((i<pm->NWin) && (pm->WinList[i]!=HWin)) {
120 maya 3227 i++;
121 maya 3392 }
122     if (pm->WinList[i]!=HWin) {
123 maya 3227 return;
124 maya 3392 }
125     for (j=i ; j<pm->NWin-1 ; j++) {
126 maya 3227 pm->WinList[j] = pm->WinList[j+1];
127 yutakapon 5223 pm->WinPrevRect[j] = pm->WinPrevRect[j+1]; // RECT shift
128 maya 3392 }
129     if (pm->NWin>0) {
130 maya 3227 pm->NWin--;
131 maya 3392 }
132 maya 3227 }
133    
134 zmatsuo 10130 static char GetWindowTypeChar(HWND Hw, HWND HWin)
135 doda 4073 {
136 doda 4076 #if 0
137 doda 4073 if (HWin == Hw)
138     return '*';
139     else if (!IsWindowVisible(Hw))
140 doda 4076 #else
141     if (!IsWindowVisible(Hw))
142     #endif
143 doda 4073 return '#';
144     else if (IsIconic(Hw))
145     return '-';
146     else if (IsZoomed(Hw))
147     return '@';
148     else
149     return '+';
150     }
151    
152 zmatsuo 7305 void WINAPI SetWinMenu(HMENU menu, PCHAR buf, int buflen, PCHAR langFile, int VTFlag)
153 maya 3227 {
154     int i;
155     char Temp[MAXPATHLEN];
156     HWND Hw;
157 zmatsuo 8496 wchar_t uimsg[MAX_UIMSG];
158 maya 3227
159     // delete all items in Window menu
160     i = GetMenuItemCount(menu);
161     if (i>0)
162     do {
163     i--;
164     RemoveMenu(menu,i,MF_BYPOSITION);
165     } while (i>0);
166    
167     i = 0;
168     while (i<pm->NWin) {
169     Hw = pm->WinList[i]; // get window handle
170     if ((GetClassName(Hw,Temp,sizeof(Temp))>0) &&
171     ((strcmp(Temp,VTCLASSNAME)==0) ||
172     (strcmp(Temp,TEKCLASSNAME)==0))) {
173     Temp[0] = '&';
174     Temp[1] = (char)(0x31 + i);
175     Temp[2] = ' ';
176 doda 4073 Temp[3] = GetWindowTypeChar(Hw, NULL);
177     Temp[4] = ' ';
178     GetWindowText(Hw,&Temp[5],sizeof(Temp)-6);
179 maya 3227 AppendMenu(menu,MF_ENABLED | MF_STRING,ID_WINDOW_1+i,Temp);
180     i++;
181 maya 3392 if (i>8) {
182 maya 3227 i = pm->NWin;
183 maya 3392 }
184 maya 3227 }
185 maya 3392 else {
186 maya 3227 UnregWin(Hw);
187 maya 3392 }
188 maya 3227 }
189     if (VTFlag == 1) {
190 zmatsuo 8496 static const DlgTextInfo MenuTextInfo[] = {
191     { ID_WINDOW_WINDOW, "MENU_WINDOW_WINDOW" },
192     { ID_WINDOW_MINIMIZEALL, "MENU_WINDOW_MINIMIZEALL" },
193     { ID_WINDOW_RESTOREALL, "MENU_WINDOW_RESTOREALL" },
194     { ID_WINDOW_CASCADEALL, "MENU_WINDOW_CASCADE" },
195     { ID_WINDOW_STACKED, "MENU_WINDOW_STACKED" },
196     { ID_WINDOW_SIDEBYSIDE, "MENU_WINDOW_SIDEBYSIDE" },
197     };
198    
199 maya 4655 AppendMenu(menu, MF_SEPARATOR, 0, NULL);
200 zmatsuo 8496 AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_WINDOW, "&Window");
201     AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_MINIMIZEALL, "&Minimize All");
202     AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_RESTOREALL, "&Restore All");
203     AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_CASCADEALL, "&Cascade");
204     AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_STACKED, "&Stacked");
205     AppendMenu(menu, MF_ENABLED | MF_STRING, ID_WINDOW_SIDEBYSIDE, "Side &by Side");
206 doda 4647
207 zmatsuo 8496 SetI18nMenuStrs("Tera Term", menu, MenuTextInfo, _countof(MenuTextInfo), langFile);
208 doda 4647
209 yutakapon 5299 if (pm->WinUndoFlag) {
210     if (pm->WinUndoStyle == WIN_CASCADE)
211 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_CASCADE_UNDO", uimsg, _countof(uimsg), L"&Undo - Cascade", langFile);
212 yutakapon 5299 else if (pm->WinUndoStyle == WIN_STACKED)
213 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_STACKED_UNDO", uimsg, _countof(uimsg), L"&Undo - Stacked", langFile);
214 yutakapon 5299 else
215 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_SIDEBYSIDE_UNDO", uimsg, _countof(uimsg), L"&Undo - Side by Side", langFile);
216 zmatsuo 9324 AppendMenuW(menu, MF_ENABLED | MF_STRING, ID_WINDOW_UNDO, uimsg); // TODO UNICODE
217 yutakapon 5299 }
218    
219 maya 3227 }
220     else {
221 zmatsuo 8496 get_lang_msgW("MENU_WINDOW_WINDOW", uimsg, _countof(uimsg), L"&Window", langFile);
222 zmatsuo 9324 AppendMenuW(menu,MF_ENABLED | MF_STRING,ID_TEKWINDOW_WINDOW, uimsg);
223 maya 3227 }
224     }
225    
226 zmatsuo 7305 void WINAPI SetWinList(HWND HWin, HWND HDlg, int IList)
227 maya 3227 {
228     int i;
229     char Temp[MAXPATHLEN];
230     HWND Hw;
231    
232     for (i=0; i<pm->NWin; i++) {
233     Hw = pm->WinList[i]; // get window handle
234     if ((GetClassName(Hw,Temp,sizeof(Temp))>0) &&
235     ((strcmp(Temp,VTCLASSNAME)==0) ||
236     (strcmp(Temp,TEKCLASSNAME)==0))) {
237 doda 4073 Temp[0] = GetWindowTypeChar(Hw, HWin);
238     Temp[1] = ' ';
239     GetWindowText(Hw,&Temp[2],sizeof(Temp)-3);
240 maya 3227 SendDlgItemMessage(HDlg, IList, LB_ADDSTRING,
241 zmatsuo 7896 0, (LPARAM)Temp);
242 maya 3392 if (Hw==HWin) {
243     SendDlgItemMessage(HDlg, IList, LB_SETCURSEL, i,0);
244     }
245 maya 3227 }
246 maya 3392 else {
247 maya 3227 UnregWin(Hw);
248 maya 3392 }
249 maya 3227 }
250     }
251    
252 zmatsuo 7305 void WINAPI SelectWin(int WinId)
253 maya 3227 {
254     if ((WinId>=0) && (WinId<pm->NWin)) {
255 yutakapon 3673 /* �E�B���h�E�����������������������������������A���������������������������A
256     * SW_SHOWNORMAL ���� SW_SHOW �����X�����B
257     * (2009.11.8 yutaka)
258 maya 3675 * �E�B���h�E�����������������������������T�C�Y������(SW_RESTORE)�����������B
259     * (2009.11.9 maya)
260 yutakapon 3673 */
261 maya 3675 if (IsIconic(pm->WinList[WinId])) {
262     ShowWindow(pm->WinList[WinId],SW_RESTORE);
263     }
264     else {
265     ShowWindow(pm->WinList[WinId],SW_SHOW);
266     }
267 maya 3227 SetForegroundWindow(pm->WinList[WinId]);
268     }
269     }
270    
271 zmatsuo 7305 void WINAPI SelectNextWin(HWND HWin, int Next, BOOL SkipIconic)
272 maya 3227 {
273     int i;
274    
275     i = 0;
276 doda 3950 while ((i < pm->NWin) && (pm->WinList[i]!=HWin)) {
277     i++;
278     }
279     if (pm->WinList[i]!=HWin) {
280     return;
281     }
282    
283     do {
284     i += Next;
285     if (i >= pm->NWin) {
286     i = 0;
287     }
288     else if (i < 0) {
289     i = pm->NWin-1;
290     }
291    
292     if (pm->WinList[i] == HWin) {
293 doda 4030 break;
294 doda 3950 }
295 doda 4030 } while ((SkipIconic && IsIconic(pm->WinList[i])) || !IsWindowVisible(pm->WinList[i]));
296 doda 3950
297     SelectWin(i);
298     }
299    
300 zmatsuo 7305 void WINAPI ShowAllWin(int stat) {
301 doda 4647 int i;
302 doda 5280
303     for (i=0; i < pm->NWin; i++) {
304     ShowWindow(pm->WinList[i], stat);
305     }
306     }
307    
308 zmatsuo 7305 void WINAPI UndoAllWin(void) {
309 doda 5280 int i;
310 yutakapon 5223 WINDOWPLACEMENT rc0;
311     RECT rc;
312 yutakapon 5299 int stat = SW_RESTORE;
313 yutakapon 5407 int multi_mon = 0;
314 doda 4647
315 yutakapon 6286 if (HasMultiMonitorSupport()) {
316 yutakapon 5407 multi_mon = 1;
317     }
318    
319 yutakapon 5299 // ���x�A�����������t���O���������B
320     pm->WinUndoFlag = FALSE;
321    
322 yutakapon 5223 memset(&rc0, 0, sizeof(rc0));
323    
324 doda 4647 for (i=0; i < pm->NWin; i++) {
325 yutakapon 5223 // �����w�����A�O�����������c���������������A�E�B���h�E�����������������B
326     if (stat == SW_RESTORE && memcmp(&pm->WinPrevRect[i], &rc0, sizeof(rc0)) != 0) {
327     rc = pm->WinPrevRect[i].rcNormalPosition;
328    
329 yutakapon 5407 // NT4.0, 95 ���}���`���j�^API��������
330     if (multi_mon) {
331     // �������j�^������������
332 zmatsuo 8517 HMONITOR hMonitor;
333     MONITORINFO mi;
334     hMonitor = pMonitorFromRect(&rc, MONITOR_DEFAULTTONEAREST);
335 yutakapon 5407 mi.cbSize = sizeof(MONITORINFO);
336 zmatsuo 8517 pGetMonitorInfoA(hMonitor, &mi);
337 yutakapon 5223
338 yutakapon 5407 // ���u�����i�����O���������x���������������������������j
339     if (rc.right > mi.rcMonitor.right) {
340     rc.left -= rc.right - mi.rcMonitor.right;
341     rc.right = mi.rcMonitor.right;
342     }
343     if (rc.left < mi.rcMonitor.left) {
344     rc.right += mi.rcMonitor.left - rc.left;
345     rc.left = mi.rcMonitor.left;
346     }
347     if (rc.bottom > mi.rcMonitor.bottom) {
348     rc.top -= rc.bottom - mi.rcMonitor.bottom;
349     rc.bottom = mi.rcMonitor.bottom;
350     }
351     if (rc.top < mi.rcMonitor.top) {
352     rc.bottom += mi.rcMonitor.top - rc.top;
353     rc.top = mi.rcMonitor.top;
354     }
355 yutakapon 5223 }
356    
357     // �E�B���h�E���u����
358     SetWindowPos(
359 doda 6435 pm->WinList[i], NULL,
360     rc.left,
361 yutakapon 5223 rc.top,
362 doda 6435 rc.right - rc.left,
363 yutakapon 5223 rc.bottom - rc.top,
364     SWP_NOZORDER);
365    
366 yutakapon 5230 // �E�B���h�E����������
367     ShowWindow(pm->WinList[i], pm->WinPrevRect[i].showCmd);
368 yutakapon 5223
369     } else {
370     ShowWindow(pm->WinList[i], stat);
371     }
372 doda 4647 }
373     }
374    
375 zmatsuo 7305 HWND WINAPI GetNthWin(int n)
376 maya 3227 {
377 maya 3392 if (n<pm->NWin) {
378 maya 3227 return pm->WinList[n];
379 maya 3392 }
380     else {
381 maya 3227 return NULL;
382 maya 3392 }
383 maya 3227 }
384    
385 zmatsuo 7725 int WINAPI GetRegisteredWindowCount(void)
386 doda 6888 {
387     return (pm->NWin);
388     }
389 yutakapon 5222
390 yutakapon 5223 // �L�����E�B���h�E���T���A�������u���L�������������B
391 yutakapon 5299 static void get_valid_window_and_memorize_rect(HWND myhwnd, HWND hwnd[], int *num, int style)
392 yutakapon 5222 {
393 yutakapon 5223 int i, n;
394     WINDOWPLACEMENT wndPlace;
395 yutakapon 5222
396 yutakapon 5299 // ��������(Undo)���j���[�����x�����\���������B
397     if (pm->WinUndoFlag == FALSE) {
398     pm->WinUndoFlag = TRUE;
399     } else {
400     // ���������j���[���\�������������A�������O�������X�^�C�����I�����������A
401     // ���j���[�������B
402     // Windows8�����A�������A�����������X�^�C�����I�����������j���[�����������������A
403     // Tera Term�������j���[���\�������������A�������������B
404     if (pm->WinUndoStyle == style)
405     pm->WinUndoFlag = FALSE;
406     }
407     pm->WinUndoStyle = style;
408    
409 yutakapon 5222 n = 0;
410     for (i = 0 ; i < pm->NWin ; i++) {
411 yutakapon 5223 // �������u���o���������B
412     wndPlace.length = sizeof(WINDOWPLACEMENT);
413     GetWindowPlacement(pm->WinList[i], &wndPlace);
414     pm->WinPrevRect[i] = wndPlace;
415    
416     // �������g�������������B
417 yutakapon 5222 if (pm->WinList[i] == myhwnd) {
418     hwnd[n] = hwnd[0];
419     hwnd[0] = myhwnd;
420     } else {
421     hwnd[n] = pm->WinList[i];
422     }
423     n++;
424     }
425 yutakapon 5223 *num = n;
426     }
427 yutakapon 5222
428 yutakapon 5223 // �E�B���h�E�����E���������\������(Show Windows Side by Side)
429 zmatsuo 7305 void WINAPI ShowAllWinSidebySide(HWND myhwnd)
430 yutakapon 5223 {
431     int n;
432     HWND hwnd[MAXNWIN];
433    
434 yutakapon 5299 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_SIDEBYSIDE);
435 yutakapon 5251 TileWindows(NULL, MDITILE_VERTICAL, NULL, n, hwnd);
436 yutakapon 5222 }
437    
438     // �E�B���h�E���������������\������(Show Windows Stacked)
439 zmatsuo 7305 void WINAPI ShowAllWinStacked(HWND myhwnd)
440 yutakapon 5222 {
441 yutakapon 5223 int n;
442 yutakapon 5222 HWND hwnd[MAXNWIN];
443    
444 yutakapon 5299 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_STACKED);
445 yutakapon 5251 TileWindows(NULL, MDITILE_HORIZONTAL, NULL, n, hwnd);
446 yutakapon 5222 }
447    
448     // �E�B���h�E���d�����\������(Cascade)
449 zmatsuo 7305 void WINAPI ShowAllWinCascade(HWND myhwnd)
450 yutakapon 5222 {
451 yutakapon 5223 int n;
452     HWND hwnd[MAXNWIN];
453    
454 yutakapon 5299 get_valid_window_and_memorize_rect(myhwnd, hwnd, &n, WIN_CASCADE);
455 yutakapon 5251 CascadeWindows(NULL, MDITILE_SKIPDISABLED, NULL, n, hwnd);
456 yutakapon 5222 }
457    
458 yutakapon 5232 // �STera Term���I���w�����o���B
459 zmatsuo 7305 void WINAPI BroadcastClosingMessage(HWND myhwnd)
460 yutakapon 5232 {
461     int i, max;
462     HWND hwnd[MAXNWIN];
463    
464     // Tera Term���I�����������A���L���������������������A
465     // ���������o�b�t�@���R�s�[���������B
466     max = pm->NWin;
467     for (i = 0 ; i < pm->NWin ; i++) {
468     hwnd[i] = pm->WinList[i];
469     }
470    
471     for (i = 0 ; i < max ; i++) {
472     // �������g�������������B
473 doda 6435 if (hwnd[i] == myhwnd)
474 yutakapon 5232 continue;
475    
476     PostMessage(hwnd[i], WM_USER_NONCONFIRM_CLOSE, 0, 0);
477     }
478     PostMessage(myhwnd, WM_USER_NONCONFIRM_CLOSE, 0, 0);
479     }
480    
481    
482 zmatsuo 7305 int WINAPI CommReadRawByte(PComVar cv, LPBYTE b)
483 maya 3227 {
484 maya 3392 if ( ! cv->Ready ) {
485 maya 3227 return 0;
486 maya 3392 }
487 maya 3227
488     if ( cv->InBuffCount>0 ) {
489     *b = cv->InBuff[cv->InPtr];
490     cv->InPtr++;
491     cv->InBuffCount--;
492 maya 3392 if ( cv->InBuffCount==0 ) {
493 maya 3227 cv->InPtr = 0;
494 maya 3392 }
495 maya 3227 return 1;
496     }
497     else {
498     cv->InPtr = 0;
499     return 0;
500     }
501     }
502    
503 zmatsuo 8897 static void LogBinSkip(PComVar cv, int add)
504     {
505     if (cv->LogBinSkip != NULL) {
506     cv->LogBinSkip(add);
507     }
508     }
509    
510 zmatsuo 7305 void WINAPI CommInsert1Byte(PComVar cv, BYTE b)
511 maya 3227 {
512 maya 3392 if ( ! cv->Ready ) {
513 maya 3227 return;
514 maya 3392 }
515 maya 3227
516 maya 3392 if (cv->InPtr == 0) {
517 maya 3227 memmove(&(cv->InBuff[1]),&(cv->InBuff[0]),cv->InBuffCount);
518 maya 3392 }
519     else {
520 maya 3227 cv->InPtr--;
521 maya 3392 }
522 maya 3227 cv->InBuff[cv->InPtr] = b;
523     cv->InBuffCount++;
524    
525 zmatsuo 8897 LogBinSkip(cv, 1);
526 maya 3227 }
527    
528 zmatsuo 8897 static void Log1Bin(PComVar cv, BYTE b)
529 maya 3227 {
530 zmatsuo 8897 if (cv->Log1Bin != NULL) {
531     cv->Log1Bin(b);
532 maya 3392 }
533 maya 3227 }
534    
535 zmatsuo 7305 int WINAPI CommRead1Byte(PComVar cv, LPBYTE b)
536 maya 3227 {
537     int c;
538    
539 maya 3392 if ( ! cv->Ready ) {
540 maya 3227 return 0;
541 maya 3392 }
542 maya 3227
543 maya 3392 if ( cv->TelMode ) {
544 maya 3227 c = 0;
545 maya 3392 }
546     else {
547 maya 3227 c = CommReadRawByte(cv,b);
548 maya 3392 }
549 maya 3227
550     if ((c==1) && cv->TelCRFlag) {
551     cv->TelCRFlag = FALSE;
552 maya 3392 if (*b==0) {
553     c = 0;
554     }
555 maya 3227 }
556    
557     if ( c==1 ) {
558     if ( cv->IACFlag ) {
559     cv->IACFlag = FALSE;
560     if ( *b != 0xFF ) {
561     cv->TelMode = TRUE;
562     CommInsert1Byte(cv,*b);
563 zmatsuo 8897 LogBinSkip(cv, -1);
564 maya 3227 c = 0;
565     }
566     }
567     else if ((cv->PortType==IdTCPIP) && (*b==0xFF)) {
568 maya 3392 if (!cv->TelFlag && cv->TelAutoDetect) { /* TTPLUG */
569 maya 3227 cv->TelFlag = TRUE;
570 maya 3392 }
571 maya 3227 if (cv->TelFlag) {
572     cv->IACFlag = TRUE;
573     c = 0;
574     }
575     }
576 maya 3392 else if (cv->TelFlag && ! cv->TelBinRecv && (*b==0x0D)) {
577 maya 3227 cv->TelCRFlag = TRUE;
578 maya 3392 }
579 maya 3227 }
580    
581 zmatsuo 8897 if (c == 1) {
582 maya 3227 Log1Bin(cv, *b);
583 maya 3392 }
584 maya 3227
585     return c;
586     }
587    
588 doda 8445 int WINAPI CommRawOut(PComVar cv, /*const*/ PCHAR B, int C)
589 maya 3227 {
590     int a;
591    
592 maya 3392 if ( ! cv->Ready ) {
593 maya 3227 return C;
594 maya 3392 }
595 maya 3227
596 maya 3392 if (C > OutBuffSize - cv->OutBuffCount) {
597 maya 3227 a = OutBuffSize - cv->OutBuffCount;
598 maya 3392 }
599     else {
600 maya 3227 a = C;
601 maya 3392 }
602 maya 3227 if ( cv->OutPtr > 0 ) {
603     memmove(&(cv->OutBuff[0]),&(cv->OutBuff[cv->OutPtr]),cv->OutBuffCount);
604     cv->OutPtr = 0;
605     }
606     memcpy(&(cv->OutBuff[cv->OutBuffCount]),B,a);
607     cv->OutBuffCount = cv->OutBuffCount + a;
608     return a;
609     }
610    
611 zmatsuo 7305 int WINAPI CommBinaryOut(PComVar cv, PCHAR B, int C)
612 maya 3227 {
613     int a, i, Len;
614     char d[3];
615    
616 maya 3392 if ( ! cv->Ready ) {
617 maya 3227 return C;
618 maya 3392 }
619 maya 3227
620     i = 0;
621     a = 1;
622     while ((a>0) && (i<C)) {
623     Len = 0;
624    
625     d[Len] = B[i];
626     Len++;
627    
628 doda 3505 if ( cv->TelFlag && (B[i]=='\x0d') && ! cv->TelBinSend ) {
629     d[Len++] = '\x00';
630 maya 3227 }
631 doda 3505 else if ( cv->TelFlag && (B[i]=='\xff') ) {
632     d[Len++] = '\xff';
633     }
634 maya 3227
635 doda 3505 if ( OutBuffSize - cv->OutBuffCount - Len >= 0 ) {
636     CommRawOut(cv, d, Len);
637 maya 3227 a = 1;
638     }
639 maya 3392 else {
640 maya 3227 a = 0;
641 maya 3392 }
642 maya 3227
643 doda 3505 i += a;
644 maya 3227 }
645     return i;
646     }
647    
648 doda 8445 /**
649     * �f�[�^(������)���o���o�b�t�@����������
650     *
651     * �w���f�[�^��������������������������������������
652     * CommRawOut() ��������������������������
653     *
654     * @retval TRUE �o��������
655     * @retval FALSE �o��������������(buffer full)
656     */
657     static BOOL WriteOutBuff(PComVar cv, const char *TempStr, int TempLen)
658     {
659     BOOL output;
660    
661     if (TempLen == 0) {
662     // ����0������������������������
663     return TRUE;
664     }
665    
666     output = FALSE;
667     if (cv->TelLineMode) {
668     const BOOL Full = OutBuffSize - cv->LineModeBuffCount - TempLen < 0;
669     if (!Full) {
670     output = TRUE;
671     memcpy(&(cv->LineModeBuff[cv->LineModeBuffCount]), TempStr, TempLen);
672     cv->LineModeBuffCount += TempLen;
673     if (cv->Flush) {
674     cv->FlushLen = cv->LineModeBuffCount;
675     }
676     }
677     if (cv->FlushLen > 0) {
678     const int OutLen = CommRawOut(cv, cv->LineModeBuff, cv->FlushLen);
679     cv->FlushLen -= OutLen;
680     cv->LineModeBuffCount -= OutLen;
681     memmove(cv->LineModeBuff, &(cv->LineModeBuff[OutLen]), cv->LineModeBuffCount);
682     }
683     cv->Flush = FALSE;
684     }
685     else {
686     const BOOL Full = OutBuffSize-cv->OutBuffCount-TempLen < 0;
687     if (! Full) {
688     output = TRUE;
689     CommRawOut(cv, (char *)TempStr, TempLen);
690     }
691     }
692     return output;
693     }
694    
695     /**
696     * �f�[�^(������)�������o�b�t�@����������
697     * �����o�b�t�@�������� -> �G�R�[������
698     *
699     * @retval TRUE �o��������
700     * @retval FALSE �o��������������(buffer full)
701     */
702     static BOOL WriteInBuff(PComVar cv, const char *TempStr, int TempLen)
703     {
704     BOOL Full;
705    
706     if (TempLen == 0) {
707     return TRUE;
708     }
709    
710     Full = InBuffSize-cv->InBuffCount-TempLen < 0;
711     if (! Full) {
712     memcpy(&(cv->InBuff[cv->InBuffCount]),TempStr,TempLen);
713     cv->InBuffCount = cv->InBuffCount + TempLen;
714     return TRUE;
715     }
716     return FALSE;
717     }
718    
719     /**
720     * �����o�b�t�@�����������������������l����
721     */
722     static void PackInBuff(PComVar cv)
723     {
724     if ( (cv->InPtr>0) && (cv->InBuffCount>0) ) {
725     memmove(cv->InBuff,&(cv->InBuff[cv->InPtr]),cv->InBuffCount);
726     cv->InPtr = 0;
727     }
728     }
729    
730 zmatsuo 7305 int WINAPI CommBinaryBuffOut(PComVar cv, PCHAR B, int C)
731 doda 3505 {
732 doda 8445 int a, i, Len;
733 doda 3505 char d[3];
734    
735     if ( ! cv->Ready ) {
736     return C;
737     }
738    
739     i = 0;
740     a = 1;
741     while ((a>0) && (i<C)) {
742     Len = 0;
743    
744     d[Len] = B[i];
745     Len++;
746    
747     if (B[i] == CR) {
748     if ( cv->TelFlag && ! cv->TelBinSend ) {
749     d[Len++] = '\x00';
750     }
751     if (cv->TelLineMode) {
752     cv->Flush = TRUE;
753     }
754     }
755     else if ( cv->TelFlag && (B[i]=='\xff') ) {
756     d[Len++] = '\xff';
757     }
758    
759 doda 8445 if (WriteOutBuff(cv, d, Len)) {
760     a = 1;
761     i++;
762     } else {
763     a = 0;
764 doda 3505 }
765     }
766     return i;
767     }
768    
769 doda 8445 /**
770     * @retval true ���{�������p�J�^�J�i
771     * @retval false ������
772     */
773     static BOOL IsHalfWidthKatakana(unsigned int u32)
774     {
775     // Halfwidth CJK punctuation (U+FF61�`FF64)
776     // Halfwidth Katakana variants (U+FF65�`FF9F)
777     return (0xff61 <= u32 && u32 <= 0xff9f);
778     }
779    
780     /**
781     * �o���p�A TODO echo�p������
782     * @param cv
783     * @param u32 ��������
784     * @param check_only TRUE���������s�����A
785     * @param TempStr �o��������
786     * @param StrLen TempStr�����o��������
787     * @retval �������s����
788     */
789     static BOOL OutControl(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
790     {
791     const wchar_t d = u32;
792     size_t TempLen = 0;
793     BOOL retval = FALSE;
794     if (check_only == TRUE) {
795     /* �`�F�b�N���� */
796     if (d == CR || d == BS || d == 0x15/*ctrl-u*/) {
797     return TRUE;
798     } else {
799     return FALSE;
800     }
801     }
802     if (d==CR) {
803     TempStr[TempLen++] = 0x0d;
804     if (cv->CRSend==IdCRLF) {
805     TempStr[TempLen++] = 0x0a;
806     }
807     else if ((cv->CRSend ==IdCR) &&
808     cv->TelFlag && ! cv->TelBinSend) {
809     TempStr[TempLen++] = 0;
810     }
811     else if (cv->CRSend == IdLF) {
812     TempStr[TempLen-1] = 0x0a;
813     }
814 doda 3494 if (cv->TelLineMode) {
815 doda 8445 cv->Flush = TRUE;
816     }
817     retval = TRUE;
818     }
819     else if (d== BS) {
820     if (cv->TelLineMode) {
821     if (cv->FlushLen < cv->LineModeBuffCount) {
822     cv->LineModeBuffCount--;
823     }
824     }
825     else {
826     TempStr[TempLen++] = BS;
827     }
828     retval = TRUE;
829     }
830     else if (d==0x15) { // ctrl-u
831     if (cv->TelLineMode) {
832     cv->LineModeBuffCount = cv->FlushLen;
833     }
834     else {
835     TempStr[TempLen++] = 0x15;
836     }
837     retval = TRUE;
838     }
839     *StrLen = TempLen;
840     return retval;
841     }
842     static BOOL ControlEcho(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
843     {
844     const wchar_t d = u32;
845     size_t TempLen = 0;
846     BOOL retval = FALSE;
847     if (check_only == TRUE) {
848     /* �`�F�b�N���� */
849     if (d == CR || (d == 0x15/*ctrl-u*/ && cv->TelLineMode)) {
850     return TRUE;
851     } else {
852     return FALSE;
853     }
854     }
855     if (d==CR) {
856     TempStr[TempLen++] = 0x0d;
857     if (cv->CRSend==IdCRLF) {
858     TempStr[TempLen++] = 0x0a;
859     }
860     else if ((cv->CRSend ==IdCR) && cv->TelFlag && ! cv->TelBinSend) {
861     TempStr[TempLen++] = 0;
862     }
863     else if (cv->CRSend == IdLF) {
864     TempStr[TempLen-1] = 0x0a;
865     }
866     retval = TRUE;
867     }
868     else if (d==0x15/*ctrl-u*/ && cv->TelLineMode) {
869     // Move to top of line (CHA "\033[G") and erase line (EL "\033[K")
870     memcpy(TempStr, "\033[G\033[K", 6);
871     TempLen += 6;
872     retval = TRUE;
873     }
874     *StrLen = TempLen;
875     return retval;
876     }
877    
878     /**
879     * �o���p����������������
880     *
881     * @retval ��������������
882     */
883     typedef struct {
884     int KanjiCode; // [in]�o�������R�[�h(sjis,jis����)
885     BOOL (*ControlOut)(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen);
886     // state�����������K�v�����������R�[�h���g�p
887     BOOL JIS7Katakana; // [in](Kanji JIS)kana
888     int SendCode; // [in,out](Kanji JIS)���O�����M�R�[�h Ascii/Kana/Kanji
889     BOOL KanjiFlag; // [in,out](MBCS)���O��1byte��������������?(2byte������������?)
890     BYTE KanjiFirst; // [in,out](MBCS)���O��1byte
891     } OutputCharState;
892    
893     /**
894     * unicode(UTF-16)����unicode(UTF-32)��1���������o����
895     * �o���f�[�^(TempStr)����������
896     */
897     static size_t MakeOutputString(PComVar cv, OutputCharState *states,
898     const wchar_t *B, int C,
899     char *TempStr, int *TempLen_)
900     {
901     BOOL (*ControlOut)(PComVar cv, unsigned int u32, BOOL check_only, char *TempStr, size_t *StrLen)
902     = states->ControlOut;
903     //
904     int TempLen = 0;
905     size_t TempLen2;
906     size_t output_char_count; // ��������������
907    
908     // UTF-32 ��1���������o��
909     unsigned int u32;
910     size_t u16_len = UTF16ToUTF32(B, C, &u32);
911     if (u16_len == 0) {
912     // �f�R�[�h��������? ����������������?
913     assert(FALSE);
914     u32 = '?';
915     u16_len = 1;
916     }
917     output_char_count = u16_len;
918    
919     // �e���V�t�g����������������
920     if (u32 < 0x100 || ControlOut(cv, u32, TRUE, NULL, NULL)) {
921     if (cv->Language == IdJapanese && states->KanjiCode == IdJIS) {
922     // �����������A���{��,JIS��������
923     if (cv->SendCode == IdKanji) {
924     // �����������������A����OUT
925     TempStr[TempLen++] = 0x1B;
926     TempStr[TempLen++] = '(';
927     switch (cv->KanjiOut) {
928     case IdKanjiOutJ:
929     TempStr[TempLen++] = 'J';
930     break;
931     case IdKanjiOutH:
932     TempStr[TempLen++] = 'H';
933     break;
934     default:
935     TempStr[TempLen++] = 'B';
936 doda 3494 }
937     }
938 doda 8445
939     if (states->JIS7Katakana == 1) {
940     if (cv->SendCode == IdKatakana) {
941     TempStr[TempLen++] = SO;
942     }
943 doda 3494 }
944 doda 8445
945     states->SendCode = IdASCII;
946 maya 3227 }
947 doda 8445 }
948    
949     // 1������������
950     if (ControlOut(cv, u32, FALSE, TempStr, &TempLen2)) {
951     // ��������������������
952     TempLen += TempLen2;
953     output_char_count = 1;
954     } else if (cv->Language == IdUtf8 ||
955     (cv->Language == IdJapanese && states->KanjiCode == IdUTF8) ||
956 zmatsuo 9499 (cv->Language == IdKorean && states->KanjiCode == IdUTF8) ||
957     (cv->Language == IdChinese && states->KanjiCode == IdUTF8))
958 doda 8445 {
959     // UTF-8 ���o��
960     size_t utf8_len = sizeof(TempStr);
961     utf8_len = UTF32ToUTF8(u32, TempStr, utf8_len);
962     TempLen += utf8_len;
963 zmatsuo 9314 } else if (cv->Language == IdJapanese) {
964 doda 8445 // ���{��
965     // ���� CP932(SJIS) ���������������o��
966     char mb_char[2];
967     size_t mb_len = sizeof(mb_char);
968     mb_len = UTF32ToMBCP(u32, 932, mb_char, mb_len);
969     if (mb_len == 0) {
970     // SJIS��������������
971     TempStr[TempLen++] = '?';
972     } else {
973     switch (states->KanjiCode) {
974     case IdEUC:
975     // TODO ���p�J�i
976     if (mb_len == 1) {
977     TempStr[TempLen++] = mb_char[0];
978     } else {
979     WORD K;
980     K = (((WORD)(unsigned char)mb_char[0]) << 8) +
981     (WORD)(unsigned char)mb_char[1];
982     K = SJIS2EUC(K);
983     TempStr[TempLen++] = HIBYTE(K);
984     TempStr[TempLen++] = LOBYTE(K);
985     }
986     break;
987     case IdJIS:
988     if (u32 < 0x100) {
989     // ASCII
990     TempStr[TempLen++] = mb_char[0];
991     states->SendCode = IdASCII;
992     } else if (IsHalfWidthKatakana(u32)) {
993     // ���p�J�^�J�i
994     if (states->JIS7Katakana==1) {
995     if (cv->SendCode != IdKatakana) {
996     TempStr[TempLen++] = SI;
997     }
998     TempStr[TempLen++] = mb_char[0] & 0x7f;
999     } else {
1000     TempStr[TempLen++] = mb_char[0];
1001     }
1002     states->SendCode = IdKatakana;
1003     } else {
1004     // ����
1005     WORD K;
1006     K = (((WORD)(unsigned char)mb_char[0]) << 8) +
1007     (WORD)(unsigned char)mb_char[1];
1008     K = SJIS2JIS(K);
1009     if (states->SendCode != IdKanji) {
1010     // ����IN
1011     TempStr[TempLen++] = 0x1B;
1012     TempStr[TempLen++] = '$';
1013     if (cv->KanjiIn == IdKanjiInB) {
1014     TempStr[TempLen++] = 'B';
1015     }
1016     else {
1017     TempStr[TempLen++] = '@';
1018     }
1019     states->SendCode = IdKanji;
1020     }
1021     TempStr[TempLen++] = HIBYTE(K);
1022     TempStr[TempLen++] = LOBYTE(K);
1023     }
1024     break;
1025     case IdSJIS:
1026     if (mb_len == 1) {
1027     TempStr[TempLen++] = mb_char[0];
1028     } else {
1029     TempStr[TempLen++] = mb_char[0];
1030     TempStr[TempLen++] = mb_char[1];
1031     }
1032     break;
1033     default:
1034     assert(FALSE);
1035     break;
1036 doda 3494 }
1037     }
1038 doda 8445 } else if (cv->Language == IdRussian) {
1039     /* ����CP1251�����������o�� */
1040     char mb_char[2];
1041     size_t mb_len = sizeof(mb_char);
1042     BYTE b;
1043     mb_len = UTF32ToMBCP(u32, 1251, mb_char, mb_len);
1044     if (mb_len != 1) {
1045     b = '?';
1046     } else {
1047 zmatsuo 9497 b = RussConv(IdWindows, states->KanjiCode, mb_char[0]);
1048 doda 8445 }
1049     TempStr[TempLen++] = b;
1050 zmatsuo 9314 } else if (cv->Language == IdKorean || cv->Language == IdChinese) {
1051     int code_page;
1052 doda 8445 char mb_char[2];
1053 zmatsuo 9314 size_t mb_len;
1054     if (cv->Language == IdKorean) {
1055     code_page = 51949;
1056     } else if (cv->Language == IdChinese) {
1057     switch (states->KanjiCode) {
1058     case IdCnGB2312:
1059     code_page = 936;
1060     break;
1061     case IdCnBig5:
1062     code_page = 950;
1063     break;
1064     default:
1065     assert(FALSE);
1066 zmatsuo 9463 code_page = 936;
1067 zmatsuo 9314 break;
1068     }
1069 zmatsuo 10130 } else {
1070     assert(FALSE);
1071     code_page = 0;
1072 zmatsuo 9314 }
1073     /* code_page �����������o�� */
1074     mb_len = sizeof(mb_char);
1075     mb_len = UTF32ToMBCP(u32, code_page, mb_char, mb_len);
1076 doda 8445 if (mb_len == 0) {
1077     TempStr[TempLen++] = '?';
1078     }
1079     else if (mb_len == 1) {
1080     TempStr[TempLen++] = mb_char[0];
1081     } else {
1082     TempStr[TempLen++] = mb_char[0];
1083     TempStr[TempLen++] = mb_char[1];
1084     }
1085     } else if (cv->Language == IdEnglish) {
1086 zmatsuo 9598 char byte;
1087     int part = KanjiCodeToISO8859Part(states->KanjiCode);
1088     int r = UnicodeToISO8859(part, u32, &byte);
1089 zmatsuo 9988 if (r == 0) {
1090     // �����������������R�[�h������
1091     byte = '?';
1092     }
1093 zmatsuo 9598 TempStr[TempLen++] = byte;
1094 doda 8445 } else {
1095 zmatsuo 9314 assert(FALSE);
1096 doda 8445 }
1097 maya 3227
1098 doda 8445 *TempLen_ = TempLen;
1099     return output_char_count;
1100 maya 3227 }
1101    
1102 doda 8445
1103     /**
1104     * CommTextOut() �� wchar_t ��
1105     *
1106     * @retval �o��������(wchar_t�P��)
1107     */
1108 zmatsuo 7484 int WINAPI CommTextOutW(PComVar cv, const wchar_t *B, int C)
1109     {
1110 doda 8445 char TempStr[12];
1111     BOOL Full = FALSE;
1112     int i = 0;
1113     while (! Full && (i < C)) {
1114     // �o���p�f�[�^������
1115     int TempLen = 0;
1116     size_t output_char_count; // ��������������
1117     OutputCharState state;
1118     state.KanjiCode = cv->KanjiCodeSend;
1119     state.ControlOut = OutControl;
1120     state.SendCode = cv->SendCode;
1121     state.JIS7Katakana = cv->JIS7KatakanaSend;
1122     output_char_count = MakeOutputString(cv, &state, &B[i], C-i, TempStr, &TempLen);
1123    
1124     // �f�[�^���o���o�b�t�@��
1125     if (WriteOutBuff(cv, TempStr, TempLen)) {
1126     i += output_char_count; // output_char_count ������ ��������
1127     // ��������������������
1128     cv->SendCode = state.SendCode;
1129     } else {
1130     Full = TRUE;
1131     }
1132     } // end of "while {}"
1133     _CrtCheckMemory();
1134     return i;
1135 zmatsuo 7484 }
1136    
1137 doda 8445 /**
1138     * CommTextEcho() �� wchar_t ��
1139     *
1140     * @retval �o��������(wchar_t�P��)
1141     */
1142 zmatsuo 7484 int WINAPI CommTextEchoW(PComVar cv, const wchar_t *B, int C)
1143     {
1144 doda 8445 char TempStr[12];
1145     BOOL Full = FALSE;
1146     int i = 0;
1147     while (! Full && (i < C)) {
1148     // �o���p�f�[�^������
1149     int TempLen = 0;
1150     size_t output_char_count; // ��������������
1151     OutputCharState state;
1152     state.KanjiCode = cv->KanjiCodeEcho;
1153     state.ControlOut = ControlEcho;
1154     state.SendCode = cv->EchoCode;
1155     state.JIS7Katakana = cv->JIS7KatakanaEcho;
1156     output_char_count = MakeOutputString(cv, &state, &B[i], C-i, TempStr, &TempLen);
1157    
1158     // �f�[�^���o���o�b�t�@��
1159     if (WriteInBuff(cv, TempStr, TempLen)) {
1160     i += output_char_count; // output_char_count ������ ��������
1161     // ��������������������
1162     cv->EchoCode = state.SendCode;
1163     } else {
1164     Full = TRUE;
1165     }
1166     } // end of "while {}"
1167     _CrtCheckMemory();
1168     return i;
1169 zmatsuo 7484 }
1170    
1171 zmatsuo 7305 int WINAPI CommBinaryEcho(PComVar cv, PCHAR B, int C)
1172 maya 3227 {
1173     int a, i, Len;
1174     char d[3];
1175    
1176     if ( ! cv->Ready )
1177     return C;
1178    
1179 doda 8445 PackInBuff(cv);
1180 maya 3227
1181     i = 0;
1182     a = 1;
1183     while ((a>0) && (i<C)) {
1184     Len = 0;
1185    
1186     d[Len] = B[i];
1187     Len++;
1188    
1189     if ( cv->TelFlag && (B[i]=='\x0d') &&
1190     ! cv->TelBinSend ) {
1191     d[Len] = 0x00;
1192     Len++;
1193     }
1194    
1195     if ( cv->TelFlag && (B[i]=='\xff') ) {
1196     d[Len] = '\xff';
1197     Len++;
1198     }
1199    
1200 doda 8445 if (WriteInBuff(cv, d, Len)) {
1201 maya 3227 a = 1;
1202 doda 8445 i++;
1203     } else {
1204     a = 0;
1205 maya 3227 }
1206     }
1207     return i;
1208     }
1209    
1210 zmatsuo 10130 /**
1211     * ���L�����������|�C���^���Z�b�g
1212 zmatsuo 7304 */
1213 zmatsuo 10130 DllExport void WINAPI SetPMPtr(PMap pm_)
1214 zmatsuo 7304 {
1215 zmatsuo 10130 pm = pm_;
1216 zmatsuo 7304 }
1217    
1218 maya 3227 BOOL WINAPI DllMain(HANDLE hInstance,
1219     ULONG ul_reason_for_call,
1220     LPVOID lpReserved)
1221     {
1222     switch( ul_reason_for_call ) {
1223     case DLL_THREAD_ATTACH:
1224     /* do thread initialization */
1225     break;
1226     case DLL_THREAD_DETACH:
1227     /* do thread cleanup */
1228     break;
1229     case DLL_PROCESS_ATTACH:
1230     /* do process initialization */
1231 zmatsuo 9314 #ifdef _DEBUG
1232     _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
1233     #endif
1234 doda 8445 WinCompatInit();
1235 maya 3227 break;
1236     case DLL_PROCESS_DETACH:
1237     /* do process cleanup */
1238 zmatsuo 10130 // TODO ttermpro.exe���s��
1239     // CloseSharedMemory(pm, HMap);
1240 maya 3227 break;
1241     }
1242     return TRUE;
1243     }

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