1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
#include <windows.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
#include "luamacro.h"
#include "stdmacro.h"
// from NSIS source code
int atoINT64(const char* s, INT64 *pv){
*pv = 0;
if (*s == '0' && (s[1] == 'x' || s[1] == 'X') && ISXDIGIT(s[2])){
s++;
for(;;){
int c = *(++s);
if (c >= '0' && c <= '9') c -= '0';
else if (c >= 'a' && c <= 'f') c -= 'a' - 10;
else if (c >= 'A' && c <= 'F') c -= 'A' - 10;
else if (c == 0) break;
else return 0;
*pv <<= 4;
*pv += c;
}
}else if (*s == '0' && ISODIGIT(s[1])){
for(;;){
int c = *(++s);
if (c >= '0' && c <= '7')c -= '0';
else if (c == 0) break;
else return 0;
*pv <<= 3;
*pv += c;
}
}else if ((*s == '-' && ISDIGIT(s[1])) || ISDIGIT(s[0])){
int sign = 0;
if (*s == '-') sign++; else s--;
for (;;){
int c = *(++s);
if (c >= '0' && c <= '9')c -= '0';
else if (c == 0) break;
else return 0;
*pv *= 10;
*pv += c;
}
if (sign) *pv = -*pv;
}else{
return 0;
}
return 1;
}
int atoUINT64(const char* s, UINT64 * pv){
*pv = 0;
if (*s == '0' && (s[1] == 'x' || s[1] == 'X') && ISXDIGIT(s[2])){
s++;
for(;;){
int c = *(++s);
if (c >= '0' && c <= '9') c -= '0';
else if (c >= 'a' && c <= 'f') c -= 'a' - 10;
else if (c >= 'A' && c <= 'F') c -= 'A' - 10;
else if (c == 0) break;
else return 0;
*pv <<= 4;
*pv += c;
}
}else if (*s == '0' && ISODIGIT(s[1])){
for(;;){
int c = *(++s);
if (c >= '0' && c <= '7')c -= '0';
else if (c == 0) break;
else return 0;
*pv <<= 3;
*pv += c;
}
}else if ((*s == '-' && ISDIGIT(s[1])) || ISDIGIT(s[0])){
if(*s == '-'){
INT64 iv;
if(atoINT64(s, &iv)){
*pv = (UINT64)iv;
}else{
return 0;
}
}else{
for (;;){
int c = *(++s);
if (c >= '0' && c <= '9')c -= '0';
else if (c == 0) break;
else return 0;
*pv *= 10;
*pv += c;
}
}
}else{
return 0;
}
return 1;
}
INT64 lua_checkINT64(lua_State *L, int i){
INT64 v;
if(lua_isrealstring(L, i) && atoINT64(lua_tostring(L, i), &v)){
return v;
}else{
return (INT64)luaL_checknumber(L, i);
}
}
UINT64 lua_checkUINT64(lua_State *L, int i){
UINT64 v;
if(lua_isrealstring(L, i) && atoUINT64(lua_tostring(L, i), &v)){
return v;
}else{
return (UINT64)luaL_checknumber(L, i);
}
}
|