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));