diff options
| -rw-r--r-- | libpsn00b/include/ctype.h | 13 | ||||
| -rw-r--r-- | libpsn00b/include/stdlib.h | 10 | ||||
| -rw-r--r-- | libpsn00b/include/string.h | 44 | ||||
| -rw-r--r-- | libpsn00b/libc/memcmp.s | 31 | ||||
| -rw-r--r-- | libpsn00b/libc/memcpy.s | 28 | ||||
| -rw-r--r-- | libpsn00b/libc/memmove.s | 42 | ||||
| -rw-r--r-- | libpsn00b/libc/start.c | 24 | ||||
| -rw-r--r-- | libpsn00b/libc/string.c | 604 | ||||
| -rw-r--r-- | libpsn00b/psxcd/isofs.c | 51 |
9 files changed, 447 insertions, 400 deletions
diff --git a/libpsn00b/include/ctype.h b/libpsn00b/include/ctype.h index 24ee9d9..ad78397 100644 --- a/libpsn00b/include/ctype.h +++ b/libpsn00b/include/ctype.h @@ -1,6 +1,6 @@ /* * PSn00bSDK standard library - * (C) 2019-2022 PSXSDK authors, Lameguy64, spicyjpeg - MPL licensed + * (C) 2019-2023 PSXSDK authors, Lameguy64, spicyjpeg - MPL licensed */ #ifndef __CTYPE_H @@ -10,8 +10,15 @@ extern "C" { #endif -int tolower(int chr); -int toupper(int chr); +int isprint(int ch); +int isgraph(int ch); +int isspace(int ch); +int isblank(int ch); +int isalpha(int ch); +int isdigit(int ch); + +int tolower(int ch); +int toupper(int ch); #ifdef __cplusplus } diff --git a/libpsn00b/include/stdlib.h b/libpsn00b/include/stdlib.h index 049d067..49ae7b9 100644 --- a/libpsn00b/include/stdlib.h +++ b/libpsn00b/include/stdlib.h @@ -39,11 +39,11 @@ void srand(int seed); int abs(int j); long labs(long i); -long strtol(const char *nptr, char **endptr, int base); -long long strtoll(const char *nptr, char **endptr, int base); -float strtof(const char *nptr, char **endptr); -double strtod(const char *nptr, char **endptr); -long double strtold(const char *nptr, char **endptr); +long strtol(const char *str, char **str_end, int base); +long long strtoll(const char *str, char **str_end, int base); +//float strtof(const char *str, char **str_end); +//double strtod(const char *str, char **str_end); +//long double strtold(const char *str, char **str_end); void InitHeap(void *addr, size_t size); void *sbrk(ptrdiff_t incr); diff --git a/libpsn00b/include/string.h b/libpsn00b/include/string.h index ceee066..84afbae 100644 --- a/libpsn00b/include/string.h +++ b/libpsn00b/include/string.h @@ -6,29 +6,35 @@ #ifndef __STRING_H #define __STRING_H +#include <stddef.h> + #ifdef __cplusplus extern "C" { #endif -int strcmp(const char *dst , const char *src); -int strncmp(const char *dst , const char *src , int len); -char *strpbrk(const char *dst , const char *src); -char *strtok(char *s , char *set); -char *strstr(const char *big , const char *little); - -char *strcat(char *s , const char *append); -char *strncat(char *s , const char *append, int n); -char *strcpy(char *dst , const char *src); -char *strncpy(char *dst , const char *src , int n); -int strlen(const char *s); -char *strchr(const char *s , int c); -char *strrchr(const char *s , int c); - -void *memmove(void *dst , const void *src , int n); -void *memchr(void *s , int c , int n); -void *memcpy(void *dst , const void *src , int n); -void *memset(void *dst , char c , int n); -int memcmp(const void *b1 , const void *b2 , int n); +void *memset(void *dest, int ch, size_t count); +void *memcpy(void *dest, const void *src, size_t count); +void *memccpy(void *dest, const void *src, int ch, size_t count); +void *memmove(void *dest, const void *src, size_t count); +int memcmp(const void *lhs, const void *rhs, size_t count); +void *memchr(const void *ptr, int ch, size_t count); + +char *strcpy(char *dest, const char *src); +char *strncpy(char *dest, const char *src, size_t count); +int strcmp(const char *lhs, const char *rhs); +int strncmp(const char *lhs, const char *rhs, size_t count); +char *strchr(const char *str, int ch); +char *strrchr(const char *str, int ch); +char *strpbrk(const char *str, const char *breakset); +char *strstr(const char *str, const char *substr); + +size_t strlen(const char *str); +char *strcat(char *dest, const char *src); +char *strncat(char *dest, const char *src, size_t count); +char *strdup(const char *str); +char *strndup(const char *str, size_t count); + +char *strtok(char *str, const char *delim); #ifdef __cplusplus } diff --git a/libpsn00b/libc/memcmp.s b/libpsn00b/libc/memcmp.s deleted file mode 100644 index ec1e729..0000000 --- a/libpsn00b/libc/memcmp.s +++ /dev/null @@ -1,31 +0,0 @@ -# High speed ASM memcmp implementation by Lameguy64 -# -# Part of PSn00bSDK - -.set noreorder - -.section .text - -# Arguments: -# a0 - buffer 1 address -# a1 - buffer 2 address -# a2 - bytes to compare -.global memcmp -.type memcmp, @function -memcmp: - blez $a2, .Lexit - addi $a2, -1 - lbu $v0, 0($a0) - lbu $v1, 0($a1) - addiu $a0, 1 - bne $v0, $v1, .Lmismatch - addiu $a1, 1 - b memcmp - nop -.Lmismatch: - jr $ra - sub $v0, $v1 -.Lexit: - jr $ra - move $v0, $0 -
\ No newline at end of file diff --git a/libpsn00b/libc/memcpy.s b/libpsn00b/libc/memcpy.s deleted file mode 100644 index 26edb37..0000000 --- a/libpsn00b/libc/memcpy.s +++ /dev/null @@ -1,28 +0,0 @@ -# High speed ASM memcpy implementation by Lameguy64 -# -# Part of PSn00bSDK - -.set noreorder - -.section .text - -# Arguments: -# a0 - destination address -# a1 - source adress -# a2 - bytes to copy -.global memcpy -.type memcpy, @function -memcpy: - move $v0, $a0 -.Lloop: - blez $a2, .Lexit - addi $a2, -1 - lbu $a3, 0($a1) - addiu $a1, 1 - sb $a3, 0($a0) - b .Lloop - addiu $a0, 1 -.Lexit: - jr $ra - nop -
\ No newline at end of file diff --git a/libpsn00b/libc/memmove.s b/libpsn00b/libc/memmove.s deleted file mode 100644 index 843ece7..0000000 --- a/libpsn00b/libc/memmove.s +++ /dev/null @@ -1,42 +0,0 @@ -.set noreorder - -.section .text - -# Arguments -# a0 - destination address -# a1 - source address -# a2 - bytes to move -.global memmove -.type memmove, @function -memmove: - move $v0, $a0 - sltu $v1, $a0, $a1 - blez $v1, .Linit_backward -.Lloop_forward: - blez $a2, .Lexit - addi $a2, -1 - lbu $v1, 0($a1) - addiu $a1, 1 - sb $v1, 0($a0) - addiu $a0, 1 - b .Lloop_forward - nop -.Linit_backward: - addu $a0, $a2 - addu $a1, $a2 - addiu $a0, -1 - addiu $a1, -1 - b .Lloop_backward - nop -.Lloop_backward: - blez $a2, .Lexit - addi $a2, -1 - lbu $v1, 0($a1) - addiu $a1, -1 - sb $v1, 0($a0) - addiu $a0, -1 - b .Lloop_backward - nop -.Lexit: - jr $ra - nop
\ No newline at end of file diff --git a/libpsn00b/libc/start.c b/libpsn00b/libc/start.c index 9ff09c8..dcbad2d 100644 --- a/libpsn00b/libc/start.c +++ b/libpsn00b/libc/start.c @@ -11,11 +11,13 @@ #define KERNEL_ARG_STRING ((const char *) 0x80000180) #define KERNEL_RETURN_VALUE ((volatile int *) 0x8000dffc) -/* Argument parsing */ +/* BIOS argv parser (unused, interferes with child executable argv passing) */ int __argc; const char **__argv; +#if 0 + #define ARGC_MAX 16 static const char *_argv_buffer[ARGC_MAX]; @@ -48,6 +50,8 @@ static void _parse_kernel_args(void) { } } +#endif + /* Main */ // These are defined by the linker script. Note that these are *NOT* pointers, @@ -66,11 +70,10 @@ extern int main(int argc, const char* argv[]); // Even though _start() usually takes no arguments, this implementation allows // parent executables to pass args directly to child executables without having // to overwrite the arg strings in kernel RAM. -void _start_inner(int32_t override_argc, const char **override_argv) { +void _start_inner(int argc, const char **argv) { //__asm__ volatile("la $gp, _gp;"); - // Clear BSS 4 bytes at a time. BSS is always aligned to 4 bytes by the - // linker script. + // BSS is always aligned to 4 bytes by the linker script. for (uint32_t *i = (uint32_t *) __bss_start; i < (uint32_t *) _end; i++) *i = 0; @@ -78,17 +81,14 @@ void _start_inner(int32_t override_argc, const char **override_argv) { // RAM. Note that InitHeap() can be called again in main(). InitHeap((void *) _end + 4, (void *) 0x801ffff8 - (void *) _end); - if (override_argv) { - __argc = override_argc; - __argv = override_argv; - } else { - _parse_kernel_args(); - } + //_parse_kernel_args(); + __argc = argc; + __argv = argv; // Call the global constructors (if any) to initialize global objects // before calling main(). Constructors are put by the linker script in a // length-prefixed array in reverse order. - for (uint32_t i = (uint32_t) __CTOR_LIST__[0]; i >= 1; i--) + for (int i = (int) __CTOR_LIST__[0]; i >= 1; i--) __CTOR_LIST__[i](); // Store main()'s return value into the kernel return value area (for child @@ -96,6 +96,6 @@ void _start_inner(int32_t override_argc, const char **override_argv) { *KERNEL_RETURN_VALUE = main(__argc, __argv); // Call global destructors (in forward order). - for (uint32_t i = 0; i < (uint32_t) __DTOR_LIST__[0]; i++) + for (int i = 0; i < (int) __DTOR_LIST__[0]; i++) __DTOR_LIST__[i + 1](); } diff --git a/libpsn00b/libc/string.c b/libpsn00b/libc/string.c index a1a9a05..dbc2621 100644 --- a/libpsn00b/libc/string.c +++ b/libpsn00b/libc/string.c @@ -1,295 +1,457 @@ /* - * string.c - * - * Inherited from PSXSDK C library + * PSn00bSDK standard library + * (C) 2019-2023 PSXSDK authors, Lameguy64, spicyjpeg - MPL licensed */ -#include <stdio.h> -#include <string.h> +#include <stdint.h> +#include <stddef.h> #include <stdlib.h> +#include <string.h> // Uncomment to enable strtod(), strtold() and strtof(). Note that these // functions use extremely slow software floats. //#define ALLOW_FLOAT -int tolower(int chr) -{ - return (chr >='A' && chr<='Z') ? (chr + 32) : (chr); +/* Character manipulation */ + +int isprint(int ch) { + return (ch >= ' ') && (ch <= '~'); } -int toupper(int chr) -{ - return (chr >='a' && chr<='z') ? (chr - 32) : (chr); +int isgraph(int ch) { + return (ch > ' ') && (ch <= '~'); } -// Need to be replaced with MIPS assembler equivalents +int isspace(int ch) { + return (ch == ' ') || ((ch >= '\t') && (ch <= '\r')); +} -void *memchr(void *s , int c , int n) -{ - while(n--) - { - if(*((unsigned char*)s) == (unsigned char)c) - return s; - - s++; - } - - return NULL; +int isblank(int ch) { + return (ch == ' ') || (ch == '\t'); } -char *strncpy(char *dst, const char *src, int len) -{ - char *odst=dst; +int isalpha(int ch) { + return ((ch >= 'A') && (ch <= 'Z')) || ((ch >= 'a') && (ch <= 'z')); +} - while(*src && len) - { - *(dst++) = *(src++); - len--; - } - - *dst = 0; - - return odst; +int isdigit(int ch) { + return (ch >= '0') && (ch <= '9'); } -char *strcpy(char *dst, const char *src) -{ - char *odst = dst; +int tolower(int ch) { + if ((ch >= 'A') && (ch <= 'Z')) + ch += 'a' - 'A'; - while(*(dst++) = *(src++)); - return odst; + return ch; } -char *strcat(char *dst, const char *src) -{ - char *o=dst; - - while(*dst) - dst++; - - strcpy(dst, src); - - return o; +int toupper(int ch) { + if ((ch >= 'a') && (ch <= 'z')) + ch += 'A' - 'a'; + + return ch; } -char *strncat(char *s, const char *append, int len) -{ - char *o=s; - - while(*s) - s++; - - strncpy(s, append, len); - - return o; +/* Memory buffer manipulation */ + +// TODO: replace more of these with optimized assembly implementations + +/*void *memset(void *dest, int ch, size_t count) { + uint8_t *_dest = (uint8_t *) dest; + + for (; count; count--) + *(_dest++) = (uint8_t) ch; + + return dest; +}*/ + +void *memcpy(void *restrict dest, const void *restrict src, size_t count) { + uint8_t *_dest = (uint8_t *) dest; + const uint8_t *_src = (const uint8_t *) src; + + for (; count; count--) + *(_dest++) = *(_src++); + + return dest; } -int strlen(const char *str) -{ - int i = 0; - while(*(str++))i++; - return i; +void *memccpy(void *restrict dest, const void *restrict src, int ch, size_t count) { + uint8_t *_dest = (uint8_t *) dest; + const uint8_t *_src = (const uint8_t *) src; + + for (; count; count--) { + uint8_t a = *(_src++); + + *(_dest++) = a; + if (a == ch) + return (void *) _dest; + } + + return 0; } -char *strchr(const char *s, int c) -{ - int x; +void *memmove(void *dest, const void *src, size_t count) { + uint8_t *_dest = (uint8_t *) dest; + const uint8_t *_src = (const uint8_t *) src; - for(x = 0; x <= strlen(s); x++) - if(s[x] == c) return (char*)&s[x]; + if (_dest == _src) + return dest; + if ((_dest >= &_src[count]) || (&_dest[count] <= _src)) + return memcpy(dest, src, count); - return NULL; + if (_dest < _src) { // Copy forwards + for (; count; count--) + *(_dest++) = *(_src++); + } else { // Copy backwards + _src += count; + _dest += count; + + for (; count; count--) + *(--_dest) = *(--_src); + } + + return dest; } -char *strrchr(const char *s, int c) -{ - int x; +int memcmp(const void *lhs, const void *rhs, size_t count) { + const uint8_t *_lhs = (const uint8_t *) lhs; + const uint8_t *_rhs = (const uint8_t *) rhs; + + for (; count; count--) { + uint8_t a = *(_lhs++), b = *(_rhs++); - for(x = strlen(s); x>=0; x--) - if(s[x] == c) return (char*)&s[x]; + if (a != b) + return a - b; + } - return NULL; + return 0; } -char *strpbrk(const char *s, const char *charset) -{ - int x,y; +void *memchr(const void *ptr, int ch, size_t count) { + const uint8_t *_ptr = (const uint8_t *) ptr; - for(x = 0; x < strlen(s); x++) - for(y = 0; y < strlen(charset); y++) - if(s[x] == charset[y]) return (char*)&s[x]; + for (; count; count--, _ptr++) { + if (*_ptr == ch) + return (void *) _ptr; + } - return NULL; + return 0; } -char *strstr(const char *big, const char *little) -{ - int ls = strlen(little); - int bs = strlen(big); - int x; +/* String manipulation */ - if(ls == 0) - return (char*)big; - - if(ls > bs) - return NULL; +char *strcpy(char *restrict dest, const char *restrict src) { + char *_dest = dest; - for(x = 0; x <= bs-ls; x++) - if(memcmp(little, &big[x], ls) == 0) - return (char*)&big[x]; + while (*src) + *(_dest++) = *(src++); - return NULL; + *_dest = 0; + return dest; } -int strcmp(const char *s1, const char *s2) -{ - while((*s1) && (*s2) && (*s1 == *s2)) - { - s1++; - s2++; +char *strncpy(char *restrict dest, const char *restrict src, size_t count) { + char *_dest = dest; + + for (; count && *src; count--) + *(_dest++) = *(src++); + for (; count; count--) + *(_dest++) = 0; + + return dest; +} + +int strcmp(const char *lhs, const char *rhs) { + for (;;) { + char a = *(lhs++), b = *(rhs++); + + if (a != b) + return a - b; + if (!a && !b) + return 0; + } +} + +int strncmp(const char *lhs, const char *rhs, size_t count) { + for (; count && *lhs && *rhs; count--) { + char a = *(lhs++), b = *(rhs++); + + if (a != b) + return a - b; } - return(*s1-*s2); + return 0; } -int strncmp(const char *s1, const char *s2, int len) -{ - int p = 0; +char *strchr(const char *str, int ch) { + for (; *str; str++) { + if (*str == ch) + return (char *) str; + } - while(*s1 && *s2 && (*s1 == *s2) && p<len) - { - p++; + return 0; +} + +char *strrchr(const char *str, int ch) { + size_t length = strlen(str); + + for (str += length; length; length--) { + str--; + if (*str == ch) + return (char *) str; + } + + return 0; +} + +char *strpbrk(const char *str, const char *breakset) { + for (; *str; str++) { + char a = *str; - if(p<len) - { - s1++; - s2++; + for (const char *ch = breakset; *ch; ch++) { + if (a == *ch) + return (char *) str; } } - return *s1-*s2; + return 0; } -// Requires a malloc implementation -char *strdup(const char *str) -{ - char *ns = (void*)malloc(strlen(str) + 1); +char *strstr(const char *str, const char *substr) { + size_t length = strlen(substr); - if(ns == NULL) - return NULL; - - strcpy(ns, str); - return ns; + if (!length) + return (char *) str; + + for (; *str; str++) { + if (!memcmp(str, substr, length)) + return (char *) str; + } + + return 0; } -char *strndup(const char *str, int len) -{ - int n=strlen(str); - char *ns = (void*)malloc((n+1)>len?len:(n+1)); +size_t strlen(const char *str) { + size_t length = 0; - if(ns == NULL) - return NULL; - - strncpy(ns, str, (n+1)>len?len:(n+1)); - return ns; + for (; *str; str++) + length++; + + return length; } - -long long strtoll(const char *nptr, char **endptr, int base) -{ - int r = 0; - int t = 0; - int n = 0; - - if(*nptr == '-') - { - nptr++; - n = 1; + +// Non-standard, used internally +size_t strnlen(const char *str, size_t count) { + size_t length = 0; + + for (; *str && (length < count); str++) + length++; + + return length; +} + +char *strcat(char *restrict dest, const char *restrict src) { + char *_dest = &dest[strlen(dest)]; + + while (*src) + *(_dest++) = *(src++); + + *_dest = 0; + return dest; +} + +char *strncat(char *restrict dest, const char *restrict src, size_t count) { + char *_dest = &dest[strlen(dest)]; + + for (; count && *src; count--) + *(_dest++) = *(src++); + + *_dest = 0; + return dest; +} + +char *strdup(const char *str) { + size_t length = strlen(str) + 1; + char *copy = malloc(length); + + if (!copy) + return 0; + + memcpy(copy, str, length); + return copy; +} + +char *strndup(const char *str, size_t count) { + size_t length = strnlen(str, count) + 1; + char *copy = malloc(length); + + if (!copy) + return 0; + + memcpy(copy, str, length); + return copy; +} + +/* String tokenizer */ + +static char *_strtok_ptr = 0, *_strtok_end_ptr = 0; + +char *strtok(char *restrict str, const char *restrict delim) { + if (str) { + _strtok_ptr = str; + _strtok_end_ptr = &str[strlen(str)]; } - if(base == 0) - if(*nptr == '0') - base = 8; - else - base = 10; + if (_strtok_ptr >= _strtok_end_ptr) + return 0; + if (!(*_strtok_ptr)) + return 0; + + char *split = strstr(_strtok_ptr, delim); + char *token = _strtok_ptr; + + if (split) { + *(split++) = 0; + _strtok_ptr = split; + } else { + _strtok_ptr += strlen(token); + } - if(!(base >= 2 && base <= 36)) + return token; +} + +/* Number parsers */ + +long long strtoll(const char *restrict str, char **restrict str_end, int base) { + if (!str) return 0; - if(base == 16 && *nptr == '0') - { - if(*(nptr+1) == 'x' || *(nptr+1) == 'X') - nptr+=2; + while (isspace(*str)) + str++; + + int negative = (*str == '-'); + if (negative) + str++; + + while (isspace(*str)) + str++; + + // Parse any base prefix if present. If a base was specified make sure it + // matches, otherwise use it to determine which base the value is in. + long long value = 0; + + if (*str == '0') { + int _base; + + switch (str[1]) { + case 0: + goto _exit_loop; + + case 'X': + case 'x': + _base = 16; + str += 2; + break; + + case 'O': + case 'o': + _base = 8; + str += 2; + break; + + case 'B': + case 'b': + _base = 2; + str += 2; + break; + + default: + // Numbers starting with a zero are *not* interpreted as octal + // unless base = 8. + _base = 0; + str++; + } + + if (!base) + base = _base; + else if (base != _base) + return 0; } - while(*nptr) - { - switch(*nptr) - { - case '0'...'9': - t = *nptr - '0'; - break; - case 'a' ... 'z': - t = (*nptr - 'a') + 10; - break; + if (!base) + base = 10; + else if ((base < 2) || (base > 36)) + return 0; + + // Parse the actual value. + for (; *str; str++) { + char ch = *str; + int digit; + + switch (ch) { + case '0' ... '9': + digit = ch - '0'; + break; + case 'A' ... 'Z': - t = (*nptr - 'A') + 10; - break; + digit = (ch - 'A') + 10; + break; + + case 'a' ... 'z': + digit = (ch - 'a') + 10; + break; + default: - t = 1000; - break; + goto _exit_loop; } - if(t>=base) - break; - - r*=base; - r+=t; - nptr++; + value = (value * base) + digit; } - if(endptr)*endptr = (char*)nptr; - return n?-r:r; +_exit_loop: + if (str_end) + *str_end = (char *) str; + + return negative ? (-value) : value; } -long strtol(const char *nptr, char **endptr, int base) -{ - return (long)strtoll(nptr, endptr, base); +long strtol(const char *restrict str, char **restrict str_end, int base) { + return (long) strtoll(str, str_end, base); } #ifdef ALLOW_FLOAT -double strtod(const char *nptr, char **endptr) -{ +double strtod(const char *restrict str, char **restrict str_end) { char strbuf[64]; int x = 0; int y; double i=0, d=0; int s=1; - if(*nptr == '-') + if(*str == '-') { - nptr++; + str++; s=-1; } - while(*nptr >= '0' && *nptr <= '9' && x < 18) - strbuf[x++] = *(nptr++); + while(*str >= '0' && *str <= '9' && x < 18) + strbuf[x++] = *(str++); strbuf[x] = 0; i = (double)strtoll(strbuf, NULL, 10); - if(*nptr == '.') + if(*str == '.') { - nptr++; + str++; x = 0; - while(*nptr >= '0' && *nptr <= '9' && x < 7) - strbuf[x++] = *(nptr++); + while(*str >= '0' && *str <= '9' && x < 7) + strbuf[x++] = *(str++); strbuf[x] = 0; - if(endptr != NULL) *endptr = (char*)nptr; + if(str_end != NULL) *str_end = (char*)str; y=1; @@ -301,67 +463,19 @@ double strtod(const char *nptr, char **endptr) } else { - if(endptr != NULL) - *endptr = (char*)nptr; + if(str_end != NULL) + *str_end = (char*)str; } return (i + d)*s; } -#endif - -/* implementation by Lameguy64, behaves like OpenWatcom's strtok() */ -/* BIOS strtok seemed either bugged, or designed for wide chars */ - -static char *_strtok_curpos; -static char *_strtok_endpos; - -char *strtok( char *s1, char *s2 ) -{ - char *c,*t; - - if( s1 ) - { - _strtok_curpos = s1; - _strtok_endpos = s1+strlen( s1 ); - } - else - { - if( _strtok_curpos >= _strtok_endpos ) - return( NULL ); - } - - if( !*_strtok_curpos ) - return( NULL ); - - if( c = strstr( _strtok_curpos, s2 ) ) - { - *c = 0; - t = _strtok_curpos; - _strtok_curpos = c+1; - return( t ); - } - else - { - t = _strtok_curpos; - _strtok_curpos += strlen( t ); - return( t ); - } - - return( NULL ); - -} /* strtok */ - -#ifdef ALLOW_FLOAT - -long double strtold(const char *nptr, char **endptr) -{ - return (long double)strtod(nptr, endptr); +long double strtold(const char *restrict str, char **restrict str_end) { + return (long double) strtod(str, str_end); } -float strtof(const char *nptr, char **endptr) -{ - return (float)strtod(nptr, endptr); +float strtof(const char *restrict str, char **restrict str_end) { + return (float) strtod(str, str_end); } #endif diff --git a/libpsn00b/psxcd/isofs.c b/libpsn00b/psxcd/isofs.c index 5fd0536..31ed00c 100644 --- a/libpsn00b/psxcd/isofs.c +++ b/libpsn00b/psxcd/isofs.c @@ -92,7 +92,7 @@ static int _CdReadIsoDescriptor(int session_offs) // Verify if volume descriptor is present descriptor = (ISO_DESCRIPTOR*)_cd_iso_descriptor_buff; - if( strncmp("CD001", descriptor->header.id, 5) ) + if( memcmp("CD001", descriptor->header.id, 5) ) { _sdk_log("Disc does not contain a ISO9660 file system.\n"); @@ -211,7 +211,7 @@ static int _CdReadIsoDirectory(int lba) return 0; } -#ifndef NDEBUG +#if 0 static void dump_directory(void) { @@ -228,8 +228,12 @@ static void dump_directory(void) { dir_entry = (ISO_DIR_ENTRY*)(_cd_iso_directory_buff+dir_pos); - strncpy(namebuff, - _cd_iso_directory_buff+dir_pos+sizeof(ISO_DIR_ENTRY), dir_entry->identifierLen); + memcpy( + namebuff, + _cd_iso_directory_buff+dir_pos+sizeof(ISO_DIR_ENTRY), + dir_entry->identifierLen + ); + namebuff[dir_entry->identifierLen] = 0; _sdk_log("P:%d L:%d %s\n", dir_pos, dir_entry->identifierLen, namebuff); @@ -271,9 +275,12 @@ static void dump_pathtable(void) while( (int)(tbl_pos-_cd_iso_pathtable_buff) < descriptor->pathTableSize.lsb ) { - strncpy(namebuff, + memcpy( + namebuff, tbl_pos+sizeof(ISO_PATHTABLE_ENTRY), - tbl_entry->nameLength); + tbl_entry->nameLength + ); + namebuff[tbl_entry->nameLength] = 0; _sdk_log("%s\n", namebuff); @@ -308,9 +315,12 @@ static int get_pathtable_entry(int entry, ISO_PATHTABLE_ENTRY *tbl, char *namebu { if( namebuff ) { - strncpy(namebuff, + memcpy( + namebuff, tbl_pos+sizeof(ISO_PATHTABLE_ENTRY), - tbl_entry->nameLength); + tbl_entry->nameLength + ); + namebuff[tbl_entry->nameLength] = 0; } if( tbl ) @@ -381,9 +391,12 @@ static int find_dir_entry(const char *name, ISO_DIR_ENTRY *dirent) if( !(dir_entry->flags & 0x2) ) { - strncpy(namebuff, + memcpy( + namebuff, _cd_iso_directory_buff+dir_pos+sizeof(ISO_DIR_ENTRY), - dir_entry->identifierLen); + dir_entry->identifierLen + ); + namebuff[dir_entry->identifierLen] = 0; if( strcmp(namebuff, name) == 0 ) { @@ -422,7 +435,8 @@ static char* get_pathname(char *path, const char *filename) return NULL; } - strncpy(path, filename, (int)(c-filename)); + memcpy(path, filename, c - filename); + path[c - filename] = 0; return path; } @@ -609,7 +623,11 @@ CdlDIR *CdOpenDir(const char* path) _sdk_log( "Directory LBA = %d\n", tbl_entry.dirOffs ); _CdReadIsoDirectory( tbl_entry.dirOffs ); - + +#ifndef NDEBUG + //dump_directory(); +#endif + dir = (CdlDIR_INT*)malloc( sizeof(CdlDIR_INT) ); dir->_len = _cd_iso_directory_len; @@ -664,9 +682,12 @@ int CdReadDir(CdlDIR *dir, CdlFILE* file) } else { - strncpy( file->name, + memcpy( + file->name, d_dir->_dir+d_dir->_pos+sizeof(ISO_DIR_ENTRY), - dir_entry->identifierLen ); + dir_entry->identifierLen + ); + file->name[dir_entry->identifierLen] = 0; } CdIntToPos( dir_entry->entryOffs.lsb, &file->pos ); @@ -746,7 +767,7 @@ static void _scan_callback(CdlIntrResult status, unsigned char *result) if( _ses_scanbuff[0] == 0x1 ) { - if( strncmp((const char*)_ses_scanbuff+1, "CD001", 5) == 0 ) + if( memcmp((const char*)_ses_scanbuff+1, "CD001", 5) == 0 ) { CdControlF(CdlPause, 0); _ses_scancomplete = 1; |
