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