ref: efed3e9037a152731d9f2ef9d51e4e9a8aa20edd
parent: 2da706eb682dd4906578d99521bc3e58467c10b1
author: Ali Gholami Rudi <ali@rudi.ir>
date: Fri May 8 08:59:15 EDT 2015
char: assign to escread()'s second argument a static buffer This removes the need for a few buffers with length ILNLEN.
--- a/char.c
+++ b/char.c
@@ -224,35 +224,40 @@
* s. The return value is the name of the troff request (the
* argument is copied into d) or zero for glyph names (it is
* copied into d). Returns -1 when the end of s is reached.
+ * Note that to d, a pointer to a static array is assigned.
*/
-int escread(char **s, char *d)
+int escread(char **s, char **d)
{
- char *r = d;
+ static char buf[1 << 12];
+ char *r;
if (!**s)
return -1;
- utf8read(s, d);
- if (d[0] == c_ec) {
- utf8read(s, d + 1);
- if (d[1] == '(') {
- utf8read(s, d);
- utf8read(s, d + strlen(d));
- } else if (!n_cp && d[1] == '[') {
+ r = buf;
+ *d = buf;
+ utf8read(s, r);
+ if (r[0] == c_ec) {
+ utf8read(s, r + 1);
+ if (r[1] == '(') {
+ utf8read(s, r);
+ utf8read(s, r + strlen(r));
+ } else if (!n_cp && r[1] == '[') {
while (**s && **s != ']')
*r++ = *(*s)++;
+ *r = '\0';
if (**s == ']')
(*s)++;
- } else if (strchr("CDfhmsvXx", d[1])) {
- int c = d[1];
- d[0] = '\0';
+ } else if (strchr("CDfhmsvXx", r[1])) {
+ int c = r[1];
+ r[0] = '\0';
if (strchr(ESC_P, c))
- unquotedread(s, d);
+ unquotedread(s, r);
if (strchr(ESC_Q, c))
- quotedread(s, d);
+ quotedread(s, r);
return c == 'C' ? 0 : c;
}
+ } else if (r[0] == c_ni) {
+ utf8read(s, r + 1);
}
- if (d[0] == c_ni)
- utf8read(s, d + 1);
return 0;
}
--- a/fmt.c
+++ b/fmt.c
@@ -279,14 +279,14 @@
/* find explicit hyphenation positions: dashes, \: and \% */
static int fmt_hyphmarks(char *word, int *hyidx, int *hyins)
{
- char d[ILNLEN];
char *s = word;
+ char *d = NULL;
int c, n = 0;
- while ((c = escread(&s, d)) > 0)
+ while ((c = escread(&s, &d)) > 0)
;
if (c < 0 || !strcmp(c_hc, d))
return -1;
- while ((c = escread(&s, d)) >= 0 && n < NHYPHSWORD) {
+ while ((c = escread(&s, &d)) >= 0 && n < NHYPHSWORD) {
if (!c && !strcmp(c_hc, d)) {
hyins[n] = 1;
hyidx[n++] = s - word;
--- a/hyph.c
+++ b/hyph.c
@@ -104,13 +104,13 @@
void tr_hw(char **args)
{
- char c[ILNLEN];
char word[WORDLEN];
+ char *c;
int i;
for (i = 1; i < NARGS && args[i]; i++) {
char *s = args[i];
char *d = word;
- while (d - word < WORDLEN - GNLEN && !escread(&s, c)) {
+ while (d - word < WORDLEN - GNLEN && !escread(&s, &c)) {
if (strcmp("-", c))
hcode_mapchar(c);
d += hy_cput(d, c);
--- a/out.c
+++ b/out.c
@@ -151,9 +151,9 @@
void out_line(char *s)
{
- char c[ILNLEN + GNLEN * 4];
+ char *c;
int t;
- while ((t = escread(&s, c)) >= 0) {
+ while ((t = escread(&s, &c)) >= 0) {
if (!t) {
if (c[0] == c_ni || (c[0] == '\\' && c[1] == '\\')) {
c[0] = c[1];
--- a/roff.h
+++ b/roff.h
@@ -399,7 +399,7 @@
void charnext_str(char *d, char *c);
void quotednext(char *d, int (*next)(void), void (*back)(int));
void unquotednext(char *d, int cmd, int (*next)(void), void (*back)(int));
-int escread(char **s, char *d);
+int escread(char **s, char **d);
/* string streams; nested next()/back() interface for string buffers */
void sstr_push(char *s);
char *sstr_pop(void);
--- a/wb.c
+++ b/wb.c
@@ -402,8 +402,7 @@
void wb_cat(struct wb *wb, struct wb *src)
{
- char *s;
- char d[ILNLEN];
+ char *s, *d;
int c, part;
int collect;
wb_flushsub(src);
@@ -410,7 +409,7 @@
wb_flushsub(wb);
collect = wb_collect(wb, 0);
s = sbuf_buf(&src->sbuf);
- while ((c = escread(&s, d)) >= 0)
+ while ((c = escread(&s, &d)) >= 0)
wb_putc(wb, c, d);
part = src->part;
wb->r_s = -1;
@@ -501,11 +500,11 @@
void wb_catstr(struct wb *wb, char *s, char *end)
{
- char d[ILNLEN];
int collect, c;
+ char *d;
wb_flushsub(wb);
collect = wb_collect(wb, 0);
- while (s < end && (c = escread(&s, d)) >= 0)
+ while (s < end && (c = escread(&s, &d)) >= 0)
wb_putc(wb, c, d);
wb_collect(wb, collect);
}