diff options
-rw-r--r-- | libsimple/mem.h | 44 | ||||
-rw-r--r-- | man/libsimple_getenv_e.3 | 1 | ||||
-rw-r--r-- | man/libsimple_getenv_ne.3 | 1 | ||||
-rw-r--r-- | man/libsimple_memrchr.3 | 78 | ||||
-rw-r--r-- | man/libsimple_rawmemchr.3 | 78 | ||||
-rw-r--r-- | man/libsimple_rawmemrchr.3 | 80 | ||||
-rw-r--r-- | man/libsimple_vputenvf.3 | 1 | ||||
l--------- | man/memends.3libsimple | 1 | ||||
l--------- | man/memeq.3libsimple | 1 | ||||
l--------- | man/memmem.3libsimple | 1 | ||||
l--------- | man/mempcpy.3libsimple | 1 | ||||
l--------- | man/mempset.3libsimple | 1 | ||||
l--------- | man/memrchr.3libsimple | 1 | ||||
l--------- | man/memrmem.3libsimple | 1 | ||||
l--------- | man/memstarts.3libsimple | 1 | ||||
l--------- | man/rawmemchr.3libsimple | 1 | ||||
l--------- | man/rawmemrchr.3libsimple | 1 | ||||
-rw-r--r-- | memrchr.c | 6 | ||||
-rw-r--r-- | rawmemchr.c | 6 | ||||
-rw-r--r-- | rawmemrchr.c | 6 |
20 files changed, 299 insertions, 12 deletions
diff --git a/libsimple/mem.h b/libsimple/mem.h index 37913d0..8fb85fa 100644 --- a/libsimple/mem.h +++ b/libsimple/mem.h @@ -1,47 +1,89 @@ /* See LICENSE file for copyright and license details. */ + +/** + * Finds the first occurence of a byte value in an array of bytes + * + * 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 `*s == c` + */ _LIBSIMPLE_GCC_ONLY(__attribute__((__pure__, __nonnull__, __warn_unused_result__))) void *libsimple_rawmemchr(const void *, int); #ifndef rawmemchr # define rawmemchr libsimple_rawmemchr #endif + +/** + * Finds the last occurence of a byte value in an array of bytes + * + * @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 `*s == c`, + * `NULL` if no such offset exists within [0, n) + */ _LIBSIMPLE_GCC_ONLY(__attribute__((__pure__, __nonnull__, __warn_unused_result__))) void *libsimple_memrchr(const void *, int, size_t); #ifndef memrchr # define memrchr libsimple_memrchr #endif + +/** + * Finds the last occurence of a byte value in an array of bytes + * + * 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 + * @param n The number of bytes in the byte array + * @return `s` with a maximal offset such that `*s == c` + */ _LIBSIMPLE_GCC_ONLY(__attribute__((__pure__, __nonnull__, __warn_unused_result__))) void *libsimple_rawmemrchr(const void *, int, size_t); #ifndef rawmemrchr # define rawmemrchr libsimple_rawmemrchr #endif + _LIBSIMPLE_GCC_ONLY(__attribute__((__pure__, __warn_unused_result__))) void *libsimple_memmem(const void *, size_t, const void *, size_t); #ifndef memmem # define memmem libsimple_memmem #endif + _LIBSIMPLE_GCC_ONLY(__attribute__((__pure__, __warn_unused_result__))) void *libsimple_memrmem(const void *, size_t, const void *, size_t); #ifndef memrmem # define memrmem libsimple_memrmem #endif + _LIBSIMPLE_GCC_ONLY(__attribute__((__pure__, __warn_unused_result__))) int libsimple_memstarts(const void *, size_t, const void *, size_t); #ifndef memstarts # define memstarts libsimple_memstarts #endif + _LIBSIMPLE_GCC_ONLY(__attribute__((__pure__, __warn_unused_result__))) int libsimple_memends(const void *, size_t, const void *, size_t); #ifndef memends # define memends libsimple_memends #endif + _LIBSIMPLE_GCC_ONLY(__attribute__((__pure__, __warn_unused_result__))) static inline int libsimple_memeq(const void *__s1, const void *__s2, size_t __n) { return !memcmp(__s1, __s2, __n); } @@ -49,6 +91,7 @@ static inline int libsimple_memeq(const void *__s1, const void *__s2, size_t __n # define memeq libsimple_memeq #endif + _LIBSIMPLE_GCC_ONLY(__attribute__((__warn_unused_result__))) static inline void *libsimple_mempcpy(void *__d, const void *__s, size_t __n) { return &((char *)memcpy(__d, __s, __n))[__n]; } @@ -56,6 +99,7 @@ static inline void *libsimple_mempcpy(void *__d, const void *__s, size_t __n) # define mempcpy libsimple_mempcpy #endif + _LIBSIMPLE_GCC_ONLY(__attribute__((__warn_unused_result__))) static inline void *libsimple_mempset(void *__s, int __c, size_t __n) { return &((char *)memset(__s, __c, __n))[__n]; } diff --git a/man/libsimple_getenv_e.3 b/man/libsimple_getenv_e.3 index ba9cd04..27fba39 100644 --- a/man/libsimple_getenv_e.3 +++ b/man/libsimple_getenv_e.3 @@ -1,4 +1,3 @@ -.\" -*- nroff -*- .TH LIBSIMPLE_GETENV_E 3 2018-10-20 libsimple .SH NAME libsimple_getenv_e \- get value of an environment variable or the empty string diff --git a/man/libsimple_getenv_ne.3 b/man/libsimple_getenv_ne.3 index 337a5f5..a0eca77 100644 --- a/man/libsimple_getenv_ne.3 +++ b/man/libsimple_getenv_ne.3 @@ -1,4 +1,3 @@ -.\" -*- nroff -*- .TH LIBSIMPLE_GETENV_NE 3 2018-10-20 libsimple .SH NAME libsimple_getenv_ne \- get non-empty value of an environment variable diff --git a/man/libsimple_memrchr.3 b/man/libsimple_memrchr.3 new file mode 100644 index 0000000..4c93b0a --- /dev/null +++ b/man/libsimple_memrchr.3 @@ -0,0 +1,78 @@ +.TH LIBSIMPLE_MEMRCHR 3 2018-10-20 libsimple +.SH NAME +libsimple_memrchr \- find byte in memory +.SH SYNOPSIS +.nf +#include <libsimple.h> + +void *libsimple_memrchr(const void *s, int c, size_t n); + +#ifndef memrchr +# define memrchr libsimple_memrchr +#endif +.fi + +Link with +.IR \-lsimple . +.SH DESCRIPTION +The +.BR libsimple_memrchr () +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 ). +.SH RETURN VALUE +The +.BR libsimple_memrchr () +function returns the pointer +.I s +with a maximal offset such that +.IR *r==c , +where +.I r +is the returned pointer. +If no such offset exists, +.B NULL +is returned. +.SH ERRORS +The +.BR libsimple_memrchr () +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_memrchr () +T} Thread safety MT-Safe +T{ +.BR libsimple_memrchr () +T} Async-signal safety AS-Safe +T{ +.BR libsimple_memrchr () +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_rawmemrchr (3), +.BR libsimple_memrmem (3), +.BR memchr (3) diff --git a/man/libsimple_rawmemchr.3 b/man/libsimple_rawmemchr.3 new file mode 100644 index 0000000..347ab4c --- /dev/null +++ b/man/libsimple_rawmemchr.3 @@ -0,0 +1,78 @@ +.TH LIBSIMPLE_RAWMEMCHR 3 2018-10-20 libsimple +.SH NAME +libsimple_rawmemchr \- find byte in memory +.SH SYNOPSIS +.nf +#include <libsimple.h> + +void *libsimple_rawmemchr(const void *s, int c); + +#ifndef rawmemchr +# define rawmemchr libsimple_rawmemchr +#endif +.fi + +Link with +.IR \-lsimple . +.SH DESCRIPTION +The +.BR libsimple_rawmemchr () +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_rawmemchr () +function assumes there is at least one +occurence, its behaviour is undefined +if this is not the case. +.SH RETURN VALUE +The +.BR libsimple_rawmemchr () +function returns the pointer +.I s +with a minimal offset such that +.IR *r==c , +where +.I r +is the returned pointer. +.SH ERRORS +The +.BR libsimple_rawmemchr () +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_rawmemchr () +T} Thread safety MT-Safe +T{ +.BR libsimple_rawmemchr () +T} Async-signal safety AS-Safe +T{ +.BR libsimple_rawmemchr () +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_rawmemrchr (3), +.BR memchr (3) diff --git a/man/libsimple_rawmemrchr.3 b/man/libsimple_rawmemrchr.3 new file mode 100644 index 0000000..c445794 --- /dev/null +++ b/man/libsimple_rawmemrchr.3 @@ -0,0 +1,80 @@ +.TH LIBSIMPLE_RAWMEMRCHR 3 2018-10-20 libsimple +.SH NAME +libsimple_rawmemrchr \- find byte in memory +.SH SYNOPSIS +.nf +#include <libsimple.h> + +void *libsimple_rawmemrchr(const void *s, int c, size_t n); + +#ifndef rawmemrchr +# define rawmemrchr libsimple_rawmemrchr +#endif +.fi + +Link with +.IR \-lsimple . +.SH DESCRIPTION +The +.BR libsimple_rawmemrchr () +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 +.BR libsimple_rawmemrchr () +function assumes there is at least one +occurence, its behaviour is undefined +if this is not the case. +.SH RETURN VALUE +The +.BR libsimple_rawmemrchr () +function returns the pointer +.I s +with a maximal offset such that +.IR *r==c , +where +.I r +is the returned pointer. +.SH ERRORS +The +.BR libsimple_rawmemrchr () +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_rawmemrchr () +T} Thread safety MT-Safe +T{ +.BR libsimple_rawmemrchr () +T} Async-signal safety AS-Safe +T{ +.BR libsimple_rawmemrchr () +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_rawmemchr (3) diff --git a/man/libsimple_vputenvf.3 b/man/libsimple_vputenvf.3 index b18d82f..3c081e1 100644 --- a/man/libsimple_vputenvf.3 +++ b/man/libsimple_vputenvf.3 @@ -1,4 +1,3 @@ -.\" -*- nroff -*- .TH LIBSIMPLE_VPUTENVF 3 2018-10-20 libsimple .SH NAME libsimple_vputenvf \- change or add a string formatted value to the environment diff --git a/man/memends.3libsimple b/man/memends.3libsimple new file mode 120000 index 0000000..5ab92b7 --- /dev/null +++ b/man/memends.3libsimple @@ -0,0 +1 @@ +libsimple_memends.3
\ No newline at end of file diff --git a/man/memeq.3libsimple b/man/memeq.3libsimple new file mode 120000 index 0000000..6d3ecb3 --- /dev/null +++ b/man/memeq.3libsimple @@ -0,0 +1 @@ +libsimple_memeq.3
\ No newline at end of file diff --git a/man/memmem.3libsimple b/man/memmem.3libsimple new file mode 120000 index 0000000..81f1d83 --- /dev/null +++ b/man/memmem.3libsimple @@ -0,0 +1 @@ +libsimple_memmem.3
\ No newline at end of file diff --git a/man/mempcpy.3libsimple b/man/mempcpy.3libsimple new file mode 120000 index 0000000..3ae360f --- /dev/null +++ b/man/mempcpy.3libsimple @@ -0,0 +1 @@ +libsimple_mempcpy.3
\ No newline at end of file diff --git a/man/mempset.3libsimple b/man/mempset.3libsimple new file mode 120000 index 0000000..619340a --- /dev/null +++ b/man/mempset.3libsimple @@ -0,0 +1 @@ +libsimple_mempset.3
\ No newline at end of file diff --git a/man/memrchr.3libsimple b/man/memrchr.3libsimple new file mode 120000 index 0000000..1dbd392 --- /dev/null +++ b/man/memrchr.3libsimple @@ -0,0 +1 @@ +libsimple_memrchr.3
\ No newline at end of file diff --git a/man/memrmem.3libsimple b/man/memrmem.3libsimple new file mode 120000 index 0000000..ff9d6f4 --- /dev/null +++ b/man/memrmem.3libsimple @@ -0,0 +1 @@ +libsimple_memrmem.3
\ No newline at end of file diff --git a/man/memstarts.3libsimple b/man/memstarts.3libsimple new file mode 120000 index 0000000..40f1024 --- /dev/null +++ b/man/memstarts.3libsimple @@ -0,0 +1 @@ +libsimple_memstarts.3
\ No newline at end of file diff --git a/man/rawmemchr.3libsimple b/man/rawmemchr.3libsimple new file mode 120000 index 0000000..5391310 --- /dev/null +++ b/man/rawmemchr.3libsimple @@ -0,0 +1 @@ +libsimple_rawmemchr.3
\ No newline at end of file diff --git a/man/rawmemrchr.3libsimple b/man/rawmemrchr.3libsimple new file mode 120000 index 0000000..b0c9553 --- /dev/null +++ b/man/rawmemrchr.3libsimple @@ -0,0 +1 @@ +libsimple_rawmemrchr.3
\ No newline at end of file @@ -4,11 +4,11 @@ void * -libsimple_memrchr(const void *s_, int c, size_t n_) +libsimple_memrchr(const void *s_, int c_, size_t n_) { - char *s = *(char **)(void *)&s_; + char *s = *(char **)(void *)&s_, c = (char)c_; ssize_t n = n_; - while (n-- && (int)s[n] != c); + while (n-- && s[n] != c); return n < 0 ? NULL : &s[n]; } diff --git a/rawmemchr.c b/rawmemchr.c index 091d39f..e7803e2 100644 --- a/rawmemchr.c +++ b/rawmemchr.c @@ -4,10 +4,10 @@ void * -libsimple_rawmemchr(const void *s_, int c) +libsimple_rawmemchr(const void *s_, int c_) { - char *s = *(char **)(void *)&s_; - while ((int)*s++ != c); + char *s = *(char **)(void *)&s_, c = (char)c_; + while (*s++ != c); return &s[-1]; } diff --git a/rawmemrchr.c b/rawmemrchr.c index 82a2d98..3731c00 100644 --- a/rawmemrchr.c +++ b/rawmemrchr.c @@ -4,10 +4,10 @@ void * -libsimple_rawmemrchr(const void *s_, int c, size_t n) +libsimple_rawmemrchr(const void *s_, int c_, size_t n) { - char *s = *(char **)(void *)&s_; - while ((int)s[--n] != c); + char *s = *(char **)(void *)&s_, c = (char)c_; + while (s[--n] != c); return &s[n]; } |