=================================================================== RCS file: /cvs/mandoc/roff.c,v retrieving revision 1.156 retrieving revision 1.162 diff -u -p -r1.156 -r1.162 --- mandoc/roff.c 2011/07/27 12:41:02 1.156 +++ mandoc/roff.c 2011/07/27 17:25:30 1.162 @@ -1,4 +1,4 @@ -/* $Id: roff.c,v 1.156 2011/07/27 12:41:02 kristaps Exp $ */ +/* $Id: roff.c,v 1.162 2011/07/27 17:25:30 kristaps Exp $ */ /* * Copyright (c) 2010, 2011 Kristaps Dzonsons * Copyright (c) 2010, 2011 Ingo Schwarze @@ -82,8 +82,10 @@ struct reg { }; struct roffstr { - char *name; /* key of symbol */ - char *string; /* current value */ + char *key; /* key of symbol */ + size_t keysz; + char *val; /* current value */ + size_t valsz; struct roffstr *next; /* next in list */ }; @@ -496,7 +498,7 @@ again: /* Replace the escape sequence by the string. */ - pos += (stesc - *bufp); + pos = stesc - *bufp; nsz = *szp + strlen(res) + 1; n = mandoc_malloc(nsz); @@ -530,6 +532,9 @@ roff_parsetext(char *p) sz = strcspn(p, "-\\"); p += sz; + if ('\0' == *p) + break; + if ('\\' == *p) { /* Skip over escapes. */ p++; @@ -538,18 +543,19 @@ roff_parsetext(char *p) if (ESCAPE_ERROR == esc) break; continue; - } else if ('-' != *p || p == start) + } else if (p == start) { + p++; continue; + } l = *(p - 1); r = *(p + 1); - if ('\\' != l && '\t' != r && '\t' != l && ' ' != r && ' ' != l && '-' != r && '-' != l && ! isdigit((unsigned char)l) && - ! isdigit((unsigned char)r)) + ! isdigit((unsigned char)r)) *p = ASCII_HYPH; p++; } @@ -1461,20 +1467,23 @@ roff_setstr(struct roff *r, const char *name, const ch /* Search for an existing string with the same name. */ n = r->first_string; - while (n && strcmp(name, n->name)) + while (n && strcmp(name, n->key)) n = n->next; if (NULL == n) { /* Create a new string table entry. */ n = mandoc_malloc(sizeof(struct roffstr)); - n->name = mandoc_strdup(name); - n->string = NULL; + n->key = mandoc_strdup(name); + n->keysz = strlen(name); + n->val = NULL; + n->valsz = 0; n->next = r->first_string; r->first_string = n; } else if (0 == multiline) { /* In multiline mode, append; else replace. */ - free(n->string); - n->string = NULL; + free(n->val); + n->val = NULL; + n->valsz = 0; } if (NULL == string) @@ -1485,17 +1494,19 @@ roff_setstr(struct roff *r, const char *name, const ch * and one for the terminating '\0'. */ newch = strlen(string) + (multiline ? 2u : 1u); - if (NULL == n->string) { - n->string = mandoc_malloc(newch); - *n->string = '\0'; + if (NULL == n->val) { + n->val = mandoc_malloc(newch); + *n->val = '\0'; + n->valsz = newch - 1; oldch = 0; } else { - oldch = strlen(n->string); - n->string = mandoc_realloc(n->string, oldch + newch); + oldch = n->valsz; + n->val = mandoc_realloc(n->val, n->valsz + newch); + n->valsz += newch - 1; } /* Skip existing content in the destination buffer. */ - c = n->string + (int)oldch; + c = n->val + (int)oldch; /* Append new content to the destination buffer. */ while (*string) { @@ -1519,11 +1530,12 @@ roff_getstrn(const struct roff *r, const char *name, s { const struct roffstr *n; - n = r->first_string; - while (n && (strncmp(name, n->name, len) || '\0' != n->name[(int)len])) - n = n->next; + for (n = r->first_string; n; n = n->next) + if (0 == strncmp(name, n->key, len) && + '\0' == n->key[(int)len]) + return(n->val); - return(n ? n->string : NULL); + return(NULL); } static void @@ -1532,8 +1544,8 @@ roff_freestr(struct roff *r) struct roffstr *n, *nn; for (n = r->first_string; n; n = nn) { - free(n->name); - free(n->string); + free(n->key); + free(n->val); nn = n->next; free(n); }