aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--libsimple/mem.h44
-rw-r--r--man/libsimple_getenv_e.31
-rw-r--r--man/libsimple_getenv_ne.31
-rw-r--r--man/libsimple_memrchr.378
-rw-r--r--man/libsimple_rawmemchr.378
-rw-r--r--man/libsimple_rawmemrchr.380
-rw-r--r--man/libsimple_vputenvf.31
l---------man/memends.3libsimple1
l---------man/memeq.3libsimple1
l---------man/memmem.3libsimple1
l---------man/mempcpy.3libsimple1
l---------man/mempset.3libsimple1
l---------man/memrchr.3libsimple1
l---------man/memrmem.3libsimple1
l---------man/memstarts.3libsimple1
l---------man/rawmemchr.3libsimple1
l---------man/rawmemrchr.3libsimple1
-rw-r--r--memrchr.c6
-rw-r--r--rawmemchr.c6
-rw-r--r--rawmemrchr.c6
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
diff --git a/memrchr.c b/memrchr.c
index 1c7f713..30c818e 100644
--- a/memrchr.c
+++ b/memrchr.c
@@ -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];
}