/*
 * Copyright (c) 2016 by Delphix. All rights reserved.
 */

#include <sys/lua/lua.h>


ssize_t
lcompat_sprintf(char *buf, size_t size, const char *fmt, ...)
{
	ssize_t res;
	va_list args;

	va_start(args, fmt);
	res = vsnprintf(buf, size, fmt, args);
	va_end(args);

	return (res);
}

int64_t
lcompat_strtoll(const char *str, char **ptr)
{
	int base;
	const char *cp;
	int digits;
	int64_t value;
	boolean_t is_negative;

	cp = str;
	while (*cp == ' ' || *cp == '\t' || *cp == '\n') {
		cp++;
	}
	is_negative = (*cp == '-');
	if (is_negative) {
		cp++;
	}
	base = 10;

	if (*cp == '0') {
		base = 8;
		cp++;
		if (*cp == 'x' || *cp == 'X') {
			base = 16;
			cp++;
		}
	}

	value = 0;
	for (; *cp != '\0'; cp++) {
		if (*cp >= '0' && *cp <= '9') {
			digits = *cp - '0';
		} else if (*cp >= 'a' && *cp <= 'f') {
			digits = *cp - 'a' + 10;
		} else if (*cp >= 'A' && *cp <= 'F') {
			digits = *cp - 'A' + 10;
		} else {
			break;
		}
		if (digits >= base) {
			break;
		}
		value = (value * base) + digits;
	}

	if (ptr != NULL) {
		*ptr = (char *)cp;
	}
	if (is_negative) {
		value = -value;
	}
	return (value);
}

int64_t
lcompat_pow(int64_t x, int64_t y)
{
	int64_t result = 1;
	if (y < 0)
		return (0);

	while (y) {
		if (y & 1)
			result *= x;
		y >>= 1;
		x *= x;
	}
	return (result);
}

int
lcompat_hashnum(int64_t x)
{
	x = (~x) + (x << 18);
	x = x ^ (x >> 31);
	x = x * 21;
	x = x ^ (x >> 11);
	x = x + (x << 6);
	x = x ^ (x >> 22);
	return ((int)x);
}
