summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWilliam Wilgus <wilgus.william@gmail.com>2022-11-13 00:43:43 -0500
committerWilliam Wilgus <me.theuser@yahoo.com>2022-11-13 01:14:49 -0500
commita634557a881b59b8be1dc156f9822c6d20bd8741 (patch)
treefd953a0ea1d9a02a8d73a15f1aead27b59c5ffaa
parentffe2df2e92cbdeb507a49279a85ac88cac2fbe4f (diff)
downloadrockbox-a634557a88.tar.gz
rockbox-a634557a88.zip
fix strptokspn, add strcspn, fix splash.c
fix off by 1 error in strptokspn, add strcspn, fix fallout in splash.c Change-Id: I61475d9633fc35db5a8ae30cbe588f69f2f7fabc
-rw-r--r--apps/gui/splash.c11
-rw-r--r--apps/playback.c10
-rw-r--r--firmware/SOURCES2
-rw-r--r--firmware/common/strptokspn.c33
-rw-r--r--firmware/libc/strcspn.c45
5 files changed, 65 insertions, 36 deletions
diff --git a/apps/gui/splash.c b/apps/gui/splash.c
index 65c3ad8c13..d0f1fbb67c 100644
--- a/apps/gui/splash.c
+++ b/apps/gui/splash.c
@@ -73,11 +73,11 @@ static bool splash_internal(struct screen * screen, const char *fmt, va_list ap,
if (!next)
return false; /* nothing to display */
- lines[line].len = next_len + 1;
+ lines[line].len = next_len;
lines[line].str = next;
while (true)
{
- w = font_getstringnsize(next, next_len + 1, NULL, NULL, fontnum);
+ w = font_getstringnsize(next, next_len, NULL, NULL, fontnum);
if (lastbreak)
{
len = next - lastbreak;
@@ -90,18 +90,19 @@ static bool splash_internal(struct screen * screen, const char *fmt, va_list ap,
break; /* screen full or out of lines */
x = 0;
y += chr_h;
- lines[++line].len = next_len + len;
+ lines[++line].len = next_len;
lines[line].str = next;
}
else
{
/* restore & calculate spacing */
- lines[line].len += next_len + len + 1;
+ lines[line].len += next_len + 1;
x += next_w;
}
}
x += w;
- lastbreak = next + next_len + 1;
+
+ lastbreak = next + next_len;
lastbrkchr = *lastbreak;
next = strptokspn_r(NULL, matchstr, &next_len, &store);
diff --git a/apps/playback.c b/apps/playback.c
index c425e14baf..7eaa149f2c 100644
--- a/apps/playback.c
+++ b/apps/playback.c
@@ -1483,7 +1483,7 @@ static bool audio_init_codec(struct track_info *track_infop,
enum { AUTORESUMABLE_UNKNOWN = 0, AUTORESUMABLE_TRUE, AUTORESUMABLE_FALSE };
static bool autoresumable(struct mp3entry *id3)
{
- char *endp, *path;
+ char *path;
size_t len;
bool is_resumable;
@@ -1501,13 +1501,7 @@ static bool autoresumable(struct mp3entry *id3)
if (*path == ':') /* Skip empty search patterns */
continue;
- /* FIXME: As soon as strcspn or strchrnul are made available in
- the core, the following can be made more efficient. */
- endp = strchr(path, ':');
- if (endp)
- len = endp - path;
- else
- len = strlen(path);
+ len = strcspn(path, ":");
/* Note: At this point, len is always > 0 */
diff --git a/firmware/SOURCES b/firmware/SOURCES
index 4aa7c38daf..76d6cee921 100644
--- a/firmware/SOURCES
+++ b/firmware/SOURCES
@@ -271,7 +271,7 @@ libc/strcat.c
libc/strchr.c
libc/strcmp.c
libc/strcpy.c
-
+libc/strcspn.c
libc/strncmp.c
libc/strrchr.c
libc/strstr.c
diff --git a/firmware/common/strptokspn.c b/firmware/common/strptokspn.c
index f4b92c0712..16aafc66ef 100644
--- a/firmware/common/strptokspn.c
+++ b/firmware/common/strptokspn.c
@@ -39,40 +39,29 @@
* Pointer **end
*
* Note the returned token is NOT NULL terminated by the function as in strtok_r
- * However the caller can use ret[len+1] = '\0'; to emulate a call to strtok_r
+ * However the caller can use ret[len] = '\0'; to emulate a call to strtok_r
*/
-
const char *strptokspn_r(const char *ptr, const char *sep, size_t *len, const char **end)
{
- *len = 0;
- if (!ptr)
- /* we got NULL input so then we get our last position instead */
+ if (ptr == NULL) /* we got NULL input so then we get last position instead */
+ {
ptr = *end;
+ }
/* pass all letters that are including in the separator string */
while (*ptr && strchr(sep, *ptr))
++ptr;
- if (*ptr) {
+ if (*ptr != '\0')
+ {
/* so this is where the next piece of string starts */
const char *start = ptr;
-
- /* set the end pointer to the first byte after the start */
- *end = start + 1;
-
- /* scan through the string to find where it ends, it ends on a
- null byte or a character that exists in the separator string */
- while (**end && !strchr(sep, **end))
+ *len = strcspn(ptr, sep); /* Get span until any sep character in string */
+ *end = ptr + *len;
+ if (**end) /* the end is not a null byte */
++*end;
- *len = (*end - start) - 1; /* this would be the string len if there actually was a NULL */
- if (**end) { /* the end is not a null byte */
- ++*end; /* advance last pointer to beyond the match */
- }
-
- return start; /* return the position where the string starts */
+ return start;
}
-
- /* we ended up on a null byte, there are no more strings to find! */
return NULL;
}
@@ -82,7 +71,7 @@ char * strtok_r(char *ptr, const char *sep, char **end)
size_t len;
char * ret = (char*) strptokspn_r((const char*)ptr, sep, &len, (const char**) end);
if (ret)
- ret[len + 1] = '\0';
+ ret[len] = '\0';
return ret;
}
#endif
diff --git a/firmware/libc/strcspn.c b/firmware/libc/strcspn.c
new file mode 100644
index 0000000000..ee50066ed1
--- /dev/null
+++ b/firmware/libc/strcspn.c
@@ -0,0 +1,45 @@
+/*
+FUNCTION
+ <<strcspn>>---count characters not in string
+INDEX
+ strcspn
+ANSI_SYNOPSIS
+ size_t strcspn(const char *<[s1]>, const char *<[s2]>);
+TRAD_SYNOPSIS
+ size_t strcspn(<[s1]>, <[s2]>)
+ char *<[s1]>;
+ char *<[s2]>;
+DESCRIPTION
+ This function computes the length of the initial part of
+ the string pointed to by <[s1]> which consists entirely of
+ characters <[NOT]> from the string pointed to by <[s2]>
+ (excluding the terminating null character).
+RETURNS
+ <<strcspn>> returns the length of the substring found.
+PORTABILITY
+<<strcspn>> is ANSI C.
+<<strcspn>> requires no supporting OS subroutines.
+ */
+#include <string.h>
+#include "_ansi.h" /* for _DEFUN */
+
+size_t
+_DEFUN (strcspn, (s1, s2),
+ _CONST char *s1 _AND
+ _CONST char *s2)
+{
+ _CONST char *s = s1;
+ _CONST char *c;
+ while (*s1)
+ {
+ for (c = s2; *c; c++)
+ {
+ if (*s1 == *c)
+ break;
+ }
+ if (*c)
+ break;
+ s1++;
+ }
+ return s1 - s;
+}