From 118c443aba76b340254468aa2ca92ed7c644fe65 Mon Sep 17 00:00:00 2001 From: Jan Maria Matejka Date: Thu, 23 Aug 2018 21:54:35 +0200 Subject: [PATCH] Lexer: Passing the buffer to Flex directly. --- conf/cf-lex.l | 6 ++++++ conf/conf.c | 2 ++ conf/conf.h | 2 ++ conf/parser.h | 3 +++ nest/cli.c | 21 ++------------------- 5 files changed, 15 insertions(+), 19 deletions(-) diff --git a/conf/cf-lex.l b/conf/cf-lex.l index 72acd947..32dc576a 100644 --- a/conf/cf-lex.l +++ b/conf/cf-lex.l @@ -355,6 +355,12 @@ cf_free_state(struct cf_context *ctx, struct conf_state *cs) /* The state structure is allocated from linpool, will be auto-freed. */ } +void +cf_scan_bytes(struct cf_context *ctx, const char *buf, uint len) +{ + yy_scan_bytes(buf, len, ctx->yyscanner); +} + static void cf_include(char *arg, int alen, yyscan_t yyscanner) { diff --git a/conf/conf.c b/conf/conf.c index 05b740f5..1048296c 100644 --- a/conf/conf.c +++ b/conf/conf.c @@ -157,6 +157,8 @@ cli_parse(struct conf_order *order) struct cf_context *ctx = cf_new_context(1, order); + cf_scan_bytes(ctx, order->buf, order->len); + int ok = 0; if (setjmp(ctx->jmpbuf)) goto done; diff --git a/conf/conf.h b/conf/conf.h index bbdb70ac..999e0996 100644 --- a/conf/conf.h +++ b/conf/conf.h @@ -65,6 +65,8 @@ struct conf_order { struct conf_state *state; struct pool *pool; /* If set, use this resource pool */ struct linpool *lp; /* If set, use this linpool */ + const char *buf; + uint len; int (*cf_read_hook)(struct conf_order *order, byte *buf, uint max); void (*cf_include)(struct conf_order *order, char *name, uint len); int (*cf_outclude)(struct conf_order *order); diff --git a/conf/parser.h b/conf/parser.h index 36cd2349..1d858cf1 100644 --- a/conf/parser.h +++ b/conf/parser.h @@ -34,6 +34,9 @@ void cf_free_context(struct cf_context *); struct conf_state *cf_new_state(struct cf_context *ctx, const char *name); void cf_free_state(struct cf_context *ctx, struct conf_state *cs); +/* Lexer input is a memory buffer */ +void cf_scan_bytes(struct cf_context *, const char *, uint); + /* Init keyword hash is called once from global init */ void cf_init_kh(void); diff --git a/nest/cli.c b/nest/cli.c index 80946d41..ac29677f 100644 --- a/nest/cli.c +++ b/nest/cli.c @@ -242,24 +242,8 @@ struct cli *this_cli; struct cli_conf_order { struct conf_order co; struct cli *cli; - const char *pos; - uint len; }; -static int -cli_cmd_read_hook(struct conf_order *co, byte *buf, uint max) -{ - struct cli_conf_order *cco = (struct cli_conf_order *) co; - - if (max > cco->len) - max = cco->len; - - memcpy(buf, cco->pos, cco->len); - cco->pos += max; - cco->len -= max; - return max; -} - static void cli_cmd_error(struct conf_order *co, const char *msg, va_list args) { @@ -279,15 +263,14 @@ cli_command(struct cli *c) .co = { .ctx = NULL, .state = &state, - .cf_read_hook = cli_cmd_read_hook, + .buf = c->rx_buf, + .len = strlen(c->rx_buf), .cf_include = NULL, .cf_outclude = NULL, .cf_error = cli_cmd_error, .lp = c->parser_pool, .pool = c->pool, }, - .pos = c->rx_buf, - .len = strlen(c->rx_buf), .cli = c, };