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/uptime.html b/doc/en/html/macro/command/uptime.html
index 94df65479..c3b74ab06 100644
--- a/doc/en/html/macro/command/uptime.html
+++ b/doc/en/html/macro/command/uptime.html
@@ -29,7 +29,8 @@
Remarks
-The time wraps around to zero if the system is run continuously for 49.7 days.
+Since version 5.7.0, the value is stored as a 64-bit integer,
+so it will not wrap around even if the system is run continuously for more than 49.7 days.
diff --git a/doc/en/html/macro/syntax/types.html b/doc/en/html/macro/syntax/types.html
index 311723a18..1583b71e2 100644
--- a/doc/en/html/macro/syntax/types.html
+++ b/doc/en/html/macro/syntax/types.html
@@ -17,7 +17,7 @@ Types
1) Integer
-Signed 32 bit, from -2147483648 to 2147483647.
+Signed 64 bit, from -9223372036854775808 to 9223372036854775807.
Floating point operation is not supported.
diff --git a/doc/ja/html/macro/command/uptime.html b/doc/ja/html/macro/command/uptime.html
index 6778ddc58..1684e29df 100644
--- a/doc/ja/html/macro/command/uptime.html
+++ b/doc/ja/html/macro/command/uptime.html
@@ -28,7 +28,7 @@
-※稼働時間が49日を経過すると、0に戻る。
+バージョン5.7.0以降は64ビット整数として格納するため、49日を超えても0に戻ることはない。
diff --git a/doc/ja/html/macro/syntax/types.html b/doc/ja/html/macro/syntax/types.html
index 0a6244817..3bc5747a4 100644
--- a/doc/ja/html/macro/syntax/types.html
+++ b/doc/ja/html/macro/syntax/types.html
@@ -17,7 +17,7 @@
1) 整数
-符号付き 32 bit、-2147483648から2147483647まで。
+符号付き 64 bit、-9223372036854775808から9223372036854775807まで。
浮動小数点は未サポート。
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/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 邨碁℃譎る俣縺ョ譁蟄怜
* 荳崎ヲ√↓縺ェ縺」縺溘ifree()縺吶k縺薙→
*/
-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; // 繧ッ繝ェ繝繧ッ縺励◆譁蟄幼ell
static POINT SelectStartOld; // 謠冗判縺励◆驕ク謚樣伜沺縲《tart
static POINT SelectEndOld; // 謠冗判縺励◆驕ク謚樣伜沺縲‘nd
-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繧貞虚菴懊&縺帙k縺溘a縺ォ菴ソ逕ィ縺励※縺繧
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縺梧綾縺」縺ヲ縺阪◆繧永dle蜃ヲ逅縺ッ荳崎ヲ
if (!sleep_enable) {
- if (GetTickCount() - idle_enter_tick > 20) {
+ if (GetTickCount64() - idle_enter_tick > 20) {
// 20ms莉・荳格dle蜃ヲ逅荳崎ヲ√□縺」縺溘iSleep()繧貞・繧後k
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..06b80ba12 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;
@@ -2318,12 +2318,12 @@ static WORD TTLFor(void)
{
WORD Err;
TVarId VarId;
- int ValStart, ValEnd, i;
+ long long ValStart, ValEnd, i;
Err = 0;
GetIntVar(&VarId,&Err);
- GetIntVal(&ValStart,&Err);
- GetIntVal(&ValEnd,&Err);
+ GetInt64Val(&ValStart,&Err);
+ GetInt64Val(&ValEnd,&Err);
if ((Err==0) && (GetFirstChar()!=0))
Err = ErrSyntax;
if (Err!=0) 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;
@@ -3131,18 +3131,18 @@ static WORD TTLInt2Str(void)
{
TVarId VarId;
WORD Err;
- int Num;
+ long long Num;
TStrVal Str2;
Err = 0;
GetStrVar(&VarId,&Err);
- GetIntVal(&Num,&Err);
+ GetInt64Val(&Num,&Err);
if ((Err==0) && (GetFirstChar()!=0))
Err = ErrSyntax;
if (Err!=0) return Err;
- _snprintf_s(Str2,sizeof(Str2),_TRUNCATE,"%d",Num);
+ _snprintf_s(Str2,sizeof(Str2),_TRUNCATE,"%lld",Num);
SetStrVal(VarId,Str2);
return Err;
@@ -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';
@@ -4408,7 +4408,8 @@ void TTLShowMINIMIZE(void)
static WORD TTLSprintf(int getvar)
{
TStrVal Fmt;
- int Num, NumWidth, NumPrecision;
+ long long Num;
+ int NumWidth, NumPrecision;
TStrVal Str;
WORD Err = 0, TmpErr;
TVarId VarId;
@@ -4620,19 +4621,40 @@ static WORD TTLSprintf(int getvar)
else {
// 謨ー蛟、縺ィ縺励※隱ュ繧√k縺九ヨ繝ゥ繧、
TmpErr = 0;
- GetIntVal(&Num, &TmpErr);
+ GetInt64Val(&Num, &TmpErr);
if (TmpErr == 0) {
- if (!width_asterisk && !precision_asterisk) {
- _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, Num);
- }
- else if (width_asterisk && !precision_asterisk) {
- _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, Num);
- }
- else if (!width_asterisk && precision_asterisk) {
- _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, Num);
- }
- else { // width_asterisk && precision_asterisk
- _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, Num);
+ // %d/%i/%o/%u/%x/%X 繧 %lld 遲峨↓螟画鋤縺励※ 64bit 蛟、繧呈ュ」縺励¥蜃コ蜉帙☆繧
+ char subFmt64[MaxStrLen];
+ int sflen = (int)strlen(subFmt);
+ char fspec = subFmt[sflen - 1];
+ if (fspec != 'c') {
+ _snprintf_s(subFmt64, sizeof(subFmt64), _TRUNCATE, "%.*sll%c", sflen - 1, subFmt, fspec);
+ if (!width_asterisk && !precision_asterisk) {
+ _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt64, Num);
+ }
+ else if (width_asterisk && !precision_asterisk) {
+ _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt64, NumWidth, Num);
+ }
+ else if (!width_asterisk && precision_asterisk) {
+ _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt64, NumPrecision, Num);
+ }
+ else { // width_asterisk && precision_asterisk
+ _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt64, NumWidth, NumPrecision, Num);
+ }
+ } else {
+ // %c 縺ッ int 縺ァ貂。縺
+ if (!width_asterisk && !precision_asterisk) {
+ _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, (int)Num);
+ }
+ else if (width_asterisk && !precision_asterisk) {
+ _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, (int)Num);
+ }
+ else if (!width_asterisk && precision_asterisk) {
+ _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumPrecision, (int)Num);
+ }
+ else { // width_asterisk && precision_asterisk
+ _snprintf_s(buf2, sizeof(buf2), _TRUNCATE, subFmt, NumWidth, NumPrecision, (int)Num);
+ }
}
}
else {
@@ -4718,7 +4740,7 @@ static WORD TTLStr2Int(void)
TVarId VarId;
WORD Err;
TStrVal Str;
- int Num;
+ long long Num;
Err = 0;
GetIntVar(&VarId,&Err);
@@ -4740,7 +4762,7 @@ static WORD TTLStr2Int(void)
// 10 : decimal
// 0x10, $10: hex
if (Str[0] == '0' && tolower(Str[1]) == 'x') {
- if (sscanf(Str,"%i",&Num)!=1)
+ if (sscanf(Str,"%lli",&Num)!=1)
{
Num = 0;
SetResult(0);
@@ -4749,7 +4771,7 @@ static WORD TTLStr2Int(void)
SetResult(1);
}
} else {
- if (sscanf(Str,"%d",&Num)!=1)
+ if (sscanf(Str,"%lld",&Num)!=1)
{
Num = 0;
SetResult(0);
@@ -5461,7 +5483,6 @@ static WORD TTLUptime(void)
{
WORD Err;
TVarId VarId;
- DWORD tick;
Err = 0;
GetIntVar(&VarId,&Err);
@@ -5469,12 +5490,7 @@ static WORD TTLUptime(void)
Err = ErrSyntax;
if (Err!=0) return Err;
- // Windows OS縺瑚オキ蜍輔@縺ヲ縺九i縺ョ邨碁℃譎る俣シ医Α繝ェ遘抵シ峨r蜿門セ励☆繧九ゅ◆縺縺励49譌・繧堤オ碁℃縺吶k縺ィ縲0縺ォ謌サ繧九
- // GetTickCount64() API(Vista莉・髯)繧剃スソ縺縺ィ縲√が繝シ繝舌シ繝輔Ο繝シ縺励↑縺上↑繧九′縲√◎繧ゅ◎繧5era Term縺ァ縺ッ
- // 64bit螟画焚繧偵し繝昴シ繝医@縺ヲ縺縺ェ縺縺ョ縺ァ縲∵э蜻ウ縺後↑縺縲
- tick = GetTickCount();
-
- SetIntVal(VarId, tick);
+ SetIntVal(VarId, (long long)GetTickCount64());
return Err;
}
@@ -5487,7 +5503,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 +5550,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 +5620,7 @@ static WORD TTLWaitEvent(void)
if (TimeOut>0)
{
TimeLimit = (DWORD)TimeOut;
- TimeStart = GetTickCount();
+ TimeStart = GetTickCount64();
SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
}
@@ -5645,7 +5662,7 @@ static WORD TTLWaitN(void)
if (TimeOut>0)
{
TimeLimit = (DWORD)TimeOut;
- TimeStart = GetTickCount();
+ TimeStart = GetTickCount64();
SetTimer(HMainWin, IdTimeOutTimer, TIMEOUT_TIMER_MS, NULL);
}
@@ -5685,7 +5702,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 +5914,7 @@ static int ExecCmnd(void)
TStrVal Str;
TName Cmnd;
TVariableType ValType, VarType;
- int Val;
+ long long Val;
Err = 0;
@@ -6439,8 +6456,9 @@ static int ExecCmnd(void)
}
if (Err) return Err;
if (VarType==ValType) {
- switch (ValType) {
- case TypInteger: SetIntVal(VarId,Val); break;
+ switch (VarType) {
+ case TypInteger:
+ SetIntVal(VarId,Val); break;
case TypString:
if (StrConst)
SetStrVal(VarId,Str);
@@ -6559,17 +6577,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..22a797243 100644
--- a/teraterm/ttpmacro/ttmparse.cpp
+++ b/teraterm/ttpmacro/ttmparse.cpp
@@ -73,7 +73,7 @@ typedef struct {
TVariableType Type;
union {
char *Str;
- int Int;
+ long long Int;
TLab Lab;
TIntAry IntAry;
TStrAry StrAry;
@@ -815,7 +815,7 @@ BOOL GetString(PCHAR Str, LPWORD Err)
return TRUE;
}
-BOOL GetNumber(int *Num)
+BOOL GetNumber(long long *Num)
{
BYTE b;
@@ -883,7 +883,7 @@ 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;
@@ -976,7 +976,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;
+}
+
+static BOOL GetFactor(TVariableType *ValType, long long *Val, LPWORD Err)
{
TName Name;
WORD P, WId;
@@ -988,7 +993,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;
@@ -1042,7 +1047,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 +1083,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 +1095,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,7 +1121,7 @@ static BOOL EvalMultiplication(TVariableType *ValType, int *Val, LPWORD Err)
return TRUE;
}
- if (Type!=TypInteger) {
+ if (!IsIntType(Type)) {
*Err = ErrTypeMismatch;
return TRUE;
}
@@ -1140,11 +1145,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 +1157,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,7 +1182,7 @@ static BOOL EvalAddition(TVariableType *ValType, int *Val, LPWORD Err)
return TRUE;
}
- if (Type!=TypInteger) {
+ if (!IsIntType(Type)) {
*Err = ErrTypeMismatch;
return TRUE;
}
@@ -1195,11 +1200,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 +1212,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,7 +1238,7 @@ static BOOL EvalBitShift(TVariableType *ValType, int *Val, LPWORD Err)
return TRUE;
}
- if (Type!=TypInteger) {
+ if (!IsIntType(Type)) {
*Err = ErrTypeMismatch;
return TRUE;
}
@@ -1241,24 +1246,24 @@ static BOOL EvalBitShift(TVariableType *ValType, int *Val, LPWORD Err)
if (WId == RsvALShift)
Val2 = -Val2;
- if (Val2 <= -(int)INT_BIT) { /* Val2 <= -32 */
+ const long long valbits = 64;
+ 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;
+ Val1 = (unsigned long long)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 +1275,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 +1287,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,7 +1308,7 @@ static BOOL EvalBitAnd(TVariableType *ValType, int *Val, LPWORD Err)
return TRUE;
}
- if (Type!=TypInteger) {
+ if (!IsIntType(Type)) {
*Err = ErrTypeMismatch;
return TRUE;
}
@@ -1318,11 +1323,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 +1335,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,7 +1356,7 @@ static BOOL EvalBitXor(TVariableType *ValType, int *Val, LPWORD Err)
return TRUE;
}
- if (Type!=TypInteger) {
+ if (!IsIntType(Type)) {
*Err = ErrTypeMismatch;
return TRUE;
}
@@ -1366,11 +1371,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 +1383,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,7 +1404,7 @@ static BOOL EvalBitOr(TVariableType *ValType, int *Val, LPWORD Err)
return TRUE;
}
- if (Type!=TypInteger) {
+ if (!IsIntType(Type)) {
*Err = ErrTypeMismatch;
return TRUE;
}
@@ -1414,11 +1419,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 +1431,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 +1458,7 @@ static BOOL EvalGreater(TVariableType *ValType, int *Val, LPWORD Err)
return TRUE;
}
- if (Type!=TypInteger) {
+ if (!IsIntType(Type)) {
*Err = ErrTypeMismatch;
return TRUE;
}
@@ -1464,6 +1469,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 +1479,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 +1491,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 +1516,7 @@ static BOOL EvalEqual(TVariableType *ValType, int *Val, LPWORD Err)
return TRUE;
}
- if (Type!=TypInteger) {
+ if (!IsIntType(Type)) {
*Err = ErrTypeMismatch;
return TRUE;
}
@@ -1519,6 +1525,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 +1535,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 +1547,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 +1568,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 +1584,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 +1603,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 +1626,7 @@ BOOL GetExpression(TVariableType *ValType, int *Val, LPWORD Err)
return TRUE;
}
- if (Type!=TypInteger) {
+ if (!IsIntType(Type)) {
*Err = ErrTypeMismatch;
LinePtr = P1;
return TRUE;
@@ -1628,18 +1636,40 @@ 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;
}
}
void GetIntVal(int *Val, LPWORD Err)
+{
+ TVariableType ValType;
+ long long tmp = 0;
+
+ UpdateLineParsePtr();
+
+ if (*Err != 0) return;
+ if (! GetExpression(&ValType, &tmp, Err))
+ {
+ *Err = ErrSyntax;
+ return;
+ }
+ if (*Err!=0) return;
+ if (ValType!=TypInteger) {
+ *Err = ErrTypeMismatch;
+ return;
+ }
+ *Val = (int)tmp;
+}
+
+void GetInt64Val(long long *Val, LPWORD Err)
{
TVariableType ValType;
UpdateLineParsePtr();
if (*Err != 0) return;
- if (! GetExpression(&ValType,Val,Err))
+ if (! GetExpression(&ValType, Val, Err))
{
*Err = ErrSyntax;
return;
@@ -1649,12 +1679,12 @@ void GetIntVal(int *Val, LPWORD Err)
*Err = ErrTypeMismatch;
}
-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];
@@ -1662,7 +1692,7 @@ void SetIntVal(TVarId VarId, int Val)
}
}
-int CopyIntVal(TVarId VarId)
+long long CopyIntVal(TVarId VarId)
{
Variable_t *v;
if (VarId >> 16) {
@@ -1728,7 +1758,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;
@@ -1743,7 +1773,7 @@ void GetStrVal2(PCHAR Str, LPWORD Err, BOOL AutoConversion)
break;
case TypInteger:
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..27ffe17a8 100644
--- a/teraterm/ttpmacro/ttmparse.h
+++ b/teraterm/ttpmacro/ttmparse.h
@@ -359,17 +359,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 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 GetInt64Val(long long *Val, LPWORD Err);
+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.ttl b/tests/int64.ttl
new file mode 100644
index 000000000..c288b21cb
--- /dev/null
+++ b/tests/int64.ttl
@@ -0,0 +1,14 @@
+; 謨エ謨ー蝙 64bit 諡。蠑オ縺ョ繝繧ケ繝茨シ域磁邯壻ク崎ヲシ
+;
+; sprintf2 縺ョ %d 縺ァ 64bit 蛟、縺梧ュ」縺励¥蜃コ蜉帙&繧後k縺薙→繧堤「コ隱阪☆繧
+;
+; 菴ソ縺譁ケ: Tera Term 繝槭け繝ュ縺ィ縺励※蜊倅ス薙〒螳溯。後☆繧具シ域磁邯壻ク崎ヲシ
+
+var = 2147483647
+var = var * 2147483647
+; var 縺ッ 4611686014132420609 (64bit 縺ァ豁」遒コ縺ォ陦ィ迴セ縺輔l繧)
+
+sprintf2 str "%d" var
+messagebox str "int64 test"
+
+end
diff --git a/tests/int64_arith_test.ttl b/tests/int64_arith_test.ttl
new file mode 100644
index 000000000..2b03ad6f8
--- /dev/null
+++ b/tests/int64_arith_test.ttl
@@ -0,0 +1,124 @@
+; 謨エ謨ー蝙 64bit 諡。蠑オ縺ョ邂苓。薙サ豈碑シ繝繧ケ繝茨シ域磁邯壻ク崎ヲシ
+;
+; 32繝薙ャ繝医r雜縺医k蛟、繧剃スソ縺」縺ヲ邂苓。薙サ豈碑シ縺梧ュ」縺励¥蜍穂ス懊☆繧九%縺ィ繧堤「コ隱阪☆繧九
+;
+; 菴ソ縺譁ケ: Tera Term 繝槭け繝ュ縺ィ縺励※蜊倅ス薙〒螳溯。後☆繧具シ域磁邯壻ク崎ヲシ
+;
+; 繝繧ケ繝亥、:
+; $7FFFFFFF = 2147483647 (32bit int 縺ョ譛螟ァ蛟、)
+; $80000000 = 2147483648 (32bit 縺ァ縺ッ雋縺ォ縺ェ繧九′ 64bit 縺ァ縺ッ豁」)
+; $100000000 = 4294967296 (32bit 縺ァ縺ッ陦ィ迴セ荳榊庄)
+
+; === 蜉邂 ===
+; 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 test'
+
+end
diff --git a/tests/uptime64.ttl b/tests/uptime64.ttl
new file mode 100644
index 000000000..b2025d434
--- /dev/null
+++ b/tests/uptime64.ttl
@@ -0,0 +1,17 @@
+; uptime 繧ウ繝槭Φ繝峨ョ繝繧ケ繝茨シ域磁邯壻ク崎ヲシ
+;
+; 菴ソ縺譁ケ: Tera Term 繝槭け繝ュ縺ィ縺励※蜊倅ス薙〒螳溯。後☆繧具シ域磁邯壻ク崎ヲシ
+
+uptime 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..b5595a38e
--- /dev/null
+++ b/tests/uptime64_test.ttl
@@ -0,0 +1,35 @@
+; pause 繧ウ繝槭Φ繝峨ョ繧ソ繧、繝繧「繧ヲ繝医ユ繧ケ繝
+;
+; GetTickCount64() 縺ク縺ョ鄂ョ縺肴鋤縺亥セ後√ち繧、繝繧「繧ヲ繝域ゥ滓ァ九′
+; 豁」蟶ク蜍穂ス懊☆繧九%縺ィ繧堤「コ隱阪☆繧九
+; OS 襍キ蜍輔°繧 49.7 譌・莉・荳顔オ碁℃縺励◆迺ー蠅縺ァ繧よュ」縺励¥蜍穂ス懊☆繧九%縺ィ繧呈Φ螳壹
+;
+; 菴ソ縺譁ケ: Tera Term 繝槭け繝ュ縺ィ縺励※蜊倅ス薙〒螳溯。後☆繧具シ域磁邯壻ク崎ヲシ
+
+uptime tick_start
+
+; 3 遘帝俣 pause 縺吶k
+pause 3
+
+uptime tick_end
+
+; 邨碁℃譎る俣繧定ィ育ョ暦シ医Α繝ェ遘抵シ
+elapsed = tick_end - tick_start
+
+; 3000ms ツア500ms 莉・蜀縺ァ縺ゅk縺薙→繧堤「コ隱
+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() 縺ク縺ョ鄂ョ縺肴鋤縺亥セ後「ptime 繧ウ繝槭Φ繝峨′
+; 豁」蟶ク蜍穂ス懊☆繧九%縺ィ繧堤「コ隱阪☆繧九
+; uptime 縺ッ OS 襍キ蜍輔°繧峨ョ邨碁℃譎る俣シ医Α繝ェ遘抵シ峨ョ荳倶ス 32 繝薙ャ繝医r
+; int 螟画焚縺ォ譬シ邏阪☆繧九
+;
+; 菴ソ縺譁ケ: Tera Term 繝槭け繝ュ縺ィ縺励※蜊倅ス薙〒螳溯。後☆繧具シ域磁邯壻ク崎ヲシ
+
+uptime tick_start
+
+; 3 遘帝俣 pause 縺吶k
+pause 3
+
+uptime tick_end
+
+; 邨碁℃譎る俣繧定ィ育ョ暦シ医Α繝ェ遘抵シ
+; 豕ィ諢: 32bit 縺ョ縺溘a 49.7 譌・縺ァ繧ェ繝シ繝舌シ繝輔Ο繝シ縺吶k縺後
+; 遏ュ譎る俣縺ョ險域クャ縺ァ縺ッ蠖ア髻ソ縺ェ縺
+elapsed = tick_end - tick_start
+
+; 3000ms ツア500ms 莉・蜀縺ァ縺ゅk縺薙→繧堤「コ隱
+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..af0a57ac9
--- /dev/null
+++ b/tests/wait_timeout_connected.ttl
@@ -0,0 +1,43 @@
+; wait 繧ウ繝槭Φ繝峨ョ繧ソ繧、繝繧「繧ヲ繝医ユ繧ケ繝茨シ域磁邯壼ソ隕シ
+;
+; GetTickCount64() 縺ク縺ョ鄂ョ縺肴鋤縺亥セ後『ait 繧ウ繝槭Φ繝峨ョ繧ソ繧、繝繧「繧ヲ繝医′
+; 豁」蟶ク蜍穂ス懊☆繧九%縺ィ繧堤「コ隱阪☆繧九
+; OS 襍キ蜍輔°繧 49.7 譌・莉・荳顔オ碁℃縺励◆迺ー蠅縺ァ繧よュ」縺励¥蜍穂ス懊☆繧九%縺ィ繧呈Φ螳壹
+;
+; 菴ソ縺譁ケ: SSH/Telnet 遲峨〒繝帙せ繝医↓謗・邯壹@縺溽憾諷九〒螳溯。後☆繧九
+
+timeout = 3
+
+uptime tick_start
+
+; 蜃コ迴セ縺励↑縺譁蟄怜励r wait 縺ァ蠕縺。縲3 遘偵〒繧ソ繧、繝繧「繧ヲ繝医&縺帙k
+wait 'XXXXXXXXXX_NEVER_APPEAR_XXXXXXXXXX'
+
+uptime tick_end
+
+; 繧ソ繧、繝繧「繧ヲ繝医〒謚懊¢縺溘%縺ィ繧堤「コ隱 (result == 1)
+if result <> 1 then
+ messagebox 'NG: wait 縺後ち繧、繝繧「繧ヲ繝医@縺ェ縺九▲縺' 'wait timeout test'
+ end
+endif
+
+; 邨碁℃譎る俣繧定ィ育ョ暦シ医Α繝ェ遘抵シ
+elapsed = tick_end - tick_start
+
+; 3000ms ツア500ms 莉・蜀縺ァ縺ゅk縺薙→繧堤「コ隱
+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 // 鬮倩イ闕キ蟇セ遲
// 騾イ謐励ム繧、繧「繝ュ繧ー縺ョ謠冗判縺碁俣縺ォ蜷医o縺ェ縺蝣エ蜷医ッ縲∬イ闕キ縺御ク九′繧九∪縺ァ蠕縺、
- 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 // 鬮倩イ闕キ蟇セ遲
// 騾イ謐励ム繧、繧「繝ュ繧ー縺ョ謠冗判縺碁俣縺ォ蜷医o縺ェ縺蝣エ蜷医ッ縲∬イ闕キ縺御ク九′繧九∪縺ァ蠕縺、
- 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));