aboutsummaryrefslogblamecommitdiff
path: root/src/lib/libc/stdlib.c
blob: 7d08cd16e735dddc5b01d3255d0cc42ffee9dc0b (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
















                                       
                                               

                                           
                                                





































                                                                
                                               



















                                         
#include <stdlib.h>
#include <ctype.h>

#include <kogata/debug.h>

int rand(void) {
	return 0;		// TODO
}

void srand(unsigned int seed) {
	//TODO
}

void abort() {
	PANIC("Aborted.");
}

float strtof(const char *nptr, char **endptr) {
	return (float)strtod(nptr, endptr);
}
double strtod(const char *nptr, char **endptr) {
	// TODO: better (inf, nan, ...)

	const char* p = nptr;
	while (isspace(*p)) p++;

	double val = 0;
	double sign = 1;
	if (*p == '-') sign = -1;
	if (*p == '-' || *p == '+') p++;
	while (isdigit(*p)) {
		val = val*10. + (double)((int)*p - '0');
		p++;
	}
	if (*p == '.') {
		p++;
		double fac = 0.1;
		while (isdigit(*p)) {
			val += fac * (double)((int)*p - '0');
			fac /= 10.;
			p++;
		}
	}
	if (*p == 'e' || *p == 'E') {
		p++;
		int exp = 0;
		int sexp = 1;
		if (*p == '-') sexp = -1;
		if (*p == '-' || *p =='+') p++;
		while (isdigit(*p)) {
			exp = exp * 10 + (*p - '0');
			p++;
		}
		if (sexp == 1) {
			for (int i = 0; i < exp; i++) val *= 10;
		} else {
			for (int i = 0; i < exp; i++) val /= 10;
		}
	}
	if (endptr != NULL) *endptr = (char*)p;

	return val * sign;
}

char *getenv(const char *name) {
	// TODO
	return 0;
}

int system(const char *command) {
	// TODO
	return -1;
}

int abs(int j) {
	if (j < 0) return -j;
	return j;
}

/* vim: set sts=0 ts=4 sw=4 tw=0 noet :*/