varch/source/02_vstd/vstdlib.c
2024-04-22 00:09:51 +08:00

356 lines
6.5 KiB
C

#include "vstdlib.h"
#include "vctype.h"
#include "vstddef.h"
int v_atoi(const char *str)
{
int result = v_atoll(str);
return result;
}
long int v_atol(const char *str)
{
long int result = v_atoll(str);
return result;
}
long long int v_atoll(const char *str)
{
long long int result = 0;
int sign = 1;
int i = 0;
if (str[i] == '-')
{
sign = -1;
i++;
}
else if (str[i] == '+')
{
i++;
}
while (str[i] != '\0' && v_isdigit(str[i]))
{
result = result * 10 + (str[i] - '0');
i++;
}
return sign * result;
}
double v_atof(const char *str)
{
return v_strtod(str, NULL);
}
float v_strtof(const char *str, char **endptr)
{
float result = v_strtold(str, endptr);
return result;
}
double v_strtod(const char *str, char **endptr)
{
double result = v_strtold(str, endptr);
return result;
}
long double v_strtold(const char *str, char **endptr)
{
long double result = 0.0L;
int sign = 1;
int fraction = 0;
long double div = 1.0L;
int i = 0;
if (str[i] == '-')
{
sign = -1;
i++;
}
else if (str[i] == '+')
{
i++;
}
while (str[i] != '\0' && (v_isdigit(str[i]) || str[i] == '.'))
{
if (str[i] == '.')
{
fraction = 1;
}
else if (fraction == 0)
{
result = result * 10.0L + (long double) (str[i] - '0');
}
else
{
div *= 10.0L;
result = result + (long double) (str[i] - '0') / div;
}
i++;
}
if (endptr != NULL)
{
*endptr = (char *) &str[i];
}
return sign * result;
}
static int hex_to_int(char c)
{
if (v_isdigit(c))
{
return c - '0';
}
else if (v_islower(c))
{
return c - 'a' + 10;
}
else if (v_isupper(c))
{
return c - 'A' + 10;
}
else
{
return 0;
}
}
float v_strtof16(const char *str, char **endptr)
{
float result = 0.0f;
int i = 0;
if (str[i] == '-')
{
i++;
}
else if (str[i] == '+')
{
i++;
}
if (str[i] == '0' && (str[i+1] == 'x' || str[i+1] == 'X'))
{
i += 2;
}
while (v_isxdigit(str[i]))
{
result = result * 16.0f + (float) hex_to_int(str[i]);
i++;
}
if (endptr != NULL)
{
*endptr = (char *) &str[i];
}
return result;
}
float v_strtof32(const char *str, char **endptr)
{
float result = v_strtof(str, endptr);
return result;
}
double v_strtof64(const char *str, char **endptr)
{
double result = v_strtod(str, endptr);
return result;
}
long double v_strtof128(const char *str, char **endptr)
{
long double result = v_strtold(str, endptr);
return result;
}
float v_strtof32x(const char *str, char **endptr)
{
float result = v_strtof128x(str, endptr);
return result;
}
double v_strtof64x(const char *str, char **endptr)
{
double result = v_strtof128x(str, endptr);
return result;
}
long double v_strtof128x(const char *str, char **endptr)
{
long double result = 0.0L;
int i = 0;
if (str[i] == '-')
{
i++;
}
else if (str[i] == '+')
{
i++;
}
if (str[i] == '0' && (str[i+1] == 'x' || str[i+1] == 'X'))
{
i += 2;
}
while (v_isxdigit(str[i]))
{
result = result * 16.0L + (long double) hex_to_int(str[i]);
i++;
}
if (endptr != NULL)
{
*endptr = (char *) &str[i];
}
return result;
}
long int v_strtol(const char *str, char **endptr, int base)
{
long int result = v_strtoq(str, endptr, base);
return result;
}
unsigned long int v_strtoul(const char *str, char **endptr, int base)
{
unsigned long int result = v_strtouq(str, endptr, base);
return result;
}
long long int v_strtoq(const char *str, char **endptr, int base)
{
long long int result = 0;
int sign = 1;
int i = 0;
if (str[i] == '-')
{
sign = -1;
i++;
}
else if (str[i] == '+')
{
i++;
}
if (base == 0)
{
if (str[i] == '0' && (str[i + 1] == 'x' || str[i + 1] == 'X'))
{
base = 16;
i += 2;
}
else if (str[i] == '0')
{
base = 8;
i++;
}
else
{
base = 10;
}
}
while (str[i] != '\0')
{
int digit = 0;
if (str[i] >= '0' && str[i] <= '9')
{
digit = str[i] - '0';
}
else if (str[i] >= 'a' && str[i] <= 'z')
{
digit = str[i] - 'a' + 10;
}
else if (str[i] >= 'A' && str[i] <= 'Z')
{
digit = str[i] - 'A' + 10;
}
else
{
break;
}
if (digit >= base)
{
break;
}
result = result * base + digit;
i++;
}
if (endptr != NULL)
{
*endptr = (char *) &str[i];
}
return sign * result;
}
unsigned long long int v_strtouq(const char *str, char **endptr, int base)
{
unsigned long long int result = 0;
int i = 0;
if (base == 0)
{
if (str[i] == '0' && (str[i + 1] == 'x' || str[i + 1] == 'X'))
{
base = 16;
i += 2;
}
else if (str[i] == '0')
{
base = 8;
i++;
}
else
{
base = 10;
}
}
while (str[i] != '\0')
{
int digit = 0;
if (str[i] >= '0' && str[i] <= '9')
{
digit = str[i] - '0';
}
else if (str[i] >= 'a' && str[i] <= 'z')
{
digit = str[i] - 'a' + 10;
}
else if (str[i] >= 'A' && str[i] <= 'Z')
{
digit = str[i] - 'A' + 10;
}
else
{
break;
}
if (digit >= base)
{
break;
}
result = result * base + digit;
i++;
}
if (endptr != NULL)
{
*endptr = (char *) &str[i];
}
return result;
}
long long int v_strtoll(const char *str, char **endptr, int base)
{
return v_strtoq(str, endptr, base);
}
unsigned long long int v_strtoull(const char *str, char **endptr, int base)
{
return v_strtouq(str, endptr, base);
}
#define _mul 1103515245
#define _ins 1
static int _seed_value = 0;
void v_srand(int seed)
{
_seed_value = seed;
}
int v_rand(void)
{
_seed_value = (_mul * _seed_value) + _ins;
return _seed_value;
}