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