Merge commit 'dfc115332c94a2f62058ac7f2bce7631fbd20b3d'
[unleashed/tickless.git] / kernel / fs / zfs / lua / lcompat.c
blob55564ddbd9fd477a96bdd1892dbd7f1d0146ae46
1 /*
2 * Copyright (c) 2016 by Delphix. All rights reserved.
3 */
5 #include "lua.h"
7 #include <sys/zfs_context.h>
9 ssize_t
10 lcompat_sprintf(char *buf, const char *fmt, ...)
12 ssize_t res;
13 va_list args;
15 va_start(args, fmt);
16 res = vsnprintf(buf, INT_MAX, fmt, args);
17 va_end(args);
19 return (res);
22 int64_t
23 lcompat_strtoll(const char *str, char **ptr)
25 int base;
26 const char *cp;
27 int digits;
28 int64_t value;
29 boolean_t is_negative;
31 cp = str;
32 while (*cp == ' ' || *cp == '\t' || *cp == '\n') {
33 cp++;
35 is_negative = (*cp == '-');
36 if (is_negative) {
37 cp++;
39 base = 10;
41 if (*cp == '0') {
42 base = 8;
43 cp++;
44 if (*cp == 'x' || *cp == 'X') {
45 base = 16;
46 cp++;
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;
61 if (digits >= base) {
62 break;
64 value = (value * base) + digits;
67 if (ptr != NULL) {
68 *ptr = (char *)cp;
70 if (is_negative) {
71 value = -value;
73 return (value);
76 int64_t
77 lcompat_pow(int64_t x, int64_t y)
79 int64_t result = 1;
80 if (y < 0)
81 return (0);
83 while (y) {
84 if (y & 1)
85 result *= x;
86 y >>= 1;
87 x *= x;
89 return (result);
92 int
93 lcompat_hashnum(int64_t x)
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);