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