diff src/std.c @ 27:1a070e843bf6

Fixed bugs with printing out and reading in numbers If infinity or NAN is passed to ftoa, it will set the character buffer to read either "INF" or "NAN" Negative decimals are now correctly read in by atof. abs() is now a part of the standard library. The math_ prefix has been dropped from all functions but the trivial binary operations. The strcpy function has been added.
author Jonathan Pevarnek <pevarnj@gmail.com>
date Tue, 29 Mar 2011 22:05:03 -0400
parents c1ad124f2aaf
children cced4d365c5e
line wrap: on
line diff
--- a/src/std.c	Sun Mar 20 14:17:24 2011 -0400
+++ b/src/std.c	Tue Mar 29 22:05:03 2011 -0400
@@ -1,6 +1,12 @@
 #include <std.h>
 
-char* itoa(long long n, char *a, unsigned short base)
+double abs(double num)
+{
+	if(num < 0) return num*-1;
+	else return num;
+}
+
+char* itoa(s64 n, char *a, unsigned short base)
 {
 	char *ret = a;
 	if(n < 0) {
@@ -27,36 +33,49 @@
 char* ftoa(double x, char *a, unsigned int prec)
 {
 	char *ret = a;
-	int n = (int) x; //integer part
-	double d = x - (double) n; //fractional part;
-	itoa(n, a, 10);
-	if(prec) { //only do the decimal part if decimal parts were asked for
-		while(*a && *++a); //get to the null character from itoa
-		int i; //counter variable for the for loop
-		*a++ = '.'; //put the decimal in place
-		for(i = 0; i < prec; i++) {
-			d = d*10; //the integer part is the decimal digit
-			*a++ = ((int) d) + '0'; //add the integer part of d to the string
-			d -= (int) d; //chop off the integer part
-		} a--; //move back to the last digit
-		while(*a != '.') {
-			if(*a == '0') {
-				a--;
-				continue;
-			} else if(*a > '0' && *a <= '9') {
-				a++;
-				break;
+	if(x == INF || x == -INF) {
+		strcpy(a, "INF");
+	} else if(x != x) { //NAN != NAN
+		strcpy(a, "NAN");
+	} else {
+		s64 n = (s64) x; //integer part
+		double d = abs(x - (double) n); //fractional part;
+		if(d != 0) sPrint("WORKING\n");
+		itoa(n, a, 10);
+		if(prec) { //only do the decimal part if decimal parts were asked for
+			while(*a && *++a); //get to the null character from itoa
+			int i; //counter variable for the for loop
+			*a++ = '.'; //put the decimal in place
+			for(i = 0; i < prec; i++) {
+				d *= 10; //the integer part is the decimal digit
+				char aoeu[43];
+				sPrint(itoa((int) d, aoeu, 10));
+				sPrint("\n");
+				*a++ = ((int) d) + '0'; //add the integer part of d to the string
+				d -= (int) d; //chop off the integer part
+			} a--; //move back to the last digit
+			while(*a != '.') {
+				if(*a == '0') {
+					a--;
+					continue;
+				} else if(*a > '0' && *a <= '9') {
+					a++;
+					break;
+				} else {
+					sPrint("ERROR: SOMETHING IS VERY WRONG\n");
+					break;
+				}
 			}
+			*a = '\0';
 		}
-		*a = '\0';
 	}
 	return ret;
 }
 
-int atoi(char *a)
+s64 atoi(char *a)
 {
 	short neg = 0;
-	int n = 0;
+	s64 n = 0;
 	if(*a == '-') {
 		neg = 1;
 		a++;
@@ -69,11 +88,16 @@
 
 double atof(char *a)
 {
-	int n = atoi(a);
+	s64 n = atoi(a);
 	double x = 0;
 	double dec = .1;
+	short neg = 0;
+	if(*a == '-') {
+		neg = 1;
+		a++;
+	}
 	while(*a != '.') {
-		if(!(*a >= '0' && *a <= '9')) return n;
+		if(!(*a >= '0' && *a <= '9') && *a != '-') return n;
 		a++;
 	} a++; //a will be immediately after the decimal point
 	while(*a >= '0' && *a <= '9') { //goes through the decimal part
@@ -81,6 +105,7 @@
 		dec *= .1;
 		a++;
 	}
+	if(neg) x*=-1;
 	return n + x;
 }
 
@@ -94,6 +119,11 @@
 	} while(a < b);
 }
 
+void strcpy(char *dest, const char *src)
+{
+	while((*dest++ = *src++));
+}
+
 int strcmp(const char *a, const char *b)
 {
 	while(1) {
@@ -193,13 +223,13 @@
 {
 	char buffer[20];
 	sPrint("Memory address is: ");
-	sPrint(itoa((size_t)head, buffer, 16));
+	sPrint(itoa((intptr_t)head, buffer, 16));
 	sPrint("\n");
 	sPrint("The size of the block is: ");
 	sPrint(itoa(head->size, buffer, 10));
 	sPrint("\n");
 	sPrint("Next memory address is: ");
-	sPrint(itoa((size_t)head->next, buffer, 16));
+	sPrint(itoa((intptr_t)head->next, buffer, 16));
 	sPrint("\n\n");
 }