kern
annotate src/klibc/stdlib.c @ 76:0fe6eef16335
holy fuck, copy_on_write didn't actually do the copy!!!!
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sat, 05 Nov 2011 04:53:46 +0200 |
parents | |
children | f83f50c17c3b |
rev | line source |
---|---|
nuclear@6 | 1 #include <stdlib.h> |
nuclear@6 | 2 #include <ctype.h> |
nuclear@6 | 3 |
nuclear@6 | 4 int atoi(const char *str) |
nuclear@6 | 5 { |
nuclear@6 | 6 return atol(str); |
nuclear@6 | 7 } |
nuclear@6 | 8 |
nuclear@6 | 9 long atol(const char *str) |
nuclear@6 | 10 { |
nuclear@6 | 11 long acc = 0; |
nuclear@6 | 12 int sign = 1; |
nuclear@6 | 13 |
nuclear@6 | 14 while(isspace(*str)) str++; |
nuclear@6 | 15 |
nuclear@6 | 16 if(*str == '+') { |
nuclear@6 | 17 str++; |
nuclear@6 | 18 } else if(*str == '-') { |
nuclear@6 | 19 sign = -1; |
nuclear@6 | 20 str++; |
nuclear@6 | 21 } |
nuclear@6 | 22 |
nuclear@6 | 23 while(*str && isdigit(*str)) { |
nuclear@6 | 24 acc = acc * 10 + (*str - '0'); |
nuclear@6 | 25 str++; |
nuclear@6 | 26 } |
nuclear@6 | 27 |
nuclear@6 | 28 return sign > 0 ? acc : -acc; |
nuclear@6 | 29 } |
nuclear@6 | 30 |
nuclear@6 | 31 void itoa(int val, char *buf, int base) |
nuclear@6 | 32 { |
nuclear@6 | 33 static char rbuf[16]; |
nuclear@6 | 34 char *ptr = rbuf; |
nuclear@6 | 35 int neg = 0; |
nuclear@6 | 36 |
nuclear@6 | 37 if(val < 0) { |
nuclear@6 | 38 neg = 1; |
nuclear@6 | 39 val = -val; |
nuclear@6 | 40 } |
nuclear@6 | 41 |
nuclear@6 | 42 if(val == 0) { |
nuclear@6 | 43 *ptr++ = '0'; |
nuclear@6 | 44 } |
nuclear@6 | 45 |
nuclear@6 | 46 while(val) { |
nuclear@6 | 47 int digit = val % base; |
nuclear@6 | 48 *ptr++ = digit < 10 ? (digit + '0') : (digit - 10 + 'a'); |
nuclear@6 | 49 val /= base; |
nuclear@6 | 50 } |
nuclear@6 | 51 |
nuclear@6 | 52 if(neg) { |
nuclear@6 | 53 *ptr++ = '-'; |
nuclear@6 | 54 } |
nuclear@6 | 55 |
nuclear@6 | 56 ptr--; |
nuclear@6 | 57 |
nuclear@6 | 58 while(ptr >= rbuf) { |
nuclear@6 | 59 *buf++ = *ptr--; |
nuclear@6 | 60 } |
nuclear@6 | 61 *buf = 0; |
nuclear@6 | 62 } |
nuclear@6 | 63 |
nuclear@6 | 64 void utoa(unsigned int val, char *buf, int base) |
nuclear@6 | 65 { |
nuclear@6 | 66 static char rbuf[16]; |
nuclear@6 | 67 char *ptr = rbuf; |
nuclear@6 | 68 |
nuclear@6 | 69 if(val == 0) { |
nuclear@6 | 70 *ptr++ = '0'; |
nuclear@6 | 71 } |
nuclear@6 | 72 |
nuclear@6 | 73 while(val) { |
nuclear@6 | 74 unsigned int digit = val % base; |
nuclear@6 | 75 *ptr++ = digit < 10 ? (digit + '0') : (digit - 10 + 'a'); |
nuclear@6 | 76 val /= base; |
nuclear@6 | 77 } |
nuclear@6 | 78 |
nuclear@6 | 79 ptr--; |
nuclear@6 | 80 |
nuclear@6 | 81 while(ptr >= rbuf) { |
nuclear@6 | 82 *buf++ = *ptr--; |
nuclear@6 | 83 } |
nuclear@6 | 84 *buf = 0; |
nuclear@6 | 85 } |
nuclear@6 | 86 |