diff --git a/TTProxy/ProxyWSockHook.h b/TTProxy/ProxyWSockHook.h index a571a641e..be2725d51 100644 --- a/TTProxy/ProxyWSockHook.h +++ b/TTProxy/ProxyWSockHook.h @@ -471,7 +471,7 @@ class ProxyWSockHook { in_addr addr; struct in6_addr addr6; char* buffer; - DWORD time; + ULONGLONG time; ConnectionInfo(ProxyInfo& proxy, String realhost):proxy(proxy), realhost(realhost), buffer(NULL) { } ~ConnectionInfo() { @@ -664,7 +664,7 @@ class ProxyWSockHook { ConnectionInfo* info = table.get(url); ::LeaveCriticalSection(§ion); if (info != NULL) { - info->time = ::GetTickCount(); + info->time = ::GetTickCount64(); return info; } ProxyInfo proxy; @@ -688,8 +688,8 @@ class ProxyWSockHook { } } if (i >= countof(list)) { - DWORD now = ::GetTickCount(); - DWORD max = 0; + ULONGLONG now = ::GetTickCount64(); + ULONGLONG max = 0; int index = -1; for (i = 0; i < countof(list); i++) { if (list[i] != NULL) { @@ -709,7 +709,7 @@ class ProxyWSockHook { info->addr6.s6_addr[11] = 0xff; info->addr6.s6_addr[15] = i + 1; - info->time = ::GetTickCount(); + info->time = ::GetTickCount64(); return info; } }; diff --git a/doc/en/html/macro/command/uptime64.html b/doc/en/html/macro/command/uptime64.html new file mode 100644 index 000000000..06a900d5f --- /dev/null +++ b/doc/en/html/macro/command/uptime64.html @@ -0,0 +1,69 @@ + + + + + uptime64 + + + + + + + +

uptime64

+ +

+Gets System Up Time. (version 5.7.0 or later) +

+ +
+int64 <var>
+uptime64 <var>
+
+ +

Remarks

+ +

+Retrieves the number of milliseconds that have elapsed since the Windows OS was started, +and then stores the value into the <int64var> variable. +

+ +

+The time is valid after the system is run continuously for 49.7 days. +

+ + +

Example

+ +
+; How to get the uptime in Windows
+int64 var
+uptime64 var
+day = var / 86400000
+var = var % 86400000
+hour = var / 3600000
+var = var % 3600000
+min = var / 60000
+var = var % 60000
+sec = var / 1000
+
+sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec
+messagebox str "uptime"
+
+ +
+int64 varstart
+int64 varend
+uptime64 varstart
+
+; do something...
+
+uptime64 varend
+diff = varend - varstart
+sprintf2 str "MACRO running time: %d msec" diff
+messagebox str "running time"
+
+ + + diff --git a/doc/en/teraterm.hhc b/doc/en/teraterm.hhc index 21144538b..8fd5b586b 100644 --- a/doc/en/teraterm.hhc +++ b/doc/en/teraterm.hhc @@ -1991,6 +1991,11 @@ +
  • + + + +
  • diff --git a/doc/en/teraterm.hhp b/doc/en/teraterm.hhp index 7d8d437fd..2918c08af 100644 --- a/doc/en/teraterm.hhp +++ b/doc/en/teraterm.hhp @@ -395,6 +395,7 @@ HlpMacroCommandToupper=html\macro\command\toupper.html HlpMacroCommandUnlink=html\macro\command\unlink.html HlpMacroCommandUntil=html\macro\command\until.html HlpMacroCommandUptime=html\macro\command\uptime.html +HlpMacroCommandUptime64=html\macro\command\uptime64.html HlpMacroCommandVar2clipb=html\macro\command\var2clipb.html HlpMacroCommandWait=html\macro\command\wait.html HlpMacroCommandWait4all=html\macro\command\wait4all.html diff --git a/doc/ja/html/macro/command/uptime64.html b/doc/ja/html/macro/command/uptime64.html new file mode 100644 index 000000000..6de1bea1b --- /dev/null +++ b/doc/ja/html/macro/command/uptime64.html @@ -0,0 +1,68 @@ + + + + + uptime64 + + + + + + + +

    uptime64

    + +

    +OS‚̉ғ­ŽžŠÔ‚ðŽæ“¾‚·‚éB(ƒo[ƒWƒ‡ƒ“5.7.0ˆÈ~) +

    + +
    +int64 <var>
    +uptime64 <var>
    +
    + +

    ‰ðà

    + +

    +Windows OS‚̉ғ­ŽžŠÔiƒ~ƒŠ•bj‚ð <int64var> ‚ÉŠi”[‚·‚éB +

    + +

    +¦‰Ò“­ŽžŠÔ‚ª49“ú‚ðŒo‰ß‚µ‚Ä‚à—LŒø +

    + + +

    —á

    + +
    +; How to get the uptime in Windows
    +int64 var
    +uptime64 var
    +day = var / 86400000
    +var = var % 86400000
    +hour = var / 3600000
    +var = var % 3600000
    +min = var / 60000
    +var = var % 60000
    +sec = var / 1000
    +
    +sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec
    +messagebox str "uptime"
    +
    + +
    +int64 varstart
    +int64 varend
    +uptime64 varstart
    +
    +; do something...
    +
    +uptime64 varend
    +diff = varend - varstart
    +sprintf2 str "MACRO running time: %d msec" diff
    +messagebox str "running time"
    +
    + + + diff --git a/doc/ja/teraterm.hhc b/doc/ja/teraterm.hhc index edf9456bf..71004fdd4 100644 --- a/doc/ja/teraterm.hhc +++ b/doc/ja/teraterm.hhc @@ -2014,6 +2014,11 @@
    +
  • + + + +
  • diff --git a/doc/ja/teraterm.hhp b/doc/ja/teraterm.hhp index 606aa5146..df886a30b 100755 --- a/doc/ja/teraterm.hhp +++ b/doc/ja/teraterm.hhp @@ -401,6 +401,7 @@ HlpMacroCommandToupper=html\macro\command\toupper.html HlpMacroCommandUnlink=html\macro\command\unlink.html HlpMacroCommandUntil=html\macro\command\until.html HlpMacroCommandUptime=html\macro\command\uptime.html +HlpMacroCommandUptime64=html\macro\command\uptime64.html HlpMacroCommandVar2clipb=html\macro\command\var2clipb.html HlpMacroCommandWait=html\macro\command\wait.html HlpMacroCommandWait4all=html\macro\command\wait4all.html diff --git a/teraterm/common/compat_win.cpp b/teraterm/common/compat_win.cpp index 50697632c..5dee78c74 100644 --- a/teraterm/common/compat_win.cpp +++ b/teraterm/common/compat_win.cpp @@ -239,7 +239,7 @@ static HWND WINAPI GetConsoleWindowLocal(void) } // Format a "unique" NewWindowTitle. - wsprintfA(pszNewWindowTitle, "%d/%d", GetTickCount(), GetCurrentProcessId()); + wsprintfA(pszNewWindowTitle, "%I64u/%d", GetTickCount64(), GetCurrentProcessId()); // Change current window title. SetConsoleTitleA(pszNewWindowTitle); diff --git a/teraterm/common/dlglib.c b/teraterm/common/dlglib.c index 25e515aec..164f46e90 100644 --- a/teraterm/common/dlglib.c +++ b/teraterm/common/dlglib.c @@ -153,13 +153,14 @@ void SetDlgPercent(HWND HDlg, int id_Item, int id_Progress, LONG a, LONG b, int } } -void SetDlgTime(HWND HDlg, int id_Item, DWORD stime, int bytes) +void SetDlgTime(HWND HDlg, int id_Item, ULONGLONG stime, int bytes) { - static int prev_elapsed; - int elapsed, rate; + static ULONGLONG prev_elapsed; + ULONGLONG elapsed; + int rate; wchar_t buff[64]; - elapsed = (GetTickCount() - stime) / 1000; + elapsed = (GetTickCount64() - stime) / 1000; if (elapsed == 0) { prev_elapsed = 0; @@ -172,15 +173,15 @@ void SetDlgTime(HWND HDlg, int id_Item, DWORD stime, int bytes) } prev_elapsed = elapsed; - rate = bytes / elapsed; + rate = (int)(bytes / elapsed); if (rate < 1200) { - _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%d:%02d (%dBytes/s)", elapsed / 60, elapsed % 60, rate); + _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%llu:%02llu (%dBytes/s)", elapsed / 60, elapsed % 60, rate); } else if (rate < 1200000) { - _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%d:%02d (%d.%02dKB/s)", elapsed / 60, elapsed % 60, rate / 1000, rate / 10 % 100); + _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%llu:%02llu (%d.%02dKB/s)", elapsed / 60, elapsed % 60, rate / 1000, rate / 10 % 100); } else { - _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%d:%02d (%d.%02dMB/s)", elapsed / 60, elapsed % 60, rate / (1000 * 1000), rate / 10000 % 100); + _snwprintf_s(buff, _countof(buff), _TRUNCATE, L"%llu:%02llu (%d.%02dMB/s)", elapsed / 60, elapsed % 60, rate / (1000 * 1000), rate / 10000 % 100); } SetDlgItemTextW(HDlg, id_Item, buff); diff --git a/teraterm/common/dlglib.h b/teraterm/common/dlglib.h index ad5989da4..66c82bf60 100644 --- a/teraterm/common/dlglib.h +++ b/teraterm/common/dlglib.h @@ -44,7 +44,7 @@ void SetRB(HWND HDlg, int R, int FirstId, int LastId); void GetRB(HWND HDlg, LPWORD R, int FirstId, int LastId); void SetDlgNum(HWND HDlg, int id_Item, LONG Num); void SetDlgPercent(HWND HDlg, int id_Item, int id_Progress, LONG a, LONG b, int *prog); -void SetDlgTime(HWND HDlg, int id_Item, DWORD elapsed, int bytes); +void SetDlgTime(HWND HDlg, int id_Item, ULONGLONG elapsed, int bytes); void SetDropDownList(HWND HDlg, int Id_Item, const char *List[], int nsel); void SetDropDownListW(HWND HDlg, int Id_Item, const wchar_t *List[], int nsel); LONG GetCurSel(HWND HDlg, int Id_Item); diff --git a/teraterm/common/helpid.h b/teraterm/common/helpid.h index efec090d0..95df25e46 100644 --- a/teraterm/common/helpid.h +++ b/teraterm/common/helpid.h @@ -429,6 +429,7 @@ #define HlpMacroCommandUnlink 92099 #define HlpMacroCommandUntil 92128 #define HlpMacroCommandUptime 92212 +#define HlpMacroCommandUptime64 92213 #define HlpMacroCommandVar2clipb 92114 #define HlpMacroCommandWait 92100 #define HlpMacroCommandWait4all 92148 diff --git a/teraterm/common/ttlib.c b/teraterm/common/ttlib.c index 12d865a08..dab3e45c4 100644 --- a/teraterm/common/ttlib.c +++ b/teraterm/common/ttlib.c @@ -956,24 +956,24 @@ char *mctimelocal(const char *format, BOOL utc_flag) * @return çµŒéŽæ™‚é–“ã®æ–‡å­—列 * ä¸è¦ã«ãªã£ãŸã‚‰free()ã™ã‚‹ã“㨠*/ -char *strelapsed(DWORD start_time) +char *strelapsed(ULONGLONG start_time) { size_t sizeof_strtime = 20; char *strtime = malloc(sizeof_strtime); int days, hours, minutes, seconds, msecs; - DWORD delta = GetTickCount() - start_time; + ULONGLONG delta = GetTickCount64() - start_time; - msecs = delta % 1000; + msecs = (int)(delta % 1000); delta /= 1000; - seconds = delta % 60; + seconds = (int)(delta % 60); delta /= 60; - minutes = delta % 60; + minutes = (int)(delta % 60); delta /= 60; - hours = delta % 24; - days = delta / 24; + hours = (int)(delta % 24); + days = (int)(delta / 24); _snprintf_s(strtime, sizeof_strtime, _TRUNCATE, "%d %02d:%02d:%02d.%03d", diff --git a/teraterm/common/ttlib.h b/teraterm/common/ttlib.h index 498cc4823..13492cb0e 100644 --- a/teraterm/common/ttlib.h +++ b/teraterm/common/ttlib.h @@ -137,7 +137,7 @@ DllExport BOOL HasMultiMonitorSupport(); DllExport BOOL HasDnsQuery(); DllExport BOOL HasBalloonTipSupport(); DllExport char *mctimelocal(const char *format, BOOL utc_flag); -char *strelapsed(DWORD start_time); +char *strelapsed(ULONGLONG start_time); void b64encode(PCHAR dst, int dsize, PCHAR src, int len); DllExport int b64decode(PCHAR dst, int dsize, PCHAR src); diff --git a/teraterm/common/tttypes.h b/teraterm/common/tttypes.h index 530f76778..1c9394787 100644 --- a/teraterm/common/tttypes.h +++ b/teraterm/common/tttypes.h @@ -869,7 +869,7 @@ typedef struct { void *NotifyIcon; - DWORD ConnectedTime; + ULONGLONG ConnectedTime; void (*Log1Byte)(BYTE b); void (*Log1Bin)(BYTE b); diff --git a/teraterm/teraterm/buffer.c b/teraterm/teraterm/buffer.c index 4a196fc26..71ce82cca 100644 --- a/teraterm/teraterm/buffer.c +++ b/teraterm/teraterm/buffer.c @@ -115,7 +115,7 @@ static BOOL BoxSelect; // TRUE=çŸ©å½¢é¸æŠž / FALSE=è¡Œé¸æŠž static POINT ClickCell; // クリックã—ãŸæ–‡å­—cell static POINT SelectStartOld; // æç”»ã—ãŸé¸æŠžé ˜åŸŸã€start static POINT SelectEndOld; // æç”»ã—ãŸé¸æŠžé ˜åŸŸã€end -static DWORD SelectStartTime; +static ULONGLONG SelectStartTime; static POINT DblClkStart; static POINT DblClkEnd; @@ -4749,7 +4749,7 @@ void BuffStartSelect(int Xw, int Yw, BOOL Box, BOOL Shift) Selected = FALSE; // é¸æŠžé–‹å§‹ã‚¬ãƒ¼ãƒ‰ - SelectStartTime = GetTickCount(); + SelectStartTime = GetTickCount64(); Selecting = FALSE; // pushä½ç½® @@ -4778,7 +4778,7 @@ void BuffChangeSelect(int Xw, int Yw, int NClick) if (!Selecting) { // é¸æŠžã‚¬ãƒ¼ãƒ‰? - if (GetTickCount() - SelectStartTime < ts.SelectStartDelay) { + if (GetTickCount64() - SelectStartTime < ts.SelectStartDelay) { // ガード中 return; } @@ -4889,7 +4889,7 @@ void BuffEndSelect(int Xw, int Yw) (void)Xw; (void)Yw; if (!Selecting) { - if (GetTickCount() - SelectStartTime < ts.SelectStartDelay) { + if (GetTickCount64() - SelectStartTime < ts.SelectStartDelay) { // ガード時間以内ãªã‚‰ // é¸æŠžé ˜åŸŸè§£é™¤ SelectEnd = SelectStart; diff --git a/teraterm/teraterm/commlib.c b/teraterm/teraterm/commlib.c index 7a9942ddf..92c5125ff 100644 --- a/teraterm/teraterm/commlib.c +++ b/teraterm/teraterm/commlib.c @@ -805,7 +805,7 @@ void CommStart(PComVar cv, LONG lParam, PTTSet ts) break; } cv->Ready = TRUE; - cv->ConnectedTime = GetTickCount(); + cv->ConnectedTime = GetTickCount64(); } BOOL CommCanClose(PComVar cv) diff --git a/teraterm/teraterm/filesys.cpp b/teraterm/teraterm/filesys.cpp index 70472fc85..cdcfc59aa 100644 --- a/teraterm/teraterm/filesys.cpp +++ b/teraterm/teraterm/filesys.cpp @@ -66,7 +66,7 @@ typedef struct { LONG FileSize; // uint64_t FileSize; TODO LONG ByteCount; // uint64_t ByteCount; - DWORD StartTime; + ULONGLONG StartTime; BOOL FilePause; BOOL FileRetrySend, FileRetryEcho, FileCRSend, FileReadEOF, BinaryMode; @@ -118,7 +118,7 @@ static BOOL OpenFTDlg(PFileVar fv) free(DlgCaption); fv->FilePause = FALSE; - fv->StartTime = GetTickCount(); + fv->StartTime = GetTickCount64(); fv->SendDlg = FTDlg; /* File send */ return TRUE; diff --git a/teraterm/teraterm/filesys_log.cpp b/teraterm/teraterm/filesys_log.cpp index 26eb3ddf6..70e7ca54d 100644 --- a/teraterm/teraterm/filesys_log.cpp +++ b/teraterm/teraterm/filesys_log.cpp @@ -69,7 +69,7 @@ typedef struct { LONG FileSize; // ? 使ã£ã¦ã„ãªã„ LONG ByteCount; // ファイルサイズ - DWORD StartTime; + ULONGLONG StartTime; enum enumLineEnd eLineEnd; @@ -406,7 +406,7 @@ static BOOL LogStart(PFileVar fv, const wchar_t *fname) } fv->IsPause = FALSE; - fv->StartTime = GetTickCount(); + fv->StartTime = GetTickCount64(); if (ts.DeferredLogWriteMode) { StartThread(fv); diff --git a/teraterm/teraterm/filesys_proto.cpp b/teraterm/teraterm/filesys_proto.cpp index ec9ce6b77..dd36acc20 100644 --- a/teraterm/teraterm/filesys_proto.cpp +++ b/teraterm/teraterm/filesys_proto.cpp @@ -92,7 +92,7 @@ static PFileVarProto FileVar = NULL; static PProtoDlg PtDlg = NULL; static BOOL cv_ProtoFlag = FALSE; -static void _SetDlgTime(TFileVarProto *fv, DWORD elapsed, int bytes) +static void _SetDlgTime(TFileVarProto *fv, ULONGLONG elapsed, int bytes) { SetDlgTime(fv->HWin, IDC_PROTOELAPSEDTIME, elapsed, bytes); } diff --git a/teraterm/teraterm/filesys_proto.h b/teraterm/teraterm/filesys_proto.h index 0936ec6ec..8933d3ff7 100644 --- a/teraterm/teraterm/filesys_proto.h +++ b/teraterm/teraterm/filesys_proto.h @@ -153,7 +153,7 @@ typedef TFileVarProto *PFileVarProto; // UIãªã©æƒ…報表示用関数 typedef struct InfoOp_ { void (*InitDlgProgress)(struct FileVarProto *fv, int *CurProgStat); - void (*SetDlgTime)(struct FileVarProto *fv, DWORD elapsed, int bytes); + void (*SetDlgTime)(struct FileVarProto *fv, ULONGLONG elapsed, int bytes); void (*SetDlgPacketNum)(struct FileVarProto *fv, LONG Num); void (*SetDlgByteCount)(struct FileVarProto *fv, LONG Num); void (*SetDlgPercent)(struct FileVarProto *fv, LONG a, LONG b, int *p); diff --git a/teraterm/teraterm/ftdlg.cpp b/teraterm/teraterm/ftdlg.cpp index 66009075c..214d93250 100644 --- a/teraterm/teraterm/ftdlg.cpp +++ b/teraterm/teraterm/ftdlg.cpp @@ -151,13 +151,13 @@ void CFileTransDlg::ChangeButton(BOOL PauseFlag) } } -void CFileTransDlg::RefreshNum(DWORD StartTime, LONG FileSize, LONG ByteCount) +void CFileTransDlg::RefreshNum(ULONGLONG StartTime, LONG FileSize, LONG ByteCount) { char NumStr[24]; double rate; int rate2; - static DWORD prev_elapsed; - DWORD elapsed; + static ULONGLONG prev_elapsed; + ULONGLONG elapsed; if (OpId == OpSendFile) { if (StartTime == 0) { @@ -165,17 +165,17 @@ void CFileTransDlg::RefreshNum(DWORD StartTime, LONG FileSize, LONG ByteCount) prev_elapsed = 0; } else { - elapsed = (GetTickCount() - StartTime) / 1000; + elapsed = (GetTickCount64() - StartTime) / 1000; if (elapsed != prev_elapsed && elapsed != 0) { - rate2 = ByteCount / elapsed; + rate2 = (int)(ByteCount / elapsed); if (rate2 < 1200) { - _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%d:%02d (%dBytes/s)", elapsed / 60, elapsed % 60, rate2); + _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%llu:%02llu (%dBytes/s)", elapsed / 60, elapsed % 60, rate2); } else if (rate2 < 1200000) { - _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%d:%02d (%d.%02dKB/s)", elapsed / 60, elapsed % 60, rate2 / 1000, rate2 / 10 % 100); + _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%llu:%02llu (%d.%02dKB/s)", elapsed / 60, elapsed % 60, rate2 / 1000, rate2 / 10 % 100); } else { - _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%d:%02d (%d.%02dMB/s)", elapsed / 60, elapsed % 60, rate2 / (1000*1000), rate2 / 10000 % 100); + _snprintf_s(NumStr, sizeof(NumStr), _TRUNCATE, "%llu:%02llu (%d.%02dMB/s)", elapsed / 60, elapsed % 60, rate2 / (1000*1000), rate2 / 10000 % 100); } SetDlgItemText(IDC_TRANS_ETIME, NumStr); prev_elapsed = elapsed; diff --git a/teraterm/teraterm/ftdlg.h b/teraterm/teraterm/ftdlg.h index 5283598c4..6d3e83444 100644 --- a/teraterm/teraterm/ftdlg.h +++ b/teraterm/teraterm/ftdlg.h @@ -57,7 +57,7 @@ class CFileTransDlg : public TTCDialog BOOL Create(HINSTANCE hInstance, Info *info); void ChangeButton(BOOL PauseFlag); - void RefreshNum(DWORD StartTime, LONG FileSize, LONG ByteCount); + void RefreshNum(ULONGLONG StartTime, LONG FileSize, LONG ByteCount); private: virtual BOOL OnCancel(); diff --git a/teraterm/teraterm/ftdlg_lite.cpp b/teraterm/teraterm/ftdlg_lite.cpp index 44558e98e..1461ef283 100644 --- a/teraterm/teraterm/ftdlg_lite.cpp +++ b/teraterm/teraterm/ftdlg_lite.cpp @@ -174,8 +174,8 @@ class PrivateData : public TTCDialog BOOL Pause; BOOL check_2sec; BOOL show; - DWORD prev_elapsed; - DWORD StartTime; + ULONGLONG prev_elapsed; + ULONGLONG StartTime; BOOL HideDialog; CFileTransLiteDlg::Observer *observer_; @@ -215,7 +215,7 @@ BOOL CFileTransLiteDlg::Create(HINSTANCE hInstance, HWND hParent, const wchar_t } pData->SetDlgItemTextA(IDC_TRANS_ETIME, "0:00"); - pData->StartTime = GetTickCount(); + pData->StartTime = GetTickCount64(); pData->prev_elapsed = 0; return Ok; @@ -232,10 +232,10 @@ void CFileTransLiteDlg::RefreshNum(size_t ByteCount, size_t FileSize) return; } - const DWORD now = GetTickCount(); + const ULONGLONG now = GetTickCount64(); if (!pData->check_2sec) { - DWORD elapsed_ms = now - pData->StartTime; + ULONGLONG elapsed_ms = now - pData->StartTime; if (elapsed_ms > 2 * 1000) { // 2secçµŒéŽ pData->check_2sec = TRUE; @@ -247,10 +247,10 @@ void CFileTransLiteDlg::RefreshNum(size_t ByteCount, size_t FileSize) } char NumStr[24]; - DWORD elapsed = (now - pData->StartTime) / 1000; + ULONGLONG elapsed = (now - pData->StartTime) / 1000; if (elapsed != pData->prev_elapsed && elapsed != 0) { char elapsed_str[24]; - _snprintf_s(elapsed_str, sizeof(elapsed_str), _TRUNCATE, "%ld:%02ld", + _snprintf_s(elapsed_str, sizeof(elapsed_str), _TRUNCATE, "%llu:%02llu", elapsed / 60, elapsed % 60); char speed_str[24]; diff --git a/teraterm/teraterm/sendmem.cpp b/teraterm/teraterm/sendmem.cpp index 615299de2..465b609f5 100644 --- a/teraterm/teraterm/sendmem.cpp +++ b/teraterm/teraterm/sendmem.cpp @@ -82,7 +82,7 @@ typedef struct SendMemTag { size_t send_left; size_t send_index; BOOL waited; - DWORD last_send_tick; + ULONGLONG last_send_tick; // CFileTransLiteDlg *dlg; class SendMemDlgObserver *dlg_observer; @@ -377,7 +377,7 @@ void SendMemContinuously(void) } if (p->waited) { - if (GetTickCount() - p->last_send_tick < p->delay_tick) { + if (GetTickCount64() - p->last_send_tick < p->delay_tick) { // ウエイトã™ã‚‹ return; } @@ -518,7 +518,7 @@ void SendMemContinuously(void) if (p->send_left != 0 && need_delay) { // waitã«å…¥ã‚‹ p->waited = TRUE; - p->last_send_tick = GetTickCount(); + p->last_send_tick = GetTickCount64(); // タイマーã¯idleを動作ã•ã›ã‚‹ãŸã‚ã«ä½¿ç”¨ã—ã¦ã„ã‚‹ SetTimer(p->hWnd, p->timer_id, p->delay_tick, NULL); } diff --git a/teraterm/teraterm/teraterm.cpp b/teraterm/teraterm/teraterm.cpp index 49c118b0a..902af9ff3 100644 --- a/teraterm/teraterm/teraterm.cpp +++ b/teraterm/teraterm/teraterm.cpp @@ -398,7 +398,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, MSG msg; for (;;) { // idle状態ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãªã„å ´åˆ - DWORD idle_enter_tick = GetTickCount(); + ULONGLONG idle_enter_tick = GetTickCount64(); BOOL sleep_enable = FALSE; for (;;) { // idle処ç†ã‚’行ㆠ@@ -412,7 +412,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, if (!continue_idle) { // FALSEãŒæˆ»ã£ã¦ããŸã‚‰idle処ç†ã¯ä¸è¦ if (!sleep_enable) { - if (GetTickCount() - idle_enter_tick > 20) { + if (GetTickCount64() - idle_enter_tick > 20) { // 20ms以上idle処ç†ä¸è¦ã ã£ãŸã‚‰Sleep()を入れる sleep_enable = TRUE; } @@ -423,7 +423,7 @@ int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInst, lCount = 0; } else { - idle_enter_tick = GetTickCount(); + idle_enter_tick = GetTickCount64(); sleep_enable = FALSE; } diff --git a/teraterm/teraterm/vtterm.c b/teraterm/teraterm/vtterm.c index bb1a8722e..dd41bd93f 100644 --- a/teraterm/teraterm/vtterm.c +++ b/teraterm/teraterm/vtterm.c @@ -196,8 +196,8 @@ static int FilterTop, FilterBottom, FilterLeft, FilterRight; static BOOL SavedIMEstatus; /* Beep over-used */ -static DWORD BeepStartTime = 0; -static DWORD BeepSuppressTime = 0; +static ULONGLONG BeepStartTime = 0; +static ULONGLONG BeepSuppressTime = 0; static DWORD BeepOverUsedCount = 0; static _locale_t CLocale = NULL; @@ -345,7 +345,7 @@ void ResetTerminal() /*reset variables but don't update screen */ LastPutCharacter = 0; // Beep over-used - BeepStartTime = GetTickCount(); + BeepStartTime = GetTickCount64(); BeepSuppressTime = BeepStartTime - ts.BeepSuppressTime * 1000; BeepStartTime -= (ts.BeepOverUsedTime * 1000); BeepOverUsedCount = ts.BeepOverUsedCount; @@ -5398,8 +5398,8 @@ int VTParse() while ((c>0) && (ChangeEmu==0)) { #if defined(DEBUG_DUMP_INPUTCODE) { - static DWORD prev_tick; - DWORD now = GetTickCount(); + static ULONGLONG prev_tick; + ULONGLONG now = GetTickCount64(); if (prev_tick == 0) prev_tick = now; if (now - prev_tick > 1*1000) { printf("\n"); @@ -5777,9 +5777,9 @@ static void VisualBell(void) static void RingBell(int type) { - DWORD now; + ULONGLONG now; - now = GetTickCount(); + now = GetTickCount64(); if (now - BeepSuppressTime < ts.BeepSuppressTime * 1000) { BeepSuppressTime = now; } diff --git a/teraterm/teraterm/vtwin.cpp b/teraterm/teraterm/vtwin.cpp index 00e7586cf..74722f60d 100644 --- a/teraterm/teraterm/vtwin.cpp +++ b/teraterm/teraterm/vtwin.cpp @@ -2207,7 +2207,7 @@ void CVTWindow::OnKeyDown(WPARAM nChar, UINT nRepCnt, UINT nFlags) #if UNICODE_DEBUG if (UnicodeDebugParam.CodePopupEnable) { - const DWORD now = GetTickCount(); + const ULONGLONG now = GetTickCount64(); switch(CtrlKeyState) { case 0: if (nChar == UnicodeDebugParam.CodePopupKey1) { diff --git a/teraterm/teraterm/vtwin.h b/teraterm/teraterm/vtwin.h index 05a5ee442..70a928df5 100644 --- a/teraterm/teraterm/vtwin.h +++ b/teraterm/teraterm/vtwin.h @@ -72,7 +72,7 @@ class CVTWindow : public TTCFrameWnd #if UNICODE_DEBUG TipWin *TipWinCodeDebug; int CtrlKeyState; // 0:é–‹å§‹/1:押ã™/2:離ã™/3:押ã™(表示状態) - DWORD CtrlKeyDownTick; // 最åˆã«æŠ¼ã—ãŸtick + ULONGLONG CtrlKeyDownTick; // 最åˆã«æŠ¼ã—ãŸtick #endif // TipWin diff --git a/teraterm/ttpfile/bplus.c b/teraterm/ttpfile/bplus.c index f85866fda..c63f1e3ef 100644 --- a/teraterm/ttpfile/bplus.c +++ b/teraterm/ttpfile/bplus.c @@ -80,7 +80,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -162,7 +162,7 @@ static BOOL BPInit(TProto *pv, PComVar cv, PTTSet ts) fv->InfoOp->SetDlgProtoText(fv, "B-Plus"); fv->InfoOp->InitDlgProgress(fv, &bv->ProgStat); - bv->StartTime = GetTickCount(); + bv->StartTime = GetTickCount64(); /* file name, file size */ if (bv->BPMode==IdBPSend) @@ -610,7 +610,7 @@ static BOOL FTCreateFile(PBPVar bv) if (bv->ProgStat != -1) { bv->ProgStat = 0; } - bv->StartTime = GetTickCount(); + bv->StartTime = GetTickCount64(); return TRUE; } diff --git a/teraterm/ttpfile/kermit.c b/teraterm/ttpfile/kermit.c index bda13abe4..0b50977e2 100644 --- a/teraterm/ttpfile/kermit.c +++ b/teraterm/ttpfile/kermit.c @@ -79,7 +79,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -1086,7 +1086,7 @@ static BOOL KmtSendNextFile(PKmtVar kv) kv->ByteCount = 0; kv->ProgStat = 0; - kv->StartTime = GetTickCount(); + kv->StartTime = GetTickCount64(); fv->InfoOp->SetDlgProtoFileName(fv, kv->FullName); fv->InfoOp->SetDlgByteCount(fv, kv->ByteCount); @@ -1191,7 +1191,7 @@ static BOOL KmtInit(TProto *pv, PComVar cv, PTTSet ts) if (kv->KmtMode == IdKmtSend) { fv->InfoOp->InitDlgProgress(fv, &kv->ProgStat); - kv->StartTime = GetTickCount(); + kv->StartTime = GetTickCount64(); } else { kv->ProgStat = -1; @@ -1347,7 +1347,7 @@ static BOOL FTCreateFile(PKmtVar kv) if (kv->ProgStat != -1) { kv->ProgStat = 0; } - kv->StartTime = GetTickCount(); + kv->StartTime = GetTickCount64(); return TRUE; } diff --git a/teraterm/ttpfile/quickvan.c b/teraterm/ttpfile/quickvan.c index 1b23bc9d4..df3ff364c 100644 --- a/teraterm/ttpfile/quickvan.c +++ b/teraterm/ttpfile/quickvan.c @@ -65,7 +65,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -192,7 +192,7 @@ static BOOL QVInit(TProto *pv, PComVar cv, PTTSet ts) fv->InfoOp->SetDlgProtoText(fv, "Quick-VAN"); fv->InfoOp->InitDlgProgress(fv, &qv->ProgStat); - qv->StartTime = GetTickCount(); + qv->StartTime = GetTickCount64(); qv->SeqNum = 0; qv->FileNum = 0; @@ -470,7 +470,7 @@ static BOOL FTCreateFile(PQVVar qv) if (qv->ProgStat != -1) { qv->ProgStat = 0; } - qv->StartTime = GetTickCount(); + qv->StartTime = GetTickCount64(); return TRUE; } @@ -930,7 +930,7 @@ static void QVSendVFILE(PQVVar qv) /* file no. */ qv->FileNum++; qv->ProgStat = 0; - qv->StartTime = GetTickCount(); + qv->StartTime = GetTickCount64(); i = 3; QVPutNum2(qv,qv->FileNum,&i); /* file name */ diff --git a/teraterm/ttpfile/raw.c b/teraterm/ttpfile/raw.c index 4617703c6..e55c05a82 100644 --- a/teraterm/ttpfile/raw.c +++ b/teraterm/ttpfile/raw.c @@ -38,7 +38,7 @@ typedef struct { const char *FullName; // Windows上ã®ãƒ•ァイルå UTF-8 BOOL FileOpen; LONG ByteCount; - DWORD StartTime; + ULONGLONG StartTime; PComVar cv; enum { STATE_FLUSH, // 処ç†é–‹å§‹æ™‚ã«å—信データをæ¨ã¦ã‚‹ @@ -148,12 +148,12 @@ static BOOL RawReadPacket(void *arg) PComVar cv = rv->cv; BYTE Buff[InBuffSize]; int BuffCount; - static DWORD prev_elapsed; - DWORD elapsed; + static ULONGLONG prev_elapsed; + ULONGLONG elapsed; if (cv->InBuffCount > 0) { if (rv->StartTime == 0) { - rv->StartTime = GetTickCount(); + rv->StartTime = GetTickCount64(); prev_elapsed = rv->StartTime; fv->InfoOp->SetDlgPacketNum(fv, 1); } @@ -166,7 +166,7 @@ static BOOL RawReadPacket(void *arg) LeaveCriticalSection(&cv->InBuff_lock); file->WriteFile(file, Buff, BuffCount); rv->ByteCount += BuffCount; - elapsed = (GetTickCount() - prev_elapsed) / 250; + elapsed = (GetTickCount64() - prev_elapsed) / 250; if (elapsed != prev_elapsed) { prev_elapsed = elapsed; fv->InfoOp->SetDlgByteCount(fv, rv->ByteCount); diff --git a/teraterm/ttpfile/xmodem.c b/teraterm/ttpfile/xmodem.c index 3c9ebddbb..4d9d2d4f5 100644 --- a/teraterm/ttpfile/xmodem.c +++ b/teraterm/ttpfile/xmodem.c @@ -80,7 +80,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -299,7 +299,7 @@ static BOOL XInit(TProto *pv, PComVar cv, PTTSet ts) xv->ProgStat = -1; } fv->InfoOp->SetDlgProtoFileName(fv, xv->FullName); - xv->StartTime = GetTickCount(); + xv->StartTime = GetTickCount64(); xv->PktNumOffset = 0; xv->PktNum = 0; diff --git a/teraterm/ttpfile/ymodem.c b/teraterm/ttpfile/ymodem.c index 013c53981..4cd412e8f 100644 --- a/teraterm/ttpfile/ymodem.c +++ b/teraterm/ttpfile/ymodem.c @@ -72,7 +72,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -341,7 +341,7 @@ static void initialize_file_info(PYVar yv) } else { yv->ProgStat = -1; } - yv->StartTime = GetTickCount(); + yv->StartTime = GetTickCount64(); fv->InfoOp->SetDlgProtoFileName(fv, yv->FullName); yv->PktNumOffset = 0; @@ -501,7 +501,7 @@ static BOOL FTCreateFile(PYVar yv) if (yv->ProgStat != -1) { yv->ProgStat = 0; } - yv->StartTime = GetTickCount(); + yv->StartTime = GetTickCount64(); return TRUE; } diff --git a/teraterm/ttpfile/zmodem.c b/teraterm/ttpfile/zmodem.c index 28d802a16..fb587b778 100644 --- a/teraterm/ttpfile/zmodem.c +++ b/teraterm/ttpfile/zmodem.c @@ -116,7 +116,7 @@ typedef struct { int ProgStat; - DWORD StartTime; + ULONGLONG StartTime; DWORD FileMtime; @@ -640,7 +640,7 @@ static void ZSendFileDat(PZVar zv) zv->ByteCount = 0; zv->ProgStat = 0; - zv->StartTime = GetTickCount(); + zv->StartTime = GetTickCount64(); fv->InfoOp->SetDlgByteCount(fv, zv->ByteCount); fv->InfoOp->SetDlgPercent(fv, zv->ByteCount, zv->FileSize, &zv->ProgStat); fv->InfoOp->SetDlgTime(fv, zv->StartTime, zv->ByteCount); @@ -746,7 +746,7 @@ static BOOL ZInit(TProto *pv, PComVar cv, PTTSet ts) fv->InfoOp->SetDlgProtoText(fv, "ZMODEM"); fv->InfoOp->InitDlgProgress(fv, &zv->ProgStat); - zv->StartTime = GetTickCount(); + zv->StartTime = GetTickCount64(); zv->FileSize = 0; zv->FileMtime = 0; @@ -1107,7 +1107,7 @@ static BOOL FTCreateFile(PZVar zv) if (zv->ProgStat != -1) { zv->ProgStat = 0; } - zv->StartTime = GetTickCount(); + zv->StartTime = GetTickCount64(); return TRUE; } @@ -1169,7 +1169,7 @@ static BOOL ZParseFile(PZVar zv) if (zv->FileSize > 0) fv->InfoOp->SetDlgPercent(fv, 0, zv->FileSize, &zv->ProgStat); - fv->InfoOp->SetDlgTime(fv, GetTickCount(), zv->ByteCount); + fv->InfoOp->SetDlgTime(fv, GetTickCount64(), zv->ByteCount); /* set timeout for data */ fv->FTSetTimeOut(fv, zv->TimeOut); diff --git a/teraterm/ttpmacro/ttl.cpp b/teraterm/ttpmacro/ttl.cpp index 8c3d6d8fa..06535c57a 100644 --- a/teraterm/ttpmacro/ttl.cpp +++ b/teraterm/ttpmacro/ttl.cpp @@ -81,7 +81,7 @@ static int EndIfFlag; static HWND HMainWin; // Timeout static DWORD TimeLimit; -static DWORD TimeStart; +static ULONGLONG TimeStart; // for 'WaitEvent' command static int WakeupCondition; @@ -961,7 +961,7 @@ static WORD TTLDispStr(void) TStrVal Str, buff; WORD Err; TVariableType ValType; - int Val; + long long Val; if (! Linked) return ErrLinkFirst; @@ -1577,7 +1577,7 @@ static WORD TTLFileLock(void) DWORD timeout; int result; BOOL ret; - DWORD dwStart; + ULONGLONG dwStart; Err = 0; GetIntVal(&fhi,&Err); @@ -1592,7 +1592,7 @@ static WORD TTLFileLock(void) timeout = timeoutI * 1000; result = 1; // error - dwStart = GetTickCount(); + dwStart = GetTickCount64(); do { ret = LockFile(FH, 0, 0, (DWORD)-1, (DWORD)-1); if (ret != 0) { // ロックæˆåŠŸ @@ -1600,7 +1600,7 @@ static WORD TTLFileLock(void) break; } Sleep(1); - } while (GetTickCount() - dwStart < (timeout*1000)); + } while (GetTickCount64() - dwStart < (timeout*1000)); SetResult(result); return Err; @@ -3074,7 +3074,7 @@ static WORD TTLIf(void) { WORD Err, Tmp, WId; TVariableType ValType; - int Val; + long long Val; if (! GetExpression(&ValType,&Val,&Err)) return ErrSyntax; @@ -3446,7 +3446,7 @@ static WORD TTLPause(void) { TTLStatus = IdTTLPause; TimeLimit = (DWORD)(TimeOut*1000); - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } return Err; @@ -3548,7 +3548,7 @@ static WORD TTLRecvLn(void) if (TimeOut>0) { TimeLimit = (DWORD)TimeOut; - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } @@ -3921,7 +3921,7 @@ static WORD GetParamStrings(void) TStrVal Str; WORD Err; TVariableType ValType; - int Val; + long long Val; BOOL EndOfLine; EndOfLine = FALSE; @@ -4033,7 +4033,7 @@ static WORD GetBroadcastString(char *buff, int bufflen, BOOL crlf) TStrVal Str; WORD Err; TVariableType ValType; - int Val; + long long Val; char tmp[3]; buff[0] = '\0'; @@ -5457,6 +5457,24 @@ static WORD TTLUnlink(void) } +// int64 varname — 64ビット整数変数ã®å®£è¨€ +static WORD TTLInt64Decl(void) +{ + WORD Err, WordId; + TVariableType VarType; + TName Name; + TVarId VarId; + + Err = 0; + if (! GetIdentifier(Name)) return ErrSyntax; + if (CheckReservedWord(Name, &WordId)) return ErrSyntax; + if (CheckVar(Name, &VarType, &VarId)) return ErrSyntax; + if (GetFirstChar() != 0) return ErrSyntax; + + if (! NewInt64Var(Name, 0)) return ErrTooManyVar; + return 0; +} + static WORD TTLUptime(void) { WORD Err; @@ -5469,16 +5487,32 @@ static WORD TTLUptime(void) Err = ErrSyntax; if (Err!=0) return Err; - // Windows OSãŒèµ·å‹•ã—ã¦ã‹ã‚‰ã®çµŒéŽæ™‚間(ミリ秒)をå–å¾—ã™ã‚‹ã€‚ãŸã ã—ã€49日を経éŽã™ã‚‹ã¨ã€0ã«æˆ»ã‚‹ã€‚ - // GetTickCount64() API(Vista以é™)を使ã†ã¨ã€ã‚ªãƒ¼ãƒãƒ¼ãƒ•ローã—ãªããªã‚‹ãŒã€ãã‚‚ãã‚‚Tera Termã§ã¯ - // 64bit変数をサãƒãƒ¼ãƒˆã—ã¦ã„ãªã„ã®ã§ã€æ„味ãŒãªã„。 - tick = GetTickCount(); + // Windows OSãŒèµ·å‹•ã—ã¦ã‹ã‚‰ã®çµŒéŽæ™‚間(ミリ秒)をå–å¾—ã™ã‚‹ã€‚ + // マクロ変数ã¯32bitã®ãŸã‚下ä½32bitã®ã¿æ ¼ç´ã™ã‚‹ã€‚ + tick = (DWORD)GetTickCount64(); SetIntVal(VarId, tick); return Err; } +static WORD TTLUptime64(void) +{ + WORD Err; + TVarId VarId; + + Err = 0; + GetIntVar(&VarId,&Err); + if ((Err==0) && (GetFirstChar()!=0)) + Err = ErrSyntax; + if (Err!=0) return Err; + + // int64変数ã«OSèµ·å‹•ã‹ã‚‰ã®çµŒéŽæ™‚間(ミリ秒)を64ãƒ“ãƒƒãƒˆã§æ ¼ç´ã™ã‚‹ã€‚ + SetIntVal(VarId, (long long)GetTickCount64()); + + return Err; +} + static WORD TTLWait(BOOL Ln) @@ -5487,7 +5521,8 @@ static WORD TTLWait(BOOL Ln) WORD Err; TVariableType ValType; TVarId VarId; - int i, Val; + int i; + long long Val; int TimeOut; ClearWait(); @@ -5533,7 +5568,7 @@ static WORD TTLWait(BOOL Ln) if (TimeOut>0) { TimeLimit = (DWORD)TimeOut; - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } } @@ -5603,7 +5638,7 @@ static WORD TTLWaitEvent(void) if (TimeOut>0) { TimeLimit = (DWORD)TimeOut; - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } @@ -5645,7 +5680,7 @@ static WORD TTLWaitN(void) if (TimeOut>0) { TimeLimit = (DWORD)TimeOut; - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } @@ -5685,7 +5720,7 @@ static WORD TTLWaitRecv(void) if (TimeOut>0) { TimeLimit = (DWORD)TimeOut; - TimeStart = GetTickCount(); + TimeStart = GetTickCount64(); SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL); } return Err; @@ -5897,7 +5932,7 @@ static int ExecCmnd(void) TStrVal Str; TName Cmnd; TVariableType ValType, VarType; - int Val; + long long Val; Err = 0; @@ -6185,6 +6220,8 @@ static int ExecCmnd(void) Err = TTLInputBox(FALSE); break; case RsvInt2Str: Err = TTLInt2Str(); break; + case RsvInt64: + Err = TTLInt64Decl(); break; case RsvIntDim: case RsvStrDim: Err = TTLDim(WId); break; @@ -6364,6 +6401,8 @@ static int ExecCmnd(void) Err = TTLWhile(FALSE); break; case RsvUptime: Err = TTLUptime(); break; + case RsvUptime64: + Err = TTLUptime64(); break; case RsvVar2Clipb: Err = TTLVar2Clipb(); break; // add 'var2clipb' (2006.9.17 maya) case RsvWaitRegex: @@ -6438,9 +6477,13 @@ static int ExecCmnd(void) } } if (Err) return Err; - if (VarType==ValType) { - switch (ValType) { - case TypInteger: SetIntVal(VarId,Val); break; + if (VarType==ValType || + (VarType==TypInteger && ValType==TypInteger64) || + (VarType==TypInteger64 && ValType==TypInteger)) { + switch (VarType) { + case TypInteger: + case TypInteger64: + SetIntVal(VarId,Val); break; case TypString: if (StrConst) SetStrVal(VarId,Str); @@ -6462,6 +6505,7 @@ static int ExecCmnd(void) else { switch (ValType) { case TypInteger: E = NewIntVar(Cmnd,Val); break; + case TypInteger64: E = NewInt64Var(Cmnd,Val); break; case TypString: if (StrConst) E = NewStrVar(Cmnd,Str); @@ -6559,17 +6603,8 @@ void SetResult(int ResultCode) BOOL CheckTimeout() { - BOOL ret; - DWORD TimeUp = (TimeStart+TimeLimit); - - if (TimeUp > TimeStart) { - ret = (GetTickCount() > TimeUp); - } - else { // for DWORD overflow (49.7 days) - DWORD TimeTmp = GetTickCount(); - ret = (TimeUp < TimeTmp && TimeTmp >= TimeStart); - } - return ret; + ULONGLONG TimeUp = TimeStart + TimeLimit; + return (GetTickCount64() > TimeUp); } BOOL TestWakeup(int Wakeup) diff --git a/teraterm/ttpmacro/ttmenc.c b/teraterm/ttpmacro/ttmenc.c index ff36bcc43..ff524f339 100644 --- a/teraterm/ttpmacro/ttmenc.c +++ b/teraterm/ttpmacro/ttmenc.c @@ -90,7 +90,7 @@ void Encrypt(const char *InStr, PCHAR OutStr) if (InStr[0]==0) { return; } - srand(LOWORD(GetTickCount())); + srand((unsigned)GetTickCount64()); r = (BYTE)(rand() & 0x3f); r2 = (~r) & 0x3f; OutStr[0] = r; diff --git a/teraterm/ttpmacro/ttmparse.cpp b/teraterm/ttpmacro/ttmparse.cpp index d24234cfc..970e1d7fc 100644 --- a/teraterm/ttpmacro/ttmparse.cpp +++ b/teraterm/ttpmacro/ttmparse.cpp @@ -74,6 +74,7 @@ typedef struct { union { char *Str; int Int; + long long Int64; TLab Lab; TIntAry IntAry; TStrAry StrAry; @@ -291,6 +292,7 @@ BOOL CheckReservedWord(PCHAR Str, LPWORD WordId) else if (_stricmp(Str,"include")==0) *WordId = RsvInclude ; else if (_stricmp(Str,"inputbox")==0) *WordId = RsvInputBox; else if (_stricmp(Str,"int2str")==0) *WordId = RsvInt2Str; + else if (_stricmp(Str,"int64")==0) *WordId = RsvInt64; else if (_stricmp(Str,"intdim")==0) *WordId = RsvIntDim; else if (_stricmp(Str,"ispassword")==0) *WordId = RsvIsPassword; // add 'ispassword' (2012.5.24 yutaka) else if (_stricmp(Str,"ispassword2")==0) *WordId = RsvIsPassword2; @@ -413,6 +415,7 @@ BOOL CheckReservedWord(PCHAR Str, LPWORD WordId) case 'u': if (_stricmp(Str,"unlink")==0) *WordId = RsvUnlink; else if (_stricmp(Str,"until")==0) *WordId = RsvUntil; + else if (_stricmp(Str,"uptime64")==0) *WordId = RsvUptime64; else if (_stricmp(Str,"uptime")==0) *WordId = RsvUptime; break; case 'v': @@ -815,7 +818,7 @@ BOOL GetString(PCHAR Str, LPWORD Err) return TRUE; } -BOOL GetNumber(int *Num) +BOOL GetNumber(long long *Num) { BYTE b; @@ -883,10 +886,17 @@ static Variable_t *NewVar(const char *name, TVariableType type) return v; } -BOOL NewIntVar(const char *Name, int InitVal) +BOOL NewIntVar(const char *Name, long long InitVal) { Variable_t *v = NewVar(Name, TypeInteger); - v->Value.Int = InitVal; + v->Value.Int = (int)InitVal; + return TRUE; +} + +BOOL NewInt64Var(const char *Name, long long InitVal) +{ + Variable_t *v = NewVar(Name, TypeInteger64); + v->Value.Int64 = InitVal; return TRUE; } @@ -976,7 +986,12 @@ void CopyLabel(WORD ILabel, BINT *Ptr, LPWORD Level) * Evaluate following operator. * not, ~, !, +(unary), -(unary) */ -static BOOL GetFactor(TVariableType *ValType, int *Val, LPWORD Err) +static BOOL IsIntType(TVariableType t) +{ + return t == TypInteger || t == TypInteger64; +} + +static BOOL GetFactor(TVariableType *ValType, long long *Val, LPWORD Err) { TName Name; WORD P, WId; @@ -988,7 +1003,7 @@ static BOOL GetFactor(TVariableType *ValType, int *Val, LPWORD Err) if (GetIdentifier(Name)) { if (CheckReservedWord(Name,&WId)) { if (GetFactor(ValType, Val, Err)) { - if ((*Err==0) && (*ValType!=TypInteger)) + if ((*Err==0) && (!IsIntType(*ValType))) *Err = ErrTypeMismatch; switch (WId) { case RsvBNot: *Val = ~(*Val); break; @@ -1005,6 +1020,9 @@ static BOOL GetFactor(TVariableType *ValType, int *Val, LPWORD Err) case TypInteger: *Val = Variables[VarId].Value.Int; break; + case TypInteger64: + *Val = Variables[VarId].Value.Int64; + break; case TypString: *Val = VarId; break; case TypIntArray: if (GetIndex(&Index, Err)) { @@ -1042,7 +1060,7 @@ static BOOL GetFactor(TVariableType *ValType, int *Val, LPWORD Err) *ValType = TypInteger; else if (GetOperator(&WId)) { if (GetFactor(ValType, Val, Err)) { - if ((*Err==0) && (*ValType != TypInteger)) + if ((*Err==0) && (!IsIntType(*ValType))) *Err = ErrTypeMismatch; switch (WId) { case RsvPlus: break; @@ -1078,11 +1096,11 @@ static BOOL GetFactor(TVariableType *ValType, int *Val, LPWORD Err) * Evaluate following operator. * *, /, % */ -static BOOL EvalMultiplication(TVariableType *ValType, int *Val, LPWORD Err) +static BOOL EvalMultiplication(TVariableType *ValType, long long *Val, LPWORD Err) { WORD P, Er; TVariableType Type; - int Val1, Val2; + long long Val1, Val2; WORD WId; if (! GetFactor(&Type, &Val1, &Er)) return FALSE; @@ -1090,7 +1108,7 @@ static BOOL EvalMultiplication(TVariableType *ValType, int *Val, LPWORD Err) *Val = Val1; *Err = Er; if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; + if (!IsIntType(Type)) return TRUE; while (TRUE) { P = LinePtr; @@ -1116,10 +1134,11 @@ static BOOL EvalMultiplication(TVariableType *ValType, int *Val, LPWORD Err) return TRUE; } - if (Type!=TypInteger) { + if (!IsIntType(Type)) { *Err = ErrTypeMismatch; return TRUE; } + if (Type == TypInteger64) *ValType = TypInteger64; if (Val2 == 0 && WId != RsvMul) { *Err = ErrDivByZero; @@ -1140,11 +1159,11 @@ static BOOL EvalMultiplication(TVariableType *ValType, int *Val, LPWORD Err) * Evaluate following operator. * +, - */ -static BOOL EvalAddition(TVariableType *ValType, int *Val, LPWORD Err) +static BOOL EvalAddition(TVariableType *ValType, long long *Val, LPWORD Err) { WORD P, Er; TVariableType Type; - int Val1, Val2; + long long Val1, Val2; WORD WId; if (! EvalMultiplication(&Type, &Val1, &Er)) return FALSE; @@ -1152,7 +1171,7 @@ static BOOL EvalAddition(TVariableType *ValType, int *Val, LPWORD Err) *Val = Val1; *Err = Er; if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; + if (!IsIntType(Type)) return TRUE; while (TRUE) { P = LinePtr; @@ -1177,10 +1196,11 @@ static BOOL EvalAddition(TVariableType *ValType, int *Val, LPWORD Err) return TRUE; } - if (Type!=TypInteger) { + if (!IsIntType(Type)) { *Err = ErrTypeMismatch; return TRUE; } + if (Type == TypInteger64) *ValType = TypInteger64; switch (WId) { case RsvPlus: Val1 = Val1 + Val2; break; @@ -1195,11 +1215,11 @@ static BOOL EvalAddition(TVariableType *ValType, int *Val, LPWORD Err) * Evaluate following operator. * >>, <<, >>> */ -static BOOL EvalBitShift(TVariableType *ValType, int *Val, LPWORD Err) +static BOOL EvalBitShift(TVariableType *ValType, long long *Val, LPWORD Err) { WORD P, Er; TVariableType Type; - int Val1, Val2; + long long Val1, Val2; WORD WId; if (! EvalAddition(&Type, &Val1, &Er)) return FALSE; @@ -1207,7 +1227,7 @@ static BOOL EvalBitShift(TVariableType *ValType, int *Val, LPWORD Err) *Val = Val1; *Err = Er; if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; + if (!IsIntType(Type)) return TRUE; while (TRUE) { P = LinePtr; @@ -1233,32 +1253,36 @@ static BOOL EvalBitShift(TVariableType *ValType, int *Val, LPWORD Err) return TRUE; } - if (Type!=TypInteger) { + if (!IsIntType(Type)) { *Err = ErrTypeMismatch; return TRUE; } + if (Type == TypInteger64) *ValType = TypInteger64; if (WId == RsvALShift) Val2 = -Val2; - if (Val2 <= -(int)INT_BIT) { /* Val2 <= -32 */ + const long long valbits = (*ValType == TypInteger64) ? 64 : (long long)INT_BIT; + if (Val2 <= -valbits) { Val1 = 0; - } else if (Val2 < 0 ) { /* -32 < Val2 < 0 */ + } else if (Val2 < 0) { Val1 = Val1 << -Val2; - } else if (Val2 == 0 ) { /* Val2 == 0 */ + } else if (Val2 == 0) { ; /* do nothing */ - } else if (Val2 < INT_BIT) { /* 0 < Val2 < 32 */ + } else if (Val2 < valbits) { if (WId == RsvLRShift) { - // use unsigned int for logical right shift - Val1 = (unsigned int)Val1 >> Val2; + if (*ValType == TypInteger64) + Val1 = (unsigned long long)Val1 >> Val2; + else + Val1 = (unsigned int)Val1 >> Val2; } else { Val1 = Val1 >> Val2; } - } else { /* Val2 >= 32 */ + } else { if (Val1 > 0 || WId == RsvLRShift) { Val1 = 0; } else { - Val1 = ~0; + Val1 = ~0LL; } } *Val = Val1; @@ -1270,11 +1294,11 @@ static BOOL EvalBitShift(TVariableType *ValType, int *Val, LPWORD Err) * Evaluate following operator. * & */ -static BOOL EvalBitAnd(TVariableType *ValType, int *Val, LPWORD Err) +static BOOL EvalBitAnd(TVariableType *ValType, long long *Val, LPWORD Err) { WORD P, Er; TVariableType Type; - int Val1, Val2; + long long Val1, Val2; WORD WId; if (! EvalBitShift(&Type, &Val1, &Er)) return FALSE; @@ -1282,7 +1306,7 @@ static BOOL EvalBitAnd(TVariableType *ValType, int *Val, LPWORD Err) *Val = Val1; *Err = Er; if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; + if (!IsIntType(Type)) return TRUE; while (TRUE) { P = LinePtr; @@ -1303,10 +1327,11 @@ static BOOL EvalBitAnd(TVariableType *ValType, int *Val, LPWORD Err) return TRUE; } - if (Type!=TypInteger) { + if (!IsIntType(Type)) { *Err = ErrTypeMismatch; return TRUE; } + if (Type == TypInteger64) *ValType = TypInteger64; Val1 = Val1 & Val2; *Val = Val1; @@ -1318,11 +1343,11 @@ static BOOL EvalBitAnd(TVariableType *ValType, int *Val, LPWORD Err) * Evaluate following operator. * ^ */ -static BOOL EvalBitXor(TVariableType *ValType, int *Val, LPWORD Err) +static BOOL EvalBitXor(TVariableType *ValType, long long *Val, LPWORD Err) { WORD P, Er; TVariableType Type; - int Val1, Val2; + long long Val1, Val2; WORD WId; if (! EvalBitAnd(&Type, &Val1, &Er)) return FALSE; @@ -1330,7 +1355,7 @@ static BOOL EvalBitXor(TVariableType *ValType, int *Val, LPWORD Err) *Val = Val1; *Err = Er; if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; + if (!IsIntType(Type)) return TRUE; while (TRUE) { P = LinePtr; @@ -1351,10 +1376,11 @@ static BOOL EvalBitXor(TVariableType *ValType, int *Val, LPWORD Err) return TRUE; } - if (Type!=TypInteger) { + if (!IsIntType(Type)) { *Err = ErrTypeMismatch; return TRUE; } + if (Type == TypInteger64) *ValType = TypInteger64; Val1 = Val1 ^ Val2; *Val = Val1; @@ -1366,11 +1392,11 @@ static BOOL EvalBitXor(TVariableType *ValType, int *Val, LPWORD Err) * Evaluate following operator. * | */ -static BOOL EvalBitOr(TVariableType *ValType, int *Val, LPWORD Err) +static BOOL EvalBitOr(TVariableType *ValType, long long *Val, LPWORD Err) { WORD P, Er; TVariableType Type; - int Val1, Val2; + long long Val1, Val2; WORD WId; if (! EvalBitXor(&Type, &Val1, &Er)) return FALSE; @@ -1378,7 +1404,7 @@ static BOOL EvalBitOr(TVariableType *ValType, int *Val, LPWORD Err) *Val = Val1; *Err = Er; if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; + if (!IsIntType(Type)) return TRUE; while (TRUE) { P = LinePtr; @@ -1399,10 +1425,11 @@ static BOOL EvalBitOr(TVariableType *ValType, int *Val, LPWORD Err) return TRUE; } - if (Type!=TypInteger) { + if (!IsIntType(Type)) { *Err = ErrTypeMismatch; return TRUE; } + if (Type == TypInteger64) *ValType = TypInteger64; Val1 = Val1 | Val2; *Val = Val1; @@ -1414,11 +1441,11 @@ static BOOL EvalBitOr(TVariableType *ValType, int *Val, LPWORD Err) * Evaluate following operator. * <, >, <=, >= */ -static BOOL EvalGreater(TVariableType *ValType, int *Val, LPWORD Err) +static BOOL EvalGreater(TVariableType *ValType, long long *Val, LPWORD Err) { WORD P, Er; TVariableType Type; - int Val1, Val2; + long long Val1, Val2; WORD WId; if (! EvalBitOr(&Type, &Val1, &Er)) return FALSE; @@ -1426,7 +1453,7 @@ static BOOL EvalGreater(TVariableType *ValType, int *Val, LPWORD Err) *Val = Val1; *Err = Er; if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; + if (!IsIntType(Type)) return TRUE; while (TRUE) { P = LinePtr; @@ -1453,7 +1480,7 @@ static BOOL EvalGreater(TVariableType *ValType, int *Val, LPWORD Err) return TRUE; } - if (Type!=TypInteger) { + if (!IsIntType(Type)) { *Err = ErrTypeMismatch; return TRUE; } @@ -1464,6 +1491,7 @@ static BOOL EvalGreater(TVariableType *ValType, int *Val, LPWORD Err) case RsvLE: Val1 = (Val1<=Val2); break; case RsvGE: Val1 = (Val1>=Val2); break; } + *ValType = TypInteger; *Val = Val1; } } @@ -1473,11 +1501,11 @@ static BOOL EvalGreater(TVariableType *ValType, int *Val, LPWORD Err) * Evaluate following operator. * =, ==, <>, != */ -static BOOL EvalEqual(TVariableType *ValType, int *Val, LPWORD Err) +static BOOL EvalEqual(TVariableType *ValType, long long *Val, LPWORD Err) { WORD P, Er; TVariableType Type; - int Val1, Val2; + long long Val1, Val2; WORD WId; if (! EvalGreater(&Type, &Val1, &Er)) return FALSE; @@ -1485,7 +1513,7 @@ static BOOL EvalEqual(TVariableType *ValType, int *Val, LPWORD Err) *Val = Val1; *Err = Er; if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; + if (!IsIntType(Type)) return TRUE; while (TRUE) { P = LinePtr; @@ -1510,7 +1538,7 @@ static BOOL EvalEqual(TVariableType *ValType, int *Val, LPWORD Err) return TRUE; } - if (Type!=TypInteger) { + if (!IsIntType(Type)) { *Err = ErrTypeMismatch; return TRUE; } @@ -1519,6 +1547,7 @@ static BOOL EvalEqual(TVariableType *ValType, int *Val, LPWORD Err) case RsvEQ: Val1 = (Val1==Val2); break; case RsvNE: Val1 = (Val1!=Val2); break; } + *ValType = TypInteger; *Val = Val1; } } @@ -1528,11 +1557,11 @@ static BOOL EvalEqual(TVariableType *ValType, int *Val, LPWORD Err) * Evaluate following operator. * && */ -static BOOL EvalLogicalAnd(TVariableType *ValType, int *Val, LPWORD Err) +static BOOL EvalLogicalAnd(TVariableType *ValType, long long *Val, LPWORD Err) { WORD P, Er; TVariableType Type; - int Val1, Val2; + long long Val1, Val2; WORD WId; if (! EvalEqual(&Type, &Val1, &Er)) return FALSE; @@ -1540,7 +1569,7 @@ static BOOL EvalLogicalAnd(TVariableType *ValType, int *Val, LPWORD Err) *Val = Val1; *Err = Er; if (Er) return TRUE; - if (Type!=TypInteger) return TRUE; + if (!IsIntType(Type)) return TRUE; while (TRUE) { P = LinePtr; @@ -1561,12 +1590,13 @@ static BOOL EvalLogicalAnd(TVariableType *ValType, int *Val, LPWORD Err) return TRUE; } - if (Type!=TypInteger) { + if (!IsIntType(Type)) { *Err = ErrTypeMismatch; return TRUE; } Val1 = Val1 && Val2; + *ValType = TypInteger; *Val = Val1; } } @@ -1576,11 +1606,11 @@ static BOOL EvalLogicalAnd(TVariableType *ValType, int *Val, LPWORD Err) * Evaluate following operator. * || */ -BOOL GetExpression(TVariableType *ValType, int *Val, LPWORD Err) +BOOL GetExpression(TVariableType *ValType, long long *Val, LPWORD Err) { WORD P1, P2, Er; TVariableType Type; - int Val1, Val2; + long long Val1, Val2; WORD WId; P1 = LinePtr; @@ -1595,7 +1625,7 @@ BOOL GetExpression(TVariableType *ValType, int *Val, LPWORD Err) LinePtr = P1; return TRUE; } - if (Type!=TypInteger) return TRUE; + if (!IsIntType(Type)) return TRUE; while (TRUE) { P2 = LinePtr; @@ -1618,7 +1648,7 @@ BOOL GetExpression(TVariableType *ValType, int *Val, LPWORD Err) return TRUE; } - if (Type!=TypInteger) { + if (!IsIntType(Type)) { *Err = ErrTypeMismatch; LinePtr = P1; return TRUE; @@ -1628,6 +1658,7 @@ BOOL GetExpression(TVariableType *ValType, int *Val, LPWORD Err) case RsvLOr: Val1 = Val1 || Val2; break; case RsvLXor: Val1 = (Val1 && !Val2) || (!Val1 && Val2); break; } + *ValType = TypInteger; *Val = Val1; } } @@ -1635,34 +1666,41 @@ BOOL GetExpression(TVariableType *ValType, int *Val, LPWORD Err) void GetIntVal(int *Val, LPWORD Err) { TVariableType ValType; + long long tmp = 0; UpdateLineParsePtr(); if (*Err != 0) return; - if (! GetExpression(&ValType,Val,Err)) + if (! GetExpression(&ValType, &tmp, Err)) { *Err = ErrSyntax; return; } if (*Err!=0) return; - if (ValType!=TypInteger) + if (ValType!=TypInteger && ValType!=TypInteger64) { *Err = ErrTypeMismatch; + return; + } + *Val = (int)tmp; } -void SetIntVal(TVarId VarId, int Val) +void SetIntVal(TVarId VarId, long long Val) { if (VarId >> 16) { Variable_t *v = &Variables[(VarId>>16)-1]; int *int_val = &v->Value.IntAry.val[VarId & 0xffff]; - *int_val = Val; + *int_val = (int)Val; } else { Variable_t *v = &Variables[VarId]; - v->Value.Int = Val; + if (v->Type == TypInteger64) + v->Value.Int64 = Val; + else + v->Value.Int = (int)Val; } } -int CopyIntVal(TVarId VarId) +long long CopyIntVal(TVarId VarId) { Variable_t *v; if (VarId >> 16) { @@ -1671,6 +1709,8 @@ int CopyIntVal(TVarId VarId) } else { v = &Variables[VarId]; + if (v->Type == TypInteger64) + return v->Value.Int64; return v->Value.Int; } } @@ -1687,6 +1727,7 @@ void GetIntVar(PVarId VarId, LPWORD Err) if (CheckVar(Name, &VarType, VarId)) { switch (VarType) { case TypInteger: + case TypInteger64: break; case TypIntArray: if (GetIndex(&Index, Err)) { @@ -1728,7 +1769,7 @@ void GetStrVal(PCHAR Str, LPWORD Err) void GetStrVal2(PCHAR Str, LPWORD Err, BOOL AutoConversion) { TVariableType VarType; - int VarId; + long long VarId; Str[0] = 0; if (*Err!=0) return; @@ -1742,8 +1783,9 @@ void GetStrVal2(PCHAR Str, LPWORD Err, BOOL AutoConversion) strncpy_s(Str, MaxStrLen, StrVarPtr((TVarId)VarId), _TRUNCATE); break; case TypInteger: + case TypInteger64: if (AutoConversion) - _snprintf_s(Str, MaxStrLen, _TRUNCATE, "%d", VarId); + _snprintf_s(Str, MaxStrLen, _TRUNCATE, "%lld", VarId); else *Err = ErrTypeMismatch; break; diff --git a/teraterm/ttpmacro/ttmparse.h b/teraterm/ttpmacro/ttmparse.h index c5bae13b2..5de9466bc 100644 --- a/teraterm/ttpmacro/ttmparse.h +++ b/teraterm/ttpmacro/ttmparse.h @@ -79,12 +79,14 @@ typedef enum { TypLabel = 4, TypIntArray = 5, TypStrArray = 6, + TypInteger64 = 7, TypeUnknown = TypUnknown, TypeInteger = TypInteger, TypeString = TypString, TypeLabel = TypLabel, TypeIntArray = TypIntArray, TypeStrArray = TypStrArray, + TypeInteger64 = TypInteger64, } TVariableType; #define RsvBeep 1 @@ -299,6 +301,8 @@ typedef enum { #define RsvGetTTPos 223 #define RsvSetSerialDelayChar 224 #define RsvSetSerialDelayLine 225 +#define RsvInt64 226 +#define RsvUptime64 227 #define RsvOperator 1000 #define RsvBNot 1001 @@ -359,17 +363,18 @@ BOOL CheckReservedWord(PCHAR Str, LPWORD WordId); BOOL GetLabelName(PCHAR Name); BOOL GetString(PCHAR Str, LPWORD Err); BOOL CheckVar(const char *Name, TVariableType *VarType, PVarId VarId); -BOOL NewIntVar(const char *Name, int InitVal); +BOOL NewIntVar(const char *Name, long long InitVal); +BOOL NewInt64Var(const char *Name, long long InitVal); BOOL NewStrVar(const char *Name, const char *InitVal); BOOL NewLabVar(const char *Name, BINT InitVal, WORD ILevel); int NewIntAryVar(const char *Name, int size); int NewStrAryVar(const char *Name, int size); void DelLabVar(WORD ILevel); void CopyLabel(WORD ILabel, BINT *Ptr, LPWORD Level); -BOOL GetExpression(TVariableType *ValType, int *Val, LPWORD Err); +BOOL GetExpression(TVariableType *ValType, long long *Val, LPWORD Err); void GetIntVal(int *Val, LPWORD Err); -void SetIntVal(TVarId VarId, int Val); -int CopyIntVal(TVarId VarId); +void SetIntVal(TVarId VarId, long long Val); +long long CopyIntVal(TVarId VarId); void GetIntVar(PVarId VarId, LPWORD Err); void GetStrVal(PCHAR Str, LPWORD Err); void GetStrVal2(PCHAR Str, LPWORD Err, BOOL AutoConversion); diff --git a/tests/int64_arith_test.ttl b/tests/int64_arith_test.ttl new file mode 100644 index 000000000..6cccdac3c --- /dev/null +++ b/tests/int64_arith_test.ttl @@ -0,0 +1,129 @@ +; int64 変数ã®ç®—術・比較テスト(接続ä¸è¦ï¼‰ +; +; 32ビットを超ãˆã‚‹å€¤ã‚’使ã£ã¦ int64 ã®ç®—術・比較㌠+; æ­£ã—ã動作ã™ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã€‚ +; +; ä½¿ã„æ–¹: Tera Term マクロã¨ã—ã¦å˜ä½“ã§å®Ÿè¡Œã™ã‚‹ï¼ˆæŽ¥ç¶šä¸è¦ï¼‰ +; +; テスト値: +; $7FFFFFFF = 2147483647 (32bit int ã®æœ€å¤§å€¤) +; $80000000 = 2147483648 (32bit ã§ã¯è² ã«ãªã‚‹ãŒ int64 ã§ã¯æ­£) +; $100000000 = 4294967296 (32bit ã§ã¯è¡¨ç¾ä¸å¯) + +int64 a +int64 b +int64 r + +; === 加算 === +; 2147483647 + 1 = 2147483648 (32bit ã§ã¯ã‚ªãƒ¼ãƒãƒ¼ãƒ•ロー) +a = $7FFFFFFF +b = 1 +r = a + b +if r <> $80000000 then + messagebox 'NG: 加算エラー ($7FFFFFFF + 1)' 'int64 test' + end +endif + +; 2147483648 + 2147483648 = 4294967296 +a = $80000000 +b = $80000000 +r = a + b +if r <> $100000000 then + messagebox 'NG: 加算エラー ($80000000 + $80000000)' 'int64 test' + end +endif + +; === 減算 === +; 2147483648 - 1 = 2147483647 +a = $80000000 +b = 1 +r = a - b +if r <> $7FFFFFFF then + messagebox 'NG: 減算エラー ($80000000 - 1)' 'int64 test' + end +endif + +; 4294967296 - 4294967295 = 1 +a = $100000000 +b = $FFFFFFFF +r = a - b +if r <> 1 then + messagebox 'NG: 減算エラー ($100000000 - $FFFFFFFF)' 'int64 test' + end +endif + +; === ä¹—ç®— === +; 100000 * 100000 = 10000000000 (> 2^32) +a = 100000 +b = 100000 +r = a * b +if r <> 10000000000 then + messagebox 'NG: 乗算エラー (100000 * 100000)' 'int64 test' + end +endif + +; === 除算 === +; 10000000000 / 100000 = 100000 +a = 10000000000 +b = 100000 +r = a / b +if r <> 100000 then + messagebox 'NG: 除算エラー (10000000000 / 100000)' 'int64 test' + end +endif + +; === 剰余 === +; 10000000001 % 100000 = 1 +a = 10000000001 +b = 100000 +r = a % b +if r <> 1 then + messagebox 'NG: 剰余エラー (10000000001 mod 100000)' 'int64 test' + end +endif + +; === 比較: < === +a = $7FFFFFFF +b = $80000000 +if a >= b then + messagebox 'NG: 比較エラー ($7FFFFFFF < $80000000)' 'int64 test' + end +endif + +; === 比較: > === +if b <= a then + messagebox 'NG: 比較エラー ($80000000 > $7FFFFFFF)' 'int64 test' + end +endif + +; === 比較: <= === +a = $80000000 +b = $80000000 +if a > b then + messagebox 'NG: 比較エラー ($80000000 <= $80000000)' 'int64 test' + end +endif + +; === 比較: >= === +if a < b then + messagebox 'NG: 比較エラー ($80000000 >= $80000000)' 'int64 test' + end +endif + +; === 比較: == === +if a <> b then + messagebox 'NG: 比較エラー ($80000000 == $80000000)' 'int64 test' + end +endif + +; === 比較: <> === +a = $7FFFFFFF +b = $80000000 +if a == b then + messagebox 'NG: 比較エラー ($7FFFFFFF <> $80000000)' 'int64 test' + end +endif + +messagebox 'OK: int64 算術・比較 å…¨ãƒ†ã‚¹ãƒˆåˆæ ¼' 'int64 test' + +end diff --git a/tests/uptime64.ttl b/tests/uptime64.ttl new file mode 100644 index 000000000..74402764b --- /dev/null +++ b/tests/uptime64.ttl @@ -0,0 +1,20 @@ +; uptime コマンドã®ãƒ†ã‚¹ãƒˆï¼ˆæŽ¥ç¶šä¸è¦ï¼‰ +; +; uptime64 ã®ãƒ˜ãƒ«ãƒ—ãŒå‹•作ã™ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ +; +; ä½¿ã„æ–¹: Tera Term マクロã¨ã—ã¦å˜ä½“ã§å®Ÿè¡Œã™ã‚‹ï¼ˆæŽ¥ç¶šä¸è¦ï¼‰ + +int64 var +uptime64 var +day = var / 86400000 +var = var % 86400000 +hour = var / 3600000 +var = var % 3600000 +min = var / 60000 +var = var % 60000 +sec = var / 1000 + +sprintf2 str "System Up Time: %d Days, %d Hours, %d Minutes, %d Seconds" day hour min sec +messagebox str "uptime" + +end diff --git a/tests/uptime64_test.ttl b/tests/uptime64_test.ttl new file mode 100644 index 000000000..2f96e86e4 --- /dev/null +++ b/tests/uptime64_test.ttl @@ -0,0 +1,41 @@ +; pause コマンドã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆãƒ†ã‚¹ãƒˆ +; +; GetTickCount64() ã¸ã®ç½®ãæ›ãˆå¾Œã€ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆæ©Ÿæ§‹ãŒ +; 正常動作ã™ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã€‚ +; OS èµ·å‹•ã‹ã‚‰ 49.7 日以上経éŽã—ãŸç’°å¢ƒã§ã‚‚æ­£ã—ã動作ã™ã‚‹ã“ã¨ã‚’想定。 +; +; ä½¿ã„æ–¹: Tera Term マクロã¨ã—ã¦å˜ä½“ã§å®Ÿè¡Œã™ã‚‹ï¼ˆæŽ¥ç¶šä¸è¦ï¼‰ +; +; uptime64 ã§ 64ビットã®çµŒéŽæ™‚é–“ã‚’å–å¾—ã—〠+; 49.7 日オーãƒãƒ¼ãƒ•ローã«ä¾å­˜ã—ãªã„çµŒéŽæ™‚間計測を行ã†ã€‚ + +int64 tick_start +int64 tick_end + +uptime64 tick_start + +; 3 ç§’é–“ pause ã™ã‚‹ +pause 3 + +uptime64 tick_end + +; çµŒéŽæ™‚間を計算(ミリ秒) +elapsed = tick_end - tick_start + +; 3000ms ±500ms 以内ã§ã‚ã‚‹ã“ã¨ã‚’ç¢ºèª +if elapsed < 2500 then + sprintf2 msg 'NG: pause ãŒæ—©ã™ãŽã‚‹ (%d ms)' elapsed + messagebox msg 'pause timeout test' + end +endif + +if elapsed > 3500 then + sprintf2 msg 'NG: pause ãŒé…ã™ãŽã‚‹ (%d ms)' elapsed + messagebox msg 'pause timeout test' + end +endif + +sprintf2 msg 'OK: pause ãŒæ­£å¸¸ã«å®Œäº†ã—㟠(%d ms)' elapsed +messagebox msg 'pause timeout test' + +end diff --git a/tests/uptime_test.ttl b/tests/uptime_test.ttl new file mode 100644 index 000000000..20719a12b --- /dev/null +++ b/tests/uptime_test.ttl @@ -0,0 +1,38 @@ +; uptime コマンドã®ãƒ†ã‚¹ãƒˆï¼ˆæŽ¥ç¶šä¸è¦ï¼‰ +; +; GetTickCount64() ã¸ã®ç½®ãæ›ãˆå¾Œã€uptime コマンド㌠+; 正常動作ã™ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã€‚ +; uptime 㯠OS èµ·å‹•ã‹ã‚‰ã®çµŒéŽæ™‚間(ミリ秒)ã®ä¸‹ä½ 32 ビットを +; int å¤‰æ•°ã«æ ¼ç´ã™ã‚‹ã€‚ +; +; ä½¿ã„æ–¹: Tera Term マクロã¨ã—ã¦å˜ä½“ã§å®Ÿè¡Œã™ã‚‹ï¼ˆæŽ¥ç¶šä¸è¦ï¼‰ + +uptime tick_start + +; 3 ç§’é–“ pause ã™ã‚‹ +pause 3 + +uptime tick_end + +; çµŒéŽæ™‚間を計算(ミリ秒) +; 注æ„: 32bit ã®ãŸã‚ 49.7 æ—¥ã§ã‚ªãƒ¼ãƒãƒ¼ãƒ•ローã™ã‚‹ãŒã€ +; 短時間ã®è¨ˆæ¸¬ã§ã¯å½±éŸ¿ãªã— +elapsed = tick_end - tick_start + +; 3000ms ±500ms 以内ã§ã‚ã‚‹ã“ã¨ã‚’ç¢ºèª +if elapsed < 2500 then + sprintf2 msg 'NG: pause ãŒæ—©ã™ãŽã‚‹ (%d ms)' elapsed + messagebox msg 'uptime test' + end +endif + +if elapsed > 3500 then + sprintf2 msg 'NG: pause ãŒé…ã™ãŽã‚‹ (%d ms)' elapsed + messagebox msg 'uptime test' + end +endif + +sprintf2 msg 'OK: pause ãŒæ­£å¸¸ã«å®Œäº†ã—㟠(%d ms)' elapsed +messagebox msg 'uptime test' + +end diff --git a/tests/wait_timeout_connected.ttl b/tests/wait_timeout_connected.ttl new file mode 100644 index 000000000..96c97ba94 --- /dev/null +++ b/tests/wait_timeout_connected.ttl @@ -0,0 +1,49 @@ +; wait コマンドã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆãƒ†ã‚¹ãƒˆï¼ˆæŽ¥ç¶šå¿…è¦ï¼‰ +; +; GetTickCount64() ã¸ã®ç½®ãæ›ãˆå¾Œã€wait コマンドã®ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆãŒ +; 正常動作ã™ã‚‹ã“ã¨ã‚’確èªã™ã‚‹ã€‚ +; OS èµ·å‹•ã‹ã‚‰ 49.7 日以上経éŽã—ãŸç’°å¢ƒã§ã‚‚æ­£ã—ã動作ã™ã‚‹ã“ã¨ã‚’想定。 +; +; ä½¿ã„æ–¹: SSH/Telnet ç­‰ã§ãƒ›ã‚¹ãƒˆã«æŽ¥ç¶šã—ãŸçŠ¶æ…‹ã§å®Ÿè¡Œã™ã‚‹ã€‚ +; +; uptime64 ã§ 64ビットã®çµŒéŽæ™‚é–“ã‚’å–å¾—ã—〠+; 49.7 日オーãƒãƒ¼ãƒ•ローã«ä¾å­˜ã—ãªã„çµŒéŽæ™‚間計測を行ã†ã€‚ + +int64 tick_start +int64 tick_end + +timeout = 3 + +uptime64 tick_start + +; 出ç¾ã—ãªã„文字列を wait ã§å¾…ã¡ã€3 ç§’ã§ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã•ã›ã‚‹ +wait 'XXXXXXXXXX_NEVER_APPEAR_XXXXXXXXXX' + +uptime64 tick_end + +; ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã§æŠœã‘ãŸã“ã¨ã‚’ç¢ºèª (result == 1) +if result <> 1 then + messagebox 'NG: wait ãŒã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—ãªã‹ã£ãŸ' 'wait timeout test' + end +endif + +; çµŒéŽæ™‚間を計算(ミリ秒) +elapsed = tick_end - tick_start + +; 3000ms ±500ms 以内ã§ã‚ã‚‹ã“ã¨ã‚’ç¢ºèª +if elapsed < 2500 then + sprintf2 msg 'NG: ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆãŒæ—©ã™ãŽã‚‹ (%d ms)' elapsed + messagebox msg 'wait timeout test' + end +endif + +if elapsed > 3500 then + sprintf2 msg 'NG: タイムアウトãŒé…ã™ãŽã‚‹ (%d ms)' elapsed + messagebox msg 'wait timeout test' + end +endif + +sprintf2 msg 'OK: wait ãŒæ­£å¸¸ã«ã‚¿ã‚¤ãƒ ã‚¢ã‚¦ãƒˆã—㟠(%d ms)' elapsed +messagebox msg 'wait timeout test' + +end diff --git a/ttssh2/ttxssh/ssh.c b/ttssh2/ttxssh/ssh.c index a898e8f38..c8eff7300 100644 --- a/ttssh2/ttxssh/ssh.c +++ b/ttssh2/ttxssh/ssh.c @@ -9039,24 +9039,24 @@ static INT_PTR CALLBACK ssh_scp_dlg_thread_proc(HWND hWnd, UINT msg, WPARAM wp, SendDlgItemMessage(hWnd, IDC_PROGBAR, PBM_SETPOS, (WPARAM)c->scp.ProgStat, 0); } - int elapsed = (GetTickCount() - c->scp.stime) / 1000; + ULONGLONG elapsed = (GetTickCount64() - c->scp.stime) / 1000; if (elapsed > c->scp.prev_elapsed) { if (elapsed > 2) { rate = (int)(transfered / elapsed); if (rate < 1200) { - _snprintf_s(s, sizeof(s), _TRUNCATE, "%d:%02d (%d %s)", elapsed / 60, elapsed % 60, rate, "Bytes/s"); + _snprintf_s(s, sizeof(s), _TRUNCATE, "%llu:%02llu (%d %s)", elapsed / 60, elapsed % 60, rate, "Bytes/s"); } else if (rate < 1200000) { - _snprintf_s(s, sizeof(s), _TRUNCATE, "%d:%02d (%d.%02d %s)", elapsed / 60, elapsed % 60, rate / 1000, rate / 10 % 100, "KBytes/s"); + _snprintf_s(s, sizeof(s), _TRUNCATE, "%llu:%02llu (%d.%02d %s)", elapsed / 60, elapsed % 60, rate / 1000, rate / 10 % 100, "KBytes/s"); } else { - _snprintf_s(s, sizeof(s), _TRUNCATE, "%d:%02d (%d.%02d %s)", elapsed / 60, elapsed % 60, rate / (1000 * 1000), rate / 10000 % 100, "MBytes/s"); + _snprintf_s(s, sizeof(s), _TRUNCATE, "%llu:%02llu (%d.%02d %s)", elapsed / 60, elapsed % 60, rate / (1000 * 1000), rate / 10000 % 100, "MBytes/s"); } } else { - _snprintf_s(s, sizeof(s), _TRUNCATE, "%d:%02d", elapsed / 60, elapsed % 60); + _snprintf_s(s, sizeof(s), _TRUNCATE, "%llu:%02llu", elapsed / 60, elapsed % 60); } SendDlgItemMessage(hWnd, IDC_PROGTIME, WM_SETTEXT, 0, (LPARAM)s); c->scp.prev_elapsed = elapsed; } - c->scp.ProcessedTime = GetTickCount(); + c->scp.ProcessedTime = GetTickCount64(); return FALSE; case WM_COMMAND: @@ -9137,7 +9137,7 @@ static unsigned __stdcall ssh_scp_dlg_thread(void *p) c->scp.prev_elapsed = 0; c->scp.filesndsize = 0; c->scp.canceled = FALSE; - c->scp.stime = GetTickCount(); + c->scp.stime = GetTickCount64(); c->scp.ProcessedTime = c->scp.stime; SetWindowLongPtr(hDlgWnd, GWLP_USERDATA, (LONG_PTR)c); SetTimer(hDlgWnd, c->self_id, SCPDLG_UPDATE_INTERVAL, NULL); @@ -9174,7 +9174,7 @@ static HANDLE start_ssh_scp_dlg_thread(Channel_t *c) // スレッド起動待㡠WaitForSingleObject(c->scp.ScpStartThreadEvent, 5000 /*msec*/); ResetEvent(c->scp.ScpStartThreadEvent); - c->scp.stime = GetTickCount(); + c->scp.stime = GetTickCount64(); return thread; } @@ -9241,7 +9241,7 @@ static unsigned __stdcall ssh_scp_thread(void *p) c->scp.filesndsize += ret; #if 1 // 高負è·å¯¾ç­– // 進æ—ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã®æç”»ãŒé–“ã«åˆã‚ãªã„å ´åˆã¯ã€è² è·ãŒä¸‹ãŒã‚‹ã¾ã§å¾…㤠- while (GetTickCount() - c->scp.ProcessedTime > SCPDLG_UPDATE_INTERVAL * 3) { + while (GetTickCount64() - c->scp.ProcessedTime > SCPDLG_UPDATE_INTERVAL * 3) { Sleep(20); if (pvar == NULL || pvar->socket == INVALID_SOCKET || c->scp.state == SCP_CLOSING || c->used == 0) { goto cancel_abort; @@ -9405,7 +9405,7 @@ static unsigned __stdcall ssh_scp_receive_thread(void *p) } #if 1 // 高負è·å¯¾ç­– // 進æ—ãƒ€ã‚¤ã‚¢ãƒ­ã‚°ã®æç”»ãŒé–“ã«åˆã‚ãªã„å ´åˆã¯ã€è² è·ãŒä¸‹ãŒã‚‹ã¾ã§å¾…㤠- while (GetTickCount() - c->scp.ProcessedTime > SCPDLG_UPDATE_INTERVAL * 3) { + while (GetTickCount64() - c->scp.ProcessedTime > SCPDLG_UPDATE_INTERVAL * 3) { Sleep(20); if (pvar == NULL || pvar->socket == INVALID_SOCKET || c->scp.state == SCP_CLOSING || c->used == 0) { goto cancel_abort; diff --git a/ttssh2/ttxssh/ssh.h b/ttssh2/ttxssh/ssh.h index cb027b041..adfe594b8 100644 --- a/ttssh2/ttxssh/ssh.h +++ b/ttssh2/ttxssh/ssh.h @@ -552,10 +552,10 @@ typedef struct scp { PTInstVar pvar; HANDLE ScpStartThreadEvent; BOOL canceled; - DWORD stime; - int prev_elapsed; + ULONGLONG stime; + ULONGLONG prev_elapsed; int ProgStat; - DWORD ProcessedTime; + ULONGLONG ProcessedTime; // for receiving file long long filetotalsize; long long filercvsize; diff --git a/ttssh2/ttxssh/ttxssh.c b/ttssh2/ttxssh/ttxssh.c index b2f1421ee..867cfa751 100644 --- a/ttssh2/ttxssh/ttxssh.c +++ b/ttssh2/ttxssh/ttxssh.c @@ -604,7 +604,7 @@ static unsigned short find_local_port(PTInstVar pvar) if we're unlucky). They do not need to be (and are not) cryptographically strong. */ - srand((unsigned) GetTickCount()); + srand((unsigned)GetTickCount64()); for (tries = 20; tries > 0; tries--) { memset(&hints, 0, sizeof(hints));