Welcome to mirror list, hosted at ThFree Co, Russian Federation.

lua_int64.c « src « lua-winreg « modules « src « lua « 3rdparty - github.com/windirstat/windirstat.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: d33e5c22a82b757c4209738a4a6c29ce299dd06c (plain)
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);
	}
}