1c19800e8SDoug Rabson /* A Bison parser, made by GNU Bison 2.3. */
2c19800e8SDoug Rabson
3c19800e8SDoug Rabson /* Skeleton implementation for Bison's Yacc-like parsers in C
4c19800e8SDoug Rabson
5c19800e8SDoug Rabson Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
6c19800e8SDoug Rabson Free Software Foundation, Inc.
7c19800e8SDoug Rabson
8c19800e8SDoug Rabson This program is free software; you can redistribute it and/or modify
9c19800e8SDoug Rabson it under the terms of the GNU General Public License as published by
10c19800e8SDoug Rabson the Free Software Foundation; either version 2, or (at your option)
11c19800e8SDoug Rabson any later version.
12c19800e8SDoug Rabson
13c19800e8SDoug Rabson This program is distributed in the hope that it will be useful,
14c19800e8SDoug Rabson but WITHOUT ANY WARRANTY; without even the implied warranty of
15c19800e8SDoug Rabson MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16c19800e8SDoug Rabson GNU General Public License for more details.
17c19800e8SDoug Rabson
18c19800e8SDoug Rabson You should have received a copy of the GNU General Public License
19c19800e8SDoug Rabson along with this program; if not, write to the Free Software
20c19800e8SDoug Rabson Foundation, Inc., 51 Franklin Street, Fifth Floor,
21c19800e8SDoug Rabson Boston, MA 02110-1301, USA. */
22c19800e8SDoug Rabson
23c19800e8SDoug Rabson /* As a special exception, you may create a larger work that contains
24c19800e8SDoug Rabson part or all of the Bison parser skeleton and distribute that work
25c19800e8SDoug Rabson under terms of your choice, so long as that work isn't itself a
26c19800e8SDoug Rabson parser generator using the skeleton or a modified version thereof
27c19800e8SDoug Rabson as a parser skeleton. Alternatively, if you modify or redistribute
28c19800e8SDoug Rabson the parser skeleton itself, you may (at your option) remove this
29c19800e8SDoug Rabson special exception, which will cause the skeleton and the resulting
30c19800e8SDoug Rabson Bison output files to be licensed under the GNU General Public
31c19800e8SDoug Rabson License without this special exception.
32c19800e8SDoug Rabson
33c19800e8SDoug Rabson This special exception was added by the Free Software Foundation in
34c19800e8SDoug Rabson version 2.2 of Bison. */
35c19800e8SDoug Rabson
36c19800e8SDoug Rabson /* C LALR(1) parser skeleton written by Richard Stallman, by
37c19800e8SDoug Rabson simplifying the original so-called "semantic" parser. */
38c19800e8SDoug Rabson
39c19800e8SDoug Rabson /* All symbols defined below should begin with yy or YY, to avoid
40c19800e8SDoug Rabson infringing on user name space. This should be done even for local
41c19800e8SDoug Rabson variables, as they might otherwise be expanded by user macros.
42c19800e8SDoug Rabson There are some unavoidable exceptions within include files to
43c19800e8SDoug Rabson define necessary library symbols; they are noted "INFRINGES ON
44c19800e8SDoug Rabson USER NAME SPACE" below. */
45c19800e8SDoug Rabson
46c19800e8SDoug Rabson /* Identify Bison output. */
47c19800e8SDoug Rabson #define YYBISON 1
48c19800e8SDoug Rabson
49c19800e8SDoug Rabson /* Bison version. */
50c19800e8SDoug Rabson #define YYBISON_VERSION "2.3"
51c19800e8SDoug Rabson
52c19800e8SDoug Rabson /* Skeleton name. */
53c19800e8SDoug Rabson #define YYSKELETON_NAME "yacc.c"
54c19800e8SDoug Rabson
55c19800e8SDoug Rabson /* Pure parsers. */
56c19800e8SDoug Rabson #define YYPURE 0
57c19800e8SDoug Rabson
58c19800e8SDoug Rabson /* Using locations. */
59c19800e8SDoug Rabson #define YYLSP_NEEDED 0
60c19800e8SDoug Rabson
61c19800e8SDoug Rabson
62c19800e8SDoug Rabson
63c19800e8SDoug Rabson /* Tokens. */
64c19800e8SDoug Rabson #ifndef YYTOKENTYPE
65c19800e8SDoug Rabson # define YYTOKENTYPE
66c19800e8SDoug Rabson /* Put the tokens into the symbol table, so that GDB and other debuggers
67c19800e8SDoug Rabson know about them. */
68c19800e8SDoug Rabson enum yytokentype {
69c19800e8SDoug Rabson A = 258,
70c19800e8SDoug Rabson B = 259,
71c19800e8SDoug Rabson C = 260,
72c19800e8SDoug Rabson E = 261,
73c19800e8SDoug Rabson F = 262,
74c19800e8SDoug Rabson I = 263,
75c19800e8SDoug Rabson L = 264,
76c19800e8SDoug Rabson N = 265,
77c19800e8SDoug Rabson P = 266,
78c19800e8SDoug Rabson R = 267,
79c19800e8SDoug Rabson S = 268,
80c19800e8SDoug Rabson T = 269,
81c19800e8SDoug Rabson SP = 270,
82c19800e8SDoug Rabson CRLF = 271,
83c19800e8SDoug Rabson COMMA = 272,
84c19800e8SDoug Rabson USER = 273,
85c19800e8SDoug Rabson PASS = 274,
86c19800e8SDoug Rabson ACCT = 275,
87c19800e8SDoug Rabson REIN = 276,
88c19800e8SDoug Rabson QUIT = 277,
89c19800e8SDoug Rabson PORT = 278,
90c19800e8SDoug Rabson PASV = 279,
91c19800e8SDoug Rabson TYPE = 280,
92c19800e8SDoug Rabson STRU = 281,
93c19800e8SDoug Rabson MODE = 282,
94c19800e8SDoug Rabson RETR = 283,
95c19800e8SDoug Rabson STOR = 284,
96c19800e8SDoug Rabson APPE = 285,
97c19800e8SDoug Rabson MLFL = 286,
98c19800e8SDoug Rabson MAIL = 287,
99c19800e8SDoug Rabson MSND = 288,
100c19800e8SDoug Rabson MSOM = 289,
101c19800e8SDoug Rabson MSAM = 290,
102c19800e8SDoug Rabson MRSQ = 291,
103c19800e8SDoug Rabson MRCP = 292,
104c19800e8SDoug Rabson ALLO = 293,
105c19800e8SDoug Rabson REST = 294,
106c19800e8SDoug Rabson RNFR = 295,
107c19800e8SDoug Rabson RNTO = 296,
108c19800e8SDoug Rabson ABOR = 297,
109c19800e8SDoug Rabson DELE = 298,
110c19800e8SDoug Rabson CWD = 299,
111c19800e8SDoug Rabson LIST = 300,
112c19800e8SDoug Rabson NLST = 301,
113c19800e8SDoug Rabson SITE = 302,
114c19800e8SDoug Rabson sTAT = 303,
115c19800e8SDoug Rabson HELP = 304,
116c19800e8SDoug Rabson NOOP = 305,
117c19800e8SDoug Rabson MKD = 306,
118c19800e8SDoug Rabson RMD = 307,
119c19800e8SDoug Rabson PWD = 308,
120c19800e8SDoug Rabson CDUP = 309,
121c19800e8SDoug Rabson STOU = 310,
122c19800e8SDoug Rabson SMNT = 311,
123c19800e8SDoug Rabson SYST = 312,
124c19800e8SDoug Rabson SIZE = 313,
125c19800e8SDoug Rabson MDTM = 314,
126c19800e8SDoug Rabson EPRT = 315,
127c19800e8SDoug Rabson EPSV = 316,
128c19800e8SDoug Rabson UMASK = 317,
129c19800e8SDoug Rabson IDLE = 318,
130c19800e8SDoug Rabson CHMOD = 319,
131c19800e8SDoug Rabson AUTH = 320,
132c19800e8SDoug Rabson ADAT = 321,
133c19800e8SDoug Rabson PROT = 322,
134c19800e8SDoug Rabson PBSZ = 323,
135c19800e8SDoug Rabson CCC = 324,
136c19800e8SDoug Rabson MIC = 325,
137c19800e8SDoug Rabson CONF = 326,
138c19800e8SDoug Rabson ENC = 327,
139c19800e8SDoug Rabson KAUTH = 328,
140c19800e8SDoug Rabson KLIST = 329,
141c19800e8SDoug Rabson KDESTROY = 330,
142c19800e8SDoug Rabson KRBTKFILE = 331,
143c19800e8SDoug Rabson AFSLOG = 332,
144c19800e8SDoug Rabson LOCATE = 333,
145c19800e8SDoug Rabson URL = 334,
146c19800e8SDoug Rabson FEAT = 335,
147c19800e8SDoug Rabson OPTS = 336,
148c19800e8SDoug Rabson LEXERR = 337,
149c19800e8SDoug Rabson STRING = 338,
150c19800e8SDoug Rabson NUMBER = 339
151c19800e8SDoug Rabson };
152c19800e8SDoug Rabson #endif
153c19800e8SDoug Rabson /* Tokens. */
154c19800e8SDoug Rabson #define A 258
155c19800e8SDoug Rabson #define B 259
156c19800e8SDoug Rabson #define C 260
157c19800e8SDoug Rabson #define E 261
158c19800e8SDoug Rabson #define F 262
159c19800e8SDoug Rabson #define I 263
160c19800e8SDoug Rabson #define L 264
161c19800e8SDoug Rabson #define N 265
162c19800e8SDoug Rabson #define P 266
163c19800e8SDoug Rabson #define R 267
164c19800e8SDoug Rabson #define S 268
165c19800e8SDoug Rabson #define T 269
166c19800e8SDoug Rabson #define SP 270
167c19800e8SDoug Rabson #define CRLF 271
168c19800e8SDoug Rabson #define COMMA 272
169c19800e8SDoug Rabson #define USER 273
170c19800e8SDoug Rabson #define PASS 274
171c19800e8SDoug Rabson #define ACCT 275
172c19800e8SDoug Rabson #define REIN 276
173c19800e8SDoug Rabson #define QUIT 277
174c19800e8SDoug Rabson #define PORT 278
175c19800e8SDoug Rabson #define PASV 279
176c19800e8SDoug Rabson #define TYPE 280
177c19800e8SDoug Rabson #define STRU 281
178c19800e8SDoug Rabson #define MODE 282
179c19800e8SDoug Rabson #define RETR 283
180c19800e8SDoug Rabson #define STOR 284
181c19800e8SDoug Rabson #define APPE 285
182c19800e8SDoug Rabson #define MLFL 286
183c19800e8SDoug Rabson #define MAIL 287
184c19800e8SDoug Rabson #define MSND 288
185c19800e8SDoug Rabson #define MSOM 289
186c19800e8SDoug Rabson #define MSAM 290
187c19800e8SDoug Rabson #define MRSQ 291
188c19800e8SDoug Rabson #define MRCP 292
189c19800e8SDoug Rabson #define ALLO 293
190c19800e8SDoug Rabson #define REST 294
191c19800e8SDoug Rabson #define RNFR 295
192c19800e8SDoug Rabson #define RNTO 296
193c19800e8SDoug Rabson #define ABOR 297
194c19800e8SDoug Rabson #define DELE 298
195c19800e8SDoug Rabson #define CWD 299
196c19800e8SDoug Rabson #define LIST 300
197c19800e8SDoug Rabson #define NLST 301
198c19800e8SDoug Rabson #define SITE 302
199c19800e8SDoug Rabson #define sTAT 303
200c19800e8SDoug Rabson #define HELP 304
201c19800e8SDoug Rabson #define NOOP 305
202c19800e8SDoug Rabson #define MKD 306
203c19800e8SDoug Rabson #define RMD 307
204c19800e8SDoug Rabson #define PWD 308
205c19800e8SDoug Rabson #define CDUP 309
206c19800e8SDoug Rabson #define STOU 310
207c19800e8SDoug Rabson #define SMNT 311
208c19800e8SDoug Rabson #define SYST 312
209c19800e8SDoug Rabson #define SIZE 313
210c19800e8SDoug Rabson #define MDTM 314
211c19800e8SDoug Rabson #define EPRT 315
212c19800e8SDoug Rabson #define EPSV 316
213c19800e8SDoug Rabson #define UMASK 317
214c19800e8SDoug Rabson #define IDLE 318
215c19800e8SDoug Rabson #define CHMOD 319
216c19800e8SDoug Rabson #define AUTH 320
217c19800e8SDoug Rabson #define ADAT 321
218c19800e8SDoug Rabson #define PROT 322
219c19800e8SDoug Rabson #define PBSZ 323
220c19800e8SDoug Rabson #define CCC 324
221c19800e8SDoug Rabson #define MIC 325
222c19800e8SDoug Rabson #define CONF 326
223c19800e8SDoug Rabson #define ENC 327
224c19800e8SDoug Rabson #define KAUTH 328
225c19800e8SDoug Rabson #define KLIST 329
226c19800e8SDoug Rabson #define KDESTROY 330
227c19800e8SDoug Rabson #define KRBTKFILE 331
228c19800e8SDoug Rabson #define AFSLOG 332
229c19800e8SDoug Rabson #define LOCATE 333
230c19800e8SDoug Rabson #define URL 334
231c19800e8SDoug Rabson #define FEAT 335
232c19800e8SDoug Rabson #define OPTS 336
233c19800e8SDoug Rabson #define LEXERR 337
234c19800e8SDoug Rabson #define STRING 338
235c19800e8SDoug Rabson #define NUMBER 339
236c19800e8SDoug Rabson
237c19800e8SDoug Rabson
238c19800e8SDoug Rabson
239c19800e8SDoug Rabson
240c19800e8SDoug Rabson /* Copy the first part of user declarations. */
241c19800e8SDoug Rabson #line 43 "ftpcmd.y"
242c19800e8SDoug Rabson
243c19800e8SDoug Rabson
244c19800e8SDoug Rabson #include "ftpd_locl.h"
245*ae771770SStanislav Sedov RCSID("$Id$");
246c19800e8SDoug Rabson
247c19800e8SDoug Rabson off_t restart_point;
248c19800e8SDoug Rabson
249c19800e8SDoug Rabson static int hasyyerrored;
250c19800e8SDoug Rabson
251c19800e8SDoug Rabson
252c19800e8SDoug Rabson static int cmd_type;
253c19800e8SDoug Rabson static int cmd_form;
254c19800e8SDoug Rabson static int cmd_bytesz;
255c19800e8SDoug Rabson char cbuf[64*1024];
256c19800e8SDoug Rabson char *fromname;
257c19800e8SDoug Rabson
258c19800e8SDoug Rabson struct tab {
259c19800e8SDoug Rabson char *name;
260c19800e8SDoug Rabson short token;
261c19800e8SDoug Rabson short state;
262c19800e8SDoug Rabson short implemented; /* 1 if command is implemented */
263c19800e8SDoug Rabson char *help;
264c19800e8SDoug Rabson };
265c19800e8SDoug Rabson
266c19800e8SDoug Rabson extern struct tab cmdtab[];
267c19800e8SDoug Rabson extern struct tab sitetab[];
268c19800e8SDoug Rabson
269c19800e8SDoug Rabson static char *copy (char *);
270c19800e8SDoug Rabson static void help (struct tab *, char *);
271c19800e8SDoug Rabson static struct tab *
272c19800e8SDoug Rabson lookup (struct tab *, char *);
273c19800e8SDoug Rabson static void sizecmd (char *);
274c19800e8SDoug Rabson static RETSIGTYPE toolong (int);
275c19800e8SDoug Rabson static int yylex (void);
276c19800e8SDoug Rabson
277c19800e8SDoug Rabson /* This is for bison */
278c19800e8SDoug Rabson
279c19800e8SDoug Rabson #if !defined(alloca) && !defined(HAVE_ALLOCA)
280c19800e8SDoug Rabson #define alloca(x) malloc(x)
281c19800e8SDoug Rabson #endif
282c19800e8SDoug Rabson
283c19800e8SDoug Rabson
284c19800e8SDoug Rabson
285c19800e8SDoug Rabson /* Enabling traces. */
286c19800e8SDoug Rabson #ifndef YYDEBUG
287c19800e8SDoug Rabson # define YYDEBUG 0
288c19800e8SDoug Rabson #endif
289c19800e8SDoug Rabson
290c19800e8SDoug Rabson /* Enabling verbose error messages. */
291c19800e8SDoug Rabson #ifdef YYERROR_VERBOSE
292c19800e8SDoug Rabson # undef YYERROR_VERBOSE
293c19800e8SDoug Rabson # define YYERROR_VERBOSE 1
294c19800e8SDoug Rabson #else
295c19800e8SDoug Rabson # define YYERROR_VERBOSE 0
296c19800e8SDoug Rabson #endif
297c19800e8SDoug Rabson
298c19800e8SDoug Rabson /* Enabling the token table. */
299c19800e8SDoug Rabson #ifndef YYTOKEN_TABLE
300c19800e8SDoug Rabson # define YYTOKEN_TABLE 0
301c19800e8SDoug Rabson #endif
302c19800e8SDoug Rabson
303c19800e8SDoug Rabson #if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
304c19800e8SDoug Rabson typedef union YYSTYPE
305c19800e8SDoug Rabson #line 86 "ftpcmd.y"
306c19800e8SDoug Rabson {
307c19800e8SDoug Rabson int i;
308c19800e8SDoug Rabson char *s;
309c19800e8SDoug Rabson }
310c19800e8SDoug Rabson /* Line 193 of yacc.c. */
311c19800e8SDoug Rabson #line 312 "ftpcmd.c"
312c19800e8SDoug Rabson YYSTYPE;
313c19800e8SDoug Rabson # define yystype YYSTYPE /* obsolescent; will be withdrawn */
314c19800e8SDoug Rabson # define YYSTYPE_IS_DECLARED 1
315c19800e8SDoug Rabson # define YYSTYPE_IS_TRIVIAL 1
316c19800e8SDoug Rabson #endif
317c19800e8SDoug Rabson
318c19800e8SDoug Rabson
319c19800e8SDoug Rabson
320c19800e8SDoug Rabson /* Copy the second part of user declarations. */
321c19800e8SDoug Rabson
322c19800e8SDoug Rabson
323c19800e8SDoug Rabson /* Line 216 of yacc.c. */
324c19800e8SDoug Rabson #line 325 "ftpcmd.c"
325c19800e8SDoug Rabson
326c19800e8SDoug Rabson #ifdef short
327c19800e8SDoug Rabson # undef short
328c19800e8SDoug Rabson #endif
329c19800e8SDoug Rabson
330c19800e8SDoug Rabson #ifdef YYTYPE_UINT8
331c19800e8SDoug Rabson typedef YYTYPE_UINT8 yytype_uint8;
332c19800e8SDoug Rabson #else
333c19800e8SDoug Rabson typedef unsigned char yytype_uint8;
334c19800e8SDoug Rabson #endif
335c19800e8SDoug Rabson
336c19800e8SDoug Rabson #ifdef YYTYPE_INT8
337c19800e8SDoug Rabson typedef YYTYPE_INT8 yytype_int8;
338c19800e8SDoug Rabson #elif (defined __STDC__ || defined __C99__FUNC__ \
339c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
340c19800e8SDoug Rabson typedef signed char yytype_int8;
341c19800e8SDoug Rabson #else
342c19800e8SDoug Rabson typedef short int yytype_int8;
343c19800e8SDoug Rabson #endif
344c19800e8SDoug Rabson
345c19800e8SDoug Rabson #ifdef YYTYPE_UINT16
346c19800e8SDoug Rabson typedef YYTYPE_UINT16 yytype_uint16;
347c19800e8SDoug Rabson #else
348c19800e8SDoug Rabson typedef unsigned short int yytype_uint16;
349c19800e8SDoug Rabson #endif
350c19800e8SDoug Rabson
351c19800e8SDoug Rabson #ifdef YYTYPE_INT16
352c19800e8SDoug Rabson typedef YYTYPE_INT16 yytype_int16;
353c19800e8SDoug Rabson #else
354c19800e8SDoug Rabson typedef short int yytype_int16;
355c19800e8SDoug Rabson #endif
356c19800e8SDoug Rabson
357c19800e8SDoug Rabson #ifndef YYSIZE_T
358c19800e8SDoug Rabson # ifdef __SIZE_TYPE__
359c19800e8SDoug Rabson # define YYSIZE_T __SIZE_TYPE__
360c19800e8SDoug Rabson # elif defined size_t
361c19800e8SDoug Rabson # define YYSIZE_T size_t
362c19800e8SDoug Rabson # elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
363c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
364c19800e8SDoug Rabson # include <stddef.h> /* INFRINGES ON USER NAME SPACE */
365c19800e8SDoug Rabson # define YYSIZE_T size_t
366c19800e8SDoug Rabson # else
367c19800e8SDoug Rabson # define YYSIZE_T unsigned int
368c19800e8SDoug Rabson # endif
369c19800e8SDoug Rabson #endif
370c19800e8SDoug Rabson
371c19800e8SDoug Rabson #define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
372c19800e8SDoug Rabson
373c19800e8SDoug Rabson #ifndef YY_
374c19800e8SDoug Rabson # if defined YYENABLE_NLS && YYENABLE_NLS
375c19800e8SDoug Rabson # if ENABLE_NLS
376c19800e8SDoug Rabson # include <libintl.h> /* INFRINGES ON USER NAME SPACE */
377c19800e8SDoug Rabson # define YY_(msgid) dgettext ("bison-runtime", msgid)
378c19800e8SDoug Rabson # endif
379c19800e8SDoug Rabson # endif
380c19800e8SDoug Rabson # ifndef YY_
381c19800e8SDoug Rabson # define YY_(msgid) msgid
382c19800e8SDoug Rabson # endif
383c19800e8SDoug Rabson #endif
384c19800e8SDoug Rabson
385c19800e8SDoug Rabson /* Suppress unused-variable warnings by "using" E. */
386c19800e8SDoug Rabson #if ! defined lint || defined __GNUC__
387c19800e8SDoug Rabson # define YYUSE(e) ((void) (e))
388c19800e8SDoug Rabson #else
389c19800e8SDoug Rabson # define YYUSE(e) /* empty */
390c19800e8SDoug Rabson #endif
391c19800e8SDoug Rabson
392c19800e8SDoug Rabson /* Identity function, used to suppress warnings about constant conditions. */
393c19800e8SDoug Rabson #ifndef lint
394c19800e8SDoug Rabson # define YYID(n) (n)
395c19800e8SDoug Rabson #else
396c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
397c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
398c19800e8SDoug Rabson static int
399c19800e8SDoug Rabson YYID (int i)
400c19800e8SDoug Rabson #else
401c19800e8SDoug Rabson static int
402c19800e8SDoug Rabson YYID (i)
403c19800e8SDoug Rabson int i;
404c19800e8SDoug Rabson #endif
405c19800e8SDoug Rabson {
406c19800e8SDoug Rabson return i;
407c19800e8SDoug Rabson }
408c19800e8SDoug Rabson #endif
409c19800e8SDoug Rabson
410c19800e8SDoug Rabson #if ! defined yyoverflow || YYERROR_VERBOSE
411c19800e8SDoug Rabson
412c19800e8SDoug Rabson /* The parser invokes alloca or malloc; define the necessary symbols. */
413c19800e8SDoug Rabson
414c19800e8SDoug Rabson # ifdef YYSTACK_USE_ALLOCA
415c19800e8SDoug Rabson # if YYSTACK_USE_ALLOCA
416c19800e8SDoug Rabson # ifdef __GNUC__
417c19800e8SDoug Rabson # define YYSTACK_ALLOC __builtin_alloca
418c19800e8SDoug Rabson # elif defined __BUILTIN_VA_ARG_INCR
419c19800e8SDoug Rabson # include <alloca.h> /* INFRINGES ON USER NAME SPACE */
420c19800e8SDoug Rabson # elif defined _AIX
421c19800e8SDoug Rabson # define YYSTACK_ALLOC __alloca
422c19800e8SDoug Rabson # elif defined _MSC_VER
423c19800e8SDoug Rabson # include <malloc.h> /* INFRINGES ON USER NAME SPACE */
424c19800e8SDoug Rabson # define alloca _alloca
425c19800e8SDoug Rabson # else
426c19800e8SDoug Rabson # define YYSTACK_ALLOC alloca
427c19800e8SDoug Rabson # if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
428c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
429c19800e8SDoug Rabson # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
430c19800e8SDoug Rabson # ifndef _STDLIB_H
431c19800e8SDoug Rabson # define _STDLIB_H 1
432c19800e8SDoug Rabson # endif
433c19800e8SDoug Rabson # endif
434c19800e8SDoug Rabson # endif
435c19800e8SDoug Rabson # endif
436c19800e8SDoug Rabson # endif
437c19800e8SDoug Rabson
438c19800e8SDoug Rabson # ifdef YYSTACK_ALLOC
439c19800e8SDoug Rabson /* Pacify GCC's `empty if-body' warning. */
440c19800e8SDoug Rabson # define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
441c19800e8SDoug Rabson # ifndef YYSTACK_ALLOC_MAXIMUM
442c19800e8SDoug Rabson /* The OS might guarantee only one guard page at the bottom of the stack,
443c19800e8SDoug Rabson and a page size can be as small as 4096 bytes. So we cannot safely
444c19800e8SDoug Rabson invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
445c19800e8SDoug Rabson to allow for a few compiler-allocated temporary stack slots. */
446c19800e8SDoug Rabson # define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
447c19800e8SDoug Rabson # endif
448c19800e8SDoug Rabson # else
449c19800e8SDoug Rabson # define YYSTACK_ALLOC YYMALLOC
450c19800e8SDoug Rabson # define YYSTACK_FREE YYFREE
451c19800e8SDoug Rabson # ifndef YYSTACK_ALLOC_MAXIMUM
452c19800e8SDoug Rabson # define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
453c19800e8SDoug Rabson # endif
454c19800e8SDoug Rabson # if (defined __cplusplus && ! defined _STDLIB_H \
455c19800e8SDoug Rabson && ! ((defined YYMALLOC || defined malloc) \
456c19800e8SDoug Rabson && (defined YYFREE || defined free)))
457c19800e8SDoug Rabson # include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
458c19800e8SDoug Rabson # ifndef _STDLIB_H
459c19800e8SDoug Rabson # define _STDLIB_H 1
460c19800e8SDoug Rabson # endif
461c19800e8SDoug Rabson # endif
462c19800e8SDoug Rabson # ifndef YYMALLOC
463c19800e8SDoug Rabson # define YYMALLOC malloc
464c19800e8SDoug Rabson # if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
465c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
466c19800e8SDoug Rabson void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
467c19800e8SDoug Rabson # endif
468c19800e8SDoug Rabson # endif
469c19800e8SDoug Rabson # ifndef YYFREE
470c19800e8SDoug Rabson # define YYFREE free
471c19800e8SDoug Rabson # if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
472c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
473c19800e8SDoug Rabson void free (void *); /* INFRINGES ON USER NAME SPACE */
474c19800e8SDoug Rabson # endif
475c19800e8SDoug Rabson # endif
476c19800e8SDoug Rabson # endif
477c19800e8SDoug Rabson #endif /* ! defined yyoverflow || YYERROR_VERBOSE */
478c19800e8SDoug Rabson
479c19800e8SDoug Rabson
480c19800e8SDoug Rabson #if (! defined yyoverflow \
481c19800e8SDoug Rabson && (! defined __cplusplus \
482c19800e8SDoug Rabson || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
483c19800e8SDoug Rabson
484c19800e8SDoug Rabson /* A type that is properly aligned for any stack member. */
485c19800e8SDoug Rabson union yyalloc
486c19800e8SDoug Rabson {
487c19800e8SDoug Rabson yytype_int16 yyss;
488c19800e8SDoug Rabson YYSTYPE yyvs;
489c19800e8SDoug Rabson };
490c19800e8SDoug Rabson
491c19800e8SDoug Rabson /* The size of the maximum gap between one aligned stack and the next. */
492c19800e8SDoug Rabson # define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
493c19800e8SDoug Rabson
494c19800e8SDoug Rabson /* The size of an array large to enough to hold all stacks, each with
495c19800e8SDoug Rabson N elements. */
496c19800e8SDoug Rabson # define YYSTACK_BYTES(N) \
497c19800e8SDoug Rabson ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
498c19800e8SDoug Rabson + YYSTACK_GAP_MAXIMUM)
499c19800e8SDoug Rabson
500c19800e8SDoug Rabson /* Copy COUNT objects from FROM to TO. The source and destination do
501c19800e8SDoug Rabson not overlap. */
502c19800e8SDoug Rabson # ifndef YYCOPY
503c19800e8SDoug Rabson # if defined __GNUC__ && 1 < __GNUC__
504c19800e8SDoug Rabson # define YYCOPY(To, From, Count) \
505c19800e8SDoug Rabson __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
506c19800e8SDoug Rabson # else
507c19800e8SDoug Rabson # define YYCOPY(To, From, Count) \
508c19800e8SDoug Rabson do \
509c19800e8SDoug Rabson { \
510c19800e8SDoug Rabson YYSIZE_T yyi; \
511c19800e8SDoug Rabson for (yyi = 0; yyi < (Count); yyi++) \
512c19800e8SDoug Rabson (To)[yyi] = (From)[yyi]; \
513c19800e8SDoug Rabson } \
514c19800e8SDoug Rabson while (YYID (0))
515c19800e8SDoug Rabson # endif
516c19800e8SDoug Rabson # endif
517c19800e8SDoug Rabson
518c19800e8SDoug Rabson /* Relocate STACK from its old location to the new one. The
519c19800e8SDoug Rabson local variables YYSIZE and YYSTACKSIZE give the old and new number of
520c19800e8SDoug Rabson elements in the stack, and YYPTR gives the new location of the
521c19800e8SDoug Rabson stack. Advance YYPTR to a properly aligned location for the next
522c19800e8SDoug Rabson stack. */
523c19800e8SDoug Rabson # define YYSTACK_RELOCATE(Stack) \
524c19800e8SDoug Rabson do \
525c19800e8SDoug Rabson { \
526c19800e8SDoug Rabson YYSIZE_T yynewbytes; \
527c19800e8SDoug Rabson YYCOPY (&yyptr->Stack, Stack, yysize); \
528c19800e8SDoug Rabson Stack = &yyptr->Stack; \
529c19800e8SDoug Rabson yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
530c19800e8SDoug Rabson yyptr += yynewbytes / sizeof (*yyptr); \
531c19800e8SDoug Rabson } \
532c19800e8SDoug Rabson while (YYID (0))
533c19800e8SDoug Rabson
534c19800e8SDoug Rabson #endif
535c19800e8SDoug Rabson
536c19800e8SDoug Rabson /* YYFINAL -- State number of the termination state. */
537c19800e8SDoug Rabson #define YYFINAL 2
538c19800e8SDoug Rabson /* YYLAST -- Last index in YYTABLE. */
539c19800e8SDoug Rabson #define YYLAST 327
540c19800e8SDoug Rabson
541c19800e8SDoug Rabson /* YYNTOKENS -- Number of terminals. */
542c19800e8SDoug Rabson #define YYNTOKENS 85
543c19800e8SDoug Rabson /* YYNNTS -- Number of nonterminals. */
544c19800e8SDoug Rabson #define YYNNTS 18
545c19800e8SDoug Rabson /* YYNRULES -- Number of rules. */
546c19800e8SDoug Rabson #define YYNRULES 98
547c19800e8SDoug Rabson /* YYNRULES -- Number of states. */
548c19800e8SDoug Rabson #define YYNSTATES 317
549c19800e8SDoug Rabson
550c19800e8SDoug Rabson /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
551c19800e8SDoug Rabson #define YYUNDEFTOK 2
552c19800e8SDoug Rabson #define YYMAXUTOK 339
553c19800e8SDoug Rabson
554c19800e8SDoug Rabson #define YYTRANSLATE(YYX) \
555c19800e8SDoug Rabson ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
556c19800e8SDoug Rabson
557c19800e8SDoug Rabson /* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */
558c19800e8SDoug Rabson static const yytype_uint8 yytranslate[] =
559c19800e8SDoug Rabson {
560c19800e8SDoug Rabson 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
561c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
562c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
563c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
564c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
565c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
566c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
567c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
568c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
569c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
570c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
571c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
572c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
573c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
574c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
575c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
576c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
577c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
578c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
579c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
580c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
581c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
582c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
583c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
584c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
585c19800e8SDoug Rabson 2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
586c19800e8SDoug Rabson 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
587c19800e8SDoug Rabson 15, 16, 17, 18, 19, 20, 21, 22, 23, 24,
588c19800e8SDoug Rabson 25, 26, 27, 28, 29, 30, 31, 32, 33, 34,
589c19800e8SDoug Rabson 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
590c19800e8SDoug Rabson 45, 46, 47, 48, 49, 50, 51, 52, 53, 54,
591c19800e8SDoug Rabson 55, 56, 57, 58, 59, 60, 61, 62, 63, 64,
592c19800e8SDoug Rabson 65, 66, 67, 68, 69, 70, 71, 72, 73, 74,
593c19800e8SDoug Rabson 75, 76, 77, 78, 79, 80, 81, 82, 83, 84
594c19800e8SDoug Rabson };
595c19800e8SDoug Rabson
596c19800e8SDoug Rabson #if YYDEBUG
597c19800e8SDoug Rabson /* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
598c19800e8SDoug Rabson YYRHS. */
599c19800e8SDoug Rabson static const yytype_uint16 yyprhs[] =
600c19800e8SDoug Rabson {
601c19800e8SDoug Rabson 0, 0, 3, 4, 7, 10, 16, 22, 28, 34,
602c19800e8SDoug Rabson 38, 42, 48, 54, 60, 66, 72, 82, 88, 94,
603c19800e8SDoug Rabson 100, 104, 110, 114, 120, 126, 130, 136, 142, 146,
604c19800e8SDoug Rabson 150, 156, 160, 166, 170, 176, 182, 186, 190, 194,
605c19800e8SDoug Rabson 200, 206, 214, 220, 228, 238, 244, 252, 260, 266,
606c19800e8SDoug Rabson 272, 280, 286, 294, 302, 308, 314, 318, 324, 330,
607c19800e8SDoug Rabson 334, 337, 343, 349, 354, 359, 365, 371, 375, 380,
608c19800e8SDoug Rabson 385, 390, 392, 393, 395, 397, 409, 411, 413, 415,
609c19800e8SDoug Rabson 417, 421, 423, 427, 429, 431, 435, 438, 440, 442,
610c19800e8SDoug Rabson 444, 446, 448, 450, 452, 454, 456, 458, 460
611c19800e8SDoug Rabson };
612c19800e8SDoug Rabson
613c19800e8SDoug Rabson /* YYRHS -- A `-1'-separated list of the rules' RHS. */
614c19800e8SDoug Rabson static const yytype_int8 yyrhs[] =
615c19800e8SDoug Rabson {
616c19800e8SDoug Rabson 86, 0, -1, -1, 86, 87, -1, 86, 88, -1,
617c19800e8SDoug Rabson 18, 15, 89, 16, 102, -1, 19, 15, 90, 16,
618c19800e8SDoug Rabson 102, -1, 23, 15, 92, 16, 102, -1, 60, 15,
619c19800e8SDoug Rabson 83, 16, 102, -1, 24, 16, 101, -1, 61, 16,
620c19800e8SDoug Rabson 101, -1, 61, 15, 83, 16, 101, -1, 25, 15,
621c19800e8SDoug Rabson 94, 16, 102, -1, 26, 15, 95, 16, 102, -1,
622c19800e8SDoug Rabson 27, 15, 96, 16, 102, -1, 38, 15, 84, 16,
623c19800e8SDoug Rabson 102, -1, 38, 15, 84, 15, 12, 15, 84, 16,
624c19800e8SDoug Rabson 102, -1, 28, 15, 97, 16, 101, -1, 29, 15,
625c19800e8SDoug Rabson 97, 16, 101, -1, 30, 15, 97, 16, 101, -1,
626c19800e8SDoug Rabson 46, 16, 101, -1, 46, 15, 83, 16, 101, -1,
627c19800e8SDoug Rabson 45, 16, 101, -1, 45, 15, 97, 16, 101, -1,
628c19800e8SDoug Rabson 48, 15, 97, 16, 101, -1, 48, 16, 102, -1,
629c19800e8SDoug Rabson 43, 15, 97, 16, 100, -1, 41, 15, 97, 16,
630c19800e8SDoug Rabson 100, -1, 42, 16, 102, -1, 44, 16, 101, -1,
631c19800e8SDoug Rabson 44, 15, 97, 16, 101, -1, 49, 16, 102, -1,
632c19800e8SDoug Rabson 49, 15, 83, 16, 102, -1, 50, 16, 102, -1,
633c19800e8SDoug Rabson 51, 15, 97, 16, 101, -1, 52, 15, 97, 16,
634c19800e8SDoug Rabson 100, -1, 53, 16, 101, -1, 54, 16, 101, -1,
635c19800e8SDoug Rabson 80, 16, 102, -1, 81, 15, 83, 16, 102, -1,
636c19800e8SDoug Rabson 47, 15, 49, 16, 102, -1, 47, 15, 49, 15,
637c19800e8SDoug Rabson 83, 16, 102, -1, 47, 15, 62, 16, 101, -1,
638c19800e8SDoug Rabson 47, 15, 62, 15, 99, 16, 100, -1, 47, 15,
639c19800e8SDoug Rabson 64, 15, 99, 15, 97, 16, 100, -1, 47, 15,
640c19800e8SDoug Rabson 63, 16, 102, -1, 47, 15, 63, 15, 84, 16,
641c19800e8SDoug Rabson 102, -1, 47, 15, 73, 15, 83, 16, 101, -1,
642c19800e8SDoug Rabson 47, 15, 74, 16, 101, -1, 47, 15, 75, 16,
643c19800e8SDoug Rabson 101, -1, 47, 15, 76, 15, 83, 16, 101, -1,
644c19800e8SDoug Rabson 47, 15, 77, 16, 101, -1, 47, 15, 77, 15,
645c19800e8SDoug Rabson 83, 16, 101, -1, 47, 15, 78, 15, 83, 16,
646c19800e8SDoug Rabson 101, -1, 47, 15, 79, 16, 102, -1, 55, 15,
647c19800e8SDoug Rabson 97, 16, 101, -1, 57, 16, 102, -1, 58, 15,
648c19800e8SDoug Rabson 97, 16, 101, -1, 59, 15, 97, 16, 101, -1,
649c19800e8SDoug Rabson 22, 16, 102, -1, 1, 16, -1, 40, 15, 97,
650c19800e8SDoug Rabson 16, 100, -1, 39, 15, 91, 16, 102, -1, 65,
651c19800e8SDoug Rabson 15, 83, 16, -1, 66, 15, 83, 16, -1, 68,
652c19800e8SDoug Rabson 15, 84, 16, 102, -1, 67, 15, 83, 16, 102,
653c19800e8SDoug Rabson -1, 69, 16, 102, -1, 70, 15, 83, 16, -1,
654c19800e8SDoug Rabson 71, 15, 83, 16, -1, 72, 15, 83, 16, -1,
655c19800e8SDoug Rabson 83, -1, -1, 83, -1, 84, -1, 84, 17, 84,
656c19800e8SDoug Rabson 17, 84, 17, 84, 17, 84, 17, 84, -1, 10,
657c19800e8SDoug Rabson -1, 14, -1, 5, -1, 3, -1, 3, 15, 93,
658c19800e8SDoug Rabson -1, 6, -1, 6, 15, 93, -1, 8, -1, 9,
659c19800e8SDoug Rabson -1, 9, 15, 91, -1, 9, 91, -1, 7, -1,
660c19800e8SDoug Rabson 12, -1, 11, -1, 13, -1, 4, -1, 5, -1,
661c19800e8SDoug Rabson 98, -1, 83, -1, 84, -1, 101, -1, 102, -1,
662c19800e8SDoug Rabson -1
663c19800e8SDoug Rabson };
664c19800e8SDoug Rabson
665c19800e8SDoug Rabson /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
666c19800e8SDoug Rabson static const yytype_uint16 yyrline[] =
667c19800e8SDoug Rabson {
668*ae771770SStanislav Sedov 0, 129, 129, 131, 136, 140, 146, 154, 175, 181,
669*ae771770SStanislav Sedov 186, 191, 197, 234, 248, 262, 268, 274, 283, 292,
670*ae771770SStanislav Sedov 301, 306, 315, 320, 326, 333, 338, 345, 359, 364,
671*ae771770SStanislav Sedov 373, 380, 385, 402, 407, 414, 421, 426, 431, 441,
672*ae771770SStanislav Sedov 448, 453, 458, 466, 479, 493, 500, 517, 521, 526,
673*ae771770SStanislav Sedov 530, 534, 545, 558, 565, 570, 577, 595, 612, 640,
674*ae771770SStanislav Sedov 647, 653, 663, 673, 678, 683, 688, 693, 698, 703,
675*ae771770SStanislav Sedov 708, 716, 721, 724, 728, 732, 745, 749, 753, 760,
676*ae771770SStanislav Sedov 765, 770, 775, 780, 784, 789, 795, 803, 807, 811,
677*ae771770SStanislav Sedov 818, 822, 826, 833, 861, 865, 891, 899, 910
678c19800e8SDoug Rabson };
679c19800e8SDoug Rabson #endif
680c19800e8SDoug Rabson
681c19800e8SDoug Rabson #if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
682c19800e8SDoug Rabson /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
683c19800e8SDoug Rabson First, the terminals, then, starting at YYNTOKENS, nonterminals. */
684c19800e8SDoug Rabson static const char *const yytname[] =
685c19800e8SDoug Rabson {
686c19800e8SDoug Rabson "$end", "error", "$undefined", "A", "B", "C", "E", "F", "I", "L", "N",
687c19800e8SDoug Rabson "P", "R", "S", "T", "SP", "CRLF", "COMMA", "USER", "PASS", "ACCT",
688c19800e8SDoug Rabson "REIN", "QUIT", "PORT", "PASV", "TYPE", "STRU", "MODE", "RETR", "STOR",
689c19800e8SDoug Rabson "APPE", "MLFL", "MAIL", "MSND", "MSOM", "MSAM", "MRSQ", "MRCP", "ALLO",
690c19800e8SDoug Rabson "REST", "RNFR", "RNTO", "ABOR", "DELE", "CWD", "LIST", "NLST", "SITE",
691c19800e8SDoug Rabson "sTAT", "HELP", "NOOP", "MKD", "RMD", "PWD", "CDUP", "STOU", "SMNT",
692c19800e8SDoug Rabson "SYST", "SIZE", "MDTM", "EPRT", "EPSV", "UMASK", "IDLE", "CHMOD", "AUTH",
693c19800e8SDoug Rabson "ADAT", "PROT", "PBSZ", "CCC", "MIC", "CONF", "ENC", "KAUTH", "KLIST",
694c19800e8SDoug Rabson "KDESTROY", "KRBTKFILE", "AFSLOG", "LOCATE", "URL", "FEAT", "OPTS",
695c19800e8SDoug Rabson "LEXERR", "STRING", "NUMBER", "$accept", "cmd_list", "cmd", "rcmd",
696c19800e8SDoug Rabson "username", "password", "byte_size", "host_port", "form_code",
697c19800e8SDoug Rabson "type_code", "struct_code", "mode_code", "pathname", "pathstring",
698c19800e8SDoug Rabson "octal_number", "check_login_no_guest", "check_login", "check_secure", 0
699c19800e8SDoug Rabson };
700c19800e8SDoug Rabson #endif
701c19800e8SDoug Rabson
702c19800e8SDoug Rabson # ifdef YYPRINT
703c19800e8SDoug Rabson /* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
704c19800e8SDoug Rabson token YYLEX-NUM. */
705c19800e8SDoug Rabson static const yytype_uint16 yytoknum[] =
706c19800e8SDoug Rabson {
707c19800e8SDoug Rabson 0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
708c19800e8SDoug Rabson 265, 266, 267, 268, 269, 270, 271, 272, 273, 274,
709c19800e8SDoug Rabson 275, 276, 277, 278, 279, 280, 281, 282, 283, 284,
710c19800e8SDoug Rabson 285, 286, 287, 288, 289, 290, 291, 292, 293, 294,
711c19800e8SDoug Rabson 295, 296, 297, 298, 299, 300, 301, 302, 303, 304,
712c19800e8SDoug Rabson 305, 306, 307, 308, 309, 310, 311, 312, 313, 314,
713c19800e8SDoug Rabson 315, 316, 317, 318, 319, 320, 321, 322, 323, 324,
714c19800e8SDoug Rabson 325, 326, 327, 328, 329, 330, 331, 332, 333, 334,
715c19800e8SDoug Rabson 335, 336, 337, 338, 339
716c19800e8SDoug Rabson };
717c19800e8SDoug Rabson # endif
718c19800e8SDoug Rabson
719c19800e8SDoug Rabson /* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
720c19800e8SDoug Rabson static const yytype_uint8 yyr1[] =
721c19800e8SDoug Rabson {
722c19800e8SDoug Rabson 0, 85, 86, 86, 86, 87, 87, 87, 87, 87,
723c19800e8SDoug Rabson 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
724c19800e8SDoug Rabson 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
725c19800e8SDoug Rabson 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
726c19800e8SDoug Rabson 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
727c19800e8SDoug Rabson 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
728c19800e8SDoug Rabson 87, 88, 88, 88, 88, 88, 88, 88, 88, 88,
729c19800e8SDoug Rabson 88, 89, 90, 90, 91, 92, 93, 93, 93, 94,
730c19800e8SDoug Rabson 94, 94, 94, 94, 94, 94, 94, 95, 95, 95,
731c19800e8SDoug Rabson 96, 96, 96, 97, 98, 99, 100, 101, 102
732c19800e8SDoug Rabson };
733c19800e8SDoug Rabson
734c19800e8SDoug Rabson /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
735c19800e8SDoug Rabson static const yytype_uint8 yyr2[] =
736c19800e8SDoug Rabson {
737c19800e8SDoug Rabson 0, 2, 0, 2, 2, 5, 5, 5, 5, 3,
738c19800e8SDoug Rabson 3, 5, 5, 5, 5, 5, 9, 5, 5, 5,
739c19800e8SDoug Rabson 3, 5, 3, 5, 5, 3, 5, 5, 3, 3,
740c19800e8SDoug Rabson 5, 3, 5, 3, 5, 5, 3, 3, 3, 5,
741c19800e8SDoug Rabson 5, 7, 5, 7, 9, 5, 7, 7, 5, 5,
742c19800e8SDoug Rabson 7, 5, 7, 7, 5, 5, 3, 5, 5, 3,
743c19800e8SDoug Rabson 2, 5, 5, 4, 4, 5, 5, 3, 4, 4,
744c19800e8SDoug Rabson 4, 1, 0, 1, 1, 11, 1, 1, 1, 1,
745c19800e8SDoug Rabson 3, 1, 3, 1, 1, 3, 2, 1, 1, 1,
746c19800e8SDoug Rabson 1, 1, 1, 1, 1, 1, 1, 1, 0
747c19800e8SDoug Rabson };
748c19800e8SDoug Rabson
749c19800e8SDoug Rabson /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
750c19800e8SDoug Rabson STATE-NUM when YYTABLE doesn't specify something else to do. Zero
751c19800e8SDoug Rabson means the default is an error. */
752c19800e8SDoug Rabson static const yytype_uint8 yydefact[] =
753c19800e8SDoug Rabson {
754c19800e8SDoug Rabson 2, 0, 1, 0, 0, 0, 0, 0, 0, 0,
755c19800e8SDoug Rabson 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
756c19800e8SDoug Rabson 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
757c19800e8SDoug Rabson 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
758c19800e8SDoug Rabson 0, 0, 0, 0, 0, 0, 0, 0, 3, 4,
759c19800e8SDoug Rabson 60, 0, 72, 98, 0, 98, 0, 0, 0, 0,
760c19800e8SDoug Rabson 0, 0, 0, 0, 0, 0, 98, 0, 0, 98,
761c19800e8SDoug Rabson 0, 98, 0, 98, 0, 0, 98, 0, 98, 98,
762c19800e8SDoug Rabson 0, 0, 98, 98, 0, 98, 0, 0, 0, 0,
763c19800e8SDoug Rabson 98, 0, 0, 0, 0, 98, 0, 0, 0, 98,
764c19800e8SDoug Rabson 0, 71, 0, 73, 0, 59, 0, 0, 9, 97,
765c19800e8SDoug Rabson 79, 81, 83, 84, 0, 87, 89, 88, 0, 91,
766c19800e8SDoug Rabson 92, 90, 0, 94, 0, 93, 0, 0, 0, 74,
767c19800e8SDoug Rabson 0, 0, 0, 28, 0, 0, 29, 0, 22, 0,
768c19800e8SDoug Rabson 20, 0, 0, 0, 0, 0, 0, 0, 0, 0,
769c19800e8SDoug Rabson 0, 0, 0, 25, 0, 31, 33, 0, 0, 36,
770c19800e8SDoug Rabson 37, 0, 56, 0, 0, 0, 0, 10, 0, 0,
771c19800e8SDoug Rabson 0, 0, 67, 0, 0, 0, 38, 0, 98, 98,
772c19800e8SDoug Rabson 0, 98, 0, 0, 0, 86, 98, 98, 98, 98,
773c19800e8SDoug Rabson 98, 98, 0, 98, 98, 98, 98, 98, 98, 98,
774c19800e8SDoug Rabson 98, 0, 98, 0, 98, 0, 98, 0, 0, 98,
775c19800e8SDoug Rabson 98, 0, 0, 98, 0, 98, 98, 98, 98, 98,
776c19800e8SDoug Rabson 98, 98, 98, 98, 98, 63, 64, 98, 98, 68,
777c19800e8SDoug Rabson 69, 70, 98, 5, 6, 0, 7, 78, 76, 77,
778c19800e8SDoug Rabson 80, 82, 85, 12, 13, 14, 17, 18, 19, 0,
779c19800e8SDoug Rabson 15, 62, 61, 96, 27, 26, 30, 23, 21, 0,
780c19800e8SDoug Rabson 40, 95, 0, 42, 0, 45, 0, 0, 48, 49,
781c19800e8SDoug Rabson 0, 0, 51, 0, 54, 24, 32, 34, 35, 55,
782c19800e8SDoug Rabson 57, 58, 8, 11, 66, 65, 39, 0, 0, 98,
783c19800e8SDoug Rabson 98, 98, 0, 98, 98, 98, 98, 0, 0, 41,
784c19800e8SDoug Rabson 43, 46, 0, 47, 50, 52, 53, 0, 98, 98,
785c19800e8SDoug Rabson 0, 16, 44, 0, 0, 0, 75
786c19800e8SDoug Rabson };
787c19800e8SDoug Rabson
788c19800e8SDoug Rabson /* YYDEFGOTO[NTERM-NUM]. */
789c19800e8SDoug Rabson static const yytype_int16 yydefgoto[] =
790c19800e8SDoug Rabson {
791c19800e8SDoug Rabson -1, 1, 48, 49, 102, 104, 130, 107, 240, 114,
792c19800e8SDoug Rabson 118, 122, 124, 125, 262, 252, 253, 109
793c19800e8SDoug Rabson };
794c19800e8SDoug Rabson
795c19800e8SDoug Rabson /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
796c19800e8SDoug Rabson STATE-NUM. */
797c19800e8SDoug Rabson #define YYPACT_NINF -196
798c19800e8SDoug Rabson static const yytype_int16 yypact[] =
799c19800e8SDoug Rabson {
800c19800e8SDoug Rabson -196, 246, -196, 3, 13, 20, 11, 24, 21, 26,
801c19800e8SDoug Rabson 30, 45, 66, 67, 68, 69, 70, 71, 72, 76,
802c19800e8SDoug Rabson 73, -7, -5, 15, 78, 28, 32, 80, 79, 82,
803c19800e8SDoug Rabson 83, 91, 93, 94, 96, 97, 98, 38, 100, 101,
804c19800e8SDoug Rabson 102, 103, 104, 106, 107, 108, 111, 109, -196, -196,
805c19800e8SDoug Rabson -196, -66, 36, -196, 14, -196, 12, 22, 1, 46,
806c19800e8SDoug Rabson 46, 46, 25, 48, 46, 46, -196, 46, 46, -196,
807c19800e8SDoug Rabson 46, -196, 53, -196, 27, 46, -196, 55, -196, -196,
808c19800e8SDoug Rabson 46, 46, -196, -196, 46, -196, 46, 46, 56, 59,
809c19800e8SDoug Rabson -196, 60, 61, 62, 63, -196, 65, 77, 85, -196,
810c19800e8SDoug Rabson 86, -196, 114, -196, 115, -196, 120, 130, -196, -196,
811c19800e8SDoug Rabson 135, 136, -196, -11, 138, -196, -196, -196, 139, -196,
812c19800e8SDoug Rabson -196, -196, 143, -196, 145, -196, 147, 156, 47, -196,
813c19800e8SDoug Rabson 157, 162, 165, -196, 166, 168, -196, 170, -196, 174,
814c19800e8SDoug Rabson -196, 49, 52, 54, 137, 177, 178, 179, 181, 64,
815c19800e8SDoug Rabson 182, 183, 184, -196, 185, -196, -196, 186, 187, -196,
816c19800e8SDoug Rabson -196, 188, -196, 189, 190, 191, 192, -196, 193, 194,
817c19800e8SDoug Rabson 195, 196, -196, 197, 198, 199, -196, 200, -196, -196,
818c19800e8SDoug Rabson 133, -196, 2, 2, 48, -196, -196, -196, -196, -196,
819c19800e8SDoug Rabson -196, -196, 206, -196, -196, -196, -196, -196, -196, -196,
820c19800e8SDoug Rabson -196, 110, -196, 140, -196, 141, -196, 140, 144, -196,
821c19800e8SDoug Rabson -196, 146, 148, -196, 149, -196, -196, -196, -196, -196,
822c19800e8SDoug Rabson -196, -196, -196, -196, -196, -196, -196, -196, -196, -196,
823c19800e8SDoug Rabson -196, -196, -196, -196, -196, 202, -196, -196, -196, -196,
824c19800e8SDoug Rabson -196, -196, -196, -196, -196, -196, -196, -196, -196, 205,
825c19800e8SDoug Rabson -196, -196, -196, -196, -196, -196, -196, -196, -196, 207,
826c19800e8SDoug Rabson -196, -196, 210, -196, 212, -196, 215, 217, -196, -196,
827c19800e8SDoug Rabson 218, 219, -196, 221, -196, -196, -196, -196, -196, -196,
828c19800e8SDoug Rabson -196, -196, -196, -196, -196, -196, -196, 155, 158, -196,
829c19800e8SDoug Rabson -196, -196, 46, -196, -196, -196, -196, 204, 224, -196,
830c19800e8SDoug Rabson -196, -196, 225, -196, -196, -196, -196, 159, -196, -196,
831c19800e8SDoug Rabson 227, -196, -196, 161, 231, 167, -196
832c19800e8SDoug Rabson };
833c19800e8SDoug Rabson
834c19800e8SDoug Rabson /* YYPGOTO[NTERM-NUM]. */
835c19800e8SDoug Rabson static const yytype_int16 yypgoto[] =
836c19800e8SDoug Rabson {
837c19800e8SDoug Rabson -196, -196, -196, -196, -196, -196, -110, -196, 39, -196,
838c19800e8SDoug Rabson -196, -196, -9, -196, 42, -195, -33, -53
839c19800e8SDoug Rabson };
840c19800e8SDoug Rabson
841c19800e8SDoug Rabson /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If
842c19800e8SDoug Rabson positive, shift that token. If negative, reduce the rule which
843c19800e8SDoug Rabson number is the opposite. If zero, do what YYDEFACT says.
844c19800e8SDoug Rabson If YYTABLE_NINF, syntax error. */
845c19800e8SDoug Rabson #define YYTABLE_NINF -1
846c19800e8SDoug Rabson static const yytype_uint16 yytable[] =
847c19800e8SDoug Rabson {
848c19800e8SDoug Rabson 105, 254, 255, 185, 184, 119, 120, 237, 68, 69,
849c19800e8SDoug Rabson 70, 71, 238, 133, 121, 110, 239, 101, 111, 50,
850c19800e8SDoug Rabson 112, 113, 108, 153, 278, 155, 156, 53, 51, 115,
851c19800e8SDoug Rabson 72, 73, 162, 116, 117, 52, 136, 55, 138, 54,
852c19800e8SDoug Rabson 140, 56, 172, 75, 76, 57, 176, 77, 78, 159,
853c19800e8SDoug Rabson 160, 126, 127, 89, 90, 131, 132, 167, 134, 135,
854c19800e8SDoug Rabson 58, 137, 192, 193, 201, 202, 152, 203, 204, 205,
855c19800e8SDoug Rabson 206, 157, 158, 129, 242, 161, 141, 163, 164, 212,
856c19800e8SDoug Rabson 213, 59, 60, 61, 62, 63, 64, 65, 67, 142,
857c19800e8SDoug Rabson 143, 144, 66, 74, 80, 300, 79, 81, 106, 82,
858c19800e8SDoug Rabson 145, 146, 147, 148, 149, 150, 151, 83, 84, 128,
859c19800e8SDoug Rabson 85, 86, 87, 88, 312, 91, 92, 93, 94, 103,
860c19800e8SDoug Rabson 95, 96, 97, 98, 100, 233, 234, 99, 236, 123,
861c19800e8SDoug Rabson 178, 179, 129, 243, 244, 245, 139, 180, 154, 165,
862c19800e8SDoug Rabson 250, 251, 166, 168, 169, 170, 181, 171, 173, 260,
863c19800e8SDoug Rabson 182, 183, 207, 265, 186, 187, 246, 247, 248, 188,
864c19800e8SDoug Rabson 174, 189, 274, 190, 276, 256, 257, 258, 175, 177,
865c19800e8SDoug Rabson 282, 263, 191, 194, 284, 285, 268, 269, 195, 286,
866c19800e8SDoug Rabson 272, 196, 197, 275, 198, 277, 199, 279, 280, 281,
867c19800e8SDoug Rabson 200, 283, 208, 259, 209, 210, 211, 214, 0, 215,
868c19800e8SDoug Rabson 216, 217, 218, 219, 220, 221, 222, 223, 224, 225,
869c19800e8SDoug Rabson 226, 227, 228, 229, 230, 231, 232, 235, 249, 287,
870c19800e8SDoug Rabson 288, 307, 241, 289, 261, 264, 290, 267, 291, 270,
871c19800e8SDoug Rabson 292, 271, 273, 293, 294, 295, 299, 296, 301, 297,
872c19800e8SDoug Rabson 308, 309, 298, 310, 313, 314, 2, 3, 315, 266,
873c19800e8SDoug Rabson 0, 316, 0, 0, 0, 311, 0, 0, 0, 0,
874c19800e8SDoug Rabson 303, 304, 305, 306, 4, 5, 0, 0, 6, 7,
875c19800e8SDoug Rabson 8, 9, 10, 11, 12, 13, 14, 0, 0, 0,
876c19800e8SDoug Rabson 0, 0, 0, 302, 15, 16, 17, 18, 19, 20,
877c19800e8SDoug Rabson 21, 22, 23, 24, 25, 26, 27, 28, 29, 30,
878c19800e8SDoug Rabson 31, 32, 0, 33, 34, 35, 36, 37, 0, 0,
879c19800e8SDoug Rabson 0, 38, 39, 40, 41, 42, 43, 44, 45, 0,
880c19800e8SDoug Rabson 0, 0, 0, 0, 0, 0, 46, 47
881c19800e8SDoug Rabson };
882c19800e8SDoug Rabson
883c19800e8SDoug Rabson static const yytype_int16 yycheck[] =
884c19800e8SDoug Rabson {
885c19800e8SDoug Rabson 53, 196, 197, 113, 15, 4, 5, 5, 15, 16,
886c19800e8SDoug Rabson 15, 16, 10, 66, 13, 3, 14, 83, 6, 16,
887c19800e8SDoug Rabson 8, 9, 55, 76, 219, 78, 79, 16, 15, 7,
888c19800e8SDoug Rabson 15, 16, 85, 11, 12, 15, 69, 16, 71, 15,
889c19800e8SDoug Rabson 73, 15, 95, 15, 16, 15, 99, 15, 16, 82,
890c19800e8SDoug Rabson 83, 60, 61, 15, 16, 64, 65, 90, 67, 68,
891c19800e8SDoug Rabson 15, 70, 15, 16, 15, 16, 75, 15, 16, 15,
892c19800e8SDoug Rabson 16, 80, 81, 84, 184, 84, 49, 86, 87, 15,
893c19800e8SDoug Rabson 16, 15, 15, 15, 15, 15, 15, 15, 15, 62,
894c19800e8SDoug Rabson 63, 64, 16, 15, 15, 290, 16, 15, 84, 16,
895c19800e8SDoug Rabson 73, 74, 75, 76, 77, 78, 79, 16, 15, 84,
896c19800e8SDoug Rabson 16, 15, 15, 15, 309, 15, 15, 15, 15, 83,
897c19800e8SDoug Rabson 16, 15, 15, 15, 15, 178, 179, 16, 181, 83,
898c19800e8SDoug Rabson 16, 16, 84, 186, 187, 188, 83, 17, 83, 83,
899c19800e8SDoug Rabson 193, 194, 83, 83, 83, 83, 16, 84, 83, 202,
900c19800e8SDoug Rabson 15, 15, 15, 206, 16, 16, 189, 190, 191, 16,
901c19800e8SDoug Rabson 83, 16, 215, 16, 217, 198, 199, 200, 83, 83,
902c19800e8SDoug Rabson 223, 204, 16, 16, 227, 228, 209, 210, 16, 232,
903c19800e8SDoug Rabson 213, 16, 16, 216, 16, 218, 16, 220, 221, 222,
904c19800e8SDoug Rabson 16, 224, 15, 83, 16, 16, 15, 15, -1, 16,
905c19800e8SDoug Rabson 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
906c19800e8SDoug Rabson 16, 16, 16, 16, 16, 16, 16, 84, 12, 17,
907c19800e8SDoug Rabson 15, 17, 183, 16, 84, 84, 16, 83, 16, 83,
908c19800e8SDoug Rabson 15, 83, 83, 16, 16, 16, 289, 16, 291, 84,
909c19800e8SDoug Rabson 16, 16, 84, 84, 17, 84, 0, 1, 17, 207,
910c19800e8SDoug Rabson -1, 84, -1, -1, -1, 308, -1, -1, -1, -1,
911c19800e8SDoug Rabson 293, 294, 295, 296, 18, 19, -1, -1, 22, 23,
912c19800e8SDoug Rabson 24, 25, 26, 27, 28, 29, 30, -1, -1, -1,
913c19800e8SDoug Rabson -1, -1, -1, 292, 38, 39, 40, 41, 42, 43,
914c19800e8SDoug Rabson 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,
915c19800e8SDoug Rabson 54, 55, -1, 57, 58, 59, 60, 61, -1, -1,
916c19800e8SDoug Rabson -1, 65, 66, 67, 68, 69, 70, 71, 72, -1,
917c19800e8SDoug Rabson -1, -1, -1, -1, -1, -1, 80, 81
918c19800e8SDoug Rabson };
919c19800e8SDoug Rabson
920c19800e8SDoug Rabson /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
921c19800e8SDoug Rabson symbol of state STATE-NUM. */
922c19800e8SDoug Rabson static const yytype_uint8 yystos[] =
923c19800e8SDoug Rabson {
924c19800e8SDoug Rabson 0, 86, 0, 1, 18, 19, 22, 23, 24, 25,
925c19800e8SDoug Rabson 26, 27, 28, 29, 30, 38, 39, 40, 41, 42,
926c19800e8SDoug Rabson 43, 44, 45, 46, 47, 48, 49, 50, 51, 52,
927c19800e8SDoug Rabson 53, 54, 55, 57, 58, 59, 60, 61, 65, 66,
928c19800e8SDoug Rabson 67, 68, 69, 70, 71, 72, 80, 81, 87, 88,
929c19800e8SDoug Rabson 16, 15, 15, 16, 15, 16, 15, 15, 15, 15,
930c19800e8SDoug Rabson 15, 15, 15, 15, 15, 15, 16, 15, 15, 16,
931c19800e8SDoug Rabson 15, 16, 15, 16, 15, 15, 16, 15, 16, 16,
932c19800e8SDoug Rabson 15, 15, 16, 16, 15, 16, 15, 15, 15, 15,
933c19800e8SDoug Rabson 16, 15, 15, 15, 15, 16, 15, 15, 15, 16,
934c19800e8SDoug Rabson 15, 83, 89, 83, 90, 102, 84, 92, 101, 102,
935c19800e8SDoug Rabson 3, 6, 8, 9, 94, 7, 11, 12, 95, 4,
936c19800e8SDoug Rabson 5, 13, 96, 83, 97, 98, 97, 97, 84, 84,
937c19800e8SDoug Rabson 91, 97, 97, 102, 97, 97, 101, 97, 101, 83,
938c19800e8SDoug Rabson 101, 49, 62, 63, 64, 73, 74, 75, 76, 77,
939c19800e8SDoug Rabson 78, 79, 97, 102, 83, 102, 102, 97, 97, 101,
940c19800e8SDoug Rabson 101, 97, 102, 97, 97, 83, 83, 101, 83, 83,
941c19800e8SDoug Rabson 83, 84, 102, 83, 83, 83, 102, 83, 16, 16,
942c19800e8SDoug Rabson 17, 16, 15, 15, 15, 91, 16, 16, 16, 16,
943c19800e8SDoug Rabson 16, 16, 15, 16, 16, 16, 16, 16, 16, 16,
944c19800e8SDoug Rabson 16, 15, 16, 15, 16, 15, 16, 15, 15, 16,
945c19800e8SDoug Rabson 16, 15, 15, 16, 15, 16, 16, 16, 16, 16,
946c19800e8SDoug Rabson 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
947c19800e8SDoug Rabson 16, 16, 16, 102, 102, 84, 102, 5, 10, 14,
948c19800e8SDoug Rabson 93, 93, 91, 102, 102, 102, 101, 101, 101, 12,
949c19800e8SDoug Rabson 102, 102, 100, 101, 100, 100, 101, 101, 101, 83,
950c19800e8SDoug Rabson 102, 84, 99, 101, 84, 102, 99, 83, 101, 101,
951c19800e8SDoug Rabson 83, 83, 101, 83, 102, 101, 102, 101, 100, 101,
952c19800e8SDoug Rabson 101, 101, 102, 101, 102, 102, 102, 17, 15, 16,
953c19800e8SDoug Rabson 16, 16, 15, 16, 16, 16, 16, 84, 84, 102,
954c19800e8SDoug Rabson 100, 102, 97, 101, 101, 101, 101, 17, 16, 16,
955c19800e8SDoug Rabson 84, 102, 100, 17, 84, 17, 84
956c19800e8SDoug Rabson };
957c19800e8SDoug Rabson
958c19800e8SDoug Rabson #define yyerrok (yyerrstatus = 0)
959c19800e8SDoug Rabson #define yyclearin (yychar = YYEMPTY)
960c19800e8SDoug Rabson #define YYEMPTY (-2)
961c19800e8SDoug Rabson #define YYEOF 0
962c19800e8SDoug Rabson
963c19800e8SDoug Rabson #define YYACCEPT goto yyacceptlab
964c19800e8SDoug Rabson #define YYABORT goto yyabortlab
965c19800e8SDoug Rabson #define YYERROR goto yyerrorlab
966c19800e8SDoug Rabson
967c19800e8SDoug Rabson
968c19800e8SDoug Rabson /* Like YYERROR except do call yyerror. This remains here temporarily
969c19800e8SDoug Rabson to ease the transition to the new meaning of YYERROR, for GCC.
970c19800e8SDoug Rabson Once GCC version 2 has supplanted version 1, this can go. */
971c19800e8SDoug Rabson
972c19800e8SDoug Rabson #define YYFAIL goto yyerrlab
973c19800e8SDoug Rabson
974c19800e8SDoug Rabson #define YYRECOVERING() (!!yyerrstatus)
975c19800e8SDoug Rabson
976c19800e8SDoug Rabson #define YYBACKUP(Token, Value) \
977c19800e8SDoug Rabson do \
978c19800e8SDoug Rabson if (yychar == YYEMPTY && yylen == 1) \
979c19800e8SDoug Rabson { \
980c19800e8SDoug Rabson yychar = (Token); \
981c19800e8SDoug Rabson yylval = (Value); \
982c19800e8SDoug Rabson yytoken = YYTRANSLATE (yychar); \
983c19800e8SDoug Rabson YYPOPSTACK (1); \
984c19800e8SDoug Rabson goto yybackup; \
985c19800e8SDoug Rabson } \
986c19800e8SDoug Rabson else \
987c19800e8SDoug Rabson { \
988c19800e8SDoug Rabson yyerror (YY_("syntax error: cannot back up")); \
989c19800e8SDoug Rabson YYERROR; \
990c19800e8SDoug Rabson } \
991c19800e8SDoug Rabson while (YYID (0))
992c19800e8SDoug Rabson
993c19800e8SDoug Rabson
994c19800e8SDoug Rabson #define YYTERROR 1
995c19800e8SDoug Rabson #define YYERRCODE 256
996c19800e8SDoug Rabson
997c19800e8SDoug Rabson
998c19800e8SDoug Rabson /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
999c19800e8SDoug Rabson If N is 0, then set CURRENT to the empty location which ends
1000c19800e8SDoug Rabson the previous symbol: RHS[0] (always defined). */
1001c19800e8SDoug Rabson
1002c19800e8SDoug Rabson #define YYRHSLOC(Rhs, K) ((Rhs)[K])
1003c19800e8SDoug Rabson #ifndef YYLLOC_DEFAULT
1004c19800e8SDoug Rabson # define YYLLOC_DEFAULT(Current, Rhs, N) \
1005c19800e8SDoug Rabson do \
1006c19800e8SDoug Rabson if (YYID (N)) \
1007c19800e8SDoug Rabson { \
1008c19800e8SDoug Rabson (Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
1009c19800e8SDoug Rabson (Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
1010c19800e8SDoug Rabson (Current).last_line = YYRHSLOC (Rhs, N).last_line; \
1011c19800e8SDoug Rabson (Current).last_column = YYRHSLOC (Rhs, N).last_column; \
1012c19800e8SDoug Rabson } \
1013c19800e8SDoug Rabson else \
1014c19800e8SDoug Rabson { \
1015c19800e8SDoug Rabson (Current).first_line = (Current).last_line = \
1016c19800e8SDoug Rabson YYRHSLOC (Rhs, 0).last_line; \
1017c19800e8SDoug Rabson (Current).first_column = (Current).last_column = \
1018c19800e8SDoug Rabson YYRHSLOC (Rhs, 0).last_column; \
1019c19800e8SDoug Rabson } \
1020c19800e8SDoug Rabson while (YYID (0))
1021c19800e8SDoug Rabson #endif
1022c19800e8SDoug Rabson
1023c19800e8SDoug Rabson
1024c19800e8SDoug Rabson /* YY_LOCATION_PRINT -- Print the location on the stream.
1025c19800e8SDoug Rabson This macro was not mandated originally: define only if we know
1026c19800e8SDoug Rabson we won't break user code: when these are the locations we know. */
1027c19800e8SDoug Rabson
1028c19800e8SDoug Rabson #ifndef YY_LOCATION_PRINT
1029c19800e8SDoug Rabson # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
1030c19800e8SDoug Rabson # define YY_LOCATION_PRINT(File, Loc) \
1031c19800e8SDoug Rabson fprintf (File, "%d.%d-%d.%d", \
1032c19800e8SDoug Rabson (Loc).first_line, (Loc).first_column, \
1033c19800e8SDoug Rabson (Loc).last_line, (Loc).last_column)
1034c19800e8SDoug Rabson # else
1035c19800e8SDoug Rabson # define YY_LOCATION_PRINT(File, Loc) ((void) 0)
1036c19800e8SDoug Rabson # endif
1037c19800e8SDoug Rabson #endif
1038c19800e8SDoug Rabson
1039c19800e8SDoug Rabson
1040c19800e8SDoug Rabson /* YYLEX -- calling `yylex' with the right arguments. */
1041c19800e8SDoug Rabson
1042c19800e8SDoug Rabson #ifdef YYLEX_PARAM
1043c19800e8SDoug Rabson # define YYLEX yylex (YYLEX_PARAM)
1044c19800e8SDoug Rabson #else
1045c19800e8SDoug Rabson # define YYLEX yylex ()
1046c19800e8SDoug Rabson #endif
1047c19800e8SDoug Rabson
1048c19800e8SDoug Rabson /* Enable debugging if requested. */
1049c19800e8SDoug Rabson #if YYDEBUG
1050c19800e8SDoug Rabson
1051c19800e8SDoug Rabson # ifndef YYFPRINTF
1052c19800e8SDoug Rabson # include <stdio.h> /* INFRINGES ON USER NAME SPACE */
1053c19800e8SDoug Rabson # define YYFPRINTF fprintf
1054c19800e8SDoug Rabson # endif
1055c19800e8SDoug Rabson
1056c19800e8SDoug Rabson # define YYDPRINTF(Args) \
1057c19800e8SDoug Rabson do { \
1058c19800e8SDoug Rabson if (yydebug) \
1059c19800e8SDoug Rabson YYFPRINTF Args; \
1060c19800e8SDoug Rabson } while (YYID (0))
1061c19800e8SDoug Rabson
1062c19800e8SDoug Rabson # define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
1063c19800e8SDoug Rabson do { \
1064c19800e8SDoug Rabson if (yydebug) \
1065c19800e8SDoug Rabson { \
1066c19800e8SDoug Rabson YYFPRINTF (stderr, "%s ", Title); \
1067c19800e8SDoug Rabson yy_symbol_print (stderr, \
1068c19800e8SDoug Rabson Type, Value); \
1069c19800e8SDoug Rabson YYFPRINTF (stderr, "\n"); \
1070c19800e8SDoug Rabson } \
1071c19800e8SDoug Rabson } while (YYID (0))
1072c19800e8SDoug Rabson
1073c19800e8SDoug Rabson
1074c19800e8SDoug Rabson /*--------------------------------.
1075c19800e8SDoug Rabson | Print this symbol on YYOUTPUT. |
1076c19800e8SDoug Rabson `--------------------------------*/
1077c19800e8SDoug Rabson
1078c19800e8SDoug Rabson /*ARGSUSED*/
1079c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1080c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
1081c19800e8SDoug Rabson static void
1082c19800e8SDoug Rabson yy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
1083c19800e8SDoug Rabson #else
1084c19800e8SDoug Rabson static void
1085c19800e8SDoug Rabson yy_symbol_value_print (yyoutput, yytype, yyvaluep)
1086c19800e8SDoug Rabson FILE *yyoutput;
1087c19800e8SDoug Rabson int yytype;
1088c19800e8SDoug Rabson YYSTYPE const * const yyvaluep;
1089c19800e8SDoug Rabson #endif
1090c19800e8SDoug Rabson {
1091c19800e8SDoug Rabson if (!yyvaluep)
1092c19800e8SDoug Rabson return;
1093c19800e8SDoug Rabson # ifdef YYPRINT
1094c19800e8SDoug Rabson if (yytype < YYNTOKENS)
1095c19800e8SDoug Rabson YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
1096c19800e8SDoug Rabson # else
1097c19800e8SDoug Rabson YYUSE (yyoutput);
1098c19800e8SDoug Rabson # endif
1099c19800e8SDoug Rabson switch (yytype)
1100c19800e8SDoug Rabson {
1101c19800e8SDoug Rabson default:
1102c19800e8SDoug Rabson break;
1103c19800e8SDoug Rabson }
1104c19800e8SDoug Rabson }
1105c19800e8SDoug Rabson
1106c19800e8SDoug Rabson
1107c19800e8SDoug Rabson /*--------------------------------.
1108c19800e8SDoug Rabson | Print this symbol on YYOUTPUT. |
1109c19800e8SDoug Rabson `--------------------------------*/
1110c19800e8SDoug Rabson
1111c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1112c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
1113c19800e8SDoug Rabson static void
1114c19800e8SDoug Rabson yy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
1115c19800e8SDoug Rabson #else
1116c19800e8SDoug Rabson static void
1117c19800e8SDoug Rabson yy_symbol_print (yyoutput, yytype, yyvaluep)
1118c19800e8SDoug Rabson FILE *yyoutput;
1119c19800e8SDoug Rabson int yytype;
1120c19800e8SDoug Rabson YYSTYPE const * const yyvaluep;
1121c19800e8SDoug Rabson #endif
1122c19800e8SDoug Rabson {
1123c19800e8SDoug Rabson if (yytype < YYNTOKENS)
1124c19800e8SDoug Rabson YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
1125c19800e8SDoug Rabson else
1126c19800e8SDoug Rabson YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
1127c19800e8SDoug Rabson
1128c19800e8SDoug Rabson yy_symbol_value_print (yyoutput, yytype, yyvaluep);
1129c19800e8SDoug Rabson YYFPRINTF (yyoutput, ")");
1130c19800e8SDoug Rabson }
1131c19800e8SDoug Rabson
1132c19800e8SDoug Rabson /*------------------------------------------------------------------.
1133c19800e8SDoug Rabson | yy_stack_print -- Print the state stack from its BOTTOM up to its |
1134c19800e8SDoug Rabson | TOP (included). |
1135c19800e8SDoug Rabson `------------------------------------------------------------------*/
1136c19800e8SDoug Rabson
1137c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1138c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
1139c19800e8SDoug Rabson static void
1140c19800e8SDoug Rabson yy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
1141c19800e8SDoug Rabson #else
1142c19800e8SDoug Rabson static void
1143c19800e8SDoug Rabson yy_stack_print (bottom, top)
1144c19800e8SDoug Rabson yytype_int16 *bottom;
1145c19800e8SDoug Rabson yytype_int16 *top;
1146c19800e8SDoug Rabson #endif
1147c19800e8SDoug Rabson {
1148c19800e8SDoug Rabson YYFPRINTF (stderr, "Stack now");
1149c19800e8SDoug Rabson for (; bottom <= top; ++bottom)
1150c19800e8SDoug Rabson YYFPRINTF (stderr, " %d", *bottom);
1151c19800e8SDoug Rabson YYFPRINTF (stderr, "\n");
1152c19800e8SDoug Rabson }
1153c19800e8SDoug Rabson
1154c19800e8SDoug Rabson # define YY_STACK_PRINT(Bottom, Top) \
1155c19800e8SDoug Rabson do { \
1156c19800e8SDoug Rabson if (yydebug) \
1157c19800e8SDoug Rabson yy_stack_print ((Bottom), (Top)); \
1158c19800e8SDoug Rabson } while (YYID (0))
1159c19800e8SDoug Rabson
1160c19800e8SDoug Rabson
1161c19800e8SDoug Rabson /*------------------------------------------------.
1162c19800e8SDoug Rabson | Report that the YYRULE is going to be reduced. |
1163c19800e8SDoug Rabson `------------------------------------------------*/
1164c19800e8SDoug Rabson
1165c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1166c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
1167c19800e8SDoug Rabson static void
1168c19800e8SDoug Rabson yy_reduce_print (YYSTYPE *yyvsp, int yyrule)
1169c19800e8SDoug Rabson #else
1170c19800e8SDoug Rabson static void
1171c19800e8SDoug Rabson yy_reduce_print (yyvsp, yyrule)
1172c19800e8SDoug Rabson YYSTYPE *yyvsp;
1173c19800e8SDoug Rabson int yyrule;
1174c19800e8SDoug Rabson #endif
1175c19800e8SDoug Rabson {
1176c19800e8SDoug Rabson int yynrhs = yyr2[yyrule];
1177c19800e8SDoug Rabson int yyi;
1178c19800e8SDoug Rabson unsigned long int yylno = yyrline[yyrule];
1179c19800e8SDoug Rabson YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
1180c19800e8SDoug Rabson yyrule - 1, yylno);
1181c19800e8SDoug Rabson /* The symbols being reduced. */
1182c19800e8SDoug Rabson for (yyi = 0; yyi < yynrhs; yyi++)
1183c19800e8SDoug Rabson {
1184c19800e8SDoug Rabson fprintf (stderr, " $%d = ", yyi + 1);
1185c19800e8SDoug Rabson yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
1186c19800e8SDoug Rabson &(yyvsp[(yyi + 1) - (yynrhs)])
1187c19800e8SDoug Rabson );
1188c19800e8SDoug Rabson fprintf (stderr, "\n");
1189c19800e8SDoug Rabson }
1190c19800e8SDoug Rabson }
1191c19800e8SDoug Rabson
1192c19800e8SDoug Rabson # define YY_REDUCE_PRINT(Rule) \
1193c19800e8SDoug Rabson do { \
1194c19800e8SDoug Rabson if (yydebug) \
1195c19800e8SDoug Rabson yy_reduce_print (yyvsp, Rule); \
1196c19800e8SDoug Rabson } while (YYID (0))
1197c19800e8SDoug Rabson
1198c19800e8SDoug Rabson /* Nonzero means print parse trace. It is left uninitialized so that
1199c19800e8SDoug Rabson multiple parsers can coexist. */
1200c19800e8SDoug Rabson int yydebug;
1201c19800e8SDoug Rabson #else /* !YYDEBUG */
1202c19800e8SDoug Rabson # define YYDPRINTF(Args)
1203c19800e8SDoug Rabson # define YY_SYMBOL_PRINT(Title, Type, Value, Location)
1204c19800e8SDoug Rabson # define YY_STACK_PRINT(Bottom, Top)
1205c19800e8SDoug Rabson # define YY_REDUCE_PRINT(Rule)
1206c19800e8SDoug Rabson #endif /* !YYDEBUG */
1207c19800e8SDoug Rabson
1208c19800e8SDoug Rabson
1209c19800e8SDoug Rabson /* YYINITDEPTH -- initial size of the parser's stacks. */
1210c19800e8SDoug Rabson #ifndef YYINITDEPTH
1211c19800e8SDoug Rabson # define YYINITDEPTH 200
1212c19800e8SDoug Rabson #endif
1213c19800e8SDoug Rabson
1214c19800e8SDoug Rabson /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
1215c19800e8SDoug Rabson if the built-in stack extension method is used).
1216c19800e8SDoug Rabson
1217c19800e8SDoug Rabson Do not make this value too large; the results are undefined if
1218c19800e8SDoug Rabson YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
1219c19800e8SDoug Rabson evaluated with infinite-precision integer arithmetic. */
1220c19800e8SDoug Rabson
1221c19800e8SDoug Rabson #ifndef YYMAXDEPTH
1222c19800e8SDoug Rabson # define YYMAXDEPTH 10000
1223c19800e8SDoug Rabson #endif
1224c19800e8SDoug Rabson
1225c19800e8SDoug Rabson
1226c19800e8SDoug Rabson
1227c19800e8SDoug Rabson #if YYERROR_VERBOSE
1228c19800e8SDoug Rabson
1229c19800e8SDoug Rabson # ifndef yystrlen
1230c19800e8SDoug Rabson # if defined __GLIBC__ && defined _STRING_H
1231c19800e8SDoug Rabson # define yystrlen strlen
1232c19800e8SDoug Rabson # else
1233c19800e8SDoug Rabson /* Return the length of YYSTR. */
1234c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1235c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
1236c19800e8SDoug Rabson static YYSIZE_T
1237c19800e8SDoug Rabson yystrlen (const char *yystr)
1238c19800e8SDoug Rabson #else
1239c19800e8SDoug Rabson static YYSIZE_T
1240c19800e8SDoug Rabson yystrlen (yystr)
1241c19800e8SDoug Rabson const char *yystr;
1242c19800e8SDoug Rabson #endif
1243c19800e8SDoug Rabson {
1244c19800e8SDoug Rabson YYSIZE_T yylen;
1245c19800e8SDoug Rabson for (yylen = 0; yystr[yylen]; yylen++)
1246c19800e8SDoug Rabson continue;
1247c19800e8SDoug Rabson return yylen;
1248c19800e8SDoug Rabson }
1249c19800e8SDoug Rabson # endif
1250c19800e8SDoug Rabson # endif
1251c19800e8SDoug Rabson
1252c19800e8SDoug Rabson # ifndef yystpcpy
1253c19800e8SDoug Rabson # if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
1254c19800e8SDoug Rabson # define yystpcpy stpcpy
1255c19800e8SDoug Rabson # else
1256c19800e8SDoug Rabson /* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
1257c19800e8SDoug Rabson YYDEST. */
1258c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1259c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
1260c19800e8SDoug Rabson static char *
1261c19800e8SDoug Rabson yystpcpy (char *yydest, const char *yysrc)
1262c19800e8SDoug Rabson #else
1263c19800e8SDoug Rabson static char *
1264c19800e8SDoug Rabson yystpcpy (yydest, yysrc)
1265c19800e8SDoug Rabson char *yydest;
1266c19800e8SDoug Rabson const char *yysrc;
1267c19800e8SDoug Rabson #endif
1268c19800e8SDoug Rabson {
1269c19800e8SDoug Rabson char *yyd = yydest;
1270c19800e8SDoug Rabson const char *yys = yysrc;
1271c19800e8SDoug Rabson
1272c19800e8SDoug Rabson while ((*yyd++ = *yys++) != '\0')
1273c19800e8SDoug Rabson continue;
1274c19800e8SDoug Rabson
1275c19800e8SDoug Rabson return yyd - 1;
1276c19800e8SDoug Rabson }
1277c19800e8SDoug Rabson # endif
1278c19800e8SDoug Rabson # endif
1279c19800e8SDoug Rabson
1280c19800e8SDoug Rabson # ifndef yytnamerr
1281c19800e8SDoug Rabson /* Copy to YYRES the contents of YYSTR after stripping away unnecessary
1282c19800e8SDoug Rabson quotes and backslashes, so that it's suitable for yyerror. The
1283c19800e8SDoug Rabson heuristic is that double-quoting is unnecessary unless the string
1284c19800e8SDoug Rabson contains an apostrophe, a comma, or backslash (other than
1285c19800e8SDoug Rabson backslash-backslash). YYSTR is taken from yytname. If YYRES is
1286c19800e8SDoug Rabson null, do not copy; instead, return the length of what the result
1287c19800e8SDoug Rabson would have been. */
1288c19800e8SDoug Rabson static YYSIZE_T
yytnamerr(char * yyres,const char * yystr)1289c19800e8SDoug Rabson yytnamerr (char *yyres, const char *yystr)
1290c19800e8SDoug Rabson {
1291c19800e8SDoug Rabson if (*yystr == '"')
1292c19800e8SDoug Rabson {
1293c19800e8SDoug Rabson YYSIZE_T yyn = 0;
1294c19800e8SDoug Rabson char const *yyp = yystr;
1295c19800e8SDoug Rabson
1296c19800e8SDoug Rabson for (;;)
1297c19800e8SDoug Rabson switch (*++yyp)
1298c19800e8SDoug Rabson {
1299c19800e8SDoug Rabson case '\'':
1300c19800e8SDoug Rabson case ',':
1301c19800e8SDoug Rabson goto do_not_strip_quotes;
1302c19800e8SDoug Rabson
1303c19800e8SDoug Rabson case '\\':
1304c19800e8SDoug Rabson if (*++yyp != '\\')
1305c19800e8SDoug Rabson goto do_not_strip_quotes;
1306c19800e8SDoug Rabson /* Fall through. */
1307c19800e8SDoug Rabson default:
1308c19800e8SDoug Rabson if (yyres)
1309c19800e8SDoug Rabson yyres[yyn] = *yyp;
1310c19800e8SDoug Rabson yyn++;
1311c19800e8SDoug Rabson break;
1312c19800e8SDoug Rabson
1313c19800e8SDoug Rabson case '"':
1314c19800e8SDoug Rabson if (yyres)
1315c19800e8SDoug Rabson yyres[yyn] = '\0';
1316c19800e8SDoug Rabson return yyn;
1317c19800e8SDoug Rabson }
1318c19800e8SDoug Rabson do_not_strip_quotes: ;
1319c19800e8SDoug Rabson }
1320c19800e8SDoug Rabson
1321c19800e8SDoug Rabson if (! yyres)
1322c19800e8SDoug Rabson return yystrlen (yystr);
1323c19800e8SDoug Rabson
1324c19800e8SDoug Rabson return yystpcpy (yyres, yystr) - yyres;
1325c19800e8SDoug Rabson }
1326c19800e8SDoug Rabson # endif
1327c19800e8SDoug Rabson
1328c19800e8SDoug Rabson /* Copy into YYRESULT an error message about the unexpected token
1329c19800e8SDoug Rabson YYCHAR while in state YYSTATE. Return the number of bytes copied,
1330c19800e8SDoug Rabson including the terminating null byte. If YYRESULT is null, do not
1331c19800e8SDoug Rabson copy anything; just return the number of bytes that would be
1332c19800e8SDoug Rabson copied. As a special case, return 0 if an ordinary "syntax error"
1333c19800e8SDoug Rabson message will do. Return YYSIZE_MAXIMUM if overflow occurs during
1334c19800e8SDoug Rabson size calculation. */
1335c19800e8SDoug Rabson static YYSIZE_T
yysyntax_error(char * yyresult,int yystate,int yychar)1336c19800e8SDoug Rabson yysyntax_error (char *yyresult, int yystate, int yychar)
1337c19800e8SDoug Rabson {
1338c19800e8SDoug Rabson int yyn = yypact[yystate];
1339c19800e8SDoug Rabson
1340c19800e8SDoug Rabson if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
1341c19800e8SDoug Rabson return 0;
1342c19800e8SDoug Rabson else
1343c19800e8SDoug Rabson {
1344c19800e8SDoug Rabson int yytype = YYTRANSLATE (yychar);
1345c19800e8SDoug Rabson YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
1346c19800e8SDoug Rabson YYSIZE_T yysize = yysize0;
1347c19800e8SDoug Rabson YYSIZE_T yysize1;
1348c19800e8SDoug Rabson int yysize_overflow = 0;
1349c19800e8SDoug Rabson enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1350c19800e8SDoug Rabson char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1351c19800e8SDoug Rabson int yyx;
1352c19800e8SDoug Rabson
1353c19800e8SDoug Rabson # if 0
1354c19800e8SDoug Rabson /* This is so xgettext sees the translatable formats that are
1355c19800e8SDoug Rabson constructed on the fly. */
1356c19800e8SDoug Rabson YY_("syntax error, unexpected %s");
1357c19800e8SDoug Rabson YY_("syntax error, unexpected %s, expecting %s");
1358c19800e8SDoug Rabson YY_("syntax error, unexpected %s, expecting %s or %s");
1359c19800e8SDoug Rabson YY_("syntax error, unexpected %s, expecting %s or %s or %s");
1360c19800e8SDoug Rabson YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
1361c19800e8SDoug Rabson # endif
1362c19800e8SDoug Rabson char *yyfmt;
1363c19800e8SDoug Rabson char const *yyf;
1364c19800e8SDoug Rabson static char const yyunexpected[] = "syntax error, unexpected %s";
1365c19800e8SDoug Rabson static char const yyexpecting[] = ", expecting %s";
1366c19800e8SDoug Rabson static char const yyor[] = " or %s";
1367c19800e8SDoug Rabson char yyformat[sizeof yyunexpected
1368c19800e8SDoug Rabson + sizeof yyexpecting - 1
1369c19800e8SDoug Rabson + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
1370c19800e8SDoug Rabson * (sizeof yyor - 1))];
1371c19800e8SDoug Rabson char const *yyprefix = yyexpecting;
1372c19800e8SDoug Rabson
1373c19800e8SDoug Rabson /* Start YYX at -YYN if negative to avoid negative indexes in
1374c19800e8SDoug Rabson YYCHECK. */
1375c19800e8SDoug Rabson int yyxbegin = yyn < 0 ? -yyn : 0;
1376c19800e8SDoug Rabson
1377c19800e8SDoug Rabson /* Stay within bounds of both yycheck and yytname. */
1378c19800e8SDoug Rabson int yychecklim = YYLAST - yyn + 1;
1379c19800e8SDoug Rabson int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
1380c19800e8SDoug Rabson int yycount = 1;
1381c19800e8SDoug Rabson
1382c19800e8SDoug Rabson yyarg[0] = yytname[yytype];
1383c19800e8SDoug Rabson yyfmt = yystpcpy (yyformat, yyunexpected);
1384c19800e8SDoug Rabson
1385c19800e8SDoug Rabson for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1386c19800e8SDoug Rabson if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1387c19800e8SDoug Rabson {
1388c19800e8SDoug Rabson if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1389c19800e8SDoug Rabson {
1390c19800e8SDoug Rabson yycount = 1;
1391c19800e8SDoug Rabson yysize = yysize0;
1392c19800e8SDoug Rabson yyformat[sizeof yyunexpected - 1] = '\0';
1393c19800e8SDoug Rabson break;
1394c19800e8SDoug Rabson }
1395c19800e8SDoug Rabson yyarg[yycount++] = yytname[yyx];
1396c19800e8SDoug Rabson yysize1 = yysize + yytnamerr (0, yytname[yyx]);
1397c19800e8SDoug Rabson yysize_overflow |= (yysize1 < yysize);
1398c19800e8SDoug Rabson yysize = yysize1;
1399c19800e8SDoug Rabson yyfmt = yystpcpy (yyfmt, yyprefix);
1400c19800e8SDoug Rabson yyprefix = yyor;
1401c19800e8SDoug Rabson }
1402c19800e8SDoug Rabson
1403c19800e8SDoug Rabson yyf = YY_(yyformat);
1404c19800e8SDoug Rabson yysize1 = yysize + yystrlen (yyf);
1405c19800e8SDoug Rabson yysize_overflow |= (yysize1 < yysize);
1406c19800e8SDoug Rabson yysize = yysize1;
1407c19800e8SDoug Rabson
1408c19800e8SDoug Rabson if (yysize_overflow)
1409c19800e8SDoug Rabson return YYSIZE_MAXIMUM;
1410c19800e8SDoug Rabson
1411c19800e8SDoug Rabson if (yyresult)
1412c19800e8SDoug Rabson {
1413c19800e8SDoug Rabson /* Avoid sprintf, as that infringes on the user's name space.
1414c19800e8SDoug Rabson Don't have undefined behavior even if the translation
1415c19800e8SDoug Rabson produced a string with the wrong number of "%s"s. */
1416c19800e8SDoug Rabson char *yyp = yyresult;
1417c19800e8SDoug Rabson int yyi = 0;
1418c19800e8SDoug Rabson while ((*yyp = *yyf) != '\0')
1419c19800e8SDoug Rabson {
1420c19800e8SDoug Rabson if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
1421c19800e8SDoug Rabson {
1422c19800e8SDoug Rabson yyp += yytnamerr (yyp, yyarg[yyi++]);
1423c19800e8SDoug Rabson yyf += 2;
1424c19800e8SDoug Rabson }
1425c19800e8SDoug Rabson else
1426c19800e8SDoug Rabson {
1427c19800e8SDoug Rabson yyp++;
1428c19800e8SDoug Rabson yyf++;
1429c19800e8SDoug Rabson }
1430c19800e8SDoug Rabson }
1431c19800e8SDoug Rabson }
1432c19800e8SDoug Rabson return yysize;
1433c19800e8SDoug Rabson }
1434c19800e8SDoug Rabson }
1435c19800e8SDoug Rabson #endif /* YYERROR_VERBOSE */
1436c19800e8SDoug Rabson
1437c19800e8SDoug Rabson
1438c19800e8SDoug Rabson /*-----------------------------------------------.
1439c19800e8SDoug Rabson | Release the memory associated to this symbol. |
1440c19800e8SDoug Rabson `-----------------------------------------------*/
1441c19800e8SDoug Rabson
1442c19800e8SDoug Rabson /*ARGSUSED*/
1443c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1444c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
1445c19800e8SDoug Rabson static void
1446c19800e8SDoug Rabson yydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
1447c19800e8SDoug Rabson #else
1448c19800e8SDoug Rabson static void
1449c19800e8SDoug Rabson yydestruct (yymsg, yytype, yyvaluep)
1450c19800e8SDoug Rabson const char *yymsg;
1451c19800e8SDoug Rabson int yytype;
1452c19800e8SDoug Rabson YYSTYPE *yyvaluep;
1453c19800e8SDoug Rabson #endif
1454c19800e8SDoug Rabson {
1455c19800e8SDoug Rabson YYUSE (yyvaluep);
1456c19800e8SDoug Rabson
1457c19800e8SDoug Rabson if (!yymsg)
1458c19800e8SDoug Rabson yymsg = "Deleting";
1459c19800e8SDoug Rabson YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1460c19800e8SDoug Rabson
1461c19800e8SDoug Rabson switch (yytype)
1462c19800e8SDoug Rabson {
1463c19800e8SDoug Rabson
1464c19800e8SDoug Rabson default:
1465c19800e8SDoug Rabson break;
1466c19800e8SDoug Rabson }
1467c19800e8SDoug Rabson }
1468c19800e8SDoug Rabson
1469c19800e8SDoug Rabson
1470c19800e8SDoug Rabson /* Prevent warnings from -Wmissing-prototypes. */
1471c19800e8SDoug Rabson
1472c19800e8SDoug Rabson #ifdef YYPARSE_PARAM
1473c19800e8SDoug Rabson #if defined __STDC__ || defined __cplusplus
1474c19800e8SDoug Rabson int yyparse (void *YYPARSE_PARAM);
1475c19800e8SDoug Rabson #else
1476c19800e8SDoug Rabson int yyparse ();
1477c19800e8SDoug Rabson #endif
1478c19800e8SDoug Rabson #else /* ! YYPARSE_PARAM */
1479c19800e8SDoug Rabson #if defined __STDC__ || defined __cplusplus
1480c19800e8SDoug Rabson int yyparse (void);
1481c19800e8SDoug Rabson #else
1482c19800e8SDoug Rabson int yyparse ();
1483c19800e8SDoug Rabson #endif
1484c19800e8SDoug Rabson #endif /* ! YYPARSE_PARAM */
1485c19800e8SDoug Rabson
1486c19800e8SDoug Rabson
1487c19800e8SDoug Rabson
1488c19800e8SDoug Rabson /* The look-ahead symbol. */
1489c19800e8SDoug Rabson int yychar;
1490c19800e8SDoug Rabson
1491c19800e8SDoug Rabson /* The semantic value of the look-ahead symbol. */
1492c19800e8SDoug Rabson YYSTYPE yylval;
1493c19800e8SDoug Rabson
1494c19800e8SDoug Rabson /* Number of syntax errors so far. */
1495c19800e8SDoug Rabson int yynerrs;
1496c19800e8SDoug Rabson
1497c19800e8SDoug Rabson
1498c19800e8SDoug Rabson
1499c19800e8SDoug Rabson /*----------.
1500c19800e8SDoug Rabson | yyparse. |
1501c19800e8SDoug Rabson `----------*/
1502c19800e8SDoug Rabson
1503c19800e8SDoug Rabson #ifdef YYPARSE_PARAM
1504c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1505c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
1506c19800e8SDoug Rabson int
1507c19800e8SDoug Rabson yyparse (void *YYPARSE_PARAM)
1508c19800e8SDoug Rabson #else
1509c19800e8SDoug Rabson int
1510c19800e8SDoug Rabson yyparse (YYPARSE_PARAM)
1511c19800e8SDoug Rabson void *YYPARSE_PARAM;
1512c19800e8SDoug Rabson #endif
1513c19800e8SDoug Rabson #else /* ! YYPARSE_PARAM */
1514c19800e8SDoug Rabson #if (defined __STDC__ || defined __C99__FUNC__ \
1515c19800e8SDoug Rabson || defined __cplusplus || defined _MSC_VER)
1516c19800e8SDoug Rabson int
yyparse(void)1517c19800e8SDoug Rabson yyparse (void)
1518c19800e8SDoug Rabson #else
1519c19800e8SDoug Rabson int
1520c19800e8SDoug Rabson yyparse ()
1521c19800e8SDoug Rabson
1522c19800e8SDoug Rabson #endif
1523c19800e8SDoug Rabson #endif
1524c19800e8SDoug Rabson {
1525c19800e8SDoug Rabson
1526c19800e8SDoug Rabson int yystate;
1527c19800e8SDoug Rabson int yyn;
1528c19800e8SDoug Rabson int yyresult;
1529c19800e8SDoug Rabson /* Number of tokens to shift before error messages enabled. */
1530c19800e8SDoug Rabson int yyerrstatus;
1531c19800e8SDoug Rabson /* Look-ahead token as an internal (translated) token number. */
1532c19800e8SDoug Rabson int yytoken = 0;
1533c19800e8SDoug Rabson #if YYERROR_VERBOSE
1534c19800e8SDoug Rabson /* Buffer for error messages, and its allocated size. */
1535c19800e8SDoug Rabson char yymsgbuf[128];
1536c19800e8SDoug Rabson char *yymsg = yymsgbuf;
1537c19800e8SDoug Rabson YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
1538c19800e8SDoug Rabson #endif
1539c19800e8SDoug Rabson
1540c19800e8SDoug Rabson /* Three stacks and their tools:
1541c19800e8SDoug Rabson `yyss': related to states,
1542c19800e8SDoug Rabson `yyvs': related to semantic values,
1543c19800e8SDoug Rabson `yyls': related to locations.
1544c19800e8SDoug Rabson
1545c19800e8SDoug Rabson Refer to the stacks thru separate pointers, to allow yyoverflow
1546c19800e8SDoug Rabson to reallocate them elsewhere. */
1547c19800e8SDoug Rabson
1548c19800e8SDoug Rabson /* The state stack. */
1549c19800e8SDoug Rabson yytype_int16 yyssa[YYINITDEPTH];
1550c19800e8SDoug Rabson yytype_int16 *yyss = yyssa;
1551c19800e8SDoug Rabson yytype_int16 *yyssp;
1552c19800e8SDoug Rabson
1553c19800e8SDoug Rabson /* The semantic value stack. */
1554c19800e8SDoug Rabson YYSTYPE yyvsa[YYINITDEPTH];
1555c19800e8SDoug Rabson YYSTYPE *yyvs = yyvsa;
1556c19800e8SDoug Rabson YYSTYPE *yyvsp;
1557c19800e8SDoug Rabson
1558c19800e8SDoug Rabson
1559c19800e8SDoug Rabson
1560c19800e8SDoug Rabson #define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N))
1561c19800e8SDoug Rabson
1562c19800e8SDoug Rabson YYSIZE_T yystacksize = YYINITDEPTH;
1563c19800e8SDoug Rabson
1564c19800e8SDoug Rabson /* The variables used to return semantic value and location from the
1565c19800e8SDoug Rabson action routines. */
1566c19800e8SDoug Rabson YYSTYPE yyval;
1567c19800e8SDoug Rabson
1568c19800e8SDoug Rabson
1569c19800e8SDoug Rabson /* The number of symbols on the RHS of the reduced rule.
1570c19800e8SDoug Rabson Keep to zero when no symbol should be popped. */
1571c19800e8SDoug Rabson int yylen = 0;
1572c19800e8SDoug Rabson
1573c19800e8SDoug Rabson YYDPRINTF ((stderr, "Starting parse\n"));
1574c19800e8SDoug Rabson
1575c19800e8SDoug Rabson yystate = 0;
1576c19800e8SDoug Rabson yyerrstatus = 0;
1577c19800e8SDoug Rabson yynerrs = 0;
1578c19800e8SDoug Rabson yychar = YYEMPTY; /* Cause a token to be read. */
1579c19800e8SDoug Rabson
1580c19800e8SDoug Rabson /* Initialize stack pointers.
1581c19800e8SDoug Rabson Waste one element of value and location stack
1582c19800e8SDoug Rabson so that they stay on the same level as the state stack.
1583c19800e8SDoug Rabson The wasted elements are never initialized. */
1584c19800e8SDoug Rabson
1585c19800e8SDoug Rabson yyssp = yyss;
1586c19800e8SDoug Rabson yyvsp = yyvs;
1587c19800e8SDoug Rabson
1588c19800e8SDoug Rabson goto yysetstate;
1589c19800e8SDoug Rabson
1590c19800e8SDoug Rabson /*------------------------------------------------------------.
1591c19800e8SDoug Rabson | yynewstate -- Push a new state, which is found in yystate. |
1592c19800e8SDoug Rabson `------------------------------------------------------------*/
1593c19800e8SDoug Rabson yynewstate:
1594c19800e8SDoug Rabson /* In all cases, when you get here, the value and location stacks
1595c19800e8SDoug Rabson have just been pushed. So pushing a state here evens the stacks. */
1596c19800e8SDoug Rabson yyssp++;
1597c19800e8SDoug Rabson
1598c19800e8SDoug Rabson yysetstate:
1599c19800e8SDoug Rabson *yyssp = yystate;
1600c19800e8SDoug Rabson
1601c19800e8SDoug Rabson if (yyss + yystacksize - 1 <= yyssp)
1602c19800e8SDoug Rabson {
1603c19800e8SDoug Rabson /* Get the current used size of the three stacks, in elements. */
1604c19800e8SDoug Rabson YYSIZE_T yysize = yyssp - yyss + 1;
1605c19800e8SDoug Rabson
1606c19800e8SDoug Rabson #ifdef yyoverflow
1607c19800e8SDoug Rabson {
1608c19800e8SDoug Rabson /* Give user a chance to reallocate the stack. Use copies of
1609c19800e8SDoug Rabson these so that the &'s don't force the real ones into
1610c19800e8SDoug Rabson memory. */
1611c19800e8SDoug Rabson YYSTYPE *yyvs1 = yyvs;
1612c19800e8SDoug Rabson yytype_int16 *yyss1 = yyss;
1613c19800e8SDoug Rabson
1614c19800e8SDoug Rabson
1615c19800e8SDoug Rabson /* Each stack pointer address is followed by the size of the
1616c19800e8SDoug Rabson data in use in that stack, in bytes. This used to be a
1617c19800e8SDoug Rabson conditional around just the two extra args, but that might
1618c19800e8SDoug Rabson be undefined if yyoverflow is a macro. */
1619c19800e8SDoug Rabson yyoverflow (YY_("memory exhausted"),
1620c19800e8SDoug Rabson &yyss1, yysize * sizeof (*yyssp),
1621c19800e8SDoug Rabson &yyvs1, yysize * sizeof (*yyvsp),
1622c19800e8SDoug Rabson
1623c19800e8SDoug Rabson &yystacksize);
1624c19800e8SDoug Rabson
1625c19800e8SDoug Rabson yyss = yyss1;
1626c19800e8SDoug Rabson yyvs = yyvs1;
1627c19800e8SDoug Rabson }
1628c19800e8SDoug Rabson #else /* no yyoverflow */
1629c19800e8SDoug Rabson # ifndef YYSTACK_RELOCATE
1630c19800e8SDoug Rabson goto yyexhaustedlab;
1631c19800e8SDoug Rabson # else
1632c19800e8SDoug Rabson /* Extend the stack our own way. */
1633c19800e8SDoug Rabson if (YYMAXDEPTH <= yystacksize)
1634c19800e8SDoug Rabson goto yyexhaustedlab;
1635c19800e8SDoug Rabson yystacksize *= 2;
1636c19800e8SDoug Rabson if (YYMAXDEPTH < yystacksize)
1637c19800e8SDoug Rabson yystacksize = YYMAXDEPTH;
1638c19800e8SDoug Rabson
1639c19800e8SDoug Rabson {
1640c19800e8SDoug Rabson yytype_int16 *yyss1 = yyss;
1641c19800e8SDoug Rabson union yyalloc *yyptr =
1642c19800e8SDoug Rabson (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1643c19800e8SDoug Rabson if (! yyptr)
1644c19800e8SDoug Rabson goto yyexhaustedlab;
1645c19800e8SDoug Rabson YYSTACK_RELOCATE (yyss);
1646c19800e8SDoug Rabson YYSTACK_RELOCATE (yyvs);
1647c19800e8SDoug Rabson
1648c19800e8SDoug Rabson # undef YYSTACK_RELOCATE
1649c19800e8SDoug Rabson if (yyss1 != yyssa)
1650c19800e8SDoug Rabson YYSTACK_FREE (yyss1);
1651c19800e8SDoug Rabson }
1652c19800e8SDoug Rabson # endif
1653c19800e8SDoug Rabson #endif /* no yyoverflow */
1654c19800e8SDoug Rabson
1655c19800e8SDoug Rabson yyssp = yyss + yysize - 1;
1656c19800e8SDoug Rabson yyvsp = yyvs + yysize - 1;
1657c19800e8SDoug Rabson
1658c19800e8SDoug Rabson
1659c19800e8SDoug Rabson YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1660c19800e8SDoug Rabson (unsigned long int) yystacksize));
1661c19800e8SDoug Rabson
1662c19800e8SDoug Rabson if (yyss + yystacksize - 1 <= yyssp)
1663c19800e8SDoug Rabson YYABORT;
1664c19800e8SDoug Rabson }
1665c19800e8SDoug Rabson
1666c19800e8SDoug Rabson YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1667c19800e8SDoug Rabson
1668c19800e8SDoug Rabson goto yybackup;
1669c19800e8SDoug Rabson
1670c19800e8SDoug Rabson /*-----------.
1671c19800e8SDoug Rabson | yybackup. |
1672c19800e8SDoug Rabson `-----------*/
1673c19800e8SDoug Rabson yybackup:
1674c19800e8SDoug Rabson
1675c19800e8SDoug Rabson /* Do appropriate processing given the current state. Read a
1676c19800e8SDoug Rabson look-ahead token if we need one and don't already have one. */
1677c19800e8SDoug Rabson
1678c19800e8SDoug Rabson /* First try to decide what to do without reference to look-ahead token. */
1679c19800e8SDoug Rabson yyn = yypact[yystate];
1680c19800e8SDoug Rabson if (yyn == YYPACT_NINF)
1681c19800e8SDoug Rabson goto yydefault;
1682c19800e8SDoug Rabson
1683c19800e8SDoug Rabson /* Not known => get a look-ahead token if don't already have one. */
1684c19800e8SDoug Rabson
1685c19800e8SDoug Rabson /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol. */
1686c19800e8SDoug Rabson if (yychar == YYEMPTY)
1687c19800e8SDoug Rabson {
1688c19800e8SDoug Rabson YYDPRINTF ((stderr, "Reading a token: "));
1689c19800e8SDoug Rabson yychar = YYLEX;
1690c19800e8SDoug Rabson }
1691c19800e8SDoug Rabson
1692c19800e8SDoug Rabson if (yychar <= YYEOF)
1693c19800e8SDoug Rabson {
1694c19800e8SDoug Rabson yychar = yytoken = YYEOF;
1695c19800e8SDoug Rabson YYDPRINTF ((stderr, "Now at end of input.\n"));
1696c19800e8SDoug Rabson }
1697c19800e8SDoug Rabson else
1698c19800e8SDoug Rabson {
1699c19800e8SDoug Rabson yytoken = YYTRANSLATE (yychar);
1700c19800e8SDoug Rabson YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
1701c19800e8SDoug Rabson }
1702c19800e8SDoug Rabson
1703c19800e8SDoug Rabson /* If the proper action on seeing token YYTOKEN is to reduce or to
1704c19800e8SDoug Rabson detect an error, take that action. */
1705c19800e8SDoug Rabson yyn += yytoken;
1706c19800e8SDoug Rabson if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1707c19800e8SDoug Rabson goto yydefault;
1708c19800e8SDoug Rabson yyn = yytable[yyn];
1709c19800e8SDoug Rabson if (yyn <= 0)
1710c19800e8SDoug Rabson {
1711c19800e8SDoug Rabson if (yyn == 0 || yyn == YYTABLE_NINF)
1712c19800e8SDoug Rabson goto yyerrlab;
1713c19800e8SDoug Rabson yyn = -yyn;
1714c19800e8SDoug Rabson goto yyreduce;
1715c19800e8SDoug Rabson }
1716c19800e8SDoug Rabson
1717c19800e8SDoug Rabson if (yyn == YYFINAL)
1718c19800e8SDoug Rabson YYACCEPT;
1719c19800e8SDoug Rabson
1720c19800e8SDoug Rabson /* Count tokens shifted since error; after three, turn off error
1721c19800e8SDoug Rabson status. */
1722c19800e8SDoug Rabson if (yyerrstatus)
1723c19800e8SDoug Rabson yyerrstatus--;
1724c19800e8SDoug Rabson
1725c19800e8SDoug Rabson /* Shift the look-ahead token. */
1726c19800e8SDoug Rabson YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
1727c19800e8SDoug Rabson
1728c19800e8SDoug Rabson /* Discard the shifted token unless it is eof. */
1729c19800e8SDoug Rabson if (yychar != YYEOF)
1730c19800e8SDoug Rabson yychar = YYEMPTY;
1731c19800e8SDoug Rabson
1732c19800e8SDoug Rabson yystate = yyn;
1733c19800e8SDoug Rabson *++yyvsp = yylval;
1734c19800e8SDoug Rabson
1735c19800e8SDoug Rabson goto yynewstate;
1736c19800e8SDoug Rabson
1737c19800e8SDoug Rabson
1738c19800e8SDoug Rabson /*-----------------------------------------------------------.
1739c19800e8SDoug Rabson | yydefault -- do the default action for the current state. |
1740c19800e8SDoug Rabson `-----------------------------------------------------------*/
1741c19800e8SDoug Rabson yydefault:
1742c19800e8SDoug Rabson yyn = yydefact[yystate];
1743c19800e8SDoug Rabson if (yyn == 0)
1744c19800e8SDoug Rabson goto yyerrlab;
1745c19800e8SDoug Rabson goto yyreduce;
1746c19800e8SDoug Rabson
1747c19800e8SDoug Rabson
1748c19800e8SDoug Rabson /*-----------------------------.
1749c19800e8SDoug Rabson | yyreduce -- Do a reduction. |
1750c19800e8SDoug Rabson `-----------------------------*/
1751c19800e8SDoug Rabson yyreduce:
1752c19800e8SDoug Rabson /* yyn is the number of a rule to reduce with. */
1753c19800e8SDoug Rabson yylen = yyr2[yyn];
1754c19800e8SDoug Rabson
1755c19800e8SDoug Rabson /* If YYLEN is nonzero, implement the default value of the action:
1756c19800e8SDoug Rabson `$$ = $1'.
1757c19800e8SDoug Rabson
1758c19800e8SDoug Rabson Otherwise, the following line sets YYVAL to garbage.
1759c19800e8SDoug Rabson This behavior is undocumented and Bison
1760c19800e8SDoug Rabson users should not rely upon it. Assigning to YYVAL
1761c19800e8SDoug Rabson unconditionally makes the parser a bit smaller, and it avoids a
1762c19800e8SDoug Rabson GCC warning that YYVAL may be used uninitialized. */
1763c19800e8SDoug Rabson yyval = yyvsp[1-yylen];
1764c19800e8SDoug Rabson
1765c19800e8SDoug Rabson
1766c19800e8SDoug Rabson YY_REDUCE_PRINT (yyn);
1767c19800e8SDoug Rabson switch (yyn)
1768c19800e8SDoug Rabson {
1769c19800e8SDoug Rabson case 3:
1770c19800e8SDoug Rabson #line 132 "ftpcmd.y"
1771c19800e8SDoug Rabson {
1772c19800e8SDoug Rabson fromname = (char *) 0;
1773c19800e8SDoug Rabson restart_point = (off_t) 0;
1774c19800e8SDoug Rabson }
1775c19800e8SDoug Rabson break;
1776c19800e8SDoug Rabson
1777c19800e8SDoug Rabson case 5:
1778c19800e8SDoug Rabson #line 141 "ftpcmd.y"
1779c19800e8SDoug Rabson {
1780c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i))
1781c19800e8SDoug Rabson user((yyvsp[(3) - (5)].s));
1782c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
1783c19800e8SDoug Rabson }
1784c19800e8SDoug Rabson break;
1785c19800e8SDoug Rabson
1786c19800e8SDoug Rabson case 6:
1787c19800e8SDoug Rabson #line 147 "ftpcmd.y"
1788c19800e8SDoug Rabson {
1789c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i))
1790c19800e8SDoug Rabson pass((yyvsp[(3) - (5)].s));
1791c19800e8SDoug Rabson memset ((yyvsp[(3) - (5)].s), 0, strlen((yyvsp[(3) - (5)].s)));
1792c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
1793c19800e8SDoug Rabson }
1794c19800e8SDoug Rabson break;
1795c19800e8SDoug Rabson
1796c19800e8SDoug Rabson case 7:
1797*ae771770SStanislav Sedov #line 155 "ftpcmd.y"
1798c19800e8SDoug Rabson {
1799c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i)) {
1800*ae771770SStanislav Sedov if (paranoid &&
1801*ae771770SStanislav Sedov (data_dest->sa_family != his_addr->sa_family ||
1802*ae771770SStanislav Sedov (socket_get_port(data_dest) < IPPORT_RESERVED) ||
1803*ae771770SStanislav Sedov memcmp(socket_get_address(data_dest),
1804*ae771770SStanislav Sedov socket_get_address(his_addr),
1805*ae771770SStanislav Sedov socket_addr_size(his_addr)) != 0)) {
1806*ae771770SStanislav Sedov usedefault = 1;
1807*ae771770SStanislav Sedov reply(500, "Illegal PORT range rejected.");
1808*ae771770SStanislav Sedov } else {
1809c19800e8SDoug Rabson usedefault = 0;
1810c19800e8SDoug Rabson if (pdata >= 0) {
1811c19800e8SDoug Rabson close(pdata);
1812c19800e8SDoug Rabson pdata = -1;
1813c19800e8SDoug Rabson }
1814c19800e8SDoug Rabson reply(200, "PORT command successful.");
1815c19800e8SDoug Rabson }
1816c19800e8SDoug Rabson }
1817*ae771770SStanislav Sedov }
1818c19800e8SDoug Rabson break;
1819c19800e8SDoug Rabson
1820c19800e8SDoug Rabson case 8:
1821*ae771770SStanislav Sedov #line 176 "ftpcmd.y"
1822c19800e8SDoug Rabson {
1823c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i))
1824c19800e8SDoug Rabson eprt ((yyvsp[(3) - (5)].s));
1825c19800e8SDoug Rabson free ((yyvsp[(3) - (5)].s));
1826c19800e8SDoug Rabson }
1827c19800e8SDoug Rabson break;
1828c19800e8SDoug Rabson
1829c19800e8SDoug Rabson case 9:
1830*ae771770SStanislav Sedov #line 182 "ftpcmd.y"
1831c19800e8SDoug Rabson {
1832c19800e8SDoug Rabson if((yyvsp[(3) - (3)].i))
1833c19800e8SDoug Rabson pasv ();
1834c19800e8SDoug Rabson }
1835c19800e8SDoug Rabson break;
1836c19800e8SDoug Rabson
1837c19800e8SDoug Rabson case 10:
1838*ae771770SStanislav Sedov #line 187 "ftpcmd.y"
1839c19800e8SDoug Rabson {
1840c19800e8SDoug Rabson if((yyvsp[(3) - (3)].i))
1841c19800e8SDoug Rabson epsv (NULL);
1842c19800e8SDoug Rabson }
1843c19800e8SDoug Rabson break;
1844c19800e8SDoug Rabson
1845c19800e8SDoug Rabson case 11:
1846*ae771770SStanislav Sedov #line 192 "ftpcmd.y"
1847c19800e8SDoug Rabson {
1848c19800e8SDoug Rabson if((yyvsp[(5) - (5)].i))
1849c19800e8SDoug Rabson epsv ((yyvsp[(3) - (5)].s));
1850c19800e8SDoug Rabson free ((yyvsp[(3) - (5)].s));
1851c19800e8SDoug Rabson }
1852c19800e8SDoug Rabson break;
1853c19800e8SDoug Rabson
1854c19800e8SDoug Rabson case 12:
1855*ae771770SStanislav Sedov #line 198 "ftpcmd.y"
1856c19800e8SDoug Rabson {
1857c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i)) {
1858c19800e8SDoug Rabson switch (cmd_type) {
1859c19800e8SDoug Rabson
1860c19800e8SDoug Rabson case TYPE_A:
1861c19800e8SDoug Rabson if (cmd_form == FORM_N) {
1862c19800e8SDoug Rabson reply(200, "Type set to A.");
1863c19800e8SDoug Rabson type = cmd_type;
1864c19800e8SDoug Rabson form = cmd_form;
1865c19800e8SDoug Rabson } else
1866c19800e8SDoug Rabson reply(504, "Form must be N.");
1867c19800e8SDoug Rabson break;
1868c19800e8SDoug Rabson
1869c19800e8SDoug Rabson case TYPE_E:
1870c19800e8SDoug Rabson reply(504, "Type E not implemented.");
1871c19800e8SDoug Rabson break;
1872c19800e8SDoug Rabson
1873c19800e8SDoug Rabson case TYPE_I:
1874c19800e8SDoug Rabson reply(200, "Type set to I.");
1875c19800e8SDoug Rabson type = cmd_type;
1876c19800e8SDoug Rabson break;
1877c19800e8SDoug Rabson
1878c19800e8SDoug Rabson case TYPE_L:
1879c19800e8SDoug Rabson #if NBBY == 8
1880c19800e8SDoug Rabson if (cmd_bytesz == 8) {
1881c19800e8SDoug Rabson reply(200,
1882c19800e8SDoug Rabson "Type set to L (byte size 8).");
1883c19800e8SDoug Rabson type = cmd_type;
1884c19800e8SDoug Rabson } else
1885c19800e8SDoug Rabson reply(504, "Byte size must be 8.");
1886c19800e8SDoug Rabson #else /* NBBY == 8 */
1887c19800e8SDoug Rabson UNIMPLEMENTED for NBBY != 8
1888c19800e8SDoug Rabson #endif /* NBBY == 8 */
1889c19800e8SDoug Rabson }
1890c19800e8SDoug Rabson }
1891c19800e8SDoug Rabson }
1892c19800e8SDoug Rabson break;
1893c19800e8SDoug Rabson
1894c19800e8SDoug Rabson case 13:
1895*ae771770SStanislav Sedov #line 235 "ftpcmd.y"
1896c19800e8SDoug Rabson {
1897c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i)) {
1898c19800e8SDoug Rabson switch ((yyvsp[(3) - (5)].i)) {
1899c19800e8SDoug Rabson
1900c19800e8SDoug Rabson case STRU_F:
1901c19800e8SDoug Rabson reply(200, "STRU F ok.");
1902c19800e8SDoug Rabson break;
1903c19800e8SDoug Rabson
1904c19800e8SDoug Rabson default:
1905c19800e8SDoug Rabson reply(504, "Unimplemented STRU type.");
1906c19800e8SDoug Rabson }
1907c19800e8SDoug Rabson }
1908c19800e8SDoug Rabson }
1909c19800e8SDoug Rabson break;
1910c19800e8SDoug Rabson
1911c19800e8SDoug Rabson case 14:
1912*ae771770SStanislav Sedov #line 249 "ftpcmd.y"
1913c19800e8SDoug Rabson {
1914c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i)) {
1915c19800e8SDoug Rabson switch ((yyvsp[(3) - (5)].i)) {
1916c19800e8SDoug Rabson
1917c19800e8SDoug Rabson case MODE_S:
1918c19800e8SDoug Rabson reply(200, "MODE S ok.");
1919c19800e8SDoug Rabson break;
1920c19800e8SDoug Rabson
1921c19800e8SDoug Rabson default:
1922c19800e8SDoug Rabson reply(502, "Unimplemented MODE type.");
1923c19800e8SDoug Rabson }
1924c19800e8SDoug Rabson }
1925c19800e8SDoug Rabson }
1926c19800e8SDoug Rabson break;
1927c19800e8SDoug Rabson
1928c19800e8SDoug Rabson case 15:
1929*ae771770SStanislav Sedov #line 263 "ftpcmd.y"
1930c19800e8SDoug Rabson {
1931c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i)) {
1932c19800e8SDoug Rabson reply(202, "ALLO command ignored.");
1933c19800e8SDoug Rabson }
1934c19800e8SDoug Rabson }
1935c19800e8SDoug Rabson break;
1936c19800e8SDoug Rabson
1937c19800e8SDoug Rabson case 16:
1938*ae771770SStanislav Sedov #line 269 "ftpcmd.y"
1939c19800e8SDoug Rabson {
1940c19800e8SDoug Rabson if ((yyvsp[(9) - (9)].i)) {
1941c19800e8SDoug Rabson reply(202, "ALLO command ignored.");
1942c19800e8SDoug Rabson }
1943c19800e8SDoug Rabson }
1944c19800e8SDoug Rabson break;
1945c19800e8SDoug Rabson
1946c19800e8SDoug Rabson case 17:
1947*ae771770SStanislav Sedov #line 275 "ftpcmd.y"
1948c19800e8SDoug Rabson {
1949c19800e8SDoug Rabson char *name = (yyvsp[(3) - (5)].s);
1950c19800e8SDoug Rabson
1951c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && name != NULL)
1952c19800e8SDoug Rabson retrieve(0, name);
1953c19800e8SDoug Rabson if (name != NULL)
1954c19800e8SDoug Rabson free(name);
1955c19800e8SDoug Rabson }
1956c19800e8SDoug Rabson break;
1957c19800e8SDoug Rabson
1958c19800e8SDoug Rabson case 18:
1959*ae771770SStanislav Sedov #line 284 "ftpcmd.y"
1960c19800e8SDoug Rabson {
1961c19800e8SDoug Rabson char *name = (yyvsp[(3) - (5)].s);
1962c19800e8SDoug Rabson
1963c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && name != NULL)
1964c19800e8SDoug Rabson do_store(name, "w", 0);
1965c19800e8SDoug Rabson if (name != NULL)
1966c19800e8SDoug Rabson free(name);
1967c19800e8SDoug Rabson }
1968c19800e8SDoug Rabson break;
1969c19800e8SDoug Rabson
1970c19800e8SDoug Rabson case 19:
1971*ae771770SStanislav Sedov #line 293 "ftpcmd.y"
1972c19800e8SDoug Rabson {
1973c19800e8SDoug Rabson char *name = (yyvsp[(3) - (5)].s);
1974c19800e8SDoug Rabson
1975c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && name != NULL)
1976c19800e8SDoug Rabson do_store(name, "a", 0);
1977c19800e8SDoug Rabson if (name != NULL)
1978c19800e8SDoug Rabson free(name);
1979c19800e8SDoug Rabson }
1980c19800e8SDoug Rabson break;
1981c19800e8SDoug Rabson
1982c19800e8SDoug Rabson case 20:
1983*ae771770SStanislav Sedov #line 302 "ftpcmd.y"
1984c19800e8SDoug Rabson {
1985c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i))
1986c19800e8SDoug Rabson send_file_list(".");
1987c19800e8SDoug Rabson }
1988c19800e8SDoug Rabson break;
1989c19800e8SDoug Rabson
1990c19800e8SDoug Rabson case 21:
1991*ae771770SStanislav Sedov #line 307 "ftpcmd.y"
1992c19800e8SDoug Rabson {
1993c19800e8SDoug Rabson char *name = (yyvsp[(3) - (5)].s);
1994c19800e8SDoug Rabson
1995c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && name != NULL)
1996c19800e8SDoug Rabson send_file_list(name);
1997c19800e8SDoug Rabson if (name != NULL)
1998c19800e8SDoug Rabson free(name);
1999c19800e8SDoug Rabson }
2000c19800e8SDoug Rabson break;
2001c19800e8SDoug Rabson
2002c19800e8SDoug Rabson case 22:
2003*ae771770SStanislav Sedov #line 316 "ftpcmd.y"
2004c19800e8SDoug Rabson {
2005c19800e8SDoug Rabson if((yyvsp[(3) - (3)].i))
2006c19800e8SDoug Rabson list_file(".");
2007c19800e8SDoug Rabson }
2008c19800e8SDoug Rabson break;
2009c19800e8SDoug Rabson
2010c19800e8SDoug Rabson case 23:
2011*ae771770SStanislav Sedov #line 321 "ftpcmd.y"
2012c19800e8SDoug Rabson {
2013c19800e8SDoug Rabson if((yyvsp[(5) - (5)].i))
2014c19800e8SDoug Rabson list_file((yyvsp[(3) - (5)].s));
2015c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2016c19800e8SDoug Rabson }
2017c19800e8SDoug Rabson break;
2018c19800e8SDoug Rabson
2019c19800e8SDoug Rabson case 24:
2020*ae771770SStanislav Sedov #line 327 "ftpcmd.y"
2021c19800e8SDoug Rabson {
2022c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2023c19800e8SDoug Rabson statfilecmd((yyvsp[(3) - (5)].s));
2024c19800e8SDoug Rabson if ((yyvsp[(3) - (5)].s) != NULL)
2025c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2026c19800e8SDoug Rabson }
2027c19800e8SDoug Rabson break;
2028c19800e8SDoug Rabson
2029c19800e8SDoug Rabson case 25:
2030*ae771770SStanislav Sedov #line 334 "ftpcmd.y"
2031c19800e8SDoug Rabson {
2032c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i))
2033c19800e8SDoug Rabson statcmd();
2034c19800e8SDoug Rabson }
2035c19800e8SDoug Rabson break;
2036c19800e8SDoug Rabson
2037c19800e8SDoug Rabson case 26:
2038*ae771770SStanislav Sedov #line 339 "ftpcmd.y"
2039c19800e8SDoug Rabson {
2040c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2041c19800e8SDoug Rabson do_delete((yyvsp[(3) - (5)].s));
2042c19800e8SDoug Rabson if ((yyvsp[(3) - (5)].s) != NULL)
2043c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2044c19800e8SDoug Rabson }
2045c19800e8SDoug Rabson break;
2046c19800e8SDoug Rabson
2047c19800e8SDoug Rabson case 27:
2048*ae771770SStanislav Sedov #line 346 "ftpcmd.y"
2049c19800e8SDoug Rabson {
2050c19800e8SDoug Rabson if((yyvsp[(5) - (5)].i)){
2051c19800e8SDoug Rabson if (fromname) {
2052c19800e8SDoug Rabson renamecmd(fromname, (yyvsp[(3) - (5)].s));
2053c19800e8SDoug Rabson free(fromname);
2054c19800e8SDoug Rabson fromname = (char *) 0;
2055c19800e8SDoug Rabson } else {
2056c19800e8SDoug Rabson reply(503, "Bad sequence of commands.");
2057c19800e8SDoug Rabson }
2058c19800e8SDoug Rabson }
2059c19800e8SDoug Rabson if ((yyvsp[(3) - (5)].s) != NULL)
2060c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2061c19800e8SDoug Rabson }
2062c19800e8SDoug Rabson break;
2063c19800e8SDoug Rabson
2064c19800e8SDoug Rabson case 28:
2065*ae771770SStanislav Sedov #line 360 "ftpcmd.y"
2066c19800e8SDoug Rabson {
2067c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i))
2068c19800e8SDoug Rabson reply(225, "ABOR command successful.");
2069c19800e8SDoug Rabson }
2070c19800e8SDoug Rabson break;
2071c19800e8SDoug Rabson
2072c19800e8SDoug Rabson case 29:
2073*ae771770SStanislav Sedov #line 365 "ftpcmd.y"
2074c19800e8SDoug Rabson {
2075*ae771770SStanislav Sedov if ((yyvsp[(3) - (3)].i)) {
2076*ae771770SStanislav Sedov const char *path = pw->pw_dir;
2077*ae771770SStanislav Sedov if (dochroot || guest)
2078*ae771770SStanislav Sedov path = "/";
2079*ae771770SStanislav Sedov cwd(path);
2080*ae771770SStanislav Sedov }
2081c19800e8SDoug Rabson }
2082c19800e8SDoug Rabson break;
2083c19800e8SDoug Rabson
2084c19800e8SDoug Rabson case 30:
2085*ae771770SStanislav Sedov #line 374 "ftpcmd.y"
2086c19800e8SDoug Rabson {
2087c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2088c19800e8SDoug Rabson cwd((yyvsp[(3) - (5)].s));
2089c19800e8SDoug Rabson if ((yyvsp[(3) - (5)].s) != NULL)
2090c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2091c19800e8SDoug Rabson }
2092c19800e8SDoug Rabson break;
2093c19800e8SDoug Rabson
2094c19800e8SDoug Rabson case 31:
2095*ae771770SStanislav Sedov #line 381 "ftpcmd.y"
2096c19800e8SDoug Rabson {
2097c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i))
2098c19800e8SDoug Rabson help(cmdtab, (char *) 0);
2099c19800e8SDoug Rabson }
2100c19800e8SDoug Rabson break;
2101c19800e8SDoug Rabson
2102c19800e8SDoug Rabson case 32:
2103*ae771770SStanislav Sedov #line 386 "ftpcmd.y"
2104c19800e8SDoug Rabson {
2105c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i)) {
2106c19800e8SDoug Rabson char *cp = (yyvsp[(3) - (5)].s);
2107c19800e8SDoug Rabson
2108c19800e8SDoug Rabson if (strncasecmp(cp, "SITE", 4) == 0) {
2109c19800e8SDoug Rabson cp = (yyvsp[(3) - (5)].s) + 4;
2110c19800e8SDoug Rabson if (*cp == ' ')
2111c19800e8SDoug Rabson cp++;
2112c19800e8SDoug Rabson if (*cp)
2113c19800e8SDoug Rabson help(sitetab, cp);
2114c19800e8SDoug Rabson else
2115c19800e8SDoug Rabson help(sitetab, (char *) 0);
2116c19800e8SDoug Rabson } else
2117c19800e8SDoug Rabson help(cmdtab, (yyvsp[(3) - (5)].s));
2118c19800e8SDoug Rabson }
2119c19800e8SDoug Rabson }
2120c19800e8SDoug Rabson break;
2121c19800e8SDoug Rabson
2122c19800e8SDoug Rabson case 33:
2123*ae771770SStanislav Sedov #line 403 "ftpcmd.y"
2124c19800e8SDoug Rabson {
2125c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i))
2126c19800e8SDoug Rabson reply(200, "NOOP command successful.");
2127c19800e8SDoug Rabson }
2128c19800e8SDoug Rabson break;
2129c19800e8SDoug Rabson
2130c19800e8SDoug Rabson case 34:
2131*ae771770SStanislav Sedov #line 408 "ftpcmd.y"
2132c19800e8SDoug Rabson {
2133c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2134c19800e8SDoug Rabson makedir((yyvsp[(3) - (5)].s));
2135c19800e8SDoug Rabson if ((yyvsp[(3) - (5)].s) != NULL)
2136c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2137c19800e8SDoug Rabson }
2138c19800e8SDoug Rabson break;
2139c19800e8SDoug Rabson
2140c19800e8SDoug Rabson case 35:
2141*ae771770SStanislav Sedov #line 415 "ftpcmd.y"
2142c19800e8SDoug Rabson {
2143c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2144c19800e8SDoug Rabson removedir((yyvsp[(3) - (5)].s));
2145c19800e8SDoug Rabson if ((yyvsp[(3) - (5)].s) != NULL)
2146c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2147c19800e8SDoug Rabson }
2148c19800e8SDoug Rabson break;
2149c19800e8SDoug Rabson
2150c19800e8SDoug Rabson case 36:
2151*ae771770SStanislav Sedov #line 422 "ftpcmd.y"
2152c19800e8SDoug Rabson {
2153c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i))
2154c19800e8SDoug Rabson pwd();
2155c19800e8SDoug Rabson }
2156c19800e8SDoug Rabson break;
2157c19800e8SDoug Rabson
2158c19800e8SDoug Rabson case 37:
2159*ae771770SStanislav Sedov #line 427 "ftpcmd.y"
2160c19800e8SDoug Rabson {
2161c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i))
2162c19800e8SDoug Rabson cwd("..");
2163c19800e8SDoug Rabson }
2164c19800e8SDoug Rabson break;
2165c19800e8SDoug Rabson
2166c19800e8SDoug Rabson case 38:
2167*ae771770SStanislav Sedov #line 432 "ftpcmd.y"
2168c19800e8SDoug Rabson {
2169c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i)) {
2170c19800e8SDoug Rabson lreply(211, "Supported features:");
2171c19800e8SDoug Rabson lreply(0, " MDTM");
2172c19800e8SDoug Rabson lreply(0, " REST STREAM");
2173c19800e8SDoug Rabson lreply(0, " SIZE");
2174c19800e8SDoug Rabson reply(211, "End");
2175c19800e8SDoug Rabson }
2176c19800e8SDoug Rabson }
2177c19800e8SDoug Rabson break;
2178c19800e8SDoug Rabson
2179c19800e8SDoug Rabson case 39:
2180*ae771770SStanislav Sedov #line 442 "ftpcmd.y"
2181c19800e8SDoug Rabson {
2182c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i))
2183c19800e8SDoug Rabson reply(501, "Bad options");
2184c19800e8SDoug Rabson free ((yyvsp[(3) - (5)].s));
2185c19800e8SDoug Rabson }
2186c19800e8SDoug Rabson break;
2187c19800e8SDoug Rabson
2188c19800e8SDoug Rabson case 40:
2189*ae771770SStanislav Sedov #line 449 "ftpcmd.y"
2190c19800e8SDoug Rabson {
2191c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i))
2192c19800e8SDoug Rabson help(sitetab, (char *) 0);
2193c19800e8SDoug Rabson }
2194c19800e8SDoug Rabson break;
2195c19800e8SDoug Rabson
2196c19800e8SDoug Rabson case 41:
2197*ae771770SStanislav Sedov #line 454 "ftpcmd.y"
2198c19800e8SDoug Rabson {
2199c19800e8SDoug Rabson if ((yyvsp[(7) - (7)].i))
2200c19800e8SDoug Rabson help(sitetab, (yyvsp[(5) - (7)].s));
2201c19800e8SDoug Rabson }
2202c19800e8SDoug Rabson break;
2203c19800e8SDoug Rabson
2204c19800e8SDoug Rabson case 42:
2205*ae771770SStanislav Sedov #line 459 "ftpcmd.y"
2206c19800e8SDoug Rabson {
2207c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i)) {
2208c19800e8SDoug Rabson int oldmask = umask(0);
2209c19800e8SDoug Rabson umask(oldmask);
2210c19800e8SDoug Rabson reply(200, "Current UMASK is %03o", oldmask);
2211c19800e8SDoug Rabson }
2212c19800e8SDoug Rabson }
2213c19800e8SDoug Rabson break;
2214c19800e8SDoug Rabson
2215c19800e8SDoug Rabson case 43:
2216*ae771770SStanislav Sedov #line 467 "ftpcmd.y"
2217c19800e8SDoug Rabson {
2218c19800e8SDoug Rabson if ((yyvsp[(7) - (7)].i)) {
2219c19800e8SDoug Rabson if (((yyvsp[(5) - (7)].i) == -1) || ((yyvsp[(5) - (7)].i) > 0777)) {
2220c19800e8SDoug Rabson reply(501, "Bad UMASK value");
2221c19800e8SDoug Rabson } else {
2222c19800e8SDoug Rabson int oldmask = umask((yyvsp[(5) - (7)].i));
2223c19800e8SDoug Rabson reply(200,
2224c19800e8SDoug Rabson "UMASK set to %03o (was %03o)",
2225c19800e8SDoug Rabson (yyvsp[(5) - (7)].i), oldmask);
2226c19800e8SDoug Rabson }
2227c19800e8SDoug Rabson }
2228c19800e8SDoug Rabson }
2229c19800e8SDoug Rabson break;
2230c19800e8SDoug Rabson
2231c19800e8SDoug Rabson case 44:
2232*ae771770SStanislav Sedov #line 480 "ftpcmd.y"
2233c19800e8SDoug Rabson {
2234c19800e8SDoug Rabson if ((yyvsp[(9) - (9)].i) && (yyvsp[(7) - (9)].s) != NULL) {
2235c19800e8SDoug Rabson if ((yyvsp[(5) - (9)].i) > 0777)
2236c19800e8SDoug Rabson reply(501,
2237c19800e8SDoug Rabson "CHMOD: Mode value must be between 0 and 0777");
2238c19800e8SDoug Rabson else if (chmod((yyvsp[(7) - (9)].s), (yyvsp[(5) - (9)].i)) < 0)
2239c19800e8SDoug Rabson perror_reply(550, (yyvsp[(7) - (9)].s));
2240c19800e8SDoug Rabson else
2241c19800e8SDoug Rabson reply(200, "CHMOD command successful.");
2242c19800e8SDoug Rabson }
2243c19800e8SDoug Rabson if ((yyvsp[(7) - (9)].s) != NULL)
2244c19800e8SDoug Rabson free((yyvsp[(7) - (9)].s));
2245c19800e8SDoug Rabson }
2246c19800e8SDoug Rabson break;
2247c19800e8SDoug Rabson
2248c19800e8SDoug Rabson case 45:
2249*ae771770SStanislav Sedov #line 494 "ftpcmd.y"
2250c19800e8SDoug Rabson {
2251c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i))
2252c19800e8SDoug Rabson reply(200,
2253c19800e8SDoug Rabson "Current IDLE time limit is %d seconds; max %d",
2254c19800e8SDoug Rabson ftpd_timeout, maxtimeout);
2255c19800e8SDoug Rabson }
2256c19800e8SDoug Rabson break;
2257c19800e8SDoug Rabson
2258c19800e8SDoug Rabson case 46:
2259*ae771770SStanislav Sedov #line 501 "ftpcmd.y"
2260c19800e8SDoug Rabson {
2261c19800e8SDoug Rabson if ((yyvsp[(7) - (7)].i)) {
2262c19800e8SDoug Rabson if ((yyvsp[(5) - (7)].i) < 30 || (yyvsp[(5) - (7)].i) > maxtimeout) {
2263c19800e8SDoug Rabson reply(501,
2264c19800e8SDoug Rabson "Maximum IDLE time must be between 30 and %d seconds",
2265c19800e8SDoug Rabson maxtimeout);
2266c19800e8SDoug Rabson } else {
2267c19800e8SDoug Rabson ftpd_timeout = (yyvsp[(5) - (7)].i);
2268c19800e8SDoug Rabson alarm((unsigned) ftpd_timeout);
2269c19800e8SDoug Rabson reply(200,
2270c19800e8SDoug Rabson "Maximum IDLE time set to %d seconds",
2271c19800e8SDoug Rabson ftpd_timeout);
2272c19800e8SDoug Rabson }
2273c19800e8SDoug Rabson }
2274c19800e8SDoug Rabson }
2275c19800e8SDoug Rabson break;
2276c19800e8SDoug Rabson
2277c19800e8SDoug Rabson case 47:
2278*ae771770SStanislav Sedov #line 518 "ftpcmd.y"
2279c19800e8SDoug Rabson {
2280c19800e8SDoug Rabson reply(500, "Command not implemented.");
2281c19800e8SDoug Rabson }
2282c19800e8SDoug Rabson break;
2283c19800e8SDoug Rabson
2284c19800e8SDoug Rabson case 48:
2285*ae771770SStanislav Sedov #line 522 "ftpcmd.y"
2286c19800e8SDoug Rabson {
2287c19800e8SDoug Rabson if((yyvsp[(5) - (5)].i))
2288c19800e8SDoug Rabson klist();
2289c19800e8SDoug Rabson }
2290c19800e8SDoug Rabson break;
2291c19800e8SDoug Rabson
2292c19800e8SDoug Rabson case 49:
2293*ae771770SStanislav Sedov #line 527 "ftpcmd.y"
2294c19800e8SDoug Rabson {
2295c19800e8SDoug Rabson reply(500, "Command not implemented.");
2296c19800e8SDoug Rabson }
2297c19800e8SDoug Rabson break;
2298c19800e8SDoug Rabson
2299c19800e8SDoug Rabson case 50:
2300*ae771770SStanislav Sedov #line 531 "ftpcmd.y"
2301c19800e8SDoug Rabson {
2302c19800e8SDoug Rabson reply(500, "Command not implemented.");
2303c19800e8SDoug Rabson }
2304c19800e8SDoug Rabson break;
2305c19800e8SDoug Rabson
2306c19800e8SDoug Rabson case 51:
2307*ae771770SStanislav Sedov #line 535 "ftpcmd.y"
2308c19800e8SDoug Rabson {
2309*ae771770SStanislav Sedov #if defined(KRB5)
2310c19800e8SDoug Rabson if(guest)
2311c19800e8SDoug Rabson reply(500, "Can't be done as guest.");
2312c19800e8SDoug Rabson else if((yyvsp[(5) - (5)].i))
2313c19800e8SDoug Rabson afslog(NULL, 0);
2314c19800e8SDoug Rabson #else
2315c19800e8SDoug Rabson reply(500, "Command not implemented.");
2316c19800e8SDoug Rabson #endif
2317c19800e8SDoug Rabson }
2318c19800e8SDoug Rabson break;
2319c19800e8SDoug Rabson
2320c19800e8SDoug Rabson case 52:
2321*ae771770SStanislav Sedov #line 546 "ftpcmd.y"
2322c19800e8SDoug Rabson {
2323*ae771770SStanislav Sedov #if defined(KRB5)
2324c19800e8SDoug Rabson if(guest)
2325c19800e8SDoug Rabson reply(500, "Can't be done as guest.");
2326c19800e8SDoug Rabson else if((yyvsp[(7) - (7)].i))
2327c19800e8SDoug Rabson afslog((yyvsp[(5) - (7)].s), 0);
2328c19800e8SDoug Rabson if((yyvsp[(5) - (7)].s))
2329c19800e8SDoug Rabson free((yyvsp[(5) - (7)].s));
2330c19800e8SDoug Rabson #else
2331c19800e8SDoug Rabson reply(500, "Command not implemented.");
2332c19800e8SDoug Rabson #endif
2333c19800e8SDoug Rabson }
2334c19800e8SDoug Rabson break;
2335c19800e8SDoug Rabson
2336c19800e8SDoug Rabson case 53:
2337*ae771770SStanislav Sedov #line 559 "ftpcmd.y"
2338c19800e8SDoug Rabson {
2339c19800e8SDoug Rabson if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL)
2340c19800e8SDoug Rabson find((yyvsp[(5) - (7)].s));
2341c19800e8SDoug Rabson if((yyvsp[(5) - (7)].s) != NULL)
2342c19800e8SDoug Rabson free((yyvsp[(5) - (7)].s));
2343c19800e8SDoug Rabson }
2344c19800e8SDoug Rabson break;
2345c19800e8SDoug Rabson
2346c19800e8SDoug Rabson case 54:
2347*ae771770SStanislav Sedov #line 566 "ftpcmd.y"
2348c19800e8SDoug Rabson {
2349c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i))
2350c19800e8SDoug Rabson reply(200, "http://www.pdc.kth.se/heimdal/");
2351c19800e8SDoug Rabson }
2352c19800e8SDoug Rabson break;
2353c19800e8SDoug Rabson
2354c19800e8SDoug Rabson case 55:
2355*ae771770SStanislav Sedov #line 571 "ftpcmd.y"
2356c19800e8SDoug Rabson {
2357c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2358c19800e8SDoug Rabson do_store((yyvsp[(3) - (5)].s), "w", 1);
2359c19800e8SDoug Rabson if ((yyvsp[(3) - (5)].s) != NULL)
2360c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2361c19800e8SDoug Rabson }
2362c19800e8SDoug Rabson break;
2363c19800e8SDoug Rabson
2364c19800e8SDoug Rabson case 56:
2365*ae771770SStanislav Sedov #line 578 "ftpcmd.y"
2366c19800e8SDoug Rabson {
2367c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i)) {
2368c19800e8SDoug Rabson #if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__)
2369c19800e8SDoug Rabson reply(215, "UNIX Type: L%d", NBBY);
2370c19800e8SDoug Rabson #else
2371c19800e8SDoug Rabson reply(215, "UNKNOWN Type: L%d", NBBY);
2372c19800e8SDoug Rabson #endif
2373c19800e8SDoug Rabson }
2374c19800e8SDoug Rabson }
2375c19800e8SDoug Rabson break;
2376c19800e8SDoug Rabson
2377c19800e8SDoug Rabson case 57:
2378*ae771770SStanislav Sedov #line 596 "ftpcmd.y"
2379c19800e8SDoug Rabson {
2380c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2381c19800e8SDoug Rabson sizecmd((yyvsp[(3) - (5)].s));
2382c19800e8SDoug Rabson if ((yyvsp[(3) - (5)].s) != NULL)
2383c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2384c19800e8SDoug Rabson }
2385c19800e8SDoug Rabson break;
2386c19800e8SDoug Rabson
2387c19800e8SDoug Rabson case 58:
2388*ae771770SStanislav Sedov #line 613 "ftpcmd.y"
2389c19800e8SDoug Rabson {
2390c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) {
2391c19800e8SDoug Rabson struct stat stbuf;
2392c19800e8SDoug Rabson if (stat((yyvsp[(3) - (5)].s), &stbuf) < 0)
2393c19800e8SDoug Rabson reply(550, "%s: %s",
2394c19800e8SDoug Rabson (yyvsp[(3) - (5)].s), strerror(errno));
2395c19800e8SDoug Rabson else if (!S_ISREG(stbuf.st_mode)) {
2396c19800e8SDoug Rabson reply(550,
2397c19800e8SDoug Rabson "%s: not a plain file.", (yyvsp[(3) - (5)].s));
2398c19800e8SDoug Rabson } else {
2399c19800e8SDoug Rabson struct tm *t;
2400c19800e8SDoug Rabson time_t mtime = stbuf.st_mtime;
2401c19800e8SDoug Rabson
2402c19800e8SDoug Rabson t = gmtime(&mtime);
2403c19800e8SDoug Rabson reply(213,
2404c19800e8SDoug Rabson "%04d%02d%02d%02d%02d%02d",
2405c19800e8SDoug Rabson t->tm_year + 1900,
2406c19800e8SDoug Rabson t->tm_mon + 1,
2407c19800e8SDoug Rabson t->tm_mday,
2408c19800e8SDoug Rabson t->tm_hour,
2409c19800e8SDoug Rabson t->tm_min,
2410c19800e8SDoug Rabson t->tm_sec);
2411c19800e8SDoug Rabson }
2412c19800e8SDoug Rabson }
2413c19800e8SDoug Rabson if ((yyvsp[(3) - (5)].s) != NULL)
2414c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2415c19800e8SDoug Rabson }
2416c19800e8SDoug Rabson break;
2417c19800e8SDoug Rabson
2418c19800e8SDoug Rabson case 59:
2419*ae771770SStanislav Sedov #line 641 "ftpcmd.y"
2420c19800e8SDoug Rabson {
2421c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i)) {
2422c19800e8SDoug Rabson reply(221, "Goodbye.");
2423c19800e8SDoug Rabson dologout(0);
2424c19800e8SDoug Rabson }
2425c19800e8SDoug Rabson }
2426c19800e8SDoug Rabson break;
2427c19800e8SDoug Rabson
2428c19800e8SDoug Rabson case 60:
2429*ae771770SStanislav Sedov #line 648 "ftpcmd.y"
2430c19800e8SDoug Rabson {
2431c19800e8SDoug Rabson yyerrok;
2432c19800e8SDoug Rabson }
2433c19800e8SDoug Rabson break;
2434c19800e8SDoug Rabson
2435c19800e8SDoug Rabson case 61:
2436*ae771770SStanislav Sedov #line 654 "ftpcmd.y"
2437c19800e8SDoug Rabson {
2438c19800e8SDoug Rabson restart_point = (off_t) 0;
2439c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s)) {
2440c19800e8SDoug Rabson fromname = renamefrom((yyvsp[(3) - (5)].s));
2441c19800e8SDoug Rabson if (fromname == (char *) 0 && (yyvsp[(3) - (5)].s)) {
2442c19800e8SDoug Rabson free((yyvsp[(3) - (5)].s));
2443c19800e8SDoug Rabson }
2444c19800e8SDoug Rabson }
2445c19800e8SDoug Rabson }
2446c19800e8SDoug Rabson break;
2447c19800e8SDoug Rabson
2448c19800e8SDoug Rabson case 62:
2449*ae771770SStanislav Sedov #line 664 "ftpcmd.y"
2450c19800e8SDoug Rabson {
2451c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i)) {
2452c19800e8SDoug Rabson fromname = (char *) 0;
2453c19800e8SDoug Rabson restart_point = (yyvsp[(3) - (5)].i); /* XXX $3 is only "int" */
2454c19800e8SDoug Rabson reply(350, "Restarting at %ld. %s",
2455c19800e8SDoug Rabson (long)restart_point,
2456c19800e8SDoug Rabson "Send STORE or RETRIEVE to initiate transfer.");
2457c19800e8SDoug Rabson }
2458c19800e8SDoug Rabson }
2459c19800e8SDoug Rabson break;
2460c19800e8SDoug Rabson
2461c19800e8SDoug Rabson case 63:
2462*ae771770SStanislav Sedov #line 674 "ftpcmd.y"
2463c19800e8SDoug Rabson {
2464c19800e8SDoug Rabson auth((yyvsp[(3) - (4)].s));
2465c19800e8SDoug Rabson free((yyvsp[(3) - (4)].s));
2466c19800e8SDoug Rabson }
2467c19800e8SDoug Rabson break;
2468c19800e8SDoug Rabson
2469c19800e8SDoug Rabson case 64:
2470*ae771770SStanislav Sedov #line 679 "ftpcmd.y"
2471c19800e8SDoug Rabson {
2472c19800e8SDoug Rabson adat((yyvsp[(3) - (4)].s));
2473c19800e8SDoug Rabson free((yyvsp[(3) - (4)].s));
2474c19800e8SDoug Rabson }
2475c19800e8SDoug Rabson break;
2476c19800e8SDoug Rabson
2477c19800e8SDoug Rabson case 65:
2478*ae771770SStanislav Sedov #line 684 "ftpcmd.y"
2479c19800e8SDoug Rabson {
2480c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i))
2481c19800e8SDoug Rabson pbsz((yyvsp[(3) - (5)].i));
2482c19800e8SDoug Rabson }
2483c19800e8SDoug Rabson break;
2484c19800e8SDoug Rabson
2485c19800e8SDoug Rabson case 66:
2486*ae771770SStanislav Sedov #line 689 "ftpcmd.y"
2487c19800e8SDoug Rabson {
2488c19800e8SDoug Rabson if ((yyvsp[(5) - (5)].i))
2489c19800e8SDoug Rabson prot((yyvsp[(3) - (5)].s));
2490c19800e8SDoug Rabson }
2491c19800e8SDoug Rabson break;
2492c19800e8SDoug Rabson
2493c19800e8SDoug Rabson case 67:
2494*ae771770SStanislav Sedov #line 694 "ftpcmd.y"
2495c19800e8SDoug Rabson {
2496c19800e8SDoug Rabson if ((yyvsp[(3) - (3)].i))
2497c19800e8SDoug Rabson ccc();
2498c19800e8SDoug Rabson }
2499c19800e8SDoug Rabson break;
2500c19800e8SDoug Rabson
2501c19800e8SDoug Rabson case 68:
2502*ae771770SStanislav Sedov #line 699 "ftpcmd.y"
2503c19800e8SDoug Rabson {
2504c19800e8SDoug Rabson mec((yyvsp[(3) - (4)].s), prot_safe);
2505c19800e8SDoug Rabson free((yyvsp[(3) - (4)].s));
2506c19800e8SDoug Rabson }
2507c19800e8SDoug Rabson break;
2508c19800e8SDoug Rabson
2509c19800e8SDoug Rabson case 69:
2510*ae771770SStanislav Sedov #line 704 "ftpcmd.y"
2511c19800e8SDoug Rabson {
2512c19800e8SDoug Rabson mec((yyvsp[(3) - (4)].s), prot_confidential);
2513c19800e8SDoug Rabson free((yyvsp[(3) - (4)].s));
2514c19800e8SDoug Rabson }
2515c19800e8SDoug Rabson break;
2516c19800e8SDoug Rabson
2517c19800e8SDoug Rabson case 70:
2518*ae771770SStanislav Sedov #line 709 "ftpcmd.y"
2519c19800e8SDoug Rabson {
2520c19800e8SDoug Rabson mec((yyvsp[(3) - (4)].s), prot_private);
2521c19800e8SDoug Rabson free((yyvsp[(3) - (4)].s));
2522c19800e8SDoug Rabson }
2523c19800e8SDoug Rabson break;
2524c19800e8SDoug Rabson
2525c19800e8SDoug Rabson case 72:
2526*ae771770SStanislav Sedov #line 721 "ftpcmd.y"
2527c19800e8SDoug Rabson {
2528c19800e8SDoug Rabson (yyval.s) = (char *)calloc(1, sizeof(char));
2529c19800e8SDoug Rabson }
2530c19800e8SDoug Rabson break;
2531c19800e8SDoug Rabson
2532c19800e8SDoug Rabson case 75:
2533*ae771770SStanislav Sedov #line 734 "ftpcmd.y"
2534c19800e8SDoug Rabson {
2535c19800e8SDoug Rabson struct sockaddr_in *sin4 = (struct sockaddr_in *)data_dest;
2536c19800e8SDoug Rabson
2537c19800e8SDoug Rabson sin4->sin_family = AF_INET;
2538c19800e8SDoug Rabson sin4->sin_port = htons((yyvsp[(9) - (11)].i) * 256 + (yyvsp[(11) - (11)].i));
2539c19800e8SDoug Rabson sin4->sin_addr.s_addr =
2540c19800e8SDoug Rabson htonl(((yyvsp[(1) - (11)].i) << 24) | ((yyvsp[(3) - (11)].i) << 16) | ((yyvsp[(5) - (11)].i) << 8) | (yyvsp[(7) - (11)].i));
2541c19800e8SDoug Rabson }
2542c19800e8SDoug Rabson break;
2543c19800e8SDoug Rabson
2544c19800e8SDoug Rabson case 76:
2545*ae771770SStanislav Sedov #line 746 "ftpcmd.y"
2546c19800e8SDoug Rabson {
2547c19800e8SDoug Rabson (yyval.i) = FORM_N;
2548c19800e8SDoug Rabson }
2549c19800e8SDoug Rabson break;
2550c19800e8SDoug Rabson
2551c19800e8SDoug Rabson case 77:
2552*ae771770SStanislav Sedov #line 750 "ftpcmd.y"
2553c19800e8SDoug Rabson {
2554c19800e8SDoug Rabson (yyval.i) = FORM_T;
2555c19800e8SDoug Rabson }
2556c19800e8SDoug Rabson break;
2557c19800e8SDoug Rabson
2558c19800e8SDoug Rabson case 78:
2559*ae771770SStanislav Sedov #line 754 "ftpcmd.y"
2560c19800e8SDoug Rabson {
2561c19800e8SDoug Rabson (yyval.i) = FORM_C;
2562c19800e8SDoug Rabson }
2563c19800e8SDoug Rabson break;
2564c19800e8SDoug Rabson
2565c19800e8SDoug Rabson case 79:
2566*ae771770SStanislav Sedov #line 761 "ftpcmd.y"
2567c19800e8SDoug Rabson {
2568c19800e8SDoug Rabson cmd_type = TYPE_A;
2569c19800e8SDoug Rabson cmd_form = FORM_N;
2570c19800e8SDoug Rabson }
2571c19800e8SDoug Rabson break;
2572c19800e8SDoug Rabson
2573c19800e8SDoug Rabson case 80:
2574*ae771770SStanislav Sedov #line 766 "ftpcmd.y"
2575c19800e8SDoug Rabson {
2576c19800e8SDoug Rabson cmd_type = TYPE_A;
2577c19800e8SDoug Rabson cmd_form = (yyvsp[(3) - (3)].i);
2578c19800e8SDoug Rabson }
2579c19800e8SDoug Rabson break;
2580c19800e8SDoug Rabson
2581c19800e8SDoug Rabson case 81:
2582*ae771770SStanislav Sedov #line 771 "ftpcmd.y"
2583c19800e8SDoug Rabson {
2584c19800e8SDoug Rabson cmd_type = TYPE_E;
2585c19800e8SDoug Rabson cmd_form = FORM_N;
2586c19800e8SDoug Rabson }
2587c19800e8SDoug Rabson break;
2588c19800e8SDoug Rabson
2589c19800e8SDoug Rabson case 82:
2590*ae771770SStanislav Sedov #line 776 "ftpcmd.y"
2591c19800e8SDoug Rabson {
2592c19800e8SDoug Rabson cmd_type = TYPE_E;
2593c19800e8SDoug Rabson cmd_form = (yyvsp[(3) - (3)].i);
2594c19800e8SDoug Rabson }
2595c19800e8SDoug Rabson break;
2596c19800e8SDoug Rabson
2597c19800e8SDoug Rabson case 83:
2598*ae771770SStanislav Sedov #line 781 "ftpcmd.y"
2599c19800e8SDoug Rabson {
2600c19800e8SDoug Rabson cmd_type = TYPE_I;
2601c19800e8SDoug Rabson }
2602c19800e8SDoug Rabson break;
2603c19800e8SDoug Rabson
2604c19800e8SDoug Rabson case 84:
2605*ae771770SStanislav Sedov #line 785 "ftpcmd.y"
2606c19800e8SDoug Rabson {
2607c19800e8SDoug Rabson cmd_type = TYPE_L;
2608c19800e8SDoug Rabson cmd_bytesz = NBBY;
2609c19800e8SDoug Rabson }
2610c19800e8SDoug Rabson break;
2611c19800e8SDoug Rabson
2612c19800e8SDoug Rabson case 85:
2613*ae771770SStanislav Sedov #line 790 "ftpcmd.y"
2614c19800e8SDoug Rabson {
2615c19800e8SDoug Rabson cmd_type = TYPE_L;
2616c19800e8SDoug Rabson cmd_bytesz = (yyvsp[(3) - (3)].i);
2617c19800e8SDoug Rabson }
2618c19800e8SDoug Rabson break;
2619c19800e8SDoug Rabson
2620c19800e8SDoug Rabson case 86:
2621*ae771770SStanislav Sedov #line 796 "ftpcmd.y"
2622c19800e8SDoug Rabson {
2623c19800e8SDoug Rabson cmd_type = TYPE_L;
2624c19800e8SDoug Rabson cmd_bytesz = (yyvsp[(2) - (2)].i);
2625c19800e8SDoug Rabson }
2626c19800e8SDoug Rabson break;
2627c19800e8SDoug Rabson
2628c19800e8SDoug Rabson case 87:
2629*ae771770SStanislav Sedov #line 804 "ftpcmd.y"
2630c19800e8SDoug Rabson {
2631c19800e8SDoug Rabson (yyval.i) = STRU_F;
2632c19800e8SDoug Rabson }
2633c19800e8SDoug Rabson break;
2634c19800e8SDoug Rabson
2635c19800e8SDoug Rabson case 88:
2636*ae771770SStanislav Sedov #line 808 "ftpcmd.y"
2637c19800e8SDoug Rabson {
2638c19800e8SDoug Rabson (yyval.i) = STRU_R;
2639c19800e8SDoug Rabson }
2640c19800e8SDoug Rabson break;
2641c19800e8SDoug Rabson
2642c19800e8SDoug Rabson case 89:
2643*ae771770SStanislav Sedov #line 812 "ftpcmd.y"
2644c19800e8SDoug Rabson {
2645c19800e8SDoug Rabson (yyval.i) = STRU_P;
2646c19800e8SDoug Rabson }
2647c19800e8SDoug Rabson break;
2648c19800e8SDoug Rabson
2649c19800e8SDoug Rabson case 90:
2650*ae771770SStanislav Sedov #line 819 "ftpcmd.y"
2651c19800e8SDoug Rabson {
2652c19800e8SDoug Rabson (yyval.i) = MODE_S;
2653c19800e8SDoug Rabson }
2654c19800e8SDoug Rabson break;
2655c19800e8SDoug Rabson
2656c19800e8SDoug Rabson case 91:
2657*ae771770SStanislav Sedov #line 823 "ftpcmd.y"
2658c19800e8SDoug Rabson {
2659c19800e8SDoug Rabson (yyval.i) = MODE_B;
2660c19800e8SDoug Rabson }
2661c19800e8SDoug Rabson break;
2662c19800e8SDoug Rabson
2663c19800e8SDoug Rabson case 92:
2664*ae771770SStanislav Sedov #line 827 "ftpcmd.y"
2665c19800e8SDoug Rabson {
2666c19800e8SDoug Rabson (yyval.i) = MODE_C;
2667c19800e8SDoug Rabson }
2668c19800e8SDoug Rabson break;
2669c19800e8SDoug Rabson
2670c19800e8SDoug Rabson case 93:
2671*ae771770SStanislav Sedov #line 834 "ftpcmd.y"
2672c19800e8SDoug Rabson {
2673c19800e8SDoug Rabson /*
2674c19800e8SDoug Rabson * Problem: this production is used for all pathname
2675c19800e8SDoug Rabson * processing, but only gives a 550 error reply.
2676c19800e8SDoug Rabson * This is a valid reply in some cases but not in others.
2677c19800e8SDoug Rabson */
2678c19800e8SDoug Rabson if (logged_in && (yyvsp[(1) - (1)].s) && *(yyvsp[(1) - (1)].s) == '~') {
2679c19800e8SDoug Rabson glob_t gl;
2680c19800e8SDoug Rabson int flags =
2681c19800e8SDoug Rabson GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE;
2682c19800e8SDoug Rabson
2683c19800e8SDoug Rabson memset(&gl, 0, sizeof(gl));
2684c19800e8SDoug Rabson if (glob((yyvsp[(1) - (1)].s), flags, NULL, &gl) ||
2685c19800e8SDoug Rabson gl.gl_pathc == 0) {
2686c19800e8SDoug Rabson reply(550, "not found");
2687c19800e8SDoug Rabson (yyval.s) = NULL;
2688c19800e8SDoug Rabson } else {
2689c19800e8SDoug Rabson (yyval.s) = strdup(gl.gl_pathv[0]);
2690c19800e8SDoug Rabson }
2691c19800e8SDoug Rabson globfree(&gl);
2692c19800e8SDoug Rabson free((yyvsp[(1) - (1)].s));
2693c19800e8SDoug Rabson } else
2694c19800e8SDoug Rabson (yyval.s) = (yyvsp[(1) - (1)].s);
2695c19800e8SDoug Rabson }
2696c19800e8SDoug Rabson break;
2697c19800e8SDoug Rabson
2698c19800e8SDoug Rabson case 95:
2699*ae771770SStanislav Sedov #line 866 "ftpcmd.y"
2700c19800e8SDoug Rabson {
2701c19800e8SDoug Rabson int ret, dec, multby, digit;
2702c19800e8SDoug Rabson
2703c19800e8SDoug Rabson /*
2704c19800e8SDoug Rabson * Convert a number that was read as decimal number
2705c19800e8SDoug Rabson * to what it would be if it had been read as octal.
2706c19800e8SDoug Rabson */
2707c19800e8SDoug Rabson dec = (yyvsp[(1) - (1)].i);
2708c19800e8SDoug Rabson multby = 1;
2709c19800e8SDoug Rabson ret = 0;
2710c19800e8SDoug Rabson while (dec) {
2711c19800e8SDoug Rabson digit = dec%10;
2712c19800e8SDoug Rabson if (digit > 7) {
2713c19800e8SDoug Rabson ret = -1;
2714c19800e8SDoug Rabson break;
2715c19800e8SDoug Rabson }
2716c19800e8SDoug Rabson ret += digit * multby;
2717c19800e8SDoug Rabson multby *= 8;
2718c19800e8SDoug Rabson dec /= 10;
2719c19800e8SDoug Rabson }
2720c19800e8SDoug Rabson (yyval.i) = ret;
2721c19800e8SDoug Rabson }
2722c19800e8SDoug Rabson break;
2723c19800e8SDoug Rabson
2724c19800e8SDoug Rabson case 96:
2725*ae771770SStanislav Sedov #line 892 "ftpcmd.y"
2726c19800e8SDoug Rabson {
2727c19800e8SDoug Rabson (yyval.i) = (yyvsp[(1) - (1)].i) && !guest;
2728c19800e8SDoug Rabson if((yyvsp[(1) - (1)].i) && !(yyval.i))
2729c19800e8SDoug Rabson reply(550, "Permission denied");
2730c19800e8SDoug Rabson }
2731c19800e8SDoug Rabson break;
2732c19800e8SDoug Rabson
2733c19800e8SDoug Rabson case 97:
2734*ae771770SStanislav Sedov #line 900 "ftpcmd.y"
2735c19800e8SDoug Rabson {
2736c19800e8SDoug Rabson if((yyvsp[(1) - (1)].i)) {
2737c19800e8SDoug Rabson if(((yyval.i) = logged_in) == 0)
2738c19800e8SDoug Rabson reply(530, "Please login with USER and PASS.");
2739c19800e8SDoug Rabson } else
2740c19800e8SDoug Rabson (yyval.i) = 0;
2741c19800e8SDoug Rabson }
2742c19800e8SDoug Rabson break;
2743c19800e8SDoug Rabson
2744c19800e8SDoug Rabson case 98:
2745*ae771770SStanislav Sedov #line 910 "ftpcmd.y"
2746c19800e8SDoug Rabson {
2747c19800e8SDoug Rabson (yyval.i) = 1;
2748c19800e8SDoug Rabson if(sec_complete && !ccc_passed && !secure_command()) {
2749c19800e8SDoug Rabson (yyval.i) = 0;
2750c19800e8SDoug Rabson reply(533, "Command protection level denied "
2751c19800e8SDoug Rabson "for paranoid reasons.");
2752c19800e8SDoug Rabson }
2753c19800e8SDoug Rabson }
2754c19800e8SDoug Rabson break;
2755c19800e8SDoug Rabson
2756c19800e8SDoug Rabson
2757c19800e8SDoug Rabson /* Line 1267 of yacc.c. */
2758*ae771770SStanislav Sedov #line 2759 "ftpcmd.c"
2759c19800e8SDoug Rabson default: break;
2760c19800e8SDoug Rabson }
2761c19800e8SDoug Rabson YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
2762c19800e8SDoug Rabson
2763c19800e8SDoug Rabson YYPOPSTACK (yylen);
2764c19800e8SDoug Rabson yylen = 0;
2765c19800e8SDoug Rabson YY_STACK_PRINT (yyss, yyssp);
2766c19800e8SDoug Rabson
2767c19800e8SDoug Rabson *++yyvsp = yyval;
2768c19800e8SDoug Rabson
2769c19800e8SDoug Rabson
2770c19800e8SDoug Rabson /* Now `shift' the result of the reduction. Determine what state
2771c19800e8SDoug Rabson that goes to, based on the state we popped back to and the rule
2772c19800e8SDoug Rabson number reduced by. */
2773c19800e8SDoug Rabson
2774c19800e8SDoug Rabson yyn = yyr1[yyn];
2775c19800e8SDoug Rabson
2776c19800e8SDoug Rabson yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
2777c19800e8SDoug Rabson if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
2778c19800e8SDoug Rabson yystate = yytable[yystate];
2779c19800e8SDoug Rabson else
2780c19800e8SDoug Rabson yystate = yydefgoto[yyn - YYNTOKENS];
2781c19800e8SDoug Rabson
2782c19800e8SDoug Rabson goto yynewstate;
2783c19800e8SDoug Rabson
2784c19800e8SDoug Rabson
2785c19800e8SDoug Rabson /*------------------------------------.
2786c19800e8SDoug Rabson | yyerrlab -- here on detecting error |
2787c19800e8SDoug Rabson `------------------------------------*/
2788c19800e8SDoug Rabson yyerrlab:
2789c19800e8SDoug Rabson /* If not already recovering from an error, report this error. */
2790c19800e8SDoug Rabson if (!yyerrstatus)
2791c19800e8SDoug Rabson {
2792c19800e8SDoug Rabson ++yynerrs;
2793c19800e8SDoug Rabson #if ! YYERROR_VERBOSE
2794c19800e8SDoug Rabson yyerror (YY_("syntax error"));
2795c19800e8SDoug Rabson #else
2796c19800e8SDoug Rabson {
2797c19800e8SDoug Rabson YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
2798c19800e8SDoug Rabson if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
2799c19800e8SDoug Rabson {
2800c19800e8SDoug Rabson YYSIZE_T yyalloc = 2 * yysize;
2801c19800e8SDoug Rabson if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
2802c19800e8SDoug Rabson yyalloc = YYSTACK_ALLOC_MAXIMUM;
2803c19800e8SDoug Rabson if (yymsg != yymsgbuf)
2804c19800e8SDoug Rabson YYSTACK_FREE (yymsg);
2805c19800e8SDoug Rabson yymsg = (char *) YYSTACK_ALLOC (yyalloc);
2806c19800e8SDoug Rabson if (yymsg)
2807c19800e8SDoug Rabson yymsg_alloc = yyalloc;
2808c19800e8SDoug Rabson else
2809c19800e8SDoug Rabson {
2810c19800e8SDoug Rabson yymsg = yymsgbuf;
2811c19800e8SDoug Rabson yymsg_alloc = sizeof yymsgbuf;
2812c19800e8SDoug Rabson }
2813c19800e8SDoug Rabson }
2814c19800e8SDoug Rabson
2815c19800e8SDoug Rabson if (0 < yysize && yysize <= yymsg_alloc)
2816c19800e8SDoug Rabson {
2817c19800e8SDoug Rabson (void) yysyntax_error (yymsg, yystate, yychar);
2818c19800e8SDoug Rabson yyerror (yymsg);
2819c19800e8SDoug Rabson }
2820c19800e8SDoug Rabson else
2821c19800e8SDoug Rabson {
2822c19800e8SDoug Rabson yyerror (YY_("syntax error"));
2823c19800e8SDoug Rabson if (yysize != 0)
2824c19800e8SDoug Rabson goto yyexhaustedlab;
2825c19800e8SDoug Rabson }
2826c19800e8SDoug Rabson }
2827c19800e8SDoug Rabson #endif
2828c19800e8SDoug Rabson }
2829c19800e8SDoug Rabson
2830c19800e8SDoug Rabson
2831c19800e8SDoug Rabson
2832c19800e8SDoug Rabson if (yyerrstatus == 3)
2833c19800e8SDoug Rabson {
2834c19800e8SDoug Rabson /* If just tried and failed to reuse look-ahead token after an
2835c19800e8SDoug Rabson error, discard it. */
2836c19800e8SDoug Rabson
2837c19800e8SDoug Rabson if (yychar <= YYEOF)
2838c19800e8SDoug Rabson {
2839c19800e8SDoug Rabson /* Return failure if at end of input. */
2840c19800e8SDoug Rabson if (yychar == YYEOF)
2841c19800e8SDoug Rabson YYABORT;
2842c19800e8SDoug Rabson }
2843c19800e8SDoug Rabson else
2844c19800e8SDoug Rabson {
2845c19800e8SDoug Rabson yydestruct ("Error: discarding",
2846c19800e8SDoug Rabson yytoken, &yylval);
2847c19800e8SDoug Rabson yychar = YYEMPTY;
2848c19800e8SDoug Rabson }
2849c19800e8SDoug Rabson }
2850c19800e8SDoug Rabson
2851c19800e8SDoug Rabson /* Else will try to reuse look-ahead token after shifting the error
2852c19800e8SDoug Rabson token. */
2853c19800e8SDoug Rabson goto yyerrlab1;
2854c19800e8SDoug Rabson
2855c19800e8SDoug Rabson
2856c19800e8SDoug Rabson /*---------------------------------------------------.
2857c19800e8SDoug Rabson | yyerrorlab -- error raised explicitly by YYERROR. |
2858c19800e8SDoug Rabson `---------------------------------------------------*/
2859c19800e8SDoug Rabson yyerrorlab:
2860c19800e8SDoug Rabson
2861c19800e8SDoug Rabson /* Pacify compilers like GCC when the user code never invokes
2862c19800e8SDoug Rabson YYERROR and the label yyerrorlab therefore never appears in user
2863c19800e8SDoug Rabson code. */
2864c19800e8SDoug Rabson if (/*CONSTCOND*/ 0)
2865c19800e8SDoug Rabson goto yyerrorlab;
2866c19800e8SDoug Rabson
2867c19800e8SDoug Rabson /* Do not reclaim the symbols of the rule which action triggered
2868c19800e8SDoug Rabson this YYERROR. */
2869c19800e8SDoug Rabson YYPOPSTACK (yylen);
2870c19800e8SDoug Rabson yylen = 0;
2871c19800e8SDoug Rabson YY_STACK_PRINT (yyss, yyssp);
2872c19800e8SDoug Rabson yystate = *yyssp;
2873c19800e8SDoug Rabson goto yyerrlab1;
2874c19800e8SDoug Rabson
2875c19800e8SDoug Rabson
2876c19800e8SDoug Rabson /*-------------------------------------------------------------.
2877c19800e8SDoug Rabson | yyerrlab1 -- common code for both syntax error and YYERROR. |
2878c19800e8SDoug Rabson `-------------------------------------------------------------*/
2879c19800e8SDoug Rabson yyerrlab1:
2880c19800e8SDoug Rabson yyerrstatus = 3; /* Each real token shifted decrements this. */
2881c19800e8SDoug Rabson
2882c19800e8SDoug Rabson for (;;)
2883c19800e8SDoug Rabson {
2884c19800e8SDoug Rabson yyn = yypact[yystate];
2885c19800e8SDoug Rabson if (yyn != YYPACT_NINF)
2886c19800e8SDoug Rabson {
2887c19800e8SDoug Rabson yyn += YYTERROR;
2888c19800e8SDoug Rabson if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
2889c19800e8SDoug Rabson {
2890c19800e8SDoug Rabson yyn = yytable[yyn];
2891c19800e8SDoug Rabson if (0 < yyn)
2892c19800e8SDoug Rabson break;
2893c19800e8SDoug Rabson }
2894c19800e8SDoug Rabson }
2895c19800e8SDoug Rabson
2896c19800e8SDoug Rabson /* Pop the current state because it cannot handle the error token. */
2897c19800e8SDoug Rabson if (yyssp == yyss)
2898c19800e8SDoug Rabson YYABORT;
2899c19800e8SDoug Rabson
2900c19800e8SDoug Rabson
2901c19800e8SDoug Rabson yydestruct ("Error: popping",
2902c19800e8SDoug Rabson yystos[yystate], yyvsp);
2903c19800e8SDoug Rabson YYPOPSTACK (1);
2904c19800e8SDoug Rabson yystate = *yyssp;
2905c19800e8SDoug Rabson YY_STACK_PRINT (yyss, yyssp);
2906c19800e8SDoug Rabson }
2907c19800e8SDoug Rabson
2908c19800e8SDoug Rabson if (yyn == YYFINAL)
2909c19800e8SDoug Rabson YYACCEPT;
2910c19800e8SDoug Rabson
2911c19800e8SDoug Rabson *++yyvsp = yylval;
2912c19800e8SDoug Rabson
2913c19800e8SDoug Rabson
2914c19800e8SDoug Rabson /* Shift the error token. */
2915c19800e8SDoug Rabson YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
2916c19800e8SDoug Rabson
2917c19800e8SDoug Rabson yystate = yyn;
2918c19800e8SDoug Rabson goto yynewstate;
2919c19800e8SDoug Rabson
2920c19800e8SDoug Rabson
2921c19800e8SDoug Rabson /*-------------------------------------.
2922c19800e8SDoug Rabson | yyacceptlab -- YYACCEPT comes here. |
2923c19800e8SDoug Rabson `-------------------------------------*/
2924c19800e8SDoug Rabson yyacceptlab:
2925c19800e8SDoug Rabson yyresult = 0;
2926c19800e8SDoug Rabson goto yyreturn;
2927c19800e8SDoug Rabson
2928c19800e8SDoug Rabson /*-----------------------------------.
2929c19800e8SDoug Rabson | yyabortlab -- YYABORT comes here. |
2930c19800e8SDoug Rabson `-----------------------------------*/
2931c19800e8SDoug Rabson yyabortlab:
2932c19800e8SDoug Rabson yyresult = 1;
2933c19800e8SDoug Rabson goto yyreturn;
2934c19800e8SDoug Rabson
2935c19800e8SDoug Rabson #ifndef yyoverflow
2936c19800e8SDoug Rabson /*-------------------------------------------------.
2937c19800e8SDoug Rabson | yyexhaustedlab -- memory exhaustion comes here. |
2938c19800e8SDoug Rabson `-------------------------------------------------*/
2939c19800e8SDoug Rabson yyexhaustedlab:
2940c19800e8SDoug Rabson yyerror (YY_("memory exhausted"));
2941c19800e8SDoug Rabson yyresult = 2;
2942c19800e8SDoug Rabson /* Fall through. */
2943c19800e8SDoug Rabson #endif
2944c19800e8SDoug Rabson
2945c19800e8SDoug Rabson yyreturn:
2946c19800e8SDoug Rabson if (yychar != YYEOF && yychar != YYEMPTY)
2947c19800e8SDoug Rabson yydestruct ("Cleanup: discarding lookahead",
2948c19800e8SDoug Rabson yytoken, &yylval);
2949c19800e8SDoug Rabson /* Do not reclaim the symbols of the rule which action triggered
2950c19800e8SDoug Rabson this YYABORT or YYACCEPT. */
2951c19800e8SDoug Rabson YYPOPSTACK (yylen);
2952c19800e8SDoug Rabson YY_STACK_PRINT (yyss, yyssp);
2953c19800e8SDoug Rabson while (yyssp != yyss)
2954c19800e8SDoug Rabson {
2955c19800e8SDoug Rabson yydestruct ("Cleanup: popping",
2956c19800e8SDoug Rabson yystos[*yyssp], yyvsp);
2957c19800e8SDoug Rabson YYPOPSTACK (1);
2958c19800e8SDoug Rabson }
2959c19800e8SDoug Rabson #ifndef yyoverflow
2960c19800e8SDoug Rabson if (yyss != yyssa)
2961c19800e8SDoug Rabson YYSTACK_FREE (yyss);
2962c19800e8SDoug Rabson #endif
2963c19800e8SDoug Rabson #if YYERROR_VERBOSE
2964c19800e8SDoug Rabson if (yymsg != yymsgbuf)
2965c19800e8SDoug Rabson YYSTACK_FREE (yymsg);
2966c19800e8SDoug Rabson #endif
2967c19800e8SDoug Rabson /* Make sure YYID is used. */
2968c19800e8SDoug Rabson return YYID (yyresult);
2969c19800e8SDoug Rabson }
2970c19800e8SDoug Rabson
2971c19800e8SDoug Rabson
2972*ae771770SStanislav Sedov #line 920 "ftpcmd.y"
2973c19800e8SDoug Rabson
2974c19800e8SDoug Rabson
2975c19800e8SDoug Rabson #define CMD 0 /* beginning of command */
2976c19800e8SDoug Rabson #define ARGS 1 /* expect miscellaneous arguments */
2977c19800e8SDoug Rabson #define STR1 2 /* expect SP followed by STRING */
2978c19800e8SDoug Rabson #define STR2 3 /* expect STRING */
2979c19800e8SDoug Rabson #define OSTR 4 /* optional SP then STRING */
2980c19800e8SDoug Rabson #define ZSTR1 5 /* SP then optional STRING */
2981c19800e8SDoug Rabson #define ZSTR2 6 /* optional STRING after SP */
2982c19800e8SDoug Rabson #define SITECMD 7 /* SITE command */
2983c19800e8SDoug Rabson #define NSTR 8 /* Number followed by a string */
2984c19800e8SDoug Rabson
2985c19800e8SDoug Rabson struct tab cmdtab[] = { /* In order defined in RFC 765 */
2986c19800e8SDoug Rabson { "USER", USER, STR1, 1, "<sp> username" },
2987c19800e8SDoug Rabson { "PASS", PASS, ZSTR1, 1, "<sp> password" },
2988c19800e8SDoug Rabson { "ACCT", ACCT, STR1, 0, "(specify account)" },
2989c19800e8SDoug Rabson { "SMNT", SMNT, ARGS, 0, "(structure mount)" },
2990c19800e8SDoug Rabson { "REIN", REIN, ARGS, 0, "(reinitialize server state)" },
2991c19800e8SDoug Rabson { "QUIT", QUIT, ARGS, 1, "(terminate service)", },
2992c19800e8SDoug Rabson { "PORT", PORT, ARGS, 1, "<sp> b0, b1, b2, b3, b4" },
2993c19800e8SDoug Rabson { "EPRT", EPRT, STR1, 1, "<sp> string" },
2994c19800e8SDoug Rabson { "PASV", PASV, ARGS, 1, "(set server in passive mode)" },
2995c19800e8SDoug Rabson { "EPSV", EPSV, OSTR, 1, "[<sp> foo]" },
2996c19800e8SDoug Rabson { "TYPE", TYPE, ARGS, 1, "<sp> [ A | E | I | L ]" },
2997c19800e8SDoug Rabson { "STRU", STRU, ARGS, 1, "(specify file structure)" },
2998c19800e8SDoug Rabson { "MODE", MODE, ARGS, 1, "(specify transfer mode)" },
2999c19800e8SDoug Rabson { "RETR", RETR, STR1, 1, "<sp> file-name" },
3000c19800e8SDoug Rabson { "STOR", STOR, STR1, 1, "<sp> file-name" },
3001c19800e8SDoug Rabson { "APPE", APPE, STR1, 1, "<sp> file-name" },
3002c19800e8SDoug Rabson { "MLFL", MLFL, OSTR, 0, "(mail file)" },
3003c19800e8SDoug Rabson { "MAIL", MAIL, OSTR, 0, "(mail to user)" },
3004c19800e8SDoug Rabson { "MSND", MSND, OSTR, 0, "(mail send to terminal)" },
3005c19800e8SDoug Rabson { "MSOM", MSOM, OSTR, 0, "(mail send to terminal or mailbox)" },
3006c19800e8SDoug Rabson { "MSAM", MSAM, OSTR, 0, "(mail send to terminal and mailbox)" },
3007c19800e8SDoug Rabson { "MRSQ", MRSQ, OSTR, 0, "(mail recipient scheme question)" },
3008c19800e8SDoug Rabson { "MRCP", MRCP, STR1, 0, "(mail recipient)" },
3009c19800e8SDoug Rabson { "ALLO", ALLO, ARGS, 1, "allocate storage (vacuously)" },
3010c19800e8SDoug Rabson { "REST", REST, ARGS, 1, "<sp> offset (restart command)" },
3011c19800e8SDoug Rabson { "RNFR", RNFR, STR1, 1, "<sp> file-name" },
3012c19800e8SDoug Rabson { "RNTO", RNTO, STR1, 1, "<sp> file-name" },
3013c19800e8SDoug Rabson { "ABOR", ABOR, ARGS, 1, "(abort operation)" },
3014c19800e8SDoug Rabson { "DELE", DELE, STR1, 1, "<sp> file-name" },
3015c19800e8SDoug Rabson { "CWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
3016c19800e8SDoug Rabson { "XCWD", CWD, OSTR, 1, "[ <sp> directory-name ]" },
3017c19800e8SDoug Rabson { "LIST", LIST, OSTR, 1, "[ <sp> path-name ]" },
3018c19800e8SDoug Rabson { "NLST", NLST, OSTR, 1, "[ <sp> path-name ]" },
3019c19800e8SDoug Rabson { "SITE", SITE, SITECMD, 1, "site-cmd [ <sp> arguments ]" },
3020c19800e8SDoug Rabson { "SYST", SYST, ARGS, 1, "(get type of operating system)" },
3021c19800e8SDoug Rabson { "STAT", sTAT, OSTR, 1, "[ <sp> path-name ]" },
3022c19800e8SDoug Rabson { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
3023c19800e8SDoug Rabson { "NOOP", NOOP, ARGS, 1, "" },
3024c19800e8SDoug Rabson { "MKD", MKD, STR1, 1, "<sp> path-name" },
3025c19800e8SDoug Rabson { "XMKD", MKD, STR1, 1, "<sp> path-name" },
3026c19800e8SDoug Rabson { "RMD", RMD, STR1, 1, "<sp> path-name" },
3027c19800e8SDoug Rabson { "XRMD", RMD, STR1, 1, "<sp> path-name" },
3028c19800e8SDoug Rabson { "PWD", PWD, ARGS, 1, "(return current directory)" },
3029c19800e8SDoug Rabson { "XPWD", PWD, ARGS, 1, "(return current directory)" },
3030c19800e8SDoug Rabson { "CDUP", CDUP, ARGS, 1, "(change to parent directory)" },
3031c19800e8SDoug Rabson { "XCUP", CDUP, ARGS, 1, "(change to parent directory)" },
3032c19800e8SDoug Rabson { "STOU", STOU, STR1, 1, "<sp> file-name" },
3033c19800e8SDoug Rabson { "SIZE", SIZE, OSTR, 1, "<sp> path-name" },
3034c19800e8SDoug Rabson { "MDTM", MDTM, OSTR, 1, "<sp> path-name" },
3035c19800e8SDoug Rabson
3036c19800e8SDoug Rabson /* extensions from RFC2228 */
3037c19800e8SDoug Rabson { "AUTH", AUTH, STR1, 1, "<sp> auth-type" },
3038c19800e8SDoug Rabson { "ADAT", ADAT, STR1, 1, "<sp> auth-data" },
3039c19800e8SDoug Rabson { "PBSZ", PBSZ, ARGS, 1, "<sp> buffer-size" },
3040c19800e8SDoug Rabson { "PROT", PROT, STR1, 1, "<sp> prot-level" },
3041c19800e8SDoug Rabson { "CCC", CCC, ARGS, 1, "" },
3042c19800e8SDoug Rabson { "MIC", MIC, STR1, 1, "<sp> integrity command" },
3043c19800e8SDoug Rabson { "CONF", CONF, STR1, 1, "<sp> confidentiality command" },
3044c19800e8SDoug Rabson { "ENC", ENC, STR1, 1, "<sp> privacy command" },
3045c19800e8SDoug Rabson
3046c19800e8SDoug Rabson /* RFC2389 */
3047c19800e8SDoug Rabson { "FEAT", FEAT, ARGS, 1, "" },
3048c19800e8SDoug Rabson { "OPTS", OPTS, ARGS, 1, "<sp> command [<sp> options]" },
3049c19800e8SDoug Rabson
3050c19800e8SDoug Rabson { NULL, 0, 0, 0, 0 }
3051c19800e8SDoug Rabson };
3052c19800e8SDoug Rabson
3053c19800e8SDoug Rabson struct tab sitetab[] = {
3054c19800e8SDoug Rabson { "UMASK", UMASK, ARGS, 1, "[ <sp> umask ]" },
3055c19800e8SDoug Rabson { "IDLE", IDLE, ARGS, 1, "[ <sp> maximum-idle-time ]" },
3056c19800e8SDoug Rabson { "CHMOD", CHMOD, NSTR, 1, "<sp> mode <sp> file-name" },
3057c19800e8SDoug Rabson { "HELP", HELP, OSTR, 1, "[ <sp> <string> ]" },
3058c19800e8SDoug Rabson
3059c19800e8SDoug Rabson { "KAUTH", KAUTH, STR1, 1, "<sp> principal [ <sp> ticket ]" },
3060c19800e8SDoug Rabson { "KLIST", KLIST, ARGS, 1, "(show ticket file)" },
3061c19800e8SDoug Rabson { "KDESTROY", KDESTROY, ARGS, 1, "(destroy tickets)" },
3062c19800e8SDoug Rabson { "KRBTKFILE", KRBTKFILE, STR1, 1, "<sp> ticket-file" },
3063c19800e8SDoug Rabson { "AFSLOG", AFSLOG, OSTR, 1, "[<sp> cell]" },
3064c19800e8SDoug Rabson
3065c19800e8SDoug Rabson { "LOCATE", LOCATE, STR1, 1, "<sp> globexpr" },
3066c19800e8SDoug Rabson { "FIND", LOCATE, STR1, 1, "<sp> globexpr" },
3067c19800e8SDoug Rabson
3068c19800e8SDoug Rabson { "URL", URL, ARGS, 1, "?" },
3069c19800e8SDoug Rabson
3070c19800e8SDoug Rabson { NULL, 0, 0, 0, 0 }
3071c19800e8SDoug Rabson };
3072c19800e8SDoug Rabson
3073c19800e8SDoug Rabson static struct tab *
3074c19800e8SDoug Rabson lookup(struct tab *p, char *cmd)
3075c19800e8SDoug Rabson {
3076c19800e8SDoug Rabson
3077c19800e8SDoug Rabson for (; p->name != NULL; p++)
3078c19800e8SDoug Rabson if (strcmp(cmd, p->name) == 0)
3079c19800e8SDoug Rabson return (p);
3080c19800e8SDoug Rabson return (0);
3081c19800e8SDoug Rabson }
3082c19800e8SDoug Rabson
3083c19800e8SDoug Rabson /*
3084c19800e8SDoug Rabson * ftpd_getline - a hacked up version of fgets to ignore TELNET escape codes.
3085c19800e8SDoug Rabson */
3086c19800e8SDoug Rabson char *
3087c19800e8SDoug Rabson ftpd_getline(char *s, int n)
3088c19800e8SDoug Rabson {
3089c19800e8SDoug Rabson int c;
3090c19800e8SDoug Rabson char *cs;
3091c19800e8SDoug Rabson
3092c19800e8SDoug Rabson cs = s;
3093c19800e8SDoug Rabson
3094c19800e8SDoug Rabson /* might still be data within the security MIC/CONF/ENC */
3095c19800e8SDoug Rabson if(ftp_command){
3096c19800e8SDoug Rabson strlcpy(s, ftp_command, n);
3097c19800e8SDoug Rabson if (debug)
3098c19800e8SDoug Rabson syslog(LOG_DEBUG, "command: %s", s);
3099c19800e8SDoug Rabson return s;
3100c19800e8SDoug Rabson }
3101c19800e8SDoug Rabson while ((c = getc(stdin)) != EOF) {
3102c19800e8SDoug Rabson c &= 0377;
3103c19800e8SDoug Rabson if (c == IAC) {
3104c19800e8SDoug Rabson if ((c = getc(stdin)) != EOF) {
3105c19800e8SDoug Rabson c &= 0377;
3106c19800e8SDoug Rabson switch (c) {
3107c19800e8SDoug Rabson case WILL:
3108c19800e8SDoug Rabson case WONT:
3109c19800e8SDoug Rabson c = getc(stdin);
3110c19800e8SDoug Rabson printf("%c%c%c", IAC, DONT, 0377&c);
3111c19800e8SDoug Rabson fflush(stdout);
3112c19800e8SDoug Rabson continue;
3113c19800e8SDoug Rabson case DO:
3114c19800e8SDoug Rabson case DONT:
3115c19800e8SDoug Rabson c = getc(stdin);
3116c19800e8SDoug Rabson printf("%c%c%c", IAC, WONT, 0377&c);
3117c19800e8SDoug Rabson fflush(stdout);
3118c19800e8SDoug Rabson continue;
3119c19800e8SDoug Rabson case IAC:
3120c19800e8SDoug Rabson break;
3121c19800e8SDoug Rabson default:
3122c19800e8SDoug Rabson continue; /* ignore command */
3123c19800e8SDoug Rabson }
3124c19800e8SDoug Rabson }
3125c19800e8SDoug Rabson }
3126c19800e8SDoug Rabson *cs++ = c;
3127c19800e8SDoug Rabson if (--n <= 0 || c == '\n')
3128c19800e8SDoug Rabson break;
3129c19800e8SDoug Rabson }
3130c19800e8SDoug Rabson if (c == EOF && cs == s)
3131c19800e8SDoug Rabson return (NULL);
3132c19800e8SDoug Rabson *cs++ = '\0';
3133c19800e8SDoug Rabson if (debug) {
3134c19800e8SDoug Rabson if (!guest && strncasecmp("pass ", s, 5) == 0) {
3135c19800e8SDoug Rabson /* Don't syslog passwords */
3136c19800e8SDoug Rabson syslog(LOG_DEBUG, "command: %.5s ???", s);
3137c19800e8SDoug Rabson } else {
3138c19800e8SDoug Rabson char *cp;
3139c19800e8SDoug Rabson int len;
3140c19800e8SDoug Rabson
3141c19800e8SDoug Rabson /* Don't syslog trailing CR-LF */
3142c19800e8SDoug Rabson len = strlen(s);
3143c19800e8SDoug Rabson cp = s + len - 1;
3144c19800e8SDoug Rabson while (cp >= s && (*cp == '\n' || *cp == '\r')) {
3145c19800e8SDoug Rabson --cp;
3146c19800e8SDoug Rabson --len;
3147c19800e8SDoug Rabson }
3148c19800e8SDoug Rabson syslog(LOG_DEBUG, "command: %.*s", len, s);
3149c19800e8SDoug Rabson }
3150c19800e8SDoug Rabson }
3151c19800e8SDoug Rabson #ifdef XXX
3152c19800e8SDoug Rabson fprintf(stderr, "%s\n", s);
3153c19800e8SDoug Rabson #endif
3154c19800e8SDoug Rabson return (s);
3155c19800e8SDoug Rabson }
3156c19800e8SDoug Rabson
3157c19800e8SDoug Rabson static RETSIGTYPE
3158c19800e8SDoug Rabson toolong(int signo)
3159c19800e8SDoug Rabson {
3160c19800e8SDoug Rabson
3161c19800e8SDoug Rabson reply(421,
3162c19800e8SDoug Rabson "Timeout (%d seconds): closing control connection.",
3163c19800e8SDoug Rabson ftpd_timeout);
3164c19800e8SDoug Rabson if (logging)
3165c19800e8SDoug Rabson syslog(LOG_INFO, "User %s timed out after %d seconds",
3166c19800e8SDoug Rabson (pw ? pw -> pw_name : "unknown"), ftpd_timeout);
3167c19800e8SDoug Rabson dologout(1);
3168c19800e8SDoug Rabson SIGRETURN(0);
3169c19800e8SDoug Rabson }
3170c19800e8SDoug Rabson
3171c19800e8SDoug Rabson static int
3172c19800e8SDoug Rabson yylex(void)
3173c19800e8SDoug Rabson {
3174c19800e8SDoug Rabson static int cpos, state;
3175c19800e8SDoug Rabson char *cp, *cp2;
3176c19800e8SDoug Rabson struct tab *p;
3177c19800e8SDoug Rabson int n;
3178c19800e8SDoug Rabson char c;
3179c19800e8SDoug Rabson
3180c19800e8SDoug Rabson for (;;) {
3181c19800e8SDoug Rabson switch (state) {
3182c19800e8SDoug Rabson
3183c19800e8SDoug Rabson case CMD:
3184c19800e8SDoug Rabson hasyyerrored = 0;
3185c19800e8SDoug Rabson
3186c19800e8SDoug Rabson signal(SIGALRM, toolong);
3187c19800e8SDoug Rabson alarm((unsigned) ftpd_timeout);
3188c19800e8SDoug Rabson if (ftpd_getline(cbuf, sizeof(cbuf)-1) == NULL) {
3189c19800e8SDoug Rabson reply(221, "You could at least say goodbye.");
3190c19800e8SDoug Rabson dologout(0);
3191c19800e8SDoug Rabson }
3192c19800e8SDoug Rabson alarm(0);
3193c19800e8SDoug Rabson #ifdef HAVE_SETPROCTITLE
3194c19800e8SDoug Rabson if (strncasecmp(cbuf, "PASS", 4) != 0)
3195c19800e8SDoug Rabson setproctitle("%s: %s", proctitle, cbuf);
3196c19800e8SDoug Rabson #endif /* HAVE_SETPROCTITLE */
3197c19800e8SDoug Rabson if ((cp = strchr(cbuf, '\r'))) {
3198c19800e8SDoug Rabson *cp++ = '\n';
3199c19800e8SDoug Rabson *cp = '\0';
3200c19800e8SDoug Rabson }
3201c19800e8SDoug Rabson if ((cp = strpbrk(cbuf, " \n")))
3202c19800e8SDoug Rabson cpos = cp - cbuf;
3203c19800e8SDoug Rabson if (cpos == 0)
3204c19800e8SDoug Rabson cpos = 4;
3205c19800e8SDoug Rabson c = cbuf[cpos];
3206c19800e8SDoug Rabson cbuf[cpos] = '\0';
3207c19800e8SDoug Rabson strupr(cbuf);
3208c19800e8SDoug Rabson p = lookup(cmdtab, cbuf);
3209c19800e8SDoug Rabson cbuf[cpos] = c;
3210c19800e8SDoug Rabson if (p != 0) {
3211c19800e8SDoug Rabson if (p->implemented == 0) {
3212c19800e8SDoug Rabson nack(p->name);
3213c19800e8SDoug Rabson hasyyerrored = 1;
3214c19800e8SDoug Rabson break;
3215c19800e8SDoug Rabson }
3216c19800e8SDoug Rabson state = p->state;
3217c19800e8SDoug Rabson yylval.s = p->name;
3218c19800e8SDoug Rabson return (p->token);
3219c19800e8SDoug Rabson }
3220c19800e8SDoug Rabson break;
3221c19800e8SDoug Rabson
3222c19800e8SDoug Rabson case SITECMD:
3223c19800e8SDoug Rabson if (cbuf[cpos] == ' ') {
3224c19800e8SDoug Rabson cpos++;
3225c19800e8SDoug Rabson return (SP);
3226c19800e8SDoug Rabson }
3227c19800e8SDoug Rabson cp = &cbuf[cpos];
3228c19800e8SDoug Rabson if ((cp2 = strpbrk(cp, " \n")))
3229c19800e8SDoug Rabson cpos = cp2 - cbuf;
3230c19800e8SDoug Rabson c = cbuf[cpos];
3231c19800e8SDoug Rabson cbuf[cpos] = '\0';
3232c19800e8SDoug Rabson strupr(cp);
3233c19800e8SDoug Rabson p = lookup(sitetab, cp);
3234c19800e8SDoug Rabson cbuf[cpos] = c;
3235c19800e8SDoug Rabson if (p != 0) {
3236c19800e8SDoug Rabson if (p->implemented == 0) {
3237c19800e8SDoug Rabson state = CMD;
3238c19800e8SDoug Rabson nack(p->name);
3239c19800e8SDoug Rabson hasyyerrored = 1;
3240c19800e8SDoug Rabson break;
3241c19800e8SDoug Rabson }
3242c19800e8SDoug Rabson state = p->state;
3243c19800e8SDoug Rabson yylval.s = p->name;
3244c19800e8SDoug Rabson return (p->token);
3245c19800e8SDoug Rabson }
3246c19800e8SDoug Rabson state = CMD;
3247c19800e8SDoug Rabson break;
3248c19800e8SDoug Rabson
3249c19800e8SDoug Rabson case OSTR:
3250c19800e8SDoug Rabson if (cbuf[cpos] == '\n') {
3251c19800e8SDoug Rabson state = CMD;
3252c19800e8SDoug Rabson return (CRLF);
3253c19800e8SDoug Rabson }
3254c19800e8SDoug Rabson /* FALLTHROUGH */
3255c19800e8SDoug Rabson
3256c19800e8SDoug Rabson case STR1:
3257c19800e8SDoug Rabson case ZSTR1:
3258c19800e8SDoug Rabson dostr1:
3259c19800e8SDoug Rabson if (cbuf[cpos] == ' ') {
3260c19800e8SDoug Rabson cpos++;
3261c19800e8SDoug Rabson if(state == OSTR)
3262c19800e8SDoug Rabson state = STR2;
3263c19800e8SDoug Rabson else
3264c19800e8SDoug Rabson state++;
3265c19800e8SDoug Rabson return (SP);
3266c19800e8SDoug Rabson }
3267c19800e8SDoug Rabson break;
3268c19800e8SDoug Rabson
3269c19800e8SDoug Rabson case ZSTR2:
3270c19800e8SDoug Rabson if (cbuf[cpos] == '\n') {
3271c19800e8SDoug Rabson state = CMD;
3272c19800e8SDoug Rabson return (CRLF);
3273c19800e8SDoug Rabson }
3274c19800e8SDoug Rabson /* FALLTHROUGH */
3275c19800e8SDoug Rabson
3276c19800e8SDoug Rabson case STR2:
3277c19800e8SDoug Rabson cp = &cbuf[cpos];
3278c19800e8SDoug Rabson n = strlen(cp);
3279c19800e8SDoug Rabson cpos += n - 1;
3280c19800e8SDoug Rabson /*
3281c19800e8SDoug Rabson * Make sure the string is nonempty and \n terminated.
3282c19800e8SDoug Rabson */
3283c19800e8SDoug Rabson if (n > 1 && cbuf[cpos] == '\n') {
3284c19800e8SDoug Rabson cbuf[cpos] = '\0';
3285c19800e8SDoug Rabson yylval.s = copy(cp);
3286c19800e8SDoug Rabson cbuf[cpos] = '\n';
3287c19800e8SDoug Rabson state = ARGS;
3288c19800e8SDoug Rabson return (STRING);
3289c19800e8SDoug Rabson }
3290c19800e8SDoug Rabson break;
3291c19800e8SDoug Rabson
3292c19800e8SDoug Rabson case NSTR:
3293c19800e8SDoug Rabson if (cbuf[cpos] == ' ') {
3294c19800e8SDoug Rabson cpos++;
3295c19800e8SDoug Rabson return (SP);
3296c19800e8SDoug Rabson }
3297c19800e8SDoug Rabson if (isdigit((unsigned char)cbuf[cpos])) {
3298c19800e8SDoug Rabson cp = &cbuf[cpos];
3299c19800e8SDoug Rabson while (isdigit((unsigned char)cbuf[++cpos]))
3300c19800e8SDoug Rabson ;
3301c19800e8SDoug Rabson c = cbuf[cpos];
3302c19800e8SDoug Rabson cbuf[cpos] = '\0';
3303c19800e8SDoug Rabson yylval.i = atoi(cp);
3304c19800e8SDoug Rabson cbuf[cpos] = c;
3305c19800e8SDoug Rabson state = STR1;
3306c19800e8SDoug Rabson return (NUMBER);
3307c19800e8SDoug Rabson }
3308c19800e8SDoug Rabson state = STR1;
3309c19800e8SDoug Rabson goto dostr1;
3310c19800e8SDoug Rabson
3311c19800e8SDoug Rabson case ARGS:
3312c19800e8SDoug Rabson if (isdigit((unsigned char)cbuf[cpos])) {
3313c19800e8SDoug Rabson cp = &cbuf[cpos];
3314c19800e8SDoug Rabson while (isdigit((unsigned char)cbuf[++cpos]))
3315c19800e8SDoug Rabson ;
3316c19800e8SDoug Rabson c = cbuf[cpos];
3317c19800e8SDoug Rabson cbuf[cpos] = '\0';
3318c19800e8SDoug Rabson yylval.i = atoi(cp);
3319c19800e8SDoug Rabson cbuf[cpos] = c;
3320c19800e8SDoug Rabson return (NUMBER);
3321c19800e8SDoug Rabson }
3322c19800e8SDoug Rabson switch (cbuf[cpos++]) {
3323c19800e8SDoug Rabson
3324c19800e8SDoug Rabson case '\n':
3325c19800e8SDoug Rabson state = CMD;
3326c19800e8SDoug Rabson return (CRLF);
3327c19800e8SDoug Rabson
3328c19800e8SDoug Rabson case ' ':
3329c19800e8SDoug Rabson return (SP);
3330c19800e8SDoug Rabson
3331c19800e8SDoug Rabson case ',':
3332c19800e8SDoug Rabson return (COMMA);
3333c19800e8SDoug Rabson
3334c19800e8SDoug Rabson case 'A':
3335c19800e8SDoug Rabson case 'a':
3336c19800e8SDoug Rabson return (A);
3337c19800e8SDoug Rabson
3338c19800e8SDoug Rabson case 'B':
3339c19800e8SDoug Rabson case 'b':
3340c19800e8SDoug Rabson return (B);
3341c19800e8SDoug Rabson
3342c19800e8SDoug Rabson case 'C':
3343c19800e8SDoug Rabson case 'c':
3344c19800e8SDoug Rabson return (C);
3345c19800e8SDoug Rabson
3346c19800e8SDoug Rabson case 'E':
3347c19800e8SDoug Rabson case 'e':
3348c19800e8SDoug Rabson return (E);
3349c19800e8SDoug Rabson
3350c19800e8SDoug Rabson case 'F':
3351c19800e8SDoug Rabson case 'f':
3352c19800e8SDoug Rabson return (F);
3353c19800e8SDoug Rabson
3354c19800e8SDoug Rabson case 'I':
3355c19800e8SDoug Rabson case 'i':
3356c19800e8SDoug Rabson return (I);
3357c19800e8SDoug Rabson
3358c19800e8SDoug Rabson case 'L':
3359c19800e8SDoug Rabson case 'l':
3360c19800e8SDoug Rabson return (L);
3361c19800e8SDoug Rabson
3362c19800e8SDoug Rabson case 'N':
3363c19800e8SDoug Rabson case 'n':
3364c19800e8SDoug Rabson return (N);
3365c19800e8SDoug Rabson
3366c19800e8SDoug Rabson case 'P':
3367c19800e8SDoug Rabson case 'p':
3368c19800e8SDoug Rabson return (P);
3369c19800e8SDoug Rabson
3370c19800e8SDoug Rabson case 'R':
3371c19800e8SDoug Rabson case 'r':
3372c19800e8SDoug Rabson return (R);
3373c19800e8SDoug Rabson
3374c19800e8SDoug Rabson case 'S':
3375c19800e8SDoug Rabson case 's':
3376c19800e8SDoug Rabson return (S);
3377c19800e8SDoug Rabson
3378c19800e8SDoug Rabson case 'T':
3379c19800e8SDoug Rabson case 't':
3380c19800e8SDoug Rabson return (T);
3381c19800e8SDoug Rabson
3382c19800e8SDoug Rabson }
3383c19800e8SDoug Rabson break;
3384c19800e8SDoug Rabson
3385c19800e8SDoug Rabson default:
3386c19800e8SDoug Rabson fatal("Unknown state in scanner.");
3387c19800e8SDoug Rabson }
3388c19800e8SDoug Rabson yyerror(NULL);
3389c19800e8SDoug Rabson state = CMD;
3390c19800e8SDoug Rabson return (0);
3391c19800e8SDoug Rabson }
3392c19800e8SDoug Rabson }
3393c19800e8SDoug Rabson
3394c19800e8SDoug Rabson /* ARGSUSED */
3395c19800e8SDoug Rabson void
3396c19800e8SDoug Rabson yyerror(char *s)
3397c19800e8SDoug Rabson {
3398c19800e8SDoug Rabson char *cp;
3399c19800e8SDoug Rabson
3400c19800e8SDoug Rabson if (hasyyerrored)
3401c19800e8SDoug Rabson return;
3402c19800e8SDoug Rabson
3403c19800e8SDoug Rabson if ((cp = strchr(cbuf,'\n')))
3404c19800e8SDoug Rabson *cp = '\0';
3405c19800e8SDoug Rabson reply(500, "'%s': command not understood.", cbuf);
3406c19800e8SDoug Rabson hasyyerrored = 1;
3407c19800e8SDoug Rabson }
3408c19800e8SDoug Rabson
3409c19800e8SDoug Rabson static char *
3410c19800e8SDoug Rabson copy(char *s)
3411c19800e8SDoug Rabson {
3412c19800e8SDoug Rabson char *p;
3413c19800e8SDoug Rabson
3414c19800e8SDoug Rabson p = strdup(s);
3415c19800e8SDoug Rabson if (p == NULL)
3416c19800e8SDoug Rabson fatal("Ran out of memory.");
3417c19800e8SDoug Rabson return p;
3418c19800e8SDoug Rabson }
3419c19800e8SDoug Rabson
3420c19800e8SDoug Rabson static void
3421c19800e8SDoug Rabson help(struct tab *ctab, char *s)
3422c19800e8SDoug Rabson {
3423c19800e8SDoug Rabson struct tab *c;
3424c19800e8SDoug Rabson int width, NCMDS;
3425c19800e8SDoug Rabson char *t;
3426c19800e8SDoug Rabson char buf[1024];
3427c19800e8SDoug Rabson
3428c19800e8SDoug Rabson if (ctab == sitetab)
3429c19800e8SDoug Rabson t = "SITE ";
3430c19800e8SDoug Rabson else
3431c19800e8SDoug Rabson t = "";
3432c19800e8SDoug Rabson width = 0, NCMDS = 0;
3433c19800e8SDoug Rabson for (c = ctab; c->name != NULL; c++) {
3434c19800e8SDoug Rabson int len = strlen(c->name);
3435c19800e8SDoug Rabson
3436c19800e8SDoug Rabson if (len > width)
3437c19800e8SDoug Rabson width = len;
3438c19800e8SDoug Rabson NCMDS++;
3439c19800e8SDoug Rabson }
3440c19800e8SDoug Rabson width = (width + 8) &~ 7;
3441c19800e8SDoug Rabson if (s == 0) {
3442c19800e8SDoug Rabson int i, j, w;
3443c19800e8SDoug Rabson int columns, lines;
3444c19800e8SDoug Rabson
3445c19800e8SDoug Rabson lreply(214, "The following %scommands are recognized %s.",
3446c19800e8SDoug Rabson t, "(* =>'s unimplemented)");
3447c19800e8SDoug Rabson columns = 76 / width;
3448c19800e8SDoug Rabson if (columns == 0)
3449c19800e8SDoug Rabson columns = 1;
3450c19800e8SDoug Rabson lines = (NCMDS + columns - 1) / columns;
3451c19800e8SDoug Rabson for (i = 0; i < lines; i++) {
3452c19800e8SDoug Rabson strlcpy (buf, " ", sizeof(buf));
3453c19800e8SDoug Rabson for (j = 0; j < columns; j++) {
3454c19800e8SDoug Rabson c = ctab + j * lines + i;
3455c19800e8SDoug Rabson snprintf (buf + strlen(buf),
3456c19800e8SDoug Rabson sizeof(buf) - strlen(buf),
3457c19800e8SDoug Rabson "%s%c",
3458c19800e8SDoug Rabson c->name,
3459c19800e8SDoug Rabson c->implemented ? ' ' : '*');
3460c19800e8SDoug Rabson if (c + lines >= &ctab[NCMDS])
3461c19800e8SDoug Rabson break;
3462c19800e8SDoug Rabson w = strlen(c->name) + 1;
3463c19800e8SDoug Rabson while (w < width) {
3464c19800e8SDoug Rabson strlcat (buf,
3465c19800e8SDoug Rabson " ",
3466c19800e8SDoug Rabson sizeof(buf));
3467c19800e8SDoug Rabson w++;
3468c19800e8SDoug Rabson }
3469c19800e8SDoug Rabson }
3470c19800e8SDoug Rabson lreply(214, "%s", buf);
3471c19800e8SDoug Rabson }
3472c19800e8SDoug Rabson reply(214, "Direct comments to kth-krb-bugs@pdc.kth.se");
3473c19800e8SDoug Rabson return;
3474c19800e8SDoug Rabson }
3475c19800e8SDoug Rabson strupr(s);
3476c19800e8SDoug Rabson c = lookup(ctab, s);
3477c19800e8SDoug Rabson if (c == (struct tab *)0) {
3478c19800e8SDoug Rabson reply(502, "Unknown command %s.", s);
3479c19800e8SDoug Rabson return;
3480c19800e8SDoug Rabson }
3481c19800e8SDoug Rabson if (c->implemented)
3482c19800e8SDoug Rabson reply(214, "Syntax: %s%s %s", t, c->name, c->help);
3483c19800e8SDoug Rabson else
3484c19800e8SDoug Rabson reply(214, "%s%-*s\t%s; unimplemented.", t, width,
3485c19800e8SDoug Rabson c->name, c->help);
3486c19800e8SDoug Rabson }
3487c19800e8SDoug Rabson
3488c19800e8SDoug Rabson static void
3489c19800e8SDoug Rabson sizecmd(char *filename)
3490c19800e8SDoug Rabson {
3491c19800e8SDoug Rabson switch (type) {
3492c19800e8SDoug Rabson case TYPE_L:
3493c19800e8SDoug Rabson case TYPE_I: {
3494c19800e8SDoug Rabson struct stat stbuf;
3495c19800e8SDoug Rabson if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode))
3496c19800e8SDoug Rabson reply(550, "%s: not a plain file.", filename);
3497c19800e8SDoug Rabson else
3498c19800e8SDoug Rabson reply(213, "%lu", (unsigned long)stbuf.st_size);
3499c19800e8SDoug Rabson break;
3500c19800e8SDoug Rabson }
3501c19800e8SDoug Rabson case TYPE_A: {
3502c19800e8SDoug Rabson FILE *fin;
3503c19800e8SDoug Rabson int c;
3504c19800e8SDoug Rabson size_t count;
3505c19800e8SDoug Rabson struct stat stbuf;
3506c19800e8SDoug Rabson fin = fopen(filename, "r");
3507c19800e8SDoug Rabson if (fin == NULL) {
3508c19800e8SDoug Rabson perror_reply(550, filename);
3509c19800e8SDoug Rabson return;
3510c19800e8SDoug Rabson }
3511c19800e8SDoug Rabson if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) {
3512c19800e8SDoug Rabson reply(550, "%s: not a plain file.", filename);
3513c19800e8SDoug Rabson fclose(fin);
3514c19800e8SDoug Rabson return;
3515c19800e8SDoug Rabson }
3516c19800e8SDoug Rabson
3517c19800e8SDoug Rabson count = 0;
3518c19800e8SDoug Rabson while((c=getc(fin)) != EOF) {
3519c19800e8SDoug Rabson if (c == '\n') /* will get expanded to \r\n */
3520c19800e8SDoug Rabson count++;
3521c19800e8SDoug Rabson count++;
3522c19800e8SDoug Rabson }
3523c19800e8SDoug Rabson fclose(fin);
3524c19800e8SDoug Rabson
3525c19800e8SDoug Rabson reply(213, "%lu", (unsigned long)count);
3526c19800e8SDoug Rabson break;
3527c19800e8SDoug Rabson }
3528c19800e8SDoug Rabson default:
3529c19800e8SDoug Rabson reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
3530c19800e8SDoug Rabson }
3531c19800e8SDoug Rabson }
3532c19800e8SDoug Rabson
3533