[or-cvs] r14196: Now that every thing in routerparse.c is switched over to us (in tor/trunk: . src/or)
nickm at seul.org
nickm at seul.org
Wed Mar 26 16:56:35 UTC 2008
Author: nickm
Date: 2008-03-26 12:56:34 -0400 (Wed, 26 Mar 2008)
New Revision: 14196
Modified:
tor/trunk/
tor/trunk/src/or/routerparse.c
Log:
r19061 at catbus: nickm | 2008-03-26 12:53:18 -0400
Now that every thing in routerparse.c is switched over to use memareas, there is no need to keep the heap-allocated token code.
Property changes on: tor/trunk
___________________________________________________________________
svk:merge ticket from /tor/trunk [r19061] on 8246c3cf-6607-4228-993b-4d95d33730f1
Modified: tor/trunk/src/or/routerparse.c
===================================================================
--- tor/trunk/src/or/routerparse.c 2008-03-26 16:56:31 UTC (rev 14195)
+++ tor/trunk/src/or/routerparse.c 2008-03-26 16:56:34 UTC (rev 14196)
@@ -113,16 +113,21 @@
* of a keyword, a line full of arguments, and a binary object. The
* arguments and object are both optional, depending on the keyword
* type.
+ *
+ * This structure is only allocated in memareas; do not allocate it on
+ * the heap, or token_free() won't work.
*/
typedef struct directory_token_t {
directory_keyword tp; /**< Type of the token. */
- unsigned int in_area:1;/**<XXXX021 remove need for this. */
- int n_args : 31; /**< Number of elements in args */
+ int n_args:30; /**< Number of elements in args */
char **args; /**< Array of arguments from keyword line. */
+
char *object_type; /**< -----BEGIN [object_type]-----*/
size_t object_size; /**< Bytes in object_body */
char *object_body; /**< Contents of object, base64-decoded. */
- crypto_pk_env_t *key; /**< For public keys only. */
+
+ crypto_pk_env_t *key; /**< For public keys only. Heap-allocated. */
+
char *error; /**< For _ERR tokens only. */
} directory_token_t;
@@ -1870,7 +1875,7 @@
area = memarea_new(8192);
eos = find_start_of_next_routerstatus(s);
- if (tokenize_string(area,s, eos, tokens, netstatus_token_table,0)) {
+ if (tokenize_string(area, s, eos, tokens, netstatus_token_table,0)) {
log_warn(LD_DIR, "Error tokenizing network-status header.");
goto err;
}
@@ -1974,7 +1979,7 @@
memarea_clear(area);
while (!strcmpstart(s, "r ")) {
routerstatus_t *rs;
- if ((rs = routerstatus_parse_entry_from_string(NULL, &s, tokens, NULL, NULL, 0)))
+ if ((rs = routerstatus_parse_entry_from_string(area, &s, tokens, NULL, NULL, 0)))
smartlist_add(ns->entries, rs);
}
smartlist_sort(ns->entries, _compare_routerstatus_entries);
@@ -2661,35 +2666,20 @@
static void
token_free(directory_token_t *tok)
{
- int i;
tor_assert(tok);
if (tok->key)
crypto_free_pk_env(tok->key);
-
- if (! tok->in_area) {
- if (tok->args) {
- for (i = 0; i < tok->n_args; ++i) {
- tor_free(tok->args[i]);
- }
- tor_free(tok->args);
- }
- tor_free(tok->object_type);
- tor_free(tok->object_body);
- tor_free(tok->error);
- tor_free(tok);
- }
}
-#define ALLOC_ZERO(sz) (area?memarea_alloc_zero(area,sz):tor_malloc_zero(sz))
-#define ALLOC(sz) (area?memarea_alloc(area,sz):tor_malloc(sz))
-#define STRDUP(str) (area?memarea_strdup(area,str):tor_strdup(str))
-#define STRNDUP(str,n) (area?memarea_strndup(area,(str),(n)):tor_strndup((str),(n)))
+#define ALLOC_ZERO(sz) memarea_alloc_zero(area,sz)
+#define ALLOC(sz) memarea_alloc(area,sz)
+#define STRDUP(str) memarea_strdup(area,str)
+#define STRNDUP(str,n) memarea_strndup(area,(str),(n))
#define RET_ERR(msg) \
STMT_BEGIN \
if (tok) token_free(tok); \
tok = ALLOC_ZERO(sizeof(directory_token_t)); \
- tok->in_area = area?1:0; \
tok->tp = _ERR; \
tok->error = STRDUP(msg); \
goto done_tokenizing; \
@@ -2746,15 +2736,15 @@
const char **s, const char *eos, token_rule_t *table)
{
const char *next, *eol, *obstart;
- int i, j, allocated;
size_t obname_len;
+ int i;
directory_token_t *tok;
obj_syntax o_syn = NO_OBJ;
char ebuf[128];
const char *kwd = "";
+ tor_assert(area);
tok = ALLOC_ZERO(sizeof(directory_token_t));
- tok->in_area = area?1:0;
tok->tp = _ERR;
/* Set *s to first token, eol to end-of-line, next to after first token */
@@ -2792,48 +2782,32 @@
tok->n_args = 1;
} else {
/* This keyword takes multiple arguments. */
- if (area) {
- char *mem = memarea_strndup(area, *s, eol-*s);
- char *cp = mem;
+ /* XXXX021 this code is still too complicated. */
+ char *mem = memarea_strndup(area, *s, eol-*s);
+ char *cp = mem;
+ int j = 0;
+ while (*cp) {
+ j++;
+ cp = (char*)find_whitespace(cp);
+ if (!cp || !*cp)
+ break;
+ cp = (char*)eat_whitespace(cp);
+ }
+ tok->n_args = j;
+ if (tok->n_args) {
+ tok->args = memarea_alloc(area, sizeof(char*)*tok->n_args);
+ cp = mem;
j = 0;
while (*cp) {
- j++;
+ tok->args[j++] = cp;
cp = (char*)find_whitespace(cp);
- if (!cp || !*cp)
- break;
- cp = (char*)eat_whitespace(cp);
- }
- tok->n_args = j;
- if (tok->n_args) {
- tok->args = memarea_alloc(area, sizeof(char*)*tok->n_args);
- cp = mem;
- j = 0;
- while (*cp) {
- tok->args[j++] = cp;
- cp = (char*)find_whitespace(cp);
if (!cp || !*cp)
break;
*cp++ = '\0';
cp = (char*)eat_whitespace(cp);
- }
}
- *s = eol;
- } else {
- /*XXXX021 make this needless. */
- j = 0;
- allocated = 16;
- tok->args = tor_malloc(sizeof(char*)*allocated);
- while (*s < eol) { /* While not at eol, store the next token */
- if (j == allocated) {
- allocated *= 2;
- tok->args = tor_realloc(tok->args,sizeof(char*)*allocated);
- }
- tok->args[j++] = tor_strndup(*s, next-*s);
- *s = eat_whitespace_eos_no_nl(next, eol); /* eat intra-line ws */
- next = find_whitespace_eos(*s, eol); /* find end of token at *s */
- }
- tok->n_args = j;
}
+ *s = eol;
}
if (tok->n_args < table[i].min_args) {
tor_snprintf(ebuf, sizeof(ebuf), "Too few arguments to %s", kwd);
@@ -2936,6 +2910,7 @@
int i;
int first_nonannotation;
int prev_len = smartlist_len(out);
+ tor_assert(area);
s = &start;
if (!end)
More information about the tor-commits
mailing list