From 0dcdec81ab76e07c16650f5c49fc337fbccc85a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Niels=20M=C3=B6ller?= <nisse@lysator.liu.se> Date: Sun, 12 Jan 2003 15:49:06 +0100 Subject: [PATCH] (struct sexp_parser): Renamed struct (was struct sexp_parse_state). Added input pointer. Updated users to not pass around both parser and input. Rev: src/nettle/tools/sexp-conv.c:1.9 --- tools/sexp-conv.c | 96 +++++++++++++++++++++++------------------------ 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/tools/sexp-conv.c b/tools/sexp-conv.c index 6dccb605..f2f027de 100644 --- a/tools/sexp-conv.c +++ b/tools/sexp-conv.c @@ -563,8 +563,9 @@ sexp_get_token(struct sexp_input *input, enum sexp_mode mode) /* Parsing */ -struct sexp_parse_state +struct sexp_parser { + struct sexp_input *input; enum sexp_mode mode; enum sexp_token expected; @@ -578,27 +579,32 @@ struct sexp_parse_state }; static void -sexp_parse_init(struct sexp_parse_state *state, enum sexp_mode mode) +sexp_parse_init(struct sexp_parser *parser, + struct sexp_input *input, + enum sexp_mode mode) { - state->mode = mode; - state->expected = 0; + parser->input = input; + parser->mode = mode; + parser->expected = 0; /* Start counting with 1 for the top level, to make comparisons * between transport and level simpler. * * FIXME: Is that trick ugly? */ - state->level = 1; - state->transport = 0; + parser->level = 1; + parser->transport = 0; } /* Get next token, and check that it is of the expected kind. */ static void -sexp_check_token(struct sexp_input *input, struct sexp_parse_state *state, +sexp_check_token(struct sexp_parser *parser, enum sexp_token token) { - sexp_get_token(input, state->transport ? SEXP_CANONICAL : state->mode); + sexp_get_token(parser->input, + parser->transport ? SEXP_CANONICAL : parser->mode); - if (input->token != token) + /* FIXME: Handle token == 0 meaning any. */ + if (parser->input->token != token) die("Syntax error.\n"); } @@ -610,41 +616,35 @@ sexp_check_token(struct sexp_input *input, struct sexp_parse_state *state, * expression. We check at the end of strings and list whether or not * we should expect a SEXP_CODING_END as the next token. */ static void -sexp_parse(struct sexp_input *input, struct sexp_parse_state *parser) +sexp_parse(struct sexp_parser *parser) { for (;;) { - switch (parser->expected) + if (!parser->expected) + sexp_get_token(parser->input, + parser->transport ? SEXP_CANONICAL : parser->mode); + else { - default: - abort(); + sexp_check_token(parser, parser->expected); + parser->expected = 0; - case 0: - sexp_get_token(input, - parser->transport ? SEXP_CANONICAL : parser->mode); - break; - - case SEXP_STRING: - sexp_check_token(input, parser, SEXP_STRING); - break; - - case SEXP_CODING_END: - assert(parser->transport); - assert(parser->level == parser->transport); - - sexp_check_token(input, parser, SEXP_CODING_END); - - parser->level--; - parser->transport = 0; + if (parser->input->token == SEXP_STRING) + /* Nothing special */ + ; + else + { + assert(parser->input->token == SEXP_CODING_END); + assert(parser->transport); + assert(parser->level == parser->transport); - parser->expected = 0; + parser->level--; + parser->transport = 0; - continue; + continue; + } } - - parser->expected = 0; - - switch(input->token) + + switch(parser->input->token) { case SEXP_LIST_END: if (parser->level == parser->transport) @@ -668,9 +668,9 @@ sexp_parse(struct sexp_input *input, struct sexp_parse_state *parser) return; case SEXP_DISPLAY_START: - sexp_check_token(input, parser, SEXP_STRING); - sexp_check_token(input, parser, SEXP_DISPLAY_END); - input->token = SEXP_DISPLAY; + sexp_check_token(parser, SEXP_STRING); + sexp_check_token(parser, SEXP_DISPLAY_END); + parser->input->token = SEXP_DISPLAY; parser->expected = SEXP_STRING; return; @@ -970,7 +970,7 @@ sexp_put_digest(struct sexp_output *output) static void -sexp_convert_list(struct sexp_input *input, struct sexp_parse_state *parser, +sexp_convert_list(struct sexp_input *input, struct sexp_parser *parser, struct sexp_output *output, enum sexp_mode mode_out, unsigned indent); @@ -978,7 +978,7 @@ sexp_convert_list(struct sexp_input *input, struct sexp_parse_state *parser, * expression, to be converted, and return with input->token being the * last token of the expression. */ static void -sexp_convert_item(struct sexp_input *input, struct sexp_parse_state *parser, +sexp_convert_item(struct sexp_input *input, struct sexp_parser *parser, struct sexp_output *output, enum sexp_mode mode_out, unsigned indent) { @@ -1011,7 +1011,7 @@ sexp_convert_item(struct sexp_input *input, struct sexp_parse_state *parser, sexp_put_char(output, '['); sexp_put_string(output, mode_out, &input->string); sexp_put_char(output, ']'); - sexp_parse(input, parser); + sexp_parse(parser); assert(input->token == SEXP_STRING); sexp_put_string(output, mode_out, &input->string); break; @@ -1023,7 +1023,7 @@ sexp_convert_item(struct sexp_input *input, struct sexp_parse_state *parser, } static void -sexp_convert_list(struct sexp_input *input, struct sexp_parse_state *parser, +sexp_convert_list(struct sexp_input *input, struct sexp_parser *parser, struct sexp_output *output, enum sexp_mode mode_out, unsigned indent) { @@ -1033,7 +1033,7 @@ sexp_convert_list(struct sexp_input *input, struct sexp_parse_state *parser, for (item = 0;; item++) { - sexp_parse(input, parser); + sexp_parse(parser); if (input->token == SEXP_LIST_END) { @@ -1254,13 +1254,13 @@ main(int argc, char **argv) { struct conv_options options; struct sexp_input input; - struct sexp_parse_state parser; + struct sexp_parser parser; struct sexp_output output; parse_options(&options, argc, argv); sexp_input_init(&input, stdin); - sexp_parse_init(&parser, SEXP_ADVANCED); + sexp_parse_init(&parser, &input, SEXP_ADVANCED); sexp_output_init(&output, stdout, options.width, options.prefer_hex); @@ -1271,7 +1271,7 @@ main(int argc, char **argv) sexp_get_char(&input); - sexp_parse(&input, &parser); + sexp_parse(&parser); if (input.token == SEXP_EOF) { @@ -1288,7 +1288,7 @@ main(int argc, char **argv) else if (options.mode != SEXP_CANONICAL) sexp_put_newline(&output, 0); - sexp_parse(&input, &parser); + sexp_parse(&parser); } while (!options.once && input.token != SEXP_EOF); -- GitLab