xref: /freebsd/sys/contrib/openzfs/module/lua/lcompat.c (revision eda14cbc264d6969b02f2b1994cef11148e914f1)
1*eda14cbcSMatt Macy /*
2*eda14cbcSMatt Macy  * Copyright (c) 2016 by Delphix. All rights reserved.
3*eda14cbcSMatt Macy  */
4*eda14cbcSMatt Macy 
5*eda14cbcSMatt Macy #include <sys/lua/lua.h>
6*eda14cbcSMatt Macy 
7*eda14cbcSMatt Macy 
8*eda14cbcSMatt Macy ssize_t
9*eda14cbcSMatt Macy lcompat_sprintf(char *buf, size_t size, const char *fmt, ...)
10*eda14cbcSMatt Macy {
11*eda14cbcSMatt Macy 	ssize_t res;
12*eda14cbcSMatt Macy 	va_list args;
13*eda14cbcSMatt Macy 
14*eda14cbcSMatt Macy 	va_start(args, fmt);
15*eda14cbcSMatt Macy 	res = vsnprintf(buf, size, fmt, args);
16*eda14cbcSMatt Macy 	va_end(args);
17*eda14cbcSMatt Macy 
18*eda14cbcSMatt Macy 	return (res);
19*eda14cbcSMatt Macy }
20*eda14cbcSMatt Macy 
21*eda14cbcSMatt Macy int64_t
22*eda14cbcSMatt Macy lcompat_strtoll(const char *str, char **ptr)
23*eda14cbcSMatt Macy {
24*eda14cbcSMatt Macy 	int base;
25*eda14cbcSMatt Macy 	const char *cp;
26*eda14cbcSMatt Macy 	int digits;
27*eda14cbcSMatt Macy 	int64_t value;
28*eda14cbcSMatt Macy 	boolean_t is_negative;
29*eda14cbcSMatt Macy 
30*eda14cbcSMatt Macy 	cp = str;
31*eda14cbcSMatt Macy 	while (*cp == ' ' || *cp == '\t' || *cp == '\n') {
32*eda14cbcSMatt Macy 		cp++;
33*eda14cbcSMatt Macy 	}
34*eda14cbcSMatt Macy 	is_negative = (*cp == '-');
35*eda14cbcSMatt Macy 	if (is_negative) {
36*eda14cbcSMatt Macy 		cp++;
37*eda14cbcSMatt Macy 	}
38*eda14cbcSMatt Macy 	base = 10;
39*eda14cbcSMatt Macy 
40*eda14cbcSMatt Macy 	if (*cp == '0') {
41*eda14cbcSMatt Macy 		base = 8;
42*eda14cbcSMatt Macy 		cp++;
43*eda14cbcSMatt Macy 		if (*cp == 'x' || *cp == 'X') {
44*eda14cbcSMatt Macy 			base = 16;
45*eda14cbcSMatt Macy 			cp++;
46*eda14cbcSMatt Macy 		}
47*eda14cbcSMatt Macy 	}
48*eda14cbcSMatt Macy 
49*eda14cbcSMatt Macy 	value = 0;
50*eda14cbcSMatt Macy 	for (; *cp != '\0'; cp++) {
51*eda14cbcSMatt Macy 		if (*cp >= '0' && *cp <= '9') {
52*eda14cbcSMatt Macy 			digits = *cp - '0';
53*eda14cbcSMatt Macy 		} else if (*cp >= 'a' && *cp <= 'f') {
54*eda14cbcSMatt Macy 			digits = *cp - 'a' + 10;
55*eda14cbcSMatt Macy 		} else if (*cp >= 'A' && *cp <= 'F') {
56*eda14cbcSMatt Macy 			digits = *cp - 'A' + 10;
57*eda14cbcSMatt Macy 		} else {
58*eda14cbcSMatt Macy 			break;
59*eda14cbcSMatt Macy 		}
60*eda14cbcSMatt Macy 		if (digits >= base) {
61*eda14cbcSMatt Macy 			break;
62*eda14cbcSMatt Macy 		}
63*eda14cbcSMatt Macy 		value = (value * base) + digits;
64*eda14cbcSMatt Macy 	}
65*eda14cbcSMatt Macy 
66*eda14cbcSMatt Macy 	if (ptr != NULL) {
67*eda14cbcSMatt Macy 		*ptr = (char *)cp;
68*eda14cbcSMatt Macy 	}
69*eda14cbcSMatt Macy 	if (is_negative) {
70*eda14cbcSMatt Macy 		value = -value;
71*eda14cbcSMatt Macy 	}
72*eda14cbcSMatt Macy 	return (value);
73*eda14cbcSMatt Macy }
74*eda14cbcSMatt Macy 
75*eda14cbcSMatt Macy int64_t
76*eda14cbcSMatt Macy lcompat_pow(int64_t x, int64_t y)
77*eda14cbcSMatt Macy {
78*eda14cbcSMatt Macy 	int64_t result = 1;
79*eda14cbcSMatt Macy 	if (y < 0)
80*eda14cbcSMatt Macy 		return (0);
81*eda14cbcSMatt Macy 
82*eda14cbcSMatt Macy 	while (y) {
83*eda14cbcSMatt Macy 		if (y & 1)
84*eda14cbcSMatt Macy 			result *= x;
85*eda14cbcSMatt Macy 		y >>= 1;
86*eda14cbcSMatt Macy 		x *= x;
87*eda14cbcSMatt Macy 	}
88*eda14cbcSMatt Macy 	return (result);
89*eda14cbcSMatt Macy }
90*eda14cbcSMatt Macy 
91*eda14cbcSMatt Macy int
92*eda14cbcSMatt Macy lcompat_hashnum(int64_t x)
93*eda14cbcSMatt Macy {
94*eda14cbcSMatt Macy 	x = (~x) + (x << 18);
95*eda14cbcSMatt Macy 	x = x ^ (x >> 31);
96*eda14cbcSMatt Macy 	x = x * 21;
97*eda14cbcSMatt Macy 	x = x ^ (x >> 11);
98*eda14cbcSMatt Macy 	x = x + (x << 6);
99*eda14cbcSMatt Macy 	x = x ^ (x >> 22);
100*eda14cbcSMatt Macy 	return ((int)x);
101*eda14cbcSMatt Macy }
102