]> git.ipfire.org Git - thirdparty/dhcp.git/blobdiff - common/parse.c
- Silence benign static analysis warnings.
[thirdparty/dhcp.git] / common / parse.c
index ac8e6613e47469223d69601d9fe91c85a41ab94c..ad31f8ab459e96d3c0f378d0150fbd6530975eab 100644 (file)
@@ -3,7 +3,7 @@
    Common parser code for dhcpd and dhclient. */
 
 /*
- * Copyright (c) 2004-2012 by Internet Systems Consortium, Inc. ("ISC")
+ * Copyright (c) 2004-2013 by Internet Systems Consortium, Inc. ("ISC")
  * Copyright (c) 1995-2003 by Internet Software Consortium
  *
  * Permission to use, copy, modify, and distribute this software for any
@@ -110,7 +110,7 @@ void skip_to_rbrace (cfile, brace_count)
        do {
                token = peek_token (&val, (unsigned *)0, cfile);
                if (token == RBRACE) {
-                       token = next_token (&val, (unsigned *)0, cfile);
+                       skip_token(&val, (unsigned *)0, cfile);
                        if (brace_count) {
                                if (!--brace_count)
                                        return;
@@ -119,13 +119,13 @@ void skip_to_rbrace (cfile, brace_count)
                } else if (token == LBRACE) {
                        brace_count++;
                } else if (token == SEMI && !brace_count) {
-                       token = next_token (&val, (unsigned *)0, cfile);
+                       skip_token(&val, (unsigned *)0, cfile);
                        return;
                } else if (token == EOL) {
                        /* EOL only happens when parsing /etc/resolv.conf,
                           and we treat it like a semicolon because the
                           resolv.conf file is line-oriented. */
-                       token = next_token (&val, (unsigned *)0, cfile);
+                       skip_token(&val, (unsigned *)0, cfile);
                        return;
                }
                token = next_token (&val, (unsigned *)0, cfile);
@@ -206,7 +206,7 @@ char *parse_host_name (cfile)
                token = peek_token (&val, (unsigned *)0, cfile);
                if (!is_identifier (token) && token != NUMBER)
                        break;
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
 
                /* Store this identifier... */
                if (!(s = (char *)dmalloc (strlen (val) + 1, MDL)))
@@ -285,7 +285,7 @@ int parse_ip_addr_or_hostname (expr, cfile, uniform)
                 * we're dealing with.
                 */
                save_parse_state(cfile);
-               (void) next_token(NULL, NULL, cfile);
+               skip_token(NULL, NULL, cfile);
                if (next_token(NULL, NULL, cfile) == DOT &&
                    next_token(NULL, NULL, cfile) == NUMBER)
                        ipaddr = 1;
