• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision8788 (tree)
Time2020-05-22 23:50:32
Authorzmatsuo

Log Message

マクロからの文字列送信をUnicode化した

- dispstr, send, sendln コマンド
- DDE通信の文字コードは UTF-8
- sendmemを修正

- 文字をホスト側へ送信しない設定を可能にした
- SendMemInitSend()
- 文字列長を正しく見るようにした
- 文字ペースト時のEOSの処理修正
- EOS(0x00)は送信しない
- 改行コードを修正
- LF(0x0a) -> CR(0x0d)

Change Summary

Incremental Difference

--- trunk/teraterm/teraterm/clipboar.c (revision 8787)
+++ trunk/teraterm/teraterm/clipboar.c (revision 8788)
@@ -309,16 +309,10 @@
309309 *
310310 * @param str_w 文字列へのポインタ
311311 * malloc()されたバッファ、送信完了時に自動でfree()される
312- * @param str_len 文字長(wchar_t単位)
313- * 0 の場合は L'\0' まで
314312 */
315-static void CBSendStart(wchar_t *str_w, size_t str_len)
313+static void CBSendStart(wchar_t *str_w)
316314 {
317- SendMem *sm;
318- if (str_len == 0) {
319- str_len = wcslen(str_w);
320- }
321- sm = SendMemTextW(str_w, str_len);
315+ SendMem *sm = SendMemTextW(str_w, 0);
322316 if (sm == NULL)
323317 return;
324318 if (ts.PasteDelayPerLine == 0) {
@@ -405,7 +399,7 @@
405399 str_w = dest;
406400 }
407401
408- CBSendStart(str_w, 0);
402+ CBSendStart(str_w);
409403 }
410404
411405 void CBStartPasteB64(HWND HWin, PCHAR header, PCHAR footer)
@@ -474,7 +468,7 @@
474468 free(str_b64);
475469
476470 // 貼り付けの準備が正常に出来た
477- CBSendStart(str_w, 0);
471+ CBSendStart(str_w);
478472
479473 return;
480474
--- trunk/teraterm/teraterm/sendmem.cpp (revision 8787)
+++ trunk/teraterm/teraterm/sendmem.cpp (revision 8788)
@@ -65,7 +65,7 @@
6565 size_t send_len; // 送信データサイズ
6666 SendMemType type;
6767 BOOL local_echo_enable;
68- BOOL send_enable;
68+ BOOL send_host_enable;
6969 DWORD delay_per_line; // (ms)
7070 DWORD delay_per_char;
7171 DWORD delay_per_sendsize;
@@ -233,6 +233,40 @@
233233 }
234234
235235 /**
236+ * バッファの空きサイズを調べる
237+ */
238+static size_t GetBufferFreeSpece(sendmem_work_t *p)
239+{
240+ size_t buff_len = 0;
241+
242+ // 送信バッファの空きサイズ
243+ if (p->send_host_enable) {
244+ size_t out_buff_free;
245+ GetOutBuffInfo(p->cv_, NULL, &out_buff_free);
246+ buff_len = out_buff_free;
247+ }
248+
249+ if (p->local_echo_enable) {
250+ // 受信バッファの空きサイズ
251+ size_t in_buff_free;
252+ GetInBuffInfo(p->cv_, NULL, &in_buff_free);
253+
254+ if (p->send_host_enable) {
255+ // 送信+ローカルエコーの場合
256+ if (buff_len > in_buff_free) {
257+ // バッファの小さい方に合わせる
258+ buff_len = in_buff_free;
259+ }
260+ }
261+ else {
262+ // ローカルエコーだけの場合
263+ buff_len = in_buff_free;
264+ }
265+ }
266+ return buff_len;
267+}
268+
269+/**
236270 * 送信
237271 */
238272 void SendMemContinuously(void)
@@ -272,21 +306,8 @@
272306 }
273307 }
274308
275- // 送信できるバッファサイズ
276- size_t buff_len;
277- {
278- size_t out_buff_free;
279- GetOutBuffInfo(p->cv_, NULL, &out_buff_free);
280- buff_len = out_buff_free;
281- if (p->local_echo_enable) {
282- // ローカルエコーが必要な場合は、入力バッファも考慮
283- size_t in_buff_free;
284- GetInBuffInfo(p->cv_, NULL, &in_buff_free);
285- if (buff_len > in_buff_free) {
286- buff_len = in_buff_free;
287- }
288- }
289- }
309+ // 送信できるバッファサイズ(バッファの空きサイズ)
310+ size_t buff_len = GetBufferFreeSpece(p);
290311 if (buff_len == 0) {
291312 // バッファに空きがない
292313 return;
@@ -350,19 +371,21 @@
350371 const BYTE *send_ptr = (BYTE *)&p->send_ptr[p->send_index];
351372 p->send_index += send_len;
352373 p->send_left -= send_len;
353- size_t sended_len;
354374 if (p->type == SendMemTypeBinary) {
355- sended_len = CommBinaryBuffOut(p->cv_, (PCHAR)send_ptr, (int)send_len);
375+ if (p->send_host_enable) {
376+ CommBinaryBuffOut(p->cv_, (PCHAR)send_ptr, (int)send_len);
377+ }
356378 if (p->local_echo_enable) {
357379 CommTextEcho(p->cv_, (PCHAR)send_ptr, (int)send_len);
358380 }
359381 }
360382 else {
361- sended_len = CommTextOutW(p->cv_, (wchar_t *)send_ptr, (int)(send_len / sizeof(wchar_t)));
383+ if (p->send_host_enable) {
384+ CommTextOutW(p->cv_, (wchar_t *)send_ptr, (int)(send_len / sizeof(wchar_t)));
385+ }
362386 if (p->local_echo_enable) {
363387 CommTextEchoW(p->cv_, (wchar_t *)send_ptr, (int)(send_len / sizeof(wchar_t)));
364388 }
365- sended_len *= sizeof(wchar_t);
366389 }
367390
368391 // ダイアログ更新
@@ -382,12 +405,16 @@
382405 }
383406
384407 /*
385- * 改行コードをLF(0x0a)だけにする
408+ * 文字列の改行コードをCR(0x0d)だけにする
386409 *
387- * @param [in] *src 文字列へのポインタ
388- * @param [in] *len 入力文字列長(0のとき内部で文字列長を測る)
389- * @param [out] *len 出力文字列長
410+ * @param [in] *src 入力文字列へのポインタ
411+ * @param [in] *len 入力文字列長(0のとき内部で文字列長を測る,L'\0'も変換される)
412+ * @param [out] *len 出力文字列長(入力文字列の最後のL'\0'も含む)
390413 * @return 変換後文字列(mallocされた領域)
414+ *
415+ * 入力文字列長の指定がある時
416+ * 入力文字列の途中で L'\0' が見つかったら、そこで変換を終了する
417+ * 見つからないときは入力文字数分変換(最後にL'\0'は付加されない)
391418 */
392419 static wchar_t *NormalizeLineBreak(const wchar_t *src, size_t *len)
393420 {
@@ -397,6 +424,7 @@
397424 }
398425 wchar_t *dest_top = (wchar_t *)malloc(sizeof(wchar_t) * src_len);
399426 if (dest_top == NULL) {
427+ *len = 0;
400428 return NULL;
401429 }
402430
@@ -406,18 +434,28 @@
406434 const wchar_t *p = src;
407435 const wchar_t *p_end = src + src_len;
408436 wchar_t *dest = dest_top;
409- while (p < p_end) {
437+ while (p <= p_end) {
410438 wchar_t c = *p++;
411439 if (c == CR) {
412440 if (*p == LF) {
413- // CR+LF -> LF
441+ // CR+LF -> CR
414442 p++;
415- *dest++ = LF;
443+ *dest++ = CR;
416444 } else {
417- // CR -> LF
418- *dest++ = LF;
445+ // CR -> CR
446+ *dest++ = CR;
419447 }
420- } else {
448+ }
449+ else if (c == LF) {
450+ // LF -> CR
451+ *dest++ = CR;
452+ }
453+ else if (c == 0) {
454+ // EOSを見つけたときは打ち切る
455+ *dest++ = 0;
456+ break;
457+ }
458+ else {
421459 *dest++ = c;
422460 }
423461 }
@@ -445,6 +483,7 @@
445483
446484 p->type = SendMemTypeBinary;
447485 p->local_echo_enable = FALSE;
486+ p->send_host_enable = TRUE;
448487 p->delay_type = SENDMEM_DELAYTYPE_NO_DELAY;
449488 p->send_size_max = 0;
450489 p->delay_per_char = 0; // (ms)
@@ -463,8 +502,9 @@
463502 *
464503 * @param ptr データへポインタ(malloc()された領域)
465504 * 送信後(中断後)、自動的にfree()される
466- * @param len 文字列長(wchar_t単位)
467- * 0 の場合は L'\0' まで
505+ * @param len 文字数(wchar_t単位)
506+ * L'\0' は送信されない
507+ * 0 の場合は L'\0' の前まで (wcslen(str_w))
468508 */
469509 SendMem *SendMemTextW(wchar_t *str, size_t len)
470510 {
@@ -474,12 +514,30 @@
474514 }
475515
476516 if (len == 0) {
517+ // L'\0' は送信しないので +1 は不要
477518 len = wcslen(str);
478519 }
479520
480521 // 改行コードを調整しておく
481522 size_t new_len = len;
482- p->send_ptr = (BYTE *)NormalizeLineBreak((wchar_t *)str, &new_len);
523+ wchar_t *new_str = NormalizeLineBreak((wchar_t *)str, &new_len);
524+ if (new_str == NULL || new_len == 0) {
525+ // 変換できなかった?(変換長さ0?)
526+ if (new_str != NULL) {
527+ free(new_str);
528+ }
529+ SendMemFinish(p);
530+ return NULL;
531+ }
532+ if (new_str[new_len-1] == 0) {
533+ // remove EOS
534+ new_len--;
535+ if (new_len == 0){
536+ SendMemFinish(p);
537+ return NULL;
538+ }
539+ }
540+ p->send_ptr = (BYTE *)new_str;
483541 p->send_len = new_len * sizeof(wchar_t);
484542 free(str);
485543 p->type = SendMemTypeTextLF;
@@ -507,11 +565,28 @@
507565 return p;
508566 }
509567
568+/**
569+ * ローカルエコー
570+ *
571+ * @param echo FALSE エコーしない(デフォルト)
572+ * TRUE エコーする
573+ */
510574 void SendMemInitEcho(SendMem *sm, BOOL echo)
511575 {
512576 sm->local_echo_enable = echo;
513577 }
514578
579+/**
580+ * ホスト(接続先)へ送信する
581+ *
582+ * @param send_host TRUE 送信する(デフォルト)
583+ * FALSE 送信しない
584+ */
585+void SendMemInitSend(SendMem *sm, BOOL send_host)
586+{
587+ sm->send_host_enable = send_host;
588+}
589+
515590 void SendMemInitDelay(SendMem *sm, SendMemDelayType type, DWORD delay_tick, size_t send_max)
516591 {
517592 switch (type) {
--- trunk/teraterm/teraterm/sendmem.h (revision 8787)
+++ trunk/teraterm/teraterm/sendmem.h (revision 8788)
@@ -45,6 +45,7 @@
4545 SendMem *SendMemTextW(wchar_t *ptr, size_t len);
4646 SendMem *SendMemBinary(void *ptr, size_t len);
4747 void SendMemInitEcho(SendMem *sm, BOOL echo);
48+void SendMemInitSend(SendMem *sm, BOOL echo_only);
4849 void SendMemInitDelay(SendMem *sm, SendMemDelayType delay_type, DWORD delay_tick, size_t send_max);
4950 void SendMemInitDialog(SendMem *sm, HINSTANCE hInstance, HWND hWndParent, const char *UILanguageFile);
5051 void SendMemInitDialogCaption(SendMem *sm, const wchar_t *caption);
--- trunk/teraterm/teraterm/ttdde.c (revision 8787)
+++ trunk/teraterm/teraterm/ttdde.c (revision 8788)
@@ -1,6 +1,6 @@
11 /*
22 * Copyright (C) 1994-1998 T. Teranishi
3- * (C) 2004-2019 TeraTerm Project
3+ * (C) 2004-2020 TeraTerm Project
44 * All rights reserved.
55 *
66 * Redistribution and use in source and binary forms, with or without
@@ -36,15 +36,15 @@
3636 #include "ttwinman.h"
3737 #include "ttftypes.h"
3838 #include "filesys.h"
39-#include "clipboar.h"
4039 #include "ttsetup.h"
4140 #include "telnet.h"
4241 #include "ttlib.h"
4342 #include "keyboard.h"
44-
4543 #include "ttdde.h"
4644 #include "ttddecmnd.h"
4745 #include "commlib.h"
46+#include "sendmem.h"
47+#include "codeconv.h"
4848
4949 #include "vtwin.h"
5050
@@ -310,7 +310,17 @@
310310
311311 DataPtr = DdeAccessData(Data,&DataSize);
312312 if (DataPtr==NULL) return DDE_FNOTPROCESSED;
313- CBStartSend(DataPtr, DataSize, FALSE);
313+ {
314+ wchar_t *strW = ToWcharU8(DataPtr);
315+ if (strW != NULL) {
316+ SendMem *sm = SendMemTextW(strW, 0);
317+ if (sm != NULL) {
318+ SendMemInitEcho(sm, FALSE);
319+ SendMemInitDelay(sm, SENDMEM_DELAYTYPE_PER_LINE, 10, 0);
320+ SendMemStart(sm);
321+ }
322+ }
323+ }
314324 DdeUnaccessData(Data);
315325 if (TalkStatus==IdTalkCB)
316326 return (HDDEDATA)DDE_FACK;
@@ -975,9 +985,18 @@
975985 SetMulticastName(ParamFileName);
976986 break;
977987
978- case CmdDispStr:
979- CBStartSend(ParamFileName, sizeof(ParamFileName), TRUE);
988+ case CmdDispStr: {
989+ wchar_t *strW = ToWcharU8(ParamFileName);
990+ if (strW != NULL) {
991+ SendMem *sm = SendMemTextW(strW, 0);
992+ if (sm != NULL) {
993+ SendMemInitEcho(sm, TRUE);
994+ SendMemInitSend(sm, FALSE);
995+ SendMemStart(sm);
996+ }
997+ }
980998 break;
999+ }
9811000
9821001 case CmdLogInfo:
9831002 if (LogVar) {
--- trunk/teraterm/ttpmacro/ttl.cpp (revision 8787)
+++ trunk/teraterm/ttpmacro/ttl.cpp (revision 8788)
@@ -3657,13 +3657,7 @@
36573657 if (GetString(Str,&Err))
36583658 {
36593659 if (Err!=0) return Err;
3660-#if 0
36613660 DDEOut(Str);
3662-#else
3663- const char *StrA = ToCharU8(Str);
3664- DDEOut((PCHAR)StrA);
3665- free((void *)StrA);
3666-#endif
36673661 }
36683662 else if (GetExpression(&ValType,&Val,&Err))
36693663 {
Show on old repository browser