Scrap chartorunearr(), introducing utftorunestr()

Interface and function as proposed by cls.

The reasoning behind this function is that cls expressed his
interest to keep memory allocation out of libutf, which is a
very good motive.
This simplifies the function a lot and should also increase the
speed a bit, but the most important factor here is that there's
no malloc anywhere in libutf, making it a lot smaller and more
robust with a smaller attack-surface.

Look at the paste(1) and tr(1) changes for an idiomatic way to
allocate the right amount of space for the Rune-array.
This commit is contained in:
FRIGN 2015-02-11 21:32:09 +01:00
parent 1c462012e4
commit 73577f10a0
6 changed files with 20 additions and 32 deletions

View File

@ -22,7 +22,7 @@ LIBUTFSRC =\
libutf/rune.c\ libutf/rune.c\
libutf/runetype.c\ libutf/runetype.c\
libutf/utf.c\ libutf/utf.c\
libutf/chartorunearr.c\ libutf/utftorunestr.c\
libutf/fgetrune.c\ libutf/fgetrune.c\
libutf/fputrune.c\ libutf/fputrune.c\
libutf/isalnumrune.c\ libutf/isalnumrune.c\

View File

@ -1,27 +0,0 @@
/* See LICENSE file for copyright and license details. */
#include <stdlib.h>
#include <string.h>
#include "../util.h"
#include "../utf.h"
int
chartorunearr(const char *str, Rune **r)
{
size_t len = strlen(str), rlen, roff, ret = 1, i;
Rune s;
for (rlen = 0, roff = 0; roff < len && ret; rlen++) {
ret = charntorune(&s, str + roff, MAX(UTFmax, len - roff));
roff += ret;
}
*r = emalloc(rlen * sizeof(Rune) + 1);
(*r)[rlen] = 0;
for (i = 0, roff = 0; roff < len && i < rlen; i++) {
roff += charntorune(&(*r)[i], str + roff, MAX(UTFmax, len - roff));
}
return rlen;
}

13
libutf/utftorunestr.c Normal file
View File

@ -0,0 +1,13 @@
/* See LICENSE file for copyright and license details. */
#include "../utf.h"
int
utftorunestr(const char *str, Rune *r)
{
int i, n;
for(i = 0; (n = chartorune(&r[i], str)) && r[i]; i++)
str += n;
return i;
}

View File

@ -110,7 +110,8 @@ main(int argc, char *argv[])
/* populate delimiters */ /* populate delimiters */
unescape(adelim); unescape(adelim);
len = chartorunearr(adelim, &delim); delim = emalloc((utflen(adelim) + 1) * sizeof(*delim));
len = utftorunestr(adelim, delim);
/* populate file list */ /* populate file list */
dsc = emalloc(argc * sizeof(*dsc)); dsc = emalloc(argc * sizeof(*dsc));

3
tr.c
View File

@ -79,7 +79,8 @@ makeset(char *str, struct range **set, int (**check)(Rune))
/* rstr defines at most len ranges */ /* rstr defines at most len ranges */
unescape(str); unescape(str);
len = chartorunearr(str, &rstr); rstr = emalloc((utflen(str) + 1) * sizeof(*rstr));
len = utftorunestr(str, rstr);
*set = emalloc(len * sizeof(**set)); *set = emalloc(len * sizeof(**set));
for (i = 0; i < len; i++) { for (i = 0; i < len; i++) {

4
utf.h
View File

@ -59,9 +59,9 @@ int isxdigitrune(Rune);
Rune tolowerrune(Rune); Rune tolowerrune(Rune);
Rune toupperrune(Rune); Rune toupperrune(Rune);
int utftorunestr(const char*, Rune *);
int fgetrune(Rune *, FILE *); int fgetrune(Rune *, FILE *);
int efgetrune(Rune *, FILE *, const char *); int efgetrune(Rune *, FILE *, const char *);
int fputrune(const Rune *, FILE *); int fputrune(const Rune *, FILE *);
int efputrune(const Rune *, FILE *, const char *); int efputrune(const Rune *, FILE *, const char *);
int chartorunearr(const char*, Rune **);