@@ -498,7 +498,7 @@ parse_ip_addr_with_subnet(cfile, match)
                token = peek_token(&val, NULL, cfile);
 
                if (token == SLASH) {
-                       next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                        token = next_token(&val, NULL, cfile);
 
                        if (token != NUMBER) {
@@ -733,7 +733,7 @@ unsigned char *parse_numeric_aggregate (cfile, buf,
                                        dfree(bufp, MDL);
                                return (unsigned char *)0;
                        }
-                       token = next_token (&val, (unsigned *)0, cfile);
+                       skip_token(&val, (unsigned *)0, cfile);
                }
                token = next_token (&val, (unsigned *)0, cfile);
 
@@ -948,23 +948,23 @@ parse_date_core(cfile)
        /* "never", "epoch" or day of week */
        token = peek_token(&val, NULL, cfile);
        if (token == NEVER) {
-               token = next_token(&val, NULL, cfile); /* consume NEVER */
+               skip_token(&val, NULL, cfile); /* consume NEVER */
                return(MAX_TIME);
        }
 
        /* This indicates 'local' time format. */
        if (token == EPOCH) {
-               token = next_token(&val, NULL, cfile); /* consume EPOCH */
+               skip_token(&val, NULL, cfile); /* consume EPOCH */
                token = peek_token(&val, NULL, cfile);
 
                if (token != NUMBER) {
                        if (token != SEMI)
-                               token = next_token(&val, NULL, cfile);
+                               skip_token(&val, NULL, cfile);
                        parse_warn(cfile, "Seconds since epoch expected.");
                        return((TIME)0);
                }
 
-               token = next_token(&val, NULL, cfile); /* consume number */
+               skip_token(&val, NULL, cfile); /* consume number */
                guess = atoi(val);
 
                return((TIME)guess);
@@ -972,22 +972,22 @@ parse_date_core(cfile)
 
        if (token != NUMBER) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile, "numeric day of week expected.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume day of week */
+       skip_token(&val, NULL, cfile); /* consume day of week */
         /* we are not using this for anything */
 
        /* Year... */
        token = peek_token(&val, NULL, cfile);
        if (token != NUMBER) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile, "numeric year expected.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume year */
+       skip_token(&val, NULL, cfile); /* consume year */
 
        /* Note: the following is not a Y2K bug - it's a Y1.9K bug.   Until
           somebody invents a time machine, I think we can safely disregard
@@ -1001,108 +1001,108 @@ parse_date_core(cfile)
        token = peek_token(&val, NULL, cfile);
        if (token != SLASH) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile,
                           "expected slash separating year from month.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume SLASH */
+       skip_token(&val, NULL, cfile); /* consume SLASH */
 
        /* Month... */
        token = peek_token(&val, NULL, cfile);
        if (token != NUMBER) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile, "numeric month expected.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume month */      
+       skip_token(&val, NULL, cfile); /* consume month */      
        mon = atoi(val) - 1;
 
        /* Slash separating month from day... */
        token = peek_token(&val, NULL, cfile);
        if (token != SLASH) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile,
                           "expected slash separating month from day.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume SLASH */
+       skip_token(&val, NULL, cfile); /* consume SLASH */
 
        /* Day of month... */
        token = peek_token(&val, NULL, cfile);
        if (token != NUMBER) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile, "numeric day of month expected.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume day of month */
+       skip_token(&val, NULL, cfile); /* consume day of month */
        mday = atoi(val);
 
        /* Hour... */
        token = peek_token(&val, NULL, cfile);
        if (token != NUMBER) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile, "numeric hour expected.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume hour */
+       skip_token(&val, NULL, cfile); /* consume hour */
        hour = atoi(val);
 
        /* Colon separating hour from minute... */
        token = peek_token(&val, NULL, cfile);
        if (token != COLON) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile,
                           "expected colon separating hour from minute.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume colon */
+       skip_token(&val, NULL, cfile); /* consume colon */
 
        /* Minute... */
        token = peek_token(&val, NULL, cfile);
        if (token != NUMBER) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile, "numeric minute expected.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume minute */
+       skip_token(&val, NULL, cfile); /* consume minute */
        min = atoi(val);
 
        /* Colon separating minute from second... */
        token = peek_token(&val, NULL, cfile);
        if (token != COLON) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile,
                           "expected colon separating minute from second.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume colon */
+       skip_token(&val, NULL, cfile); /* consume colon */
 
        /* Second... */
        token = peek_token(&val, NULL, cfile);
        if (token != NUMBER) {
                if (token != SEMI)
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                parse_warn(cfile, "numeric second expected.");
                return((TIME)0);
        }
-       token = next_token(&val, NULL, cfile); /* consume second */
+       skip_token(&val, NULL, cfile); /* consume second */
        sec = atoi(val);
 
        tzoff = 0;
        token = peek_token(&val, NULL, cfile);
        if (token == NUMBER) {
-               token = next_token(&val, NULL, cfile); /* consume tzoff */
+               skip_token(&val, NULL, cfile); /* consume tzoff */
                tzoff = atoi(val);
        } else if (token != SEMI) {
-               token = next_token(&val, NULL, cfile);
+               skip_token(&val, NULL, cfile);
                parse_warn(cfile,
                           "Time zone offset or semicolon expected.");
                return((TIME)0);
@@ -1189,7 +1189,7 @@ parse_option_name (cfile, allocate, known, opt)
        token = peek_token (&val, (unsigned *)0, cfile);
        if (token == DOT) {
                /* Go ahead and take the DOT token... */
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
 
                /* The next token should be an identifier... */
                token = next_token (&val, (unsigned *)0, cfile);
@@ -1308,7 +1308,7 @@ void parse_option_space_decl (cfile)
        char *nu_name;
        int tsize=1, lsize=1, hsize = 0;
 
-       next_token (&val, (unsigned *)0, cfile);  /* Discard the SPACE token,
+       skip_token(&val, (unsigned *)0, cfile);  /* Discard the SPACE token,
                                                     which was checked by the
                                                     caller. */
        token = next_token (&val, (unsigned *)0, cfile);
@@ -1670,7 +1670,7 @@ int parse_option_code_definition (cfile, option)
                /* Consume optional compression indicator. */
                token = peek_token(&val, NULL, cfile);
                if (token == COMPRESSED) {
-                       token = next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
                        tokbuf[tokix++] = 'D';
                        type = 'c';
                } else
@@ -2028,7 +2028,7 @@ int parse_cshl (data, cfile)
                token = peek_token (&val, (unsigned *)0, cfile);
                if (token != COLON)
                        break;
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
        } while (1);
 
        if (!buffer_allocate (&data -> buffer, tlen + ilen, MDL))
@@ -2105,8 +2105,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
        token = peek_token (&val, (unsigned *)0, cfile);
        switch (token) {
              case DB_TIME_FORMAT:
-               next_token(&val, NULL, cfile);
-
+               skip_token(&val, NULL, cfile);
                token = next_token(&val, NULL, cfile);
                if (token == DEFAULT) {
                        db_time_format = DEFAULT_TIME_FORMAT;
@@ -2131,11 +2130,11 @@ int parse_executable_statement (result, cfile, lose, case_context)
                return 1;
 
              case IF:
-               next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                return parse_if_statement (result, cfile, lose);
 
              case TOKEN_ADD:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                token = next_token (&val, (unsigned *)0, cfile);
                if (token != STRING) {
                        parse_warn (cfile, "expecting class name.");
@@ -2163,7 +2162,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                break;
 
              case BREAK:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!parse_semi (cfile)) {
                        *lose = 1;
                        return 0;
@@ -2174,7 +2173,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                break;
 
              case SEND:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                known = 0;
                status = parse_option_name (cfile, 0, &known, &option);
                if (status != ISC_R_SUCCESS || option == NULL) {
@@ -2188,7 +2187,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
 
              case SUPERSEDE:
              case OPTION:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                known = 0;
                status = parse_option_name (cfile, 0, &known, &option);
                if (status != ISC_R_SUCCESS || option == NULL) {
@@ -2209,7 +2208,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
              case IGNORE:
                flag = 2;
              pad:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                cache = (struct option_cache *)0;
                if (!parse_allow_deny (&cache, cfile, flag))
                        return 0;
@@ -2220,7 +2219,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                break;
 
              case DEFAULT:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                token = peek_token (&val, (unsigned *)0, cfile);
                if (token == COLON)
                        goto switch_default;
@@ -2236,7 +2235,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                return status;
 
              case PREPEND:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                known = 0;
                status = parse_option_name (cfile, 0, &known, &option);
                if (status != ISC_R_SUCCESS || option == NULL) {
@@ -2249,7 +2248,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                return status;
 
              case APPEND:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                known = 0;
                status = parse_option_name (cfile, 0, &known, &option);
                if (status != ISC_R_SUCCESS || option == NULL) {
@@ -2262,15 +2261,15 @@ int parse_executable_statement (result, cfile, lose, case_context)
                return status;
 
              case ON:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                return parse_on_statement (result, cfile, lose);
                        
              case SWITCH:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                return parse_switch_statement (result, cfile, lose);
 
              case CASE:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (case_context == context_any) {
                        parse_warn (cfile,
                                    "case statement in inappropriate scope.");
@@ -2282,7 +2281,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                                             cfile, lose, case_context);
 
              switch_default:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (case_context == context_any) {
                        parse_warn (cfile, "switch default statement in %s",
                                    "inappropriate scope.");
@@ -2298,7 +2297,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                        
              case DEFINE:
              case TOKEN_SET:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (token == DEFINE)
                        flag = 1;
                else
@@ -2424,8 +2423,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                break;
 
              case UNSET:
-               token = next_token (&val, (unsigned *)0, cfile);
-
+               skip_token(&val, (unsigned *)0, cfile);
                token = next_token (&val, (unsigned *)0, cfile);
                if (token != NAME && token != NUMBER_OR_NAME) {
                        parse_warn (cfile,
@@ -2450,8 +2448,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                break;
 
              case EVAL:
-               token = next_token (&val, (unsigned *)0, cfile);
-
+               skip_token(&val, (unsigned *)0, cfile);
                if (!executable_statement_allocate (result, MDL))
                        log_fatal ("no memory for eval statement.");
                (*result) -> op = eval_statement;
@@ -2476,7 +2473,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
 
              case EXECUTE:
 #ifdef ENABLE_EXECUTE
-               token = next_token(&val, NULL, cfile);
+               skip_token(&val, NULL, cfile);
 
                if (!executable_statement_allocate (result, MDL))
                        log_fatal ("no memory for execute statement.");
@@ -2546,7 +2543,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                break;
 
              case RETURN:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
 
                if (!executable_statement_allocate (result, MDL))
                        log_fatal ("no memory for return statement.");
@@ -2572,7 +2569,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                break;
 
              case LOG:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
 
                if (!executable_statement_allocate (result, MDL))
                        log_fatal ("no memory for log statement.");
@@ -2601,7 +2598,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                        i = 0;
                }
                if (i) {
-                       token = next_token (&val, (unsigned *)0, cfile);
+                       skip_token(&val, (unsigned *)0, cfile);
                        token = next_token (&val, (unsigned *)0, cfile);
                        if (token != COMMA) {
                                parse_warn (cfile, "comma expected.");
@@ -2639,7 +2636,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                   because it's appropriate for all DHCP agents with
                   parsers. */
              case ZONE:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                zone = (struct dns_zone *)0;
                if (!dns_zone_allocate (&zone, MDL))
                        log_fatal ("no memory for new zone.");
@@ -2679,7 +2676,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                
                /* Also not really a statement, but same idea as above. */
              case KEY:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!parse_key (cfile)) {
                        *lose = 1;
                        return 0;
@@ -2693,8 +2690,7 @@ int parse_executable_statement (result, cfile, lose, case_context)
                                                config_universe->name_hash,
                                                val, 0, MDL);
                        if (option) {
-                               token = next_token (&val,
-                                                   (unsigned *)0, cfile);
+                               skip_token(&val, (unsigned *)0, cfile);
                                status = parse_option_statement
                                                (result, cfile, 1, option,
                                                 supersede_option_statement);
@@ -2790,7 +2786,7 @@ int parse_zone (struct dns_zone *zone, struct parse *cfile)
                            log_fatal ("can't allocate secondary.");
                    oc = zone -> secondary;
                  consemup:
-                   token = next_token (&val, (unsigned *)0, cfile);
+                   skip_token(&val, (unsigned *)0, cfile);
                    do {
                            struct expression *expr = (struct expression *)0;
                            if (!parse_ip_addr_or_hostname (&expr, cfile, 0)) {
@@ -2848,7 +2844,7 @@ int parse_zone (struct dns_zone *zone, struct parse *cfile)
                                      "option cache.");
                    oc = zone->secondary6;
                  consemup6:
-                   token = next_token(&val, NULL, cfile);
+                   skip_token(&val, NULL, cfile);
                    do {
                            struct expression *expr = NULL;
                            if (parse_ip6_addr_expr(&expr, cfile) == 0) {
@@ -2882,10 +2878,10 @@ int parse_zone (struct dns_zone *zone, struct parse *cfile)
                    break;
 
                  case KEY:
-                   token = next_token (&val, (unsigned *)0, cfile);
+                   skip_token(&val, (unsigned *)0, cfile);
                    token = peek_token (&val, (unsigned *)0, cfile);
                    if (token == STRING) {
-                           token = next_token (&val, (unsigned *)0, cfile);
+                           skip_token(&val, (unsigned *)0, cfile);
                            key_name = (char *)0;
                    } else {
                            key_name = parse_host_name (cfile);
@@ -2943,7 +2939,7 @@ int parse_key (struct parse *cfile)
 
        token = peek_token (&val, (unsigned *)0, cfile);
        if (token == STRING) {
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                key -> name = dmalloc (strlen (val) + 1, MDL);
                if (!key -> name)
                        log_fatal ("no memory for key name.");
@@ -3047,8 +3043,9 @@ int parse_key (struct parse *cfile)
        /* Allow the BIND 8 syntax, which has a semicolon after each
           closing brace. */
        token = peek_token (&val, (unsigned *)0, cfile);
-       if (token == SEMI)
-               token = next_token (&val, (unsigned *)0, cfile);
+       if (token == SEMI) {
+               skip_token(&val, (unsigned *)0, cfile);
+       }
 
        /* Remember the key. */
        status = omapi_auth_key_enter (key);
@@ -3286,7 +3283,7 @@ int parse_if_statement (result, cfile, lose)
        token = peek_token (&val, (unsigned *)0, cfile);
        if (token == LPAREN) {
                parenp = 1;
-               next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
        } else
                parenp = 0;
 
@@ -3341,10 +3338,10 @@ int parse_if_statement (result, cfile, lose)
        }
        token = peek_token (&val, (unsigned *)0, cfile);
        if (token == ELSE) {
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                token = peek_token (&val, (unsigned *)0, cfile);
                if (token == IF) {
-                       token = next_token (&val, (unsigned *)0, cfile);
+                       skip_token(&val, (unsigned *)0, cfile);
                        if (!parse_if_statement (&(*result) -> data.ie.fc,
                                                 cfile, lose)) {
                                if (!*lose)
@@ -3361,7 +3358,7 @@ int parse_if_statement (result, cfile, lose)
                        executable_statement_dereference (result, MDL);
                        return 0;
                } else {
-                       token = next_token (&val, (unsigned *)0, cfile);
+                       skip_token(&val, (unsigned *)0, cfile);
                        if (!(parse_executable_statements
                              (&(*result) -> data.ie.fc,
                               cfile, lose, context_any))) {
@@ -3378,7 +3375,7 @@ int parse_if_statement (result, cfile, lose)
                        }
                }
        } else if (token == ELSIF) {
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!parse_if_statement (&(*result) -> data.ie.fc,
                                         cfile, lose)) {
                        if (!*lose)
@@ -3580,7 +3577,7 @@ int parse_non_binary (expr, cfile, lose, context)
        /* Check for unary operators... */
        switch (token) {
              case CHECK:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                token = next_token (&val, (unsigned *)0, cfile);
                if (token != STRING) {
                        parse_warn (cfile, "string expected.");
@@ -3603,7 +3600,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case TOKEN_NOT:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
 #if defined(NSUPDATE_OLD)
                if (context == context_dns) {
                        token = peek_token (&val, (unsigned *)0, cfile);
@@ -3633,7 +3630,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case LPAREN:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!parse_expression (expr, cfile, lose, context,
                                       (struct expression **)0, expr_none)) {
                        if (!*lose) {
@@ -3657,7 +3654,7 @@ int parse_non_binary (expr, cfile, lose, context)
                if (context == context_dns)
                        goto ns_exists;
 #endif
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_exists;
@@ -3674,21 +3671,21 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case STATIC:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_static;
                break;
 
              case KNOWN:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_known;
                break;
 
              case SUBSTRING:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_substring;
@@ -3757,7 +3754,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case SUFFIX:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_suffix;
@@ -3784,7 +3781,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case LCASE:
-               token = next_token(&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate(expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr)->op = expr_lcase;
@@ -3802,7 +3799,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case UCASE:
-               token = next_token(&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate(expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr)->op = expr_ucase;
@@ -3821,7 +3818,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case CONCAT:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_concat;
@@ -3863,7 +3860,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case BINARY_TO_ASCII:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_binary_to_ascii;
@@ -3906,7 +3903,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case REVERSE:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_reverse;
@@ -3935,7 +3932,7 @@ int parse_non_binary (expr, cfile, lose, context)
              case PICK:
                /* pick (a, b, c) actually produces an internal representation
                   that looks like pick (a, pick (b, pick (c, nil))). */
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!(expression_allocate (expr, MDL)))
                        log_fatal ("can't allocate expression");
 
@@ -3981,7 +3978,7 @@ int parse_non_binary (expr, cfile, lose, context)
                parse_warn (cfile,
                            "Please rebuild dhcpd with --with-nsupdate.");
 #endif
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (token == DNS_UPDATE)
                        opcode = expr_ns_add;
                else
@@ -4088,7 +4085,7 @@ int parse_non_binary (expr, cfile, lose, context)
                parse_warn (cfile,
                            "Please rebuild dhcpd with --with-nsupdate.");
 #endif
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
 
@@ -4256,7 +4253,7 @@ int parse_non_binary (expr, cfile, lose, context)
                (*expr) -> op = (token == OPTION
                                 ? expr_option
                                 : expr_config_option);
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                known = 0;
                /* Pass reference directly to expression structure. */
                status = parse_option_name(cfile, 0, &known,
@@ -4270,56 +4267,56 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case HARDWARE:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_hardware;
                break;
 
              case LEASED_ADDRESS:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_leased_address;
                break;
 
              case CLIENT_STATE:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_client_state;
                break;
 
              case FILENAME:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_filename;
                break;
 
              case SERVER_NAME:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_sname;
                break;
 
              case LEASE_TIME:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_lease_time;
                break;
 
              case TOKEN_NULL:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_null;
                break;
 
              case HOST_DECL_NAME:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_host_decl_name;
@@ -4327,8 +4324,7 @@ int parse_non_binary (expr, cfile, lose, context)
 
 #if defined(NSUPDATE_OLD)
              case UPDATED_DNS_RR:
-               token = next_token (&val, (unsigned *)0, cfile);
-
+               skip_token(&val, (unsigned *)0, cfile);
                token = next_token (&val, (unsigned *)0, cfile);
                if (token != LPAREN)
                        goto nolparen;
@@ -4364,7 +4360,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 #endif /* NSUPDATE_OLD */
              case PACKET:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_packet;
@@ -4391,14 +4387,14 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
                
              case STRING:
-               token = next_token (&val, &len, cfile);
+               skip_token(&val, &len, cfile);
                if (!make_const_data (expr, (const unsigned char *)val,
                                      len, 1, 1, MDL))
                        log_fatal ("can't make constant string expression.");
                break;
 
              case EXTRACT_INT:
-               token = next_token (&val, (unsigned *)0, cfile);        
+               skip_token(&val, (unsigned *)0, cfile); 
                token = next_token (&val, (unsigned *)0, cfile);
                if (token != LPAREN) {
                        parse_warn (cfile, "left parenthesis expected.");
@@ -4468,7 +4464,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
        
              case ENCODE_INT:
-               token = next_token (&val, (unsigned *)0, cfile);        
+               skip_token(&val, (unsigned *)0, cfile); 
                token = next_token (&val, (unsigned *)0, cfile);
                if (token != LPAREN) {
                        parse_warn (cfile, "left parenthesis expected.");
@@ -4539,7 +4535,7 @@ int parse_non_binary (expr, cfile, lose, context)
                   number, by itself. */
                if (context == context_numeric ||
                    context == context_data_or_numeric) {
-                       next_token (&val, (unsigned *)0, cfile);
+                       skip_token(&val, (unsigned *)0, cfile);
                        if (!expression_allocate (expr, MDL))
                                log_fatal ("can't allocate expression");
                        (*expr) -> op = expr_const_int;
@@ -4562,7 +4558,7 @@ int parse_non_binary (expr, cfile, lose, context)
                known = FORMERR;
                goto ns_const;
              ns_const:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_const_int;
@@ -4638,7 +4634,7 @@ int parse_non_binary (expr, cfile, lose, context)
                goto ns_const;
 
              case DEFINED:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                token = next_token (&val, (unsigned *)0, cfile);
                if (token != LPAREN)
                        goto nolparen;
@@ -4665,7 +4661,7 @@ int parse_non_binary (expr, cfile, lose, context)
 
                /* This parses 'gethostname()'. */
              case GETHOSTNAME:
-               token = next_token(&val, NULL, cfile);
+               skip_token(&val, NULL, cfile);
                if (!expression_allocate(expr, MDL))
                        log_fatal("can't allocate expression");
                (*expr)->op = expr_gethostname;
@@ -4680,8 +4676,7 @@ int parse_non_binary (expr, cfile, lose, context)
                break;
 
              case GETHOSTBYNAME:
-               token = next_token(&val, NULL, cfile);
-
+               skip_token(&val, NULL, cfile);
                token = next_token(NULL, NULL, cfile);
                if (token != LPAREN)
                        goto nolparen;
@@ -4709,7 +4704,7 @@ int parse_non_binary (expr, cfile, lose, context)
                if (token != NAME && token != NUMBER_OR_NAME)
                        return 0;
 
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
 
                /* Save the name of the variable being referenced. */
                cptr = dmalloc (strlen (val) + 1, MDL);
@@ -4727,7 +4722,7 @@ int parse_non_binary (expr, cfile, lose, context)
                        break;
                }
 
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                if (!expression_allocate (expr, MDL))
                        log_fatal ("can't allocate expression");
                (*expr) -> op = expr_funcall;
@@ -4816,7 +4811,7 @@ int parse_expression (expr, cfile, lose, context, plhs, binop)
        token = peek_token (&val, (unsigned *)0, cfile);
        switch (token) {
              case BANG:
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                token = peek_token (&val, (unsigned *)0, cfile);
                if (token != EQUAL) {
                        parse_warn (cfile, "! in boolean context without =");
@@ -4837,7 +4832,7 @@ int parse_expression (expr, cfile, lose, context, plhs, binop)
 
              case TILDE:
 #ifdef HAVE_REGEX_H
-               token = next_token(&val, NULL, cfile);
+               skip_token(&val, NULL, cfile);
                token = peek_token(&val, NULL, cfile);
 
                if (token == TILDE)
@@ -4929,7 +4924,7 @@ int parse_expression (expr, cfile, lose, context, plhs, binop)
                lhs = rhs;
                rhs = (struct expression *)0;
                binop = next_op;
-               next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
                goto new_rhs;
        }
 
@@ -4944,7 +4939,7 @@ int parse_expression (expr, cfile, lose, context, plhs, binop)
                /* Eat the subexpression operator token, which we pass to
                 * parse_expression...we only peek()'d earlier.
                 */
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
 
                /* Continue parsing of the right hand side with that token. */
                tmp = rhs;
@@ -5059,7 +5054,7 @@ int parse_expression (expr, cfile, lose, context, plhs, binop)
        }
 
        /* Eat the operator token - we now know it was a binary operator... */
-       token = next_token (&val, (unsigned *)0, cfile);
+       skip_token(&val, (unsigned *)0, cfile);
 
        /* Now combine the LHS and the RHS using binop. */
        tmp = (struct expression *)0;
@@ -5170,8 +5165,7 @@ struct option *option;
                        token = peek_token (&val, (unsigned *)0, cfile);
                        /* Comma means: continue with next element in array */
                        if (token == COMMA) {
-                               token = next_token (&val,
-                                                   (unsigned *)0, cfile);
+                               skip_token(&val, (unsigned *)0, cfile);
                                continue;
                        }
                        /* no comma: end of array.
@@ -5217,10 +5211,10 @@ int parse_option_statement (result, cfile, lookups, option, op)
                 *        we are parsing a zero-length option, so don't
                 *        eat the semicolon token in that case.
                 */
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
        } else if (token == EQUAL) {
                /* Eat the equals sign. */
-               token = next_token (&val, (unsigned *)0, cfile);
+               skip_token(&val, (unsigned *)0, cfile);
 
                /* Parse a data expression and use its value for the data. */
                if (!parse_data_expression (&expr, cfile, &lose)) {
@@ -5376,6 +5370,7 @@ int parse_option_token (rv, cfile, fmt, expr, uniform, lookups)
                if (freeval == ISC_TRUE) {
                        dfree((char *)val, MDL);
                        freeval = ISC_FALSE;
+                       POST(freeval);
                }
                break;
                
@@ -5864,7 +5859,7 @@ int parse_X (cfile, buf, max)
                } while (token == COLON);
                val = (char *)buf;
        } else if (token == STRING) {
-               token = next_token (&val, &len, cfile);
+               skip_token(&val, &len, cfile);
                if (len + 1 > max) {
                        parse_warn (cfile, "string constant too long.");
                        skip_to_semi (cfile);
@@ -5952,7 +5947,7 @@ parse_domain_list(struct parse *cfile, int compress)
        do {
                /* Consume the COMMA token if peeked. */
                if (token == COMMA)
-                       next_token(&val, NULL, cfile);
+                       skip_token(&val, NULL, cfile);
 
                /* Get next (or first) value. */
                token = next_token(&val, &len, cfile);