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