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