return r;
} /* char *sstrdup */
+size_t sstrnlen(const char *s, size_t n) {
+ const char *p = s;
+
+ while(n-- > 0 && *p)
+ p++;
+
+ return p - s;
+} /* size_t sstrnlen */
+
char *sstrndup(const char *s, size_t n) {
char *r;
size_t sz;
if (s == NULL)
return NULL;
- sz = strlen(s);
- if (sz > n) {
- sz = n;
- }
+ sz = sstrnlen(s, n);
r = malloc(sz + 1);
if (r == NULL) {
ERROR("sstrndup: Out of memory.");
r[sz] = '\0';
return r;
-} /* char *sstrdup */
+} /* char *sstrndup */
/* Even though Posix requires "strerror_r" to return an "int",
* some systems (e.g. the GNU libc) return a "char *" _and_
...);
char *sstrdup(const char *s);
+size_t sstrnlen(const char *s, size_t n);
char *sstrndup(const char *s, size_t n);
void *smalloc(size_t size);
char *sstrerror(int errnum, char *buf, size_t buflen);