3
/* nettle, low-level cryptographics library
5
* Copyright (C) 2002, 2003 Niels M�ller
7
* The nettle library is free software; you can redistribute it and/or modify
8
* it under the terms of the GNU Lesser General Public License as published by
9
* the Free Software Foundation; either version 2.1 of the License, or (at your
10
* option) any later version.
12
* The nettle library is distributed in the hope that it will be useful, but
13
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
14
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
15
* License for more details.
17
* You should have received a copy of the GNU Lesser General Public License
18
* along with the nettle library; see the file COPYING.LIB. If not, write to
19
* the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
35
sexp_compound_token_init(struct sexp_compound_token *token)
38
nettle_buffer_init(&token->display);
39
nettle_buffer_init(&token->string);
43
sexp_compound_token_clear(struct sexp_compound_token *token)
45
nettle_buffer_clear(&token->display);
46
nettle_buffer_clear(&token->string);
50
sexp_parse_init(struct sexp_parser *parser,
51
struct sexp_input *input,
54
parser->input = input;
57
/* Start counting with 1 for the top level, to make comparisons
58
* between transport and level simpler.
60
* FIXME: Is that trick ugly? */
62
parser->transport = 0;
65
/* Get next token, and check that it is of the expected kind. */
67
sexp_check_token(struct sexp_parser *parser,
68
enum sexp_token token,
69
struct nettle_buffer *string)
71
sexp_get_token(parser->input,
72
parser->transport ? SEXP_CANONICAL : parser->mode,
75
if (token && parser->input->token != token)
76
die("Syntax error.\n");
79
/* Performs further processing of the input, in particular display
80
* types and transport decoding.
82
* This is complicated a little by the requirement that a
83
* transport-encoded block, {xxxxx}, must include exactly one
84
* expression. We check at the end of strings and list whether or not
85
* we should expect a SEXP_CODING_END as the next token. */
87
sexp_parse(struct sexp_parser *parser,
88
struct sexp_compound_token *token)
92
sexp_get_token(parser->input,
93
parser->transport ? SEXP_CANONICAL : parser->mode,
96
switch(parser->input->token)
99
if (parser->level == parser->transport)
100
die("Unmatched end of list in transport encoded data.\n");
104
die("Unmatched end of list.\n");
106
token->type = SEXP_LIST_END;
109
if (parser->level == parser->transport)
111
sexp_check_token(parser, SEXP_CODING_END, &token->string);
112
assert(parser->transport);
113
assert(parser->level == parser->transport);
116
parser->transport = 0;
121
if (parser->level > 1)
122
die("Unexpected end of file.\n");
124
token->type = SEXP_EOF;
127
case SEXP_LIST_START:
129
token->type = SEXP_LIST_START;
132
case SEXP_DISPLAY_START:
133
sexp_check_token(parser, SEXP_STRING, &token->display);
134
sexp_check_token(parser, SEXP_DISPLAY_END, &token->display);
135
sexp_check_token(parser, SEXP_STRING, &token->string);
137
token->type = SEXP_DISPLAY;
138
goto check_transport_end;
141
token->type = SEXP_STRING;
142
goto check_transport_end;
144
case SEXP_TRANSPORT_START:
145
if (parser->mode == SEXP_CANONICAL)
146
die("Base64 not allowed in canonical mode.\n");
148
parser->transport = parser->level;
152
case SEXP_CODING_END:
153
die("Unexpected end of transport encoding.\n");
156
/* Internal error. */