diff options
-rw-r--r-- | Makefile | 2 | ||||
-rw-r--r-- | libsimple/mem.h | 41 | ||||
-rw-r--r-- | man/libsimple_memrcasechr.3 | 81 | ||||
-rw-r--r-- | man/libsimple_memrchr.3 | 1 | ||||
-rw-r--r-- | man/libsimple_rawmemcasechr.3 | 81 | ||||
-rw-r--r-- | man/libsimple_rawmemchr.3 | 1 | ||||
l--------- | man/memcasechr.3libsimple | 1 | ||||
l--------- | man/memcasecmp.3libsimple | 1 | ||||
l--------- | man/memcaseends.3libsimple | 1 | ||||
l--------- | man/memcaseeq.3libsimple | 1 | ||||
l--------- | man/memcasemem.3libsimple | 1 | ||||
l--------- | man/memcasestarts.3libsimple | 1 | ||||
l--------- | man/memrcasechr.3libsimple | 1 | ||||
l--------- | man/memrcasemem.3libsimple | 1 | ||||
l--------- | man/rawmemcasechr.3libsimple | 1 | ||||
l--------- | man/rawmemrcasechr.3libsimple | 1 | ||||
-rw-r--r-- | memrcasechr.c | 35 | ||||
-rw-r--r-- | memrchr.c | 12 | ||||
-rw-r--r-- | rawmemcasechr.c | 33 | ||||
-rw-r--r-- | rawmemchr.c | 10 |
20 files changed, 300 insertions, 7 deletions
@@ -66,6 +66,7 @@ OBJ =\ memeqlen.o\ memmem.o\ mempsetelem.o\ + memrcasechr.o\ memrcaseeqlen.o\ memrchr.o\ memrelem.o\ @@ -75,6 +76,7 @@ OBJ =\ minimise_number_string.o\ multimespec.o\ multimeval.o\ + rawmemcasechr.o\ rawmemchr.o\ rawmemrchr.o\ rawmemrchr.o\ diff --git a/libsimple/mem.h b/libsimple/mem.h index 3092ddc..9f2f9a3 100644 --- a/libsimple/mem.h +++ b/libsimple/mem.h @@ -2,8 +2,6 @@ /* TODO memcasechr */ -/* TODO rawmemcasechr */ -/* TODO memrcasechr */ /* TODO rawmemrcasechr */ /* TODO memcasemem */ /* TODO memrcasemem */ @@ -35,6 +33,27 @@ void *libsimple_rawmemchr(const void *, int); /** + * Finds the first occurence of a byte value in an array of bytes, + * the comparison is case-insensitive + * + * This function is optimised for instances where it is already + * known that there is at least one occurence; if is no occurence + * of the specified byte value in the specified byte array, this + * behaviour is undefined + * + * @param s The array of bytes to search + * @param c The byte value to search for + * @return `s` with a miminal offset such that `tolower(*r) == tolower(c)`, + * where `r` is the returned pointer + */ +_LIBSIMPLE_GCC_ONLY(__attribute__((__pure__, __nonnull__, __warn_unused_result__))) +void *libsimple_rawmemcasechr(const void *, int); +#ifndef rawmemcasechr +# define rawmemcasechr libsimple_rawmemcasechr +#endif + + +/** * Finds the last occurence of a byte value in an array of bytes, * the comparison is case-sensitive * @@ -54,6 +73,24 @@ void *libsimple_memrchr(const void *, int, size_t); /** * Finds the last occurence of a byte value in an array of bytes, + * the comparison is case-insensitive + * + * @param s The array of bytes to search + * @param c The byte value to search for + * @param n The number of bytes in the byte array + * @return `s` with a maximal offset such that `*r == c`, + * where `r` is the returned pointer `NULL` if no + * such offset exists within [s, &s[n]) + */ +_LIBSIMPLE_GCC_ONLY(__attribute__((__pure__, __nonnull__, __warn_unused_result__))) +void *libsimple_memrcasechr(const void *, int, size_t); +#ifndef memrcasechr +# define memrcasechr libsimple_memrcasechr +#endif + + +/** + * Finds the last occurence of a byte value in an array of bytes, * the comparison is case-sensitive * * This function is optimised for instances where it is already diff --git a/man/libsimple_memrcasechr.3 b/man/libsimple_memrcasechr.3 new file mode 100644 index 0000000..be5b748 --- /dev/null +++ b/man/libsimple_memrcasechr.3 @@ -0,0 +1,81 @@ +.TH LIBSIMPLE_MEMRCASECHR 3 2018-10-20 libsimple +.SH NAME +libsimple_memrcasechr \- find byte in memory +.SH SYNOPSIS +.nf +#include <libsimple.h> + +void *libsimple_memrcasechr(const void *\fIs\fP, int \fIc\fP, size_t \fIn\fP); + +#ifndef memrcasechr +# define memrcasechr libsimple_memrcasechr +#endif +.fi +.PP +Link with +.IR \-lsimple . +.SH DESCRIPTION +The +.BR libsimple_memrcasechr () +function scans the memory segment +.IR s , +with the size +.IR n , +for the last occurence of the byte +.I c +(it is converted to a +.BR char ). +.PP +The comparison is case-insensitive. +.SH RETURN VALUE +The +.BR libsimple_memrcasechr () +function returns the pointer +.I s +with a maximal offset such that +.IR tolower(*r)==tolower(c) , +where +.I r +is the returned pointer. +If no such offset exists, +.B NULL +is returned. +.SH ERRORS +The +.BR libsimple_memrcasechr () +function cannot fail. +.SH ATTRIBUTES +For an explanation of the terms used in this section, see +.BR attributes (7). +.TS +allbox; +lb lb lb +l l l. +Interface Attribute Value +T{ +.BR libsimple_memrcasechr () +T} Thread safety MT-Safe +T{ +.BR libsimple_memrcasechr () +T} Async-signal safety AS-Safe +T{ +.BR libsimple_memrcasechr () +T} Async-cancel safety AC-Safe +.TE +.SH EXAMPLES +None. +.SH APPLICATION USAGE +None. +.SH RATIONALE +None. +.SH FUTURE DIRECTIONS +None. +.SH NOTES +None. +.SH BUGS +None. +.SH SEE ALSO +.BR libsimple_memrchr (3), +.BR libsimple_rawmemrcasechr (3), +.BR libsimple_memrcasemem (3), +.BR libsimple_memcasechr (3) diff --git a/man/libsimple_memrchr.3 b/man/libsimple_memrchr.3 index 8fd74f7..958fbc9 100644 --- a/man/libsimple_memrchr.3 +++ b/man/libsimple_memrchr.3 @@ -75,6 +75,7 @@ None. .SH BUGS None. .SH SEE ALSO +.BR libsimple_memrcasechr (3), .BR libsimple_rawmemrchr (3), .BR libsimple_memrmem (3), .BR memchr (3) diff --git a/man/libsimple_rawmemcasechr.3 b/man/libsimple_rawmemcasechr.3 new file mode 100644 index 0000000..3759cd0 --- /dev/null +++ b/man/libsimple_rawmemcasechr.3 @@ -0,0 +1,81 @@ +.TH LIBSIMPLE_RAWMEMCASECHR 3 2018-10-20 libsimple +.SH NAME +libsimple_rawmemcasechr \- find byte in memory +.SH SYNOPSIS +.nf +#include <libsimple.h> + +void *libsimple_rawmemcasechr(const void *\fIs\fP, int \fIc\fP); + +#ifndef rawmemcasechr +# define rawmemcasechr libsimple_rawmemcasechr +#endif +.fi +.PP +Link with +.IR \-lsimple . +.SH DESCRIPTION +The +.BR libsimple_rawmemcasechr () +function scans the memory segment +.I s +for the first occurence of the byte +.I c +(it is converted to a +.BR char ). +.PP +The +.BR libsimple_rawmemcasechr () +function assumes there is at least one +occurence, its behaviour is undefined +if this is not the case. +.PP +The comparison is case-insensitive. +.SH RETURN VALUE +The +.BR libsimple_rawmemcasechr () +function returns the pointer +.I s +with a minimal offset such that +.IR tolower(*r)==tolower(c) , +where +.I r +is the returned pointer. +.SH ERRORS +The +.BR libsimple_rawmemcasechr () +function cannot fail. +.SH ATTRIBUTES +For an explanation of the terms used in this section, see +.BR attributes (7). +.TS +allbox; +lb lb lb +l l l. +Interface Attribute Value +T{ +.BR libsimple_rawmemcasechr () +T} Thread safety MT-Safe +T{ +.BR libsimple_rawmemcasechr () +T} Async-signal safety AS-Safe +T{ +.BR libsimple_rawmemcasechr () +T} Async-cancel safety AC-Safe +.TE +.SH EXAMPLES +None. +.SH APPLICATION USAGE +None. +.SH RATIONALE +None. +.SH FUTURE DIRECTIONS +None. +.SH NOTES +None. +.SH BUGS +None. +.SH SEE ALSO +.BR libsimple_rawmemchr (3), +.BR libsimple_rawmemrcasechr (3), +.BR libsimple_memcasechr (3) diff --git a/man/libsimple_rawmemchr.3 b/man/libsimple_rawmemchr.3 index 4126fbb..0425d9a 100644 --- a/man/libsimple_rawmemchr.3 +++ b/man/libsimple_rawmemchr.3 @@ -76,5 +76,6 @@ None. .SH BUGS None. .SH SEE ALSO +.BR libsimple_rawmemcasechr (3), .BR libsimple_rawmemrchr (3), .BR memchr (3) diff --git a/man/memcasechr.3libsimple b/man/memcasechr.3libsimple new file mode 120000 index 0000000..e7d10b2 --- /dev/null +++ b/man/memcasechr.3libsimple @@ -0,0 +1 @@ +libsimple_memcasechr.3
\ No newline at end of file diff --git a/man/memcasecmp.3libsimple b/man/memcasecmp.3libsimple new file mode 120000 index 0000000..275bff4 --- /dev/null +++ b/man/memcasecmp.3libsimple @@ -0,0 +1 @@ +libsimple_memcasecmp.3
\ No newline at end of file diff --git a/man/memcaseends.3libsimple b/man/memcaseends.3libsimple new file mode 120000 index 0000000..4068e05 --- /dev/null +++ b/man/memcaseends.3libsimple @@ -0,0 +1 @@ +libsimple_memcaseends.3
\ No newline at end of file diff --git a/man/memcaseeq.3libsimple b/man/memcaseeq.3libsimple new file mode 120000 index 0000000..0ec4ac0 --- /dev/null +++ b/man/memcaseeq.3libsimple @@ -0,0 +1 @@ +libsimple_memcaseeq.3
\ No newline at end of file diff --git a/man/memcasemem.3libsimple b/man/memcasemem.3libsimple new file mode 120000 index 0000000..a9c885d --- /dev/null +++ b/man/memcasemem.3libsimple @@ -0,0 +1 @@ +libsimple_memcasemem.3
\ No newline at end of file diff --git a/man/memcasestarts.3libsimple b/man/memcasestarts.3libsimple new file mode 120000 index 0000000..c450aff --- /dev/null +++ b/man/memcasestarts.3libsimple @@ -0,0 +1 @@ +libsimple_memcasestarts.3
\ No newline at end of file diff --git a/man/memrcasechr.3libsimple b/man/memrcasechr.3libsimple new file mode 120000 index 0000000..4337383 --- /dev/null +++ b/man/memrcasechr.3libsimple @@ -0,0 +1 @@ +libsimple_memrcasechr.3
\ No newline at end of file diff --git a/man/memrcasemem.3libsimple b/man/memrcasemem.3libsimple new file mode 120000 index 0000000..6b52d2c --- /dev/null +++ b/man/memrcasemem.3libsimple @@ -0,0 +1 @@ +libsimple_memrcasemem.3
\ No newline at end of file diff --git a/man/rawmemcasechr.3libsimple b/man/rawmemcasechr.3libsimple new file mode 120000 index 0000000..2379e2a --- /dev/null +++ b/man/rawmemcasechr.3libsimple @@ -0,0 +1 @@ +libsimple_rawmemcasechr.3
\ No newline at end of file diff --git a/man/rawmemrcasechr.3libsimple b/man/rawmemrcasechr.3libsimple new file mode 120000 index 0000000..8fd4d5c --- /dev/null +++ b/man/rawmemrcasechr.3libsimple @@ -0,0 +1 @@ +libsimple_rawmemrcasechr.3
\ No newline at end of file diff --git a/memrcasechr.c b/memrcasechr.c new file mode 100644 index 0000000..e4fe52a --- /dev/null +++ b/memrcasechr.c @@ -0,0 +1,35 @@ +/* See LICENSE file for copyright and license details. */ +#include "libsimple.h" +#ifndef TEST + + +void * +libsimple_memrcasechr(const void *s_, int c, size_t n_) +{ + char *s = *(char **)(void *)&s_; + ssize_t n = n_; + c = tolower(c); + while (n-- && tolower(s[n]) != c); + return n < 0 ? NULL : &s[n]; +} + + +#else +#include "test.h" + +int +main(void) +{ + assert(!strcmpnul(libsimple_memrcasechr("abcABCabcABC", 'a', sizeof("abcABCabcABC") - 1), "ABC")); + assert(!strcmpnul(libsimple_memrcasechr("abcABCabcABC", 'c', sizeof("abcABCabcABC") - 1), "C")); + assert(!strcmpnul(libsimple_memrcasechr("abcABCabcABC", 'A', sizeof("abcABCabcABC") - 1), "ABC")); + assert(!strcmpnul(libsimple_memrcasechr("abcABCabcABC", 'C', sizeof("abcABCabcABC") - 1), "C")); + assert(!strcmpnul(libsimple_memrcasechr("ABCabcABCabc", 'a', sizeof("ABCabcABCabc") - 1), "abc")); + assert(!strcmpnul(libsimple_memrcasechr("ABCabcABCabc", 'c', sizeof("ABCabcABCabc") - 1), "c")); + assert(!strcmpnul(libsimple_memrcasechr("ABCabcABCabc", 'A', sizeof("ABCabcABCabc") - 1), "abc")); + assert(!strcmpnul(libsimple_memrcasechr("ABCabcABCabc", 'C', sizeof("ABCabcABCabc") - 1), "c")); + assert(!libsimple_memrcasechr("abcABCabcABC", 'x', sizeof("abcABCabcABC") - 1)); + return 0; +} + +#endif @@ -19,9 +19,15 @@ libsimple_memrchr(const void *s_, int c_, size_t n_) int main(void) { - assert(!strcmpnul(libsimple_memrchr("1234512345", '3', sizeof("1234512345") - 1), "345")); - assert(!strcmpnul(libsimple_memrchr("1234512345", '5', sizeof("1234512345") - 1), "5")); - assert(!libsimple_memrchr("1234512345", 'x', sizeof("1234512345") - 1)); + assert(!strcmpnul(libsimple_memrchr("abcABCabcABC", 'a', sizeof("abcABCabcABC") - 1), "abcABC")); + assert(!strcmpnul(libsimple_memrchr("abcABCabcABC", 'c', sizeof("abcABCabcABC") - 1), "cABC")); + assert(!strcmpnul(libsimple_memrchr("abcABCabcABC", 'A', sizeof("abcABCabcABC") - 1), "ABC")); + assert(!strcmpnul(libsimple_memrchr("abcABCabcABC", 'C', sizeof("abcABCabcABC") - 1), "C")); + assert(!strcmpnul(libsimple_memrchr("ABCabcABCabc", 'a', sizeof("ABCabcABCabc") - 1), "abc")); + assert(!strcmpnul(libsimple_memrchr("ABCabcABCabc", 'c', sizeof("ABCabcABCabc") - 1), "c")); + assert(!strcmpnul(libsimple_memrchr("ABCabcABCabc", 'A', sizeof("ABCabcABCabc") - 1), "ABCabc")); + assert(!strcmpnul(libsimple_memrchr("ABCabcABCabc", 'C', sizeof("ABCabcABCabc") - 1), "Cabc")); + assert(!libsimple_memrchr("abcABCabcABC", 'x', sizeof("abcABCabcABC") - 1)); return 0; } diff --git a/rawmemcasechr.c b/rawmemcasechr.c new file mode 100644 index 0000000..3d3a101 --- /dev/null +++ b/rawmemcasechr.c @@ -0,0 +1,33 @@ +/* See LICENSE file for copyright and license details. */ +#include "libsimple.h" +#ifndef TEST + + +void * +libsimple_rawmemcasechr(const void *s_, int c) +{ + char *s = *(char **)(void *)&s_; + c = tolower(c); + for (; tolower(*s) != c; s++); + return s; +} + + +#else +#include "test.h" + +int +main(void) +{ + assert(!strcmpnul(libsimple_rawmemcasechr("abcABCabcABC", 'a'), "abcABCabcABC")); + assert(!strcmpnul(libsimple_rawmemcasechr("abcABCabcABC", 'c'), "cABCabcABC")); + assert(!strcmpnul(libsimple_rawmemcasechr("abcABCabcABC", 'A'), "abcABCabcABC")); + assert(!strcmpnul(libsimple_rawmemcasechr("abcABCabcABC", 'C'), "cABCabcABC")); + assert(!strcmpnul(libsimple_rawmemcasechr("ABCabcABCabc", 'a'), "ABCabcABCabc")); + assert(!strcmpnul(libsimple_rawmemcasechr("ABCabcABCabc", 'c'), "CabcABCabc")); + assert(!strcmpnul(libsimple_rawmemcasechr("ABCabcABCabc", 'A'), "ABCabcABCabc")); + assert(!strcmpnul(libsimple_rawmemcasechr("ABCabcABCabc", 'C'), "CabcABCabc")); + return 0; +} + +#endif diff --git a/rawmemchr.c b/rawmemchr.c index e7803e2..2ed1709 100644 --- a/rawmemchr.c +++ b/rawmemchr.c @@ -18,8 +18,14 @@ libsimple_rawmemchr(const void *s_, int c_) int main(void) { - assert(!strcmpnul(libsimple_rawmemchr("1234512345", '3'), "34512345")); - assert(!strcmpnul(libsimple_rawmemchr("1234512345", '1'), "1234512345")); + assert(!strcmpnul(libsimple_rawmemchr("abcABCabcABC", 'a'), "abcABCabcABC")); + assert(!strcmpnul(libsimple_rawmemchr("abcABCabcABC", 'c'), "cABCabcABC")); + assert(!strcmpnul(libsimple_rawmemchr("abcABCabcABC", 'A'), "ABCabcABC")); + assert(!strcmpnul(libsimple_rawmemchr("abcABCabcABC", 'C'), "CabcABC")); + assert(!strcmpnul(libsimple_rawmemchr("ABCabcABCabc", 'a'), "abcABCabc")); + assert(!strcmpnul(libsimple_rawmemchr("ABCabcABCabc", 'c'), "cABCabc")); + assert(!strcmpnul(libsimple_rawmemchr("ABCabcABCabc", 'A'), "ABCabcABCabc")); + assert(!strcmpnul(libsimple_rawmemchr("ABCabcABCabc", 'C'), "CabcABCabc")); return 0; } |