aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libpsn00b/include/ctype.h13
-rw-r--r--libpsn00b/include/stdlib.h10
-rw-r--r--libpsn00b/include/string.h44
-rw-r--r--libpsn00b/libc/memcmp.s31
-rw-r--r--libpsn00b/libc/memcpy.s28
-rw-r--r--libpsn00b/libc/memmove.s42
-rw-r--r--libpsn00b/libc/start.c24
-rw-r--r--libpsn00b/libc/string.c604
-rw-r--r--libpsn00b/psxcd/isofs.c51
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;