# HG changeset patch # User John Tsiombikas # Date 1323437394 -7200 # Node ID f83f50c17c3b1505ac122867d8be68e9472caf3c # Parent 7ff2b4971216ece060307be9fda6ca28cc728c02 continuing with the fs added strtol and strstr to klibc diff -r 7ff2b4971216 -r f83f50c17c3b src/bdev.c --- a/src/bdev.c Fri Dec 09 13:44:15 2011 +0200 +++ b/src/bdev.c Fri Dec 09 15:29:54 2011 +0200 @@ -1,11 +1,13 @@ #include +#include #include #include "bdev.h" #include "ata.h" #include "part.h" -#define MINOR_DISK(x) (((x) >> 4) & 0xf) -#define MINOR_PART(x) ((x) & 0xf) +#define MKMINOR(disk, part) ((((disk) & 0xf) << 4) | ((part) & 0xf)) +#define MINOR_DISK(x) (((x) >> 4) & 0xf) +#define MINOR_PART(x) ((x) & 0xf) struct block_device *blk_open(dev_t dev) { @@ -84,3 +86,35 @@ } return 0; } + +dev_t bdev_by_name(const char *name) +{ + int minor; + int atadev, part = 0; + + char *tmp = strrchr(name, '/'); + if(tmp) { + name = tmp + 1; + } + + if(strstr(name, "ata") != name) { + return 0; + } + name += 3; + + atadev = strtol(name, &tmp, 10); + if(tmp == name) { + return 0; + } + name = tmp; + + if(*name++ == 'p') { + part = strtol(name, &tmp, 10) + 1; + if(tmp == name) { + return 0; + } + } + + minor = MKMINOR(atadev, part); + return DEVNO(0, minor); +} diff -r 7ff2b4971216 -r f83f50c17c3b src/bdev.h --- a/src/bdev.h Fri Dec 09 13:44:15 2011 +0200 +++ b/src/bdev.h Fri Dec 09 15:29:54 2011 +0200 @@ -16,4 +16,6 @@ int blk_read(struct block_device *bdev, uint32_t blk, void *buf); int blk_write(struct block_device *bdev, uint32_t blk, void *buf); +dev_t bdev_by_name(const char *name); + #endif /* BDEV_H_ */ diff -r 7ff2b4971216 -r f83f50c17c3b src/fs.h --- a/src/fs.h Fri Dec 09 13:44:15 2011 +0200 +++ b/src/fs.h Fri Dec 09 15:29:54 2011 +0200 @@ -8,6 +8,7 @@ #define SECT_TO_BLK(x) ((x) / (BLKSZ / 512)) +#define DEVNO(maj, min) ((((maj) & 0xff) << 8) | ((min) & 0xff)) #define DEV_MAJOR(dev) (((dev) >> 8) & 0xff) #define DEV_MINOR(dev) ((dev) & 0xff) diff -r 7ff2b4971216 -r f83f50c17c3b src/klibc/stdlib.c --- a/src/klibc/stdlib.c Fri Dec 09 13:44:15 2011 +0200 +++ b/src/klibc/stdlib.c Fri Dec 09 15:29:54 2011 +0200 @@ -3,16 +3,33 @@ int atoi(const char *str) { - return atol(str); + return strtol(str, 0, 10); } long atol(const char *str) { + return strtol(str, 0, 10); +} + +long strtol(const char *str, char **endp, int base) +{ long acc = 0; int sign = 1; while(isspace(*str)) str++; + if(base == 0) { + if(str[0] == '0') { + if(str[1] == 'x' || str[1] == 'X') { + base = 16; + } else { + base = 8; + } + } else { + base = 10; + } + } + if(*str == '+') { str++; } else if(*str == '-') { @@ -20,11 +37,27 @@ str++; } - while(*str && isdigit(*str)) { - acc = acc * 10 + (*str - '0'); + while(*str) { + long val; + char c = tolower(*str); + + if(isdigit(c)) { + val = *str - '0'; + } else if(c >= 'a' || c <= 'f') { + val = 10 + c - 'a'; + } + if(val >= base) { + break; + } + + acc = acc * base + val; str++; } + if(endp) { + *endp = (char*)str; + } + return sign > 0 ? acc : -acc; } diff -r 7ff2b4971216 -r f83f50c17c3b src/klibc/stdlib.h --- a/src/klibc/stdlib.h Fri Dec 09 13:44:15 2011 +0200 +++ b/src/klibc/stdlib.h Fri Dec 09 15:29:54 2011 +0200 @@ -8,6 +8,7 @@ int atoi(const char *str); long atol(const char *str); +long strtol(const char *str, char **endp, int base); void itoa(int val, char *buf, int base); void utoa(unsigned int val, char *buf, int base); diff -r 7ff2b4971216 -r f83f50c17c3b src/klibc/string.c --- a/src/klibc/string.c Fri Dec 09 13:44:15 2011 +0200 +++ b/src/klibc/string.c Fri Dec 09 15:29:54 2011 +0200 @@ -89,6 +89,24 @@ return 0; } +char *strstr(const char *str, const char *substr) +{ + while(*str) { + const char *s1 = str; + const char *s2 = substr; + + while(*s1 && *s1 == *s2) { + s1++; + s2++; + } + if(!*s2) { + return (char*)str; + } + str++; + } + return 0; +} + int strcmp(const char *s1, const char *s2) { while(*s1 && *s1 == *s2) { diff -r 7ff2b4971216 -r f83f50c17c3b src/klibc/string.h --- a/src/klibc/string.h Fri Dec 09 13:44:15 2011 +0200 +++ b/src/klibc/string.h Fri Dec 09 15:29:54 2011 +0200 @@ -14,6 +14,8 @@ char *strchr(const char *s, int c); char *strrchr(const char *s, int c); +char *strstr(const char *str, const char *substr); + int strcmp(const char *s1, const char *s2); #endif /* STRING_H_ */