summaryrefslogtreecommitdiff
path: root/libpsx/src/libc/misc.c
blob: f3a13260bba1dd07b5def0195fc882a32f0d0042 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <stdio.h>
#include <stdlib.h>

static unsigned int rand_seed = 0;
static unsigned int rand_next = 0;

int abs(int x)
{
	if(x<0)return -x;

	return x;
}

void srand(unsigned int seed)
{
	rand_seed = seed;
}

int rand()
{
	rand_next = (rand_next ^ 0x98765432)*0x1357;
	
	return rand_next % RAND_MAX;
}

static char *__ulltoa_internal__(unsigned long long value, char *str, int base, int minus_sign,
	unsigned long long maxp )
{
	unsigned long long p;
	unsigned long long p3;
	int c;
	int a;
	
	p = 1;
	
	do
	{
		p3 = p;
		p *= base;
		
		if(maxp && p > maxp)
			break;
	}while((p >= p3) && !(p % p3));
	
	if(minus_sign)
		*(str++) = '-';
	
	for(a = 0;p3 > 0;p3/=base)
	{
		c = value / p3;
		value %= p3;
		
		if(c)
			a = 1;
		
		if(a)
		{
			if(c <= 9)
				c += '0';
			else
				c = (c - 10) + 'A';
			
			*(str++) = c;
		}
	}
	
	*str = '\0';
	
	return str;
}

char *ulltoa(unsigned long long value, char *str, int base)
{
	return __ulltoa_internal__(value, str, base, 0, 0);
}

char *ultoa(unsigned long value, char *str, int base)
{
	return __ulltoa_internal__(value, str, base, 0, (sizeof(long)==8)?0:0xFFFFFFFF);
}

char *utoa(unsigned int value, char *str, int base)
{
	return __ulltoa_internal__(value, str, base, 0, 0xFFFFFFFF);
}

char *lltoa(long long value, char *str, int base)
{
	return __ulltoa_internal__((value<0)?-value:value, str, base, value<0, 0);
}
	
char *ltoa(long value, char *str, int base)
{
	return __ulltoa_internal__((value<0)?-value:value, str, base, value<0, (sizeof(long)==8)?0:0xFFFFFFFF);
}

char *itoa(int value, char *str, int base)
{
	return __ulltoa_internal__((value<0)?-value:value, str, base, value<0, 0xFFFFFFFF);
}

void abort(void)
{
	printf("abort(): Abnormal program termination\n");
	exit(1);
}