Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/openzfs/module/lua/lcompat.c
48383 views
1
// SPDX-License-Identifier: MIT
2
/*
3
* Copyright (c) 2016 by Delphix. All rights reserved.
4
*/
5
6
#include <sys/lua/lua.h>
7
8
9
ssize_t
10
lcompat_sprintf(char *buf, size_t size, const char *fmt, ...)
11
{
12
ssize_t res;
13
va_list args;
14
15
va_start(args, fmt);
16
res = vsnprintf(buf, size, fmt, args);
17
va_end(args);
18
19
return (res);
20
}
21
22
int64_t
23
lcompat_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
76
int64_t
77
lcompat_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
92
int
93
lcompat_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
104