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:
parent
1c462012e4
commit
73577f10a0
2
Makefile
2
Makefile
@ -22,7 +22,7 @@ LIBUTFSRC =\
|
||||
libutf/rune.c\
|
||||
libutf/runetype.c\
|
||||
libutf/utf.c\
|
||||
libutf/chartorunearr.c\
|
||||
libutf/utftorunestr.c\
|
||||
libutf/fgetrune.c\
|
||||
libutf/fputrune.c\
|
||||
libutf/isalnumrune.c\
|
||||
|
@ -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
13
libutf/utftorunestr.c
Normal 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;
|
||||
}
|
3
paste.c
3
paste.c
@ -110,7 +110,8 @@ main(int argc, char *argv[])
|
||||
|
||||
/* populate delimiters */
|
||||
unescape(adelim);
|
||||
len = chartorunearr(adelim, &delim);
|
||||
delim = emalloc((utflen(adelim) + 1) * sizeof(*delim));
|
||||
len = utftorunestr(adelim, delim);
|
||||
|
||||
/* populate file list */
|
||||
dsc = emalloc(argc * sizeof(*dsc));
|
||||
|
3
tr.c
3
tr.c
@ -79,7 +79,8 @@ makeset(char *str, struct range **set, int (**check)(Rune))
|
||||
|
||||
/* rstr defines at most len ranges */
|
||||
unescape(str);
|
||||
len = chartorunearr(str, &rstr);
|
||||
rstr = emalloc((utflen(str) + 1) * sizeof(*rstr));
|
||||
len = utftorunestr(str, rstr);
|
||||
*set = emalloc(len * sizeof(**set));
|
||||
|
||||
for (i = 0; i < len; i++) {
|
||||
|
4
utf.h
4
utf.h
@ -59,9 +59,9 @@ int isxdigitrune(Rune);
|
||||
Rune tolowerrune(Rune);
|
||||
Rune toupperrune(Rune);
|
||||
|
||||
int utftorunestr(const char*, Rune *);
|
||||
|
||||
int fgetrune(Rune *, FILE *);
|
||||
int efgetrune(Rune *, FILE *, const char *);
|
||||
int fputrune(const Rune *, FILE *);
|
||||
int efputrune(const Rune *, FILE *, const char *);
|
||||
|
||||
int chartorunearr(const char*, Rune **);
|
||||
|
Loading…
Reference in New Issue
Block a user