roken: Add (re)allocating strvis functions
These are a Heimdal innovation.
This commit is contained in:
@@ -130,6 +130,10 @@ HEIMDAL_ROKEN_2.0 {
|
|||||||
rk_socket_set_reuseaddr;
|
rk_socket_set_reuseaddr;
|
||||||
rk_socket_set_tos;
|
rk_socket_set_tos;
|
||||||
rk_socket_sockaddr_size;
|
rk_socket_sockaddr_size;
|
||||||
|
rk_strasvis;
|
||||||
|
rk_strasvisx;
|
||||||
|
rk_stravis;
|
||||||
|
rk_stravisx;
|
||||||
rk_strcollect;
|
rk_strcollect;
|
||||||
rk_strerror;
|
rk_strerror;
|
||||||
rk_strerror_r;
|
rk_strerror_r;
|
||||||
@@ -143,6 +147,8 @@ HEIMDAL_ROKEN_2.0 {
|
|||||||
rk_strpoolfree;
|
rk_strpoolfree;
|
||||||
rk_strpoolprintf;
|
rk_strpoolprintf;
|
||||||
rk_strptime;
|
rk_strptime;
|
||||||
|
rk_strrasvis;
|
||||||
|
rk_strrasvisx;
|
||||||
rk_strsep_copy;
|
rk_strsep_copy;
|
||||||
rk_strsvis;
|
rk_strsvis;
|
||||||
rk_strsvisx;
|
rk_strsvisx;
|
||||||
|
@@ -71,6 +71,7 @@
|
|||||||
#ifdef TEST
|
#ifdef TEST
|
||||||
#include <err.h>
|
#include <err.h>
|
||||||
#endif
|
#endif
|
||||||
|
#include <errno.h>
|
||||||
#include <limits.h>
|
#include <limits.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@@ -390,6 +391,67 @@ rk_strsvisx(char *dst, const char *csrc, size_t len, int flag, const char *extra
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Heimdal innovations: functions that allocate or reallocate a destination
|
||||||
|
* buffer as needed. Based on OpenBSD's stravis().
|
||||||
|
*/
|
||||||
|
|
||||||
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
|
rk_strasvis(char **out, const char *csrc, int flag, const char *extra)
|
||||||
|
{
|
||||||
|
return rk_strasvisx(out, csrc, strlen(csrc), flag, extra);
|
||||||
|
}
|
||||||
|
|
||||||
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
|
rk_strrasvis(char **out, size_t *outsz, const char *csrc, int flag, const char *extra)
|
||||||
|
{
|
||||||
|
return rk_strrasvisx(out, outsz, csrc, strlen(csrc), flag, extra);
|
||||||
|
}
|
||||||
|
|
||||||
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
|
rk_strasvisx(char **out, const char *csrc, size_t len, int flag, const char *extra)
|
||||||
|
{
|
||||||
|
size_t sz = 0;
|
||||||
|
|
||||||
|
*out = NULL;
|
||||||
|
return rk_strrasvisx(out, &sz, csrc, strlen(csrc), flag, extra);
|
||||||
|
}
|
||||||
|
|
||||||
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
|
rk_strrasvisx(char **out,
|
||||||
|
size_t *outsz,
|
||||||
|
const char *csrc,
|
||||||
|
size_t len,
|
||||||
|
int flag,
|
||||||
|
const char *extra)
|
||||||
|
{
|
||||||
|
size_t want = 4 * len + 4;
|
||||||
|
size_t have = *outsz;
|
||||||
|
char *s;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
_DIAGASSERT(dst != NULL);
|
||||||
|
_DIAGASSERT(src != NULL);
|
||||||
|
_DIAGASSERT(extra != NULL);
|
||||||
|
if (want < len || want > INT_MAX) {
|
||||||
|
errno = EOVERFLOW;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (have < want) {
|
||||||
|
if ((s = realloc(*out, want)) == NULL)
|
||||||
|
return -1;
|
||||||
|
*outsz = want;
|
||||||
|
*out = s;
|
||||||
|
}
|
||||||
|
**out = '\0'; /* Makes source debugging nicer, that's all */
|
||||||
|
if ((r = rk_strsvisx(s, csrc, len, flag, extra)) < 0) {
|
||||||
|
free(s);
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
errno = s ? errno : EINVAL;
|
||||||
|
return s ? r : -1;
|
||||||
|
}
|
||||||
|
|
||||||
#if !HAVE_VIS
|
#if !HAVE_VIS
|
||||||
/*
|
/*
|
||||||
* vis - visually encode characters
|
* vis - visually encode characters
|
||||||
@@ -536,17 +598,8 @@ main(int argc, char **argv)
|
|||||||
err(1, "Out of memory");
|
err(1, "Out of memory");
|
||||||
|
|
||||||
while (argc) {
|
while (argc) {
|
||||||
size_t len = strlen(argv[0]);
|
if (rk_strrasvis(&s, &sz, argv[0], flags, nextra) < 0)
|
||||||
|
|
||||||
if (len > sz) {
|
|
||||||
char *tmp;
|
|
||||||
|
|
||||||
if ((tmp = realloc(s, 4 * len + 1)) == NULL)
|
|
||||||
err(2, "Out of memory");
|
err(2, "Out of memory");
|
||||||
s = tmp;
|
|
||||||
sz = 4 * len + 1;
|
|
||||||
}
|
|
||||||
strsvis(s, argv[0], flags, nextra);
|
|
||||||
printf("%s\n", s);
|
printf("%s\n", s);
|
||||||
argc--;
|
argc--;
|
||||||
}
|
}
|
||||||
@@ -557,24 +610,16 @@ main(int argc, char **argv)
|
|||||||
|
|
||||||
while (!feof(stdin) &&
|
while (!feof(stdin) &&
|
||||||
(nbytes = getline(&line, &linesz, stdin)) > 0) {
|
(nbytes = getline(&line, &linesz, stdin)) > 0) {
|
||||||
int nl = 0;
|
const char *nl = "";
|
||||||
|
|
||||||
if (4 * (size_t)nbytes + 2 > sz) {
|
|
||||||
char *tmp;
|
|
||||||
|
|
||||||
if ((tmp = realloc(s, 4 * nbytes + 2)) == NULL)
|
|
||||||
err(2, "Out of memory");
|
|
||||||
s = tmp;
|
|
||||||
sz = 4 * nbytes + 2;
|
|
||||||
}
|
|
||||||
if (line[nbytes - 1] == '\n') {
|
if (line[nbytes - 1] == '\n') {
|
||||||
line[nbytes - 1] = '\0';
|
line[--nbytes] = '\0';
|
||||||
nl = 1;
|
nl = "\n";
|
||||||
} else {
|
|
||||||
nl = 0;
|
|
||||||
}
|
}
|
||||||
strsvis(s, line, flags, nextra);
|
|
||||||
printf("%s%s", s, nl ? "\n" : "");
|
if (rk_strrasvisx(&s, &sz, line, nbytes, flags, nextra) < 0)
|
||||||
|
err(2, "Out of memory");
|
||||||
|
printf("%s%s", s, nl);
|
||||||
}
|
}
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
if (ferror(stdin))
|
if (ferror(stdin))
|
||||||
|
@@ -117,6 +117,14 @@ ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
|||||||
rk_strvisx(char *, const char *, size_t, int);
|
rk_strvisx(char *, const char *, size_t, int);
|
||||||
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
rk_strsvisx(char *, const char *, size_t, int, const char *);
|
rk_strsvisx(char *, const char *, size_t, int, const char *);
|
||||||
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
|
rk_strasvis(char **, const char *, int, const char *);
|
||||||
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
|
rk_strasvisx(char **, const char *, size_t, int, const char *);
|
||||||
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
|
rk_strrasvis(char **, size_t *, const char *, int, const char *);
|
||||||
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
|
rk_strrasvisx(char **, size_t *, const char *, size_t, int, const char *);
|
||||||
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
rk_strunvis(char *, const char *);
|
rk_strunvis(char *, const char *);
|
||||||
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
|
||||||
|
Reference in New Issue
Block a user