Path: blob/main/sys/contrib/openzfs/module/lua/lcompat.c
48383 views
// SPDX-License-Identifier: MIT1/*2* Copyright (c) 2016 by Delphix. All rights reserved.3*/45#include <sys/lua/lua.h>678ssize_t9lcompat_sprintf(char *buf, size_t size, const char *fmt, ...)10{11ssize_t res;12va_list args;1314va_start(args, fmt);15res = vsnprintf(buf, size, fmt, args);16va_end(args);1718return (res);19}2021int64_t22lcompat_strtoll(const char *str, char **ptr)23{24int base;25const char *cp;26int digits;27int64_t value;28boolean_t is_negative;2930cp = str;31while (*cp == ' ' || *cp == '\t' || *cp == '\n') {32cp++;33}34is_negative = (*cp == '-');35if (is_negative) {36cp++;37}38base = 10;3940if (*cp == '0') {41base = 8;42cp++;43if (*cp == 'x' || *cp == 'X') {44base = 16;45cp++;46}47}4849value = 0;50for (; *cp != '\0'; cp++) {51if (*cp >= '0' && *cp <= '9') {52digits = *cp - '0';53} else if (*cp >= 'a' && *cp <= 'f') {54digits = *cp - 'a' + 10;55} else if (*cp >= 'A' && *cp <= 'F') {56digits = *cp - 'A' + 10;57} else {58break;59}60if (digits >= base) {61break;62}63value = (value * base) + digits;64}6566if (ptr != NULL) {67*ptr = (char *)cp;68}69if (is_negative) {70value = -value;71}72return (value);73}7475int64_t76lcompat_pow(int64_t x, int64_t y)77{78int64_t result = 1;79if (y < 0)80return (0);8182while (y) {83if (y & 1)84result *= x;85y >>= 1;86x *= x;87}88return (result);89}9091int92lcompat_hashnum(int64_t x)93{94x = (~x) + (x << 18);95x = x ^ (x >> 31);96x = x * 21;97x = x ^ (x >> 11);98x = x + (x << 6);99x = x ^ (x >> 22);100return ((int)x);101}102103104