1178825Sdfr/* A Bison parser, made by GNU Bison 2.3.  */
2178825Sdfr
3178825Sdfr/* Skeleton implementation for Bison's Yacc-like parsers in C
4178825Sdfr
5178825Sdfr   Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004, 2005, 2006
6178825Sdfr   Free Software Foundation, Inc.
7178825Sdfr
8178825Sdfr   This program is free software; you can redistribute it and/or modify
9178825Sdfr   it under the terms of the GNU General Public License as published by
10178825Sdfr   the Free Software Foundation; either version 2, or (at your option)
11178825Sdfr   any later version.
12178825Sdfr
13178825Sdfr   This program is distributed in the hope that it will be useful,
14178825Sdfr   but WITHOUT ANY WARRANTY; without even the implied warranty of
15178825Sdfr   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16178825Sdfr   GNU General Public License for more details.
17178825Sdfr
18178825Sdfr   You should have received a copy of the GNU General Public License
19178825Sdfr   along with this program; if not, write to the Free Software
20178825Sdfr   Foundation, Inc., 51 Franklin Street, Fifth Floor,
21178825Sdfr   Boston, MA 02110-1301, USA.  */
22178825Sdfr
23178825Sdfr/* As a special exception, you may create a larger work that contains
24178825Sdfr   part or all of the Bison parser skeleton and distribute that work
25178825Sdfr   under terms of your choice, so long as that work isn't itself a
26178825Sdfr   parser generator using the skeleton or a modified version thereof
27178825Sdfr   as a parser skeleton.  Alternatively, if you modify or redistribute
28178825Sdfr   the parser skeleton itself, you may (at your option) remove this
29178825Sdfr   special exception, which will cause the skeleton and the resulting
30178825Sdfr   Bison output files to be licensed under the GNU General Public
31178825Sdfr   License without this special exception.
32178825Sdfr
33178825Sdfr   This special exception was added by the Free Software Foundation in
34178825Sdfr   version 2.2 of Bison.  */
35178825Sdfr
36178825Sdfr/* C LALR(1) parser skeleton written by Richard Stallman, by
37178825Sdfr   simplifying the original so-called "semantic" parser.  */
38178825Sdfr
39178825Sdfr/* All symbols defined below should begin with yy or YY, to avoid
40178825Sdfr   infringing on user name space.  This should be done even for local
41178825Sdfr   variables, as they might otherwise be expanded by user macros.
42178825Sdfr   There are some unavoidable exceptions within include files to
43178825Sdfr   define necessary library symbols; they are noted "INFRINGES ON
44178825Sdfr   USER NAME SPACE" below.  */
45178825Sdfr
46178825Sdfr/* Identify Bison output.  */
47178825Sdfr#define YYBISON 1
48178825Sdfr
49178825Sdfr/* Bison version.  */
50178825Sdfr#define YYBISON_VERSION "2.3"
51178825Sdfr
52178825Sdfr/* Skeleton name.  */
53178825Sdfr#define YYSKELETON_NAME "yacc.c"
54178825Sdfr
55178825Sdfr/* Pure parsers.  */
56178825Sdfr#define YYPURE 0
57178825Sdfr
58178825Sdfr/* Using locations.  */
59178825Sdfr#define YYLSP_NEEDED 0
60178825Sdfr
61178825Sdfr
62178825Sdfr
63178825Sdfr/* Tokens.  */
64178825Sdfr#ifndef YYTOKENTYPE
65178825Sdfr# define YYTOKENTYPE
66178825Sdfr   /* Put the tokens into the symbol table, so that GDB and other debuggers
67178825Sdfr      know about them.  */
68178825Sdfr   enum yytokentype {
69178825Sdfr     A = 258,
70178825Sdfr     B = 259,
71178825Sdfr     C = 260,
72178825Sdfr     E = 261,
73178825Sdfr     F = 262,
74178825Sdfr     I = 263,
75178825Sdfr     L = 264,
76178825Sdfr     N = 265,
77178825Sdfr     P = 266,
78178825Sdfr     R = 267,
79178825Sdfr     S = 268,
80178825Sdfr     T = 269,
81178825Sdfr     SP = 270,
82178825Sdfr     CRLF = 271,
83178825Sdfr     COMMA = 272,
84178825Sdfr     USER = 273,
85178825Sdfr     PASS = 274,
86178825Sdfr     ACCT = 275,
87178825Sdfr     REIN = 276,
88178825Sdfr     QUIT = 277,
89178825Sdfr     PORT = 278,
90178825Sdfr     PASV = 279,
91178825Sdfr     TYPE = 280,
92178825Sdfr     STRU = 281,
93178825Sdfr     MODE = 282,
94178825Sdfr     RETR = 283,
95178825Sdfr     STOR = 284,
96178825Sdfr     APPE = 285,
97178825Sdfr     MLFL = 286,
98178825Sdfr     MAIL = 287,
99178825Sdfr     MSND = 288,
100178825Sdfr     MSOM = 289,
101178825Sdfr     MSAM = 290,
102178825Sdfr     MRSQ = 291,
103178825Sdfr     MRCP = 292,
104178825Sdfr     ALLO = 293,
105178825Sdfr     REST = 294,
106178825Sdfr     RNFR = 295,
107178825Sdfr     RNTO = 296,
108178825Sdfr     ABOR = 297,
109178825Sdfr     DELE = 298,
110178825Sdfr     CWD = 299,
111178825Sdfr     LIST = 300,
112178825Sdfr     NLST = 301,
113178825Sdfr     SITE = 302,
114178825Sdfr     sTAT = 303,
115178825Sdfr     HELP = 304,
116178825Sdfr     NOOP = 305,
117178825Sdfr     MKD = 306,
118178825Sdfr     RMD = 307,
119178825Sdfr     PWD = 308,
120178825Sdfr     CDUP = 309,
121178825Sdfr     STOU = 310,
122178825Sdfr     SMNT = 311,
123178825Sdfr     SYST = 312,
124178825Sdfr     SIZE = 313,
125178825Sdfr     MDTM = 314,
126178825Sdfr     EPRT = 315,
127178825Sdfr     EPSV = 316,
128178825Sdfr     UMASK = 317,
129178825Sdfr     IDLE = 318,
130178825Sdfr     CHMOD = 319,
131178825Sdfr     AUTH = 320,
132178825Sdfr     ADAT = 321,
133178825Sdfr     PROT = 322,
134178825Sdfr     PBSZ = 323,
135178825Sdfr     CCC = 324,
136178825Sdfr     MIC = 325,
137178825Sdfr     CONF = 326,
138178825Sdfr     ENC = 327,
139178825Sdfr     KAUTH = 328,
140178825Sdfr     KLIST = 329,
141178825Sdfr     KDESTROY = 330,
142178825Sdfr     KRBTKFILE = 331,
143178825Sdfr     AFSLOG = 332,
144178825Sdfr     LOCATE = 333,
145178825Sdfr     URL = 334,
146178825Sdfr     FEAT = 335,
147178825Sdfr     OPTS = 336,
148178825Sdfr     LEXERR = 337,
149178825Sdfr     STRING = 338,
150178825Sdfr     NUMBER = 339
151178825Sdfr   };
152178825Sdfr#endif
153178825Sdfr/* Tokens.  */
154178825Sdfr#define A 258
155178825Sdfr#define B 259
156178825Sdfr#define C 260
157178825Sdfr#define E 261
158178825Sdfr#define F 262
159178825Sdfr#define I 263
160178825Sdfr#define L 264
161178825Sdfr#define N 265
162178825Sdfr#define P 266
163178825Sdfr#define R 267
164178825Sdfr#define S 268
165178825Sdfr#define T 269
166178825Sdfr#define SP 270
167178825Sdfr#define CRLF 271
168178825Sdfr#define COMMA 272
169178825Sdfr#define USER 273
170178825Sdfr#define PASS 274
171178825Sdfr#define ACCT 275
172178825Sdfr#define REIN 276
173178825Sdfr#define QUIT 277
174178825Sdfr#define PORT 278
175178825Sdfr#define PASV 279
176178825Sdfr#define TYPE 280
177178825Sdfr#define STRU 281
178178825Sdfr#define MODE 282
179178825Sdfr#define RETR 283
180178825Sdfr#define STOR 284
181178825Sdfr#define APPE 285
182178825Sdfr#define MLFL 286
183178825Sdfr#define MAIL 287
184178825Sdfr#define MSND 288
185178825Sdfr#define MSOM 289
186178825Sdfr#define MSAM 290
187178825Sdfr#define MRSQ 291
188178825Sdfr#define MRCP 292
189178825Sdfr#define ALLO 293
190178825Sdfr#define REST 294
191178825Sdfr#define RNFR 295
192178825Sdfr#define RNTO 296
193178825Sdfr#define ABOR 297
194178825Sdfr#define DELE 298
195178825Sdfr#define CWD 299
196178825Sdfr#define LIST 300
197178825Sdfr#define NLST 301
198178825Sdfr#define SITE 302
199178825Sdfr#define sTAT 303
200178825Sdfr#define HELP 304
201178825Sdfr#define NOOP 305
202178825Sdfr#define MKD 306
203178825Sdfr#define RMD 307
204178825Sdfr#define PWD 308
205178825Sdfr#define CDUP 309
206178825Sdfr#define STOU 310
207178825Sdfr#define SMNT 311
208178825Sdfr#define SYST 312
209178825Sdfr#define SIZE 313
210178825Sdfr#define MDTM 314
211178825Sdfr#define EPRT 315
212178825Sdfr#define EPSV 316
213178825Sdfr#define UMASK 317
214178825Sdfr#define IDLE 318
215178825Sdfr#define CHMOD 319
216178825Sdfr#define AUTH 320
217178825Sdfr#define ADAT 321
218178825Sdfr#define PROT 322
219178825Sdfr#define PBSZ 323
220178825Sdfr#define CCC 324
221178825Sdfr#define MIC 325
222178825Sdfr#define CONF 326
223178825Sdfr#define ENC 327
224178825Sdfr#define KAUTH 328
225178825Sdfr#define KLIST 329
226178825Sdfr#define KDESTROY 330
227178825Sdfr#define KRBTKFILE 331
228178825Sdfr#define AFSLOG 332
229178825Sdfr#define LOCATE 333
230178825Sdfr#define URL 334
231178825Sdfr#define FEAT 335
232178825Sdfr#define OPTS 336
233178825Sdfr#define LEXERR 337
234178825Sdfr#define STRING 338
235178825Sdfr#define NUMBER 339
236178825Sdfr
237178825Sdfr
238178825Sdfr
239178825Sdfr
240178825Sdfr/* Copy the first part of user declarations.  */
241178825Sdfr#line 43 "ftpcmd.y"
242178825Sdfr
243178825Sdfr
244178825Sdfr#include "ftpd_locl.h"
245178825SdfrRCSID("$Id: ftpcmd.y 15677 2005-07-19 18:33:08Z lha $");
246178825Sdfr
247178825Sdfroff_t	restart_point;
248178825Sdfr
249178825Sdfrstatic	int hasyyerrored;
250178825Sdfr
251178825Sdfr
252178825Sdfrstatic	int cmd_type;
253178825Sdfrstatic	int cmd_form;
254178825Sdfrstatic	int cmd_bytesz;
255178825Sdfrchar	cbuf[64*1024];
256178825Sdfrchar	*fromname;
257178825Sdfr
258178825Sdfrstruct tab {
259178825Sdfr	char	*name;
260178825Sdfr	short	token;
261178825Sdfr	short	state;
262178825Sdfr	short	implemented;	/* 1 if command is implemented */
263178825Sdfr	char	*help;
264178825Sdfr};
265178825Sdfr
266178825Sdfrextern struct tab cmdtab[];
267178825Sdfrextern struct tab sitetab[];
268178825Sdfr
269178825Sdfrstatic char		*copy (char *);
270178825Sdfrstatic void		 help (struct tab *, char *);
271178825Sdfrstatic struct tab *
272178825Sdfr			 lookup (struct tab *, char *);
273178825Sdfrstatic void		 sizecmd (char *);
274178825Sdfrstatic RETSIGTYPE	 toolong (int);
275178825Sdfrstatic int		 yylex (void);
276178825Sdfr
277178825Sdfr/* This is for bison */
278178825Sdfr
279178825Sdfr#if !defined(alloca) && !defined(HAVE_ALLOCA)
280178825Sdfr#define alloca(x) malloc(x)
281178825Sdfr#endif
282178825Sdfr
283178825Sdfr
284178825Sdfr
285178825Sdfr/* Enabling traces.  */
286178825Sdfr#ifndef YYDEBUG
287178825Sdfr# define YYDEBUG 0
288178825Sdfr#endif
289178825Sdfr
290178825Sdfr/* Enabling verbose error messages.  */
291178825Sdfr#ifdef YYERROR_VERBOSE
292178825Sdfr# undef YYERROR_VERBOSE
293178825Sdfr# define YYERROR_VERBOSE 1
294178825Sdfr#else
295178825Sdfr# define YYERROR_VERBOSE 0
296178825Sdfr#endif
297178825Sdfr
298178825Sdfr/* Enabling the token table.  */
299178825Sdfr#ifndef YYTOKEN_TABLE
300178825Sdfr# define YYTOKEN_TABLE 0
301178825Sdfr#endif
302178825Sdfr
303178825Sdfr#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
304178825Sdfrtypedef union YYSTYPE
305178825Sdfr#line 86 "ftpcmd.y"
306178825Sdfr{
307178825Sdfr	int	i;
308178825Sdfr	char   *s;
309178825Sdfr}
310178825Sdfr/* Line 193 of yacc.c.  */
311178825Sdfr#line 312 "ftpcmd.c"
312178825Sdfr	YYSTYPE;
313178825Sdfr# define yystype YYSTYPE /* obsolescent; will be withdrawn */
314178825Sdfr# define YYSTYPE_IS_DECLARED 1
315178825Sdfr# define YYSTYPE_IS_TRIVIAL 1
316178825Sdfr#endif
317178825Sdfr
318178825Sdfr
319178825Sdfr
320178825Sdfr/* Copy the second part of user declarations.  */
321178825Sdfr
322178825Sdfr
323178825Sdfr/* Line 216 of yacc.c.  */
324178825Sdfr#line 325 "ftpcmd.c"
325178825Sdfr
326178825Sdfr#ifdef short
327178825Sdfr# undef short
328178825Sdfr#endif
329178825Sdfr
330178825Sdfr#ifdef YYTYPE_UINT8
331178825Sdfrtypedef YYTYPE_UINT8 yytype_uint8;
332178825Sdfr#else
333178825Sdfrtypedef unsigned char yytype_uint8;
334178825Sdfr#endif
335178825Sdfr
336178825Sdfr#ifdef YYTYPE_INT8
337178825Sdfrtypedef YYTYPE_INT8 yytype_int8;
338178825Sdfr#elif (defined __STDC__ || defined __C99__FUNC__ \
339178825Sdfr     || defined __cplusplus || defined _MSC_VER)
340178825Sdfrtypedef signed char yytype_int8;
341178825Sdfr#else
342178825Sdfrtypedef short int yytype_int8;
343178825Sdfr#endif
344178825Sdfr
345178825Sdfr#ifdef YYTYPE_UINT16
346178825Sdfrtypedef YYTYPE_UINT16 yytype_uint16;
347178825Sdfr#else
348178825Sdfrtypedef unsigned short int yytype_uint16;
349178825Sdfr#endif
350178825Sdfr
351178825Sdfr#ifdef YYTYPE_INT16
352178825Sdfrtypedef YYTYPE_INT16 yytype_int16;
353178825Sdfr#else
354178825Sdfrtypedef short int yytype_int16;
355178825Sdfr#endif
356178825Sdfr
357178825Sdfr#ifndef YYSIZE_T
358178825Sdfr# ifdef __SIZE_TYPE__
359178825Sdfr#  define YYSIZE_T __SIZE_TYPE__
360178825Sdfr# elif defined size_t
361178825Sdfr#  define YYSIZE_T size_t
362178825Sdfr# elif ! defined YYSIZE_T && (defined __STDC__ || defined __C99__FUNC__ \
363178825Sdfr     || defined __cplusplus || defined _MSC_VER)
364178825Sdfr#  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
365178825Sdfr#  define YYSIZE_T size_t
366178825Sdfr# else
367178825Sdfr#  define YYSIZE_T unsigned int
368178825Sdfr# endif
369178825Sdfr#endif
370178825Sdfr
371178825Sdfr#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
372178825Sdfr
373178825Sdfr#ifndef YY_
374178825Sdfr# if defined YYENABLE_NLS && YYENABLE_NLS
375178825Sdfr#  if ENABLE_NLS
376178825Sdfr#   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
377178825Sdfr#   define YY_(msgid) dgettext ("bison-runtime", msgid)
378178825Sdfr#  endif
379178825Sdfr# endif
380178825Sdfr# ifndef YY_
381178825Sdfr#  define YY_(msgid) msgid
382178825Sdfr# endif
383178825Sdfr#endif
384178825Sdfr
385178825Sdfr/* Suppress unused-variable warnings by "using" E.  */
386178825Sdfr#if ! defined lint || defined __GNUC__
387178825Sdfr# define YYUSE(e) ((void) (e))
388178825Sdfr#else
389178825Sdfr# define YYUSE(e) /* empty */
390178825Sdfr#endif
391178825Sdfr
392178825Sdfr/* Identity function, used to suppress warnings about constant conditions.  */
393178825Sdfr#ifndef lint
394178825Sdfr# define YYID(n) (n)
395178825Sdfr#else
396178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \
397178825Sdfr     || defined __cplusplus || defined _MSC_VER)
398178825Sdfrstatic int
399178825SdfrYYID (int i)
400178825Sdfr#else
401178825Sdfrstatic int
402178825SdfrYYID (i)
403178825Sdfr    int i;
404178825Sdfr#endif
405178825Sdfr{
406178825Sdfr  return i;
407178825Sdfr}
408178825Sdfr#endif
409178825Sdfr
410178825Sdfr#if ! defined yyoverflow || YYERROR_VERBOSE
411178825Sdfr
412178825Sdfr/* The parser invokes alloca or malloc; define the necessary symbols.  */
413178825Sdfr
414178825Sdfr# ifdef YYSTACK_USE_ALLOCA
415178825Sdfr#  if YYSTACK_USE_ALLOCA
416178825Sdfr#   ifdef __GNUC__
417178825Sdfr#    define YYSTACK_ALLOC __builtin_alloca
418178825Sdfr#   elif defined __BUILTIN_VA_ARG_INCR
419178825Sdfr#    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
420178825Sdfr#   elif defined _AIX
421178825Sdfr#    define YYSTACK_ALLOC __alloca
422178825Sdfr#   elif defined _MSC_VER
423178825Sdfr#    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
424178825Sdfr#    define alloca _alloca
425178825Sdfr#   else
426178825Sdfr#    define YYSTACK_ALLOC alloca
427178825Sdfr#    if ! defined _ALLOCA_H && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
428178825Sdfr     || defined __cplusplus || defined _MSC_VER)
429178825Sdfr#     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
430178825Sdfr#     ifndef _STDLIB_H
431178825Sdfr#      define _STDLIB_H 1
432178825Sdfr#     endif
433178825Sdfr#    endif
434178825Sdfr#   endif
435178825Sdfr#  endif
436178825Sdfr# endif
437178825Sdfr
438178825Sdfr# ifdef YYSTACK_ALLOC
439178825Sdfr   /* Pacify GCC's `empty if-body' warning.  */
440178825Sdfr#  define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
441178825Sdfr#  ifndef YYSTACK_ALLOC_MAXIMUM
442178825Sdfr    /* The OS might guarantee only one guard page at the bottom of the stack,
443178825Sdfr       and a page size can be as small as 4096 bytes.  So we cannot safely
444178825Sdfr       invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
445178825Sdfr       to allow for a few compiler-allocated temporary stack slots.  */
446178825Sdfr#   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
447178825Sdfr#  endif
448178825Sdfr# else
449178825Sdfr#  define YYSTACK_ALLOC YYMALLOC
450178825Sdfr#  define YYSTACK_FREE YYFREE
451178825Sdfr#  ifndef YYSTACK_ALLOC_MAXIMUM
452178825Sdfr#   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
453178825Sdfr#  endif
454178825Sdfr#  if (defined __cplusplus && ! defined _STDLIB_H \
455178825Sdfr       && ! ((defined YYMALLOC || defined malloc) \
456178825Sdfr	     && (defined YYFREE || defined free)))
457178825Sdfr#   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
458178825Sdfr#   ifndef _STDLIB_H
459178825Sdfr#    define _STDLIB_H 1
460178825Sdfr#   endif
461178825Sdfr#  endif
462178825Sdfr#  ifndef YYMALLOC
463178825Sdfr#   define YYMALLOC malloc
464178825Sdfr#   if ! defined malloc && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
465178825Sdfr     || defined __cplusplus || defined _MSC_VER)
466178825Sdfrvoid *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
467178825Sdfr#   endif
468178825Sdfr#  endif
469178825Sdfr#  ifndef YYFREE
470178825Sdfr#   define YYFREE free
471178825Sdfr#   if ! defined free && ! defined _STDLIB_H && (defined __STDC__ || defined __C99__FUNC__ \
472178825Sdfr     || defined __cplusplus || defined _MSC_VER)
473178825Sdfrvoid free (void *); /* INFRINGES ON USER NAME SPACE */
474178825Sdfr#   endif
475178825Sdfr#  endif
476178825Sdfr# endif
477178825Sdfr#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
478178825Sdfr
479178825Sdfr
480178825Sdfr#if (! defined yyoverflow \
481178825Sdfr     && (! defined __cplusplus \
482178825Sdfr	 || (defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
483178825Sdfr
484178825Sdfr/* A type that is properly aligned for any stack member.  */
485178825Sdfrunion yyalloc
486178825Sdfr{
487178825Sdfr  yytype_int16 yyss;
488178825Sdfr  YYSTYPE yyvs;
489178825Sdfr  };
490178825Sdfr
491178825Sdfr/* The size of the maximum gap between one aligned stack and the next.  */
492178825Sdfr# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1)
493178825Sdfr
494178825Sdfr/* The size of an array large to enough to hold all stacks, each with
495178825Sdfr   N elements.  */
496178825Sdfr# define YYSTACK_BYTES(N) \
497178825Sdfr     ((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE)) \
498178825Sdfr      + YYSTACK_GAP_MAXIMUM)
499178825Sdfr
500178825Sdfr/* Copy COUNT objects from FROM to TO.  The source and destination do
501178825Sdfr   not overlap.  */
502178825Sdfr# ifndef YYCOPY
503178825Sdfr#  if defined __GNUC__ && 1 < __GNUC__
504178825Sdfr#   define YYCOPY(To, From, Count) \
505178825Sdfr      __builtin_memcpy (To, From, (Count) * sizeof (*(From)))
506178825Sdfr#  else
507178825Sdfr#   define YYCOPY(To, From, Count)		\
508178825Sdfr      do					\
509178825Sdfr	{					\
510178825Sdfr	  YYSIZE_T yyi;				\
511178825Sdfr	  for (yyi = 0; yyi < (Count); yyi++)	\
512178825Sdfr	    (To)[yyi] = (From)[yyi];		\
513178825Sdfr	}					\
514178825Sdfr      while (YYID (0))
515178825Sdfr#  endif
516178825Sdfr# endif
517178825Sdfr
518178825Sdfr/* Relocate STACK from its old location to the new one.  The
519178825Sdfr   local variables YYSIZE and YYSTACKSIZE give the old and new number of
520178825Sdfr   elements in the stack, and YYPTR gives the new location of the
521178825Sdfr   stack.  Advance YYPTR to a properly aligned location for the next
522178825Sdfr   stack.  */
523178825Sdfr# define YYSTACK_RELOCATE(Stack)					\
524178825Sdfr    do									\
525178825Sdfr      {									\
526178825Sdfr	YYSIZE_T yynewbytes;						\
527178825Sdfr	YYCOPY (&yyptr->Stack, Stack, yysize);				\
528178825Sdfr	Stack = &yyptr->Stack;						\
529178825Sdfr	yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
530178825Sdfr	yyptr += yynewbytes / sizeof (*yyptr);				\
531178825Sdfr      }									\
532178825Sdfr    while (YYID (0))
533178825Sdfr
534178825Sdfr#endif
535178825Sdfr
536178825Sdfr/* YYFINAL -- State number of the termination state.  */
537178825Sdfr#define YYFINAL  2
538178825Sdfr/* YYLAST -- Last index in YYTABLE.  */
539178825Sdfr#define YYLAST   327
540178825Sdfr
541178825Sdfr/* YYNTOKENS -- Number of terminals.  */
542178825Sdfr#define YYNTOKENS  85
543178825Sdfr/* YYNNTS -- Number of nonterminals.  */
544178825Sdfr#define YYNNTS  18
545178825Sdfr/* YYNRULES -- Number of rules.  */
546178825Sdfr#define YYNRULES  98
547178825Sdfr/* YYNRULES -- Number of states.  */
548178825Sdfr#define YYNSTATES  317
549178825Sdfr
550178825Sdfr/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
551178825Sdfr#define YYUNDEFTOK  2
552178825Sdfr#define YYMAXUTOK   339
553178825Sdfr
554178825Sdfr#define YYTRANSLATE(YYX)						\
555178825Sdfr  ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
556178825Sdfr
557178825Sdfr/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX.  */
558178825Sdfrstatic const yytype_uint8 yytranslate[] =
559178825Sdfr{
560178825Sdfr       0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
561178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
562178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
563178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
564178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
565178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
566178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
567178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
568178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
569178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
570178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
571178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
572178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
573178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
574178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
575178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
576178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
577178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
578178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
579178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
580178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
581178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
582178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
583178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
584178825Sdfr       2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
585178825Sdfr       2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
586178825Sdfr       5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
587178825Sdfr      15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
588178825Sdfr      25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
589178825Sdfr      35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
590178825Sdfr      45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
591178825Sdfr      55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
592178825Sdfr      65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
593178825Sdfr      75,    76,    77,    78,    79,    80,    81,    82,    83,    84
594178825Sdfr};
595178825Sdfr
596178825Sdfr#if YYDEBUG
597178825Sdfr/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
598178825Sdfr   YYRHS.  */
599178825Sdfrstatic const yytype_uint16 yyprhs[] =
600178825Sdfr{
601178825Sdfr       0,     0,     3,     4,     7,    10,    16,    22,    28,    34,
602178825Sdfr      38,    42,    48,    54,    60,    66,    72,    82,    88,    94,
603178825Sdfr     100,   104,   110,   114,   120,   126,   130,   136,   142,   146,
604178825Sdfr     150,   156,   160,   166,   170,   176,   182,   186,   190,   194,
605178825Sdfr     200,   206,   214,   220,   228,   238,   244,   252,   260,   266,
606178825Sdfr     272,   280,   286,   294,   302,   308,   314,   318,   324,   330,
607178825Sdfr     334,   337,   343,   349,   354,   359,   365,   371,   375,   380,
608178825Sdfr     385,   390,   392,   393,   395,   397,   409,   411,   413,   415,
609178825Sdfr     417,   421,   423,   427,   429,   431,   435,   438,   440,   442,
610178825Sdfr     444,   446,   448,   450,   452,   454,   456,   458,   460
611178825Sdfr};
612178825Sdfr
613178825Sdfr/* YYRHS -- A `-1'-separated list of the rules' RHS.  */
614178825Sdfrstatic const yytype_int8 yyrhs[] =
615178825Sdfr{
616178825Sdfr      86,     0,    -1,    -1,    86,    87,    -1,    86,    88,    -1,
617178825Sdfr      18,    15,    89,    16,   102,    -1,    19,    15,    90,    16,
618178825Sdfr     102,    -1,    23,    15,    92,    16,   102,    -1,    60,    15,
619178825Sdfr      83,    16,   102,    -1,    24,    16,   101,    -1,    61,    16,
620178825Sdfr     101,    -1,    61,    15,    83,    16,   101,    -1,    25,    15,
621178825Sdfr      94,    16,   102,    -1,    26,    15,    95,    16,   102,    -1,
622178825Sdfr      27,    15,    96,    16,   102,    -1,    38,    15,    84,    16,
623178825Sdfr     102,    -1,    38,    15,    84,    15,    12,    15,    84,    16,
624178825Sdfr     102,    -1,    28,    15,    97,    16,   101,    -1,    29,    15,
625178825Sdfr      97,    16,   101,    -1,    30,    15,    97,    16,   101,    -1,
626178825Sdfr      46,    16,   101,    -1,    46,    15,    83,    16,   101,    -1,
627178825Sdfr      45,    16,   101,    -1,    45,    15,    97,    16,   101,    -1,
628178825Sdfr      48,    15,    97,    16,   101,    -1,    48,    16,   102,    -1,
629178825Sdfr      43,    15,    97,    16,   100,    -1,    41,    15,    97,    16,
630178825Sdfr     100,    -1,    42,    16,   102,    -1,    44,    16,   101,    -1,
631178825Sdfr      44,    15,    97,    16,   101,    -1,    49,    16,   102,    -1,
632178825Sdfr      49,    15,    83,    16,   102,    -1,    50,    16,   102,    -1,
633178825Sdfr      51,    15,    97,    16,   101,    -1,    52,    15,    97,    16,
634178825Sdfr     100,    -1,    53,    16,   101,    -1,    54,    16,   101,    -1,
635178825Sdfr      80,    16,   102,    -1,    81,    15,    83,    16,   102,    -1,
636178825Sdfr      47,    15,    49,    16,   102,    -1,    47,    15,    49,    15,
637178825Sdfr      83,    16,   102,    -1,    47,    15,    62,    16,   101,    -1,
638178825Sdfr      47,    15,    62,    15,    99,    16,   100,    -1,    47,    15,
639178825Sdfr      64,    15,    99,    15,    97,    16,   100,    -1,    47,    15,
640178825Sdfr      63,    16,   102,    -1,    47,    15,    63,    15,    84,    16,
641178825Sdfr     102,    -1,    47,    15,    73,    15,    83,    16,   101,    -1,
642178825Sdfr      47,    15,    74,    16,   101,    -1,    47,    15,    75,    16,
643178825Sdfr     101,    -1,    47,    15,    76,    15,    83,    16,   101,    -1,
644178825Sdfr      47,    15,    77,    16,   101,    -1,    47,    15,    77,    15,
645178825Sdfr      83,    16,   101,    -1,    47,    15,    78,    15,    83,    16,
646178825Sdfr     101,    -1,    47,    15,    79,    16,   102,    -1,    55,    15,
647178825Sdfr      97,    16,   101,    -1,    57,    16,   102,    -1,    58,    15,
648178825Sdfr      97,    16,   101,    -1,    59,    15,    97,    16,   101,    -1,
649178825Sdfr      22,    16,   102,    -1,     1,    16,    -1,    40,    15,    97,
650178825Sdfr      16,   100,    -1,    39,    15,    91,    16,   102,    -1,    65,
651178825Sdfr      15,    83,    16,    -1,    66,    15,    83,    16,    -1,    68,
652178825Sdfr      15,    84,    16,   102,    -1,    67,    15,    83,    16,   102,
653178825Sdfr      -1,    69,    16,   102,    -1,    70,    15,    83,    16,    -1,
654178825Sdfr      71,    15,    83,    16,    -1,    72,    15,    83,    16,    -1,
655178825Sdfr      83,    -1,    -1,    83,    -1,    84,    -1,    84,    17,    84,
656178825Sdfr      17,    84,    17,    84,    17,    84,    17,    84,    -1,    10,
657178825Sdfr      -1,    14,    -1,     5,    -1,     3,    -1,     3,    15,    93,
658178825Sdfr      -1,     6,    -1,     6,    15,    93,    -1,     8,    -1,     9,
659178825Sdfr      -1,     9,    15,    91,    -1,     9,    91,    -1,     7,    -1,
660178825Sdfr      12,    -1,    11,    -1,    13,    -1,     4,    -1,     5,    -1,
661178825Sdfr      98,    -1,    83,    -1,    84,    -1,   101,    -1,   102,    -1,
662178825Sdfr      -1
663178825Sdfr};
664178825Sdfr
665178825Sdfr/* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
666178825Sdfrstatic const yytype_uint16 yyrline[] =
667178825Sdfr{
668178825Sdfr       0,   129,   129,   131,   136,   140,   146,   153,   164,   170,
669178825Sdfr     175,   180,   186,   223,   237,   251,   257,   263,   272,   281,
670178825Sdfr     290,   295,   304,   309,   315,   322,   327,   334,   348,   353,
671178825Sdfr     358,   365,   370,   387,   392,   399,   406,   411,   416,   426,
672178825Sdfr     433,   438,   443,   451,   464,   478,   485,   502,   525,   530,
673178825Sdfr     539,   552,   563,   576,   583,   588,   595,   613,   630,   658,
674178825Sdfr     665,   671,   681,   691,   696,   701,   706,   711,   716,   721,
675178825Sdfr     726,   734,   739,   742,   746,   750,   763,   767,   771,   778,
676178825Sdfr     783,   788,   793,   798,   802,   807,   813,   821,   825,   829,
677178825Sdfr     836,   840,   844,   851,   879,   883,   909,   917,   928
678178825Sdfr};
679178825Sdfr#endif
680178825Sdfr
681178825Sdfr#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
682178825Sdfr/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
683178825Sdfr   First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
684178825Sdfrstatic const char *const yytname[] =
685178825Sdfr{
686178825Sdfr  "$end", "error", "$undefined", "A", "B", "C", "E", "F", "I", "L", "N",
687178825Sdfr  "P", "R", "S", "T", "SP", "CRLF", "COMMA", "USER", "PASS", "ACCT",
688178825Sdfr  "REIN", "QUIT", "PORT", "PASV", "TYPE", "STRU", "MODE", "RETR", "STOR",
689178825Sdfr  "APPE", "MLFL", "MAIL", "MSND", "MSOM", "MSAM", "MRSQ", "MRCP", "ALLO",
690178825Sdfr  "REST", "RNFR", "RNTO", "ABOR", "DELE", "CWD", "LIST", "NLST", "SITE",
691178825Sdfr  "sTAT", "HELP", "NOOP", "MKD", "RMD", "PWD", "CDUP", "STOU", "SMNT",
692178825Sdfr  "SYST", "SIZE", "MDTM", "EPRT", "EPSV", "UMASK", "IDLE", "CHMOD", "AUTH",
693178825Sdfr  "ADAT", "PROT", "PBSZ", "CCC", "MIC", "CONF", "ENC", "KAUTH", "KLIST",
694178825Sdfr  "KDESTROY", "KRBTKFILE", "AFSLOG", "LOCATE", "URL", "FEAT", "OPTS",
695178825Sdfr  "LEXERR", "STRING", "NUMBER", "$accept", "cmd_list", "cmd", "rcmd",
696178825Sdfr  "username", "password", "byte_size", "host_port", "form_code",
697178825Sdfr  "type_code", "struct_code", "mode_code", "pathname", "pathstring",
698178825Sdfr  "octal_number", "check_login_no_guest", "check_login", "check_secure", 0
699178825Sdfr};
700178825Sdfr#endif
701178825Sdfr
702178825Sdfr# ifdef YYPRINT
703178825Sdfr/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to
704178825Sdfr   token YYLEX-NUM.  */
705178825Sdfrstatic const yytype_uint16 yytoknum[] =
706178825Sdfr{
707178825Sdfr       0,   256,   257,   258,   259,   260,   261,   262,   263,   264,
708178825Sdfr     265,   266,   267,   268,   269,   270,   271,   272,   273,   274,
709178825Sdfr     275,   276,   277,   278,   279,   280,   281,   282,   283,   284,
710178825Sdfr     285,   286,   287,   288,   289,   290,   291,   292,   293,   294,
711178825Sdfr     295,   296,   297,   298,   299,   300,   301,   302,   303,   304,
712178825Sdfr     305,   306,   307,   308,   309,   310,   311,   312,   313,   314,
713178825Sdfr     315,   316,   317,   318,   319,   320,   321,   322,   323,   324,
714178825Sdfr     325,   326,   327,   328,   329,   330,   331,   332,   333,   334,
715178825Sdfr     335,   336,   337,   338,   339
716178825Sdfr};
717178825Sdfr# endif
718178825Sdfr
719178825Sdfr/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives.  */
720178825Sdfrstatic const yytype_uint8 yyr1[] =
721178825Sdfr{
722178825Sdfr       0,    85,    86,    86,    86,    87,    87,    87,    87,    87,
723178825Sdfr      87,    87,    87,    87,    87,    87,    87,    87,    87,    87,
724178825Sdfr      87,    87,    87,    87,    87,    87,    87,    87,    87,    87,
725178825Sdfr      87,    87,    87,    87,    87,    87,    87,    87,    87,    87,
726178825Sdfr      87,    87,    87,    87,    87,    87,    87,    87,    87,    87,
727178825Sdfr      87,    87,    87,    87,    87,    87,    87,    87,    87,    87,
728178825Sdfr      87,    88,    88,    88,    88,    88,    88,    88,    88,    88,
729178825Sdfr      88,    89,    90,    90,    91,    92,    93,    93,    93,    94,
730178825Sdfr      94,    94,    94,    94,    94,    94,    94,    95,    95,    95,
731178825Sdfr      96,    96,    96,    97,    98,    99,   100,   101,   102
732178825Sdfr};
733178825Sdfr
734178825Sdfr/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
735178825Sdfrstatic const yytype_uint8 yyr2[] =
736178825Sdfr{
737178825Sdfr       0,     2,     0,     2,     2,     5,     5,     5,     5,     3,
738178825Sdfr       3,     5,     5,     5,     5,     5,     9,     5,     5,     5,
739178825Sdfr       3,     5,     3,     5,     5,     3,     5,     5,     3,     3,
740178825Sdfr       5,     3,     5,     3,     5,     5,     3,     3,     3,     5,
741178825Sdfr       5,     7,     5,     7,     9,     5,     7,     7,     5,     5,
742178825Sdfr       7,     5,     7,     7,     5,     5,     3,     5,     5,     3,
743178825Sdfr       2,     5,     5,     4,     4,     5,     5,     3,     4,     4,
744178825Sdfr       4,     1,     0,     1,     1,    11,     1,     1,     1,     1,
745178825Sdfr       3,     1,     3,     1,     1,     3,     2,     1,     1,     1,
746178825Sdfr       1,     1,     1,     1,     1,     1,     1,     1,     0
747178825Sdfr};
748178825Sdfr
749178825Sdfr/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state
750178825Sdfr   STATE-NUM when YYTABLE doesn't specify something else to do.  Zero
751178825Sdfr   means the default is an error.  */
752178825Sdfrstatic const yytype_uint8 yydefact[] =
753178825Sdfr{
754178825Sdfr       2,     0,     1,     0,     0,     0,     0,     0,     0,     0,
755178825Sdfr       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
756178825Sdfr       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
757178825Sdfr       0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
758178825Sdfr       0,     0,     0,     0,     0,     0,     0,     0,     3,     4,
759178825Sdfr      60,     0,    72,    98,     0,    98,     0,     0,     0,     0,
760178825Sdfr       0,     0,     0,     0,     0,     0,    98,     0,     0,    98,
761178825Sdfr       0,    98,     0,    98,     0,     0,    98,     0,    98,    98,
762178825Sdfr       0,     0,    98,    98,     0,    98,     0,     0,     0,     0,
763178825Sdfr      98,     0,     0,     0,     0,    98,     0,     0,     0,    98,
764178825Sdfr       0,    71,     0,    73,     0,    59,     0,     0,     9,    97,
765178825Sdfr      79,    81,    83,    84,     0,    87,    89,    88,     0,    91,
766178825Sdfr      92,    90,     0,    94,     0,    93,     0,     0,     0,    74,
767178825Sdfr       0,     0,     0,    28,     0,     0,    29,     0,    22,     0,
768178825Sdfr      20,     0,     0,     0,     0,     0,     0,     0,     0,     0,
769178825Sdfr       0,     0,     0,    25,     0,    31,    33,     0,     0,    36,
770178825Sdfr      37,     0,    56,     0,     0,     0,     0,    10,     0,     0,
771178825Sdfr       0,     0,    67,     0,     0,     0,    38,     0,    98,    98,
772178825Sdfr       0,    98,     0,     0,     0,    86,    98,    98,    98,    98,
773178825Sdfr      98,    98,     0,    98,    98,    98,    98,    98,    98,    98,
774178825Sdfr      98,     0,    98,     0,    98,     0,    98,     0,     0,    98,
775178825Sdfr      98,     0,     0,    98,     0,    98,    98,    98,    98,    98,
776178825Sdfr      98,    98,    98,    98,    98,    63,    64,    98,    98,    68,
777178825Sdfr      69,    70,    98,     5,     6,     0,     7,    78,    76,    77,
778178825Sdfr      80,    82,    85,    12,    13,    14,    17,    18,    19,     0,
779178825Sdfr      15,    62,    61,    96,    27,    26,    30,    23,    21,     0,
780178825Sdfr      40,    95,     0,    42,     0,    45,     0,     0,    48,    49,
781178825Sdfr       0,     0,    51,     0,    54,    24,    32,    34,    35,    55,
782178825Sdfr      57,    58,     8,    11,    66,    65,    39,     0,     0,    98,
783178825Sdfr      98,    98,     0,    98,    98,    98,    98,     0,     0,    41,
784178825Sdfr      43,    46,     0,    47,    50,    52,    53,     0,    98,    98,
785178825Sdfr       0,    16,    44,     0,     0,     0,    75
786178825Sdfr};
787178825Sdfr
788178825Sdfr/* YYDEFGOTO[NTERM-NUM].  */
789178825Sdfrstatic const yytype_int16 yydefgoto[] =
790178825Sdfr{
791178825Sdfr      -1,     1,    48,    49,   102,   104,   130,   107,   240,   114,
792178825Sdfr     118,   122,   124,   125,   262,   252,   253,   109
793178825Sdfr};
794178825Sdfr
795178825Sdfr/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
796178825Sdfr   STATE-NUM.  */
797178825Sdfr#define YYPACT_NINF -196
798178825Sdfrstatic const yytype_int16 yypact[] =
799178825Sdfr{
800178825Sdfr    -196,   246,  -196,     3,    13,    20,    11,    24,    21,    26,
801178825Sdfr      30,    45,    66,    67,    68,    69,    70,    71,    72,    76,
802178825Sdfr      73,    -7,    -5,    15,    78,    28,    32,    80,    79,    82,
803178825Sdfr      83,    91,    93,    94,    96,    97,    98,    38,   100,   101,
804178825Sdfr     102,   103,   104,   106,   107,   108,   111,   109,  -196,  -196,
805178825Sdfr    -196,   -66,    36,  -196,    14,  -196,    12,    22,     1,    46,
806178825Sdfr      46,    46,    25,    48,    46,    46,  -196,    46,    46,  -196,
807178825Sdfr      46,  -196,    53,  -196,    27,    46,  -196,    55,  -196,  -196,
808178825Sdfr      46,    46,  -196,  -196,    46,  -196,    46,    46,    56,    59,
809178825Sdfr    -196,    60,    61,    62,    63,  -196,    65,    77,    85,  -196,
810178825Sdfr      86,  -196,   114,  -196,   115,  -196,   120,   130,  -196,  -196,
811178825Sdfr     135,   136,  -196,   -11,   138,  -196,  -196,  -196,   139,  -196,
812178825Sdfr    -196,  -196,   143,  -196,   145,  -196,   147,   156,    47,  -196,
813178825Sdfr     157,   162,   165,  -196,   166,   168,  -196,   170,  -196,   174,
814178825Sdfr    -196,    49,    52,    54,   137,   177,   178,   179,   181,    64,
815178825Sdfr     182,   183,   184,  -196,   185,  -196,  -196,   186,   187,  -196,
816178825Sdfr    -196,   188,  -196,   189,   190,   191,   192,  -196,   193,   194,
817178825Sdfr     195,   196,  -196,   197,   198,   199,  -196,   200,  -196,  -196,
818178825Sdfr     133,  -196,     2,     2,    48,  -196,  -196,  -196,  -196,  -196,
819178825Sdfr    -196,  -196,   206,  -196,  -196,  -196,  -196,  -196,  -196,  -196,
820178825Sdfr    -196,   110,  -196,   140,  -196,   141,  -196,   140,   144,  -196,
821178825Sdfr    -196,   146,   148,  -196,   149,  -196,  -196,  -196,  -196,  -196,
822178825Sdfr    -196,  -196,  -196,  -196,  -196,  -196,  -196,  -196,  -196,  -196,
823178825Sdfr    -196,  -196,  -196,  -196,  -196,   202,  -196,  -196,  -196,  -196,
824178825Sdfr    -196,  -196,  -196,  -196,  -196,  -196,  -196,  -196,  -196,   205,
825178825Sdfr    -196,  -196,  -196,  -196,  -196,  -196,  -196,  -196,  -196,   207,
826178825Sdfr    -196,  -196,   210,  -196,   212,  -196,   215,   217,  -196,  -196,
827178825Sdfr     218,   219,  -196,   221,  -196,  -196,  -196,  -196,  -196,  -196,
828178825Sdfr    -196,  -196,  -196,  -196,  -196,  -196,  -196,   155,   158,  -196,
829178825Sdfr    -196,  -196,    46,  -196,  -196,  -196,  -196,   204,   224,  -196,
830178825Sdfr    -196,  -196,   225,  -196,  -196,  -196,  -196,   159,  -196,  -196,
831178825Sdfr     227,  -196,  -196,   161,   231,   167,  -196
832178825Sdfr};
833178825Sdfr
834178825Sdfr/* YYPGOTO[NTERM-NUM].  */
835178825Sdfrstatic const yytype_int16 yypgoto[] =
836178825Sdfr{
837178825Sdfr    -196,  -196,  -196,  -196,  -196,  -196,  -110,  -196,    39,  -196,
838178825Sdfr    -196,  -196,    -9,  -196,    42,  -195,   -33,   -53
839178825Sdfr};
840178825Sdfr
841178825Sdfr/* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
842178825Sdfr   positive, shift that token.  If negative, reduce the rule which
843178825Sdfr   number is the opposite.  If zero, do what YYDEFACT says.
844178825Sdfr   If YYTABLE_NINF, syntax error.  */
845178825Sdfr#define YYTABLE_NINF -1
846178825Sdfrstatic const yytype_uint16 yytable[] =
847178825Sdfr{
848178825Sdfr     105,   254,   255,   185,   184,   119,   120,   237,    68,    69,
849178825Sdfr      70,    71,   238,   133,   121,   110,   239,   101,   111,    50,
850178825Sdfr     112,   113,   108,   153,   278,   155,   156,    53,    51,   115,
851178825Sdfr      72,    73,   162,   116,   117,    52,   136,    55,   138,    54,
852178825Sdfr     140,    56,   172,    75,    76,    57,   176,    77,    78,   159,
853178825Sdfr     160,   126,   127,    89,    90,   131,   132,   167,   134,   135,
854178825Sdfr      58,   137,   192,   193,   201,   202,   152,   203,   204,   205,
855178825Sdfr     206,   157,   158,   129,   242,   161,   141,   163,   164,   212,
856178825Sdfr     213,    59,    60,    61,    62,    63,    64,    65,    67,   142,
857178825Sdfr     143,   144,    66,    74,    80,   300,    79,    81,   106,    82,
858178825Sdfr     145,   146,   147,   148,   149,   150,   151,    83,    84,   128,
859178825Sdfr      85,    86,    87,    88,   312,    91,    92,    93,    94,   103,
860178825Sdfr      95,    96,    97,    98,   100,   233,   234,    99,   236,   123,
861178825Sdfr     178,   179,   129,   243,   244,   245,   139,   180,   154,   165,
862178825Sdfr     250,   251,   166,   168,   169,   170,   181,   171,   173,   260,
863178825Sdfr     182,   183,   207,   265,   186,   187,   246,   247,   248,   188,
864178825Sdfr     174,   189,   274,   190,   276,   256,   257,   258,   175,   177,
865178825Sdfr     282,   263,   191,   194,   284,   285,   268,   269,   195,   286,
866178825Sdfr     272,   196,   197,   275,   198,   277,   199,   279,   280,   281,
867178825Sdfr     200,   283,   208,   259,   209,   210,   211,   214,     0,   215,
868178825Sdfr     216,   217,   218,   219,   220,   221,   222,   223,   224,   225,
869178825Sdfr     226,   227,   228,   229,   230,   231,   232,   235,   249,   287,
870178825Sdfr     288,   307,   241,   289,   261,   264,   290,   267,   291,   270,
871178825Sdfr     292,   271,   273,   293,   294,   295,   299,   296,   301,   297,
872178825Sdfr     308,   309,   298,   310,   313,   314,     2,     3,   315,   266,
873178825Sdfr       0,   316,     0,     0,     0,   311,     0,     0,     0,     0,
874178825Sdfr     303,   304,   305,   306,     4,     5,     0,     0,     6,     7,
875178825Sdfr       8,     9,    10,    11,    12,    13,    14,     0,     0,     0,
876178825Sdfr       0,     0,     0,   302,    15,    16,    17,    18,    19,    20,
877178825Sdfr      21,    22,    23,    24,    25,    26,    27,    28,    29,    30,
878178825Sdfr      31,    32,     0,    33,    34,    35,    36,    37,     0,     0,
879178825Sdfr       0,    38,    39,    40,    41,    42,    43,    44,    45,     0,
880178825Sdfr       0,     0,     0,     0,     0,     0,    46,    47
881178825Sdfr};
882178825Sdfr
883178825Sdfrstatic const yytype_int16 yycheck[] =
884178825Sdfr{
885178825Sdfr      53,   196,   197,   113,    15,     4,     5,     5,    15,    16,
886178825Sdfr      15,    16,    10,    66,    13,     3,    14,    83,     6,    16,
887178825Sdfr       8,     9,    55,    76,   219,    78,    79,    16,    15,     7,
888178825Sdfr      15,    16,    85,    11,    12,    15,    69,    16,    71,    15,
889178825Sdfr      73,    15,    95,    15,    16,    15,    99,    15,    16,    82,
890178825Sdfr      83,    60,    61,    15,    16,    64,    65,    90,    67,    68,
891178825Sdfr      15,    70,    15,    16,    15,    16,    75,    15,    16,    15,
892178825Sdfr      16,    80,    81,    84,   184,    84,    49,    86,    87,    15,
893178825Sdfr      16,    15,    15,    15,    15,    15,    15,    15,    15,    62,
894178825Sdfr      63,    64,    16,    15,    15,   290,    16,    15,    84,    16,
895178825Sdfr      73,    74,    75,    76,    77,    78,    79,    16,    15,    84,
896178825Sdfr      16,    15,    15,    15,   309,    15,    15,    15,    15,    83,
897178825Sdfr      16,    15,    15,    15,    15,   178,   179,    16,   181,    83,
898178825Sdfr      16,    16,    84,   186,   187,   188,    83,    17,    83,    83,
899178825Sdfr     193,   194,    83,    83,    83,    83,    16,    84,    83,   202,
900178825Sdfr      15,    15,    15,   206,    16,    16,   189,   190,   191,    16,
901178825Sdfr      83,    16,   215,    16,   217,   198,   199,   200,    83,    83,
902178825Sdfr     223,   204,    16,    16,   227,   228,   209,   210,    16,   232,
903178825Sdfr     213,    16,    16,   216,    16,   218,    16,   220,   221,   222,
904178825Sdfr      16,   224,    15,    83,    16,    16,    15,    15,    -1,    16,
905178825Sdfr      16,    16,    16,    16,    16,    16,    16,    16,    16,    16,
906178825Sdfr      16,    16,    16,    16,    16,    16,    16,    84,    12,    17,
907178825Sdfr      15,    17,   183,    16,    84,    84,    16,    83,    16,    83,
908178825Sdfr      15,    83,    83,    16,    16,    16,   289,    16,   291,    84,
909178825Sdfr      16,    16,    84,    84,    17,    84,     0,     1,    17,   207,
910178825Sdfr      -1,    84,    -1,    -1,    -1,   308,    -1,    -1,    -1,    -1,
911178825Sdfr     293,   294,   295,   296,    18,    19,    -1,    -1,    22,    23,
912178825Sdfr      24,    25,    26,    27,    28,    29,    30,    -1,    -1,    -1,
913178825Sdfr      -1,    -1,    -1,   292,    38,    39,    40,    41,    42,    43,
914178825Sdfr      44,    45,    46,    47,    48,    49,    50,    51,    52,    53,
915178825Sdfr      54,    55,    -1,    57,    58,    59,    60,    61,    -1,    -1,
916178825Sdfr      -1,    65,    66,    67,    68,    69,    70,    71,    72,    -1,
917178825Sdfr      -1,    -1,    -1,    -1,    -1,    -1,    80,    81
918178825Sdfr};
919178825Sdfr
920178825Sdfr/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
921178825Sdfr   symbol of state STATE-NUM.  */
922178825Sdfrstatic const yytype_uint8 yystos[] =
923178825Sdfr{
924178825Sdfr       0,    86,     0,     1,    18,    19,    22,    23,    24,    25,
925178825Sdfr      26,    27,    28,    29,    30,    38,    39,    40,    41,    42,
926178825Sdfr      43,    44,    45,    46,    47,    48,    49,    50,    51,    52,
927178825Sdfr      53,    54,    55,    57,    58,    59,    60,    61,    65,    66,
928178825Sdfr      67,    68,    69,    70,    71,    72,    80,    81,    87,    88,
929178825Sdfr      16,    15,    15,    16,    15,    16,    15,    15,    15,    15,
930178825Sdfr      15,    15,    15,    15,    15,    15,    16,    15,    15,    16,
931178825Sdfr      15,    16,    15,    16,    15,    15,    16,    15,    16,    16,
932178825Sdfr      15,    15,    16,    16,    15,    16,    15,    15,    15,    15,
933178825Sdfr      16,    15,    15,    15,    15,    16,    15,    15,    15,    16,
934178825Sdfr      15,    83,    89,    83,    90,   102,    84,    92,   101,   102,
935178825Sdfr       3,     6,     8,     9,    94,     7,    11,    12,    95,     4,
936178825Sdfr       5,    13,    96,    83,    97,    98,    97,    97,    84,    84,
937178825Sdfr      91,    97,    97,   102,    97,    97,   101,    97,   101,    83,
938178825Sdfr     101,    49,    62,    63,    64,    73,    74,    75,    76,    77,
939178825Sdfr      78,    79,    97,   102,    83,   102,   102,    97,    97,   101,
940178825Sdfr     101,    97,   102,    97,    97,    83,    83,   101,    83,    83,
941178825Sdfr      83,    84,   102,    83,    83,    83,   102,    83,    16,    16,
942178825Sdfr      17,    16,    15,    15,    15,    91,    16,    16,    16,    16,
943178825Sdfr      16,    16,    15,    16,    16,    16,    16,    16,    16,    16,
944178825Sdfr      16,    15,    16,    15,    16,    15,    16,    15,    15,    16,
945178825Sdfr      16,    15,    15,    16,    15,    16,    16,    16,    16,    16,
946178825Sdfr      16,    16,    16,    16,    16,    16,    16,    16,    16,    16,
947178825Sdfr      16,    16,    16,   102,   102,    84,   102,     5,    10,    14,
948178825Sdfr      93,    93,    91,   102,   102,   102,   101,   101,   101,    12,
949178825Sdfr     102,   102,   100,   101,   100,   100,   101,   101,   101,    83,
950178825Sdfr     102,    84,    99,   101,    84,   102,    99,    83,   101,   101,
951178825Sdfr      83,    83,   101,    83,   102,   101,   102,   101,   100,   101,
952178825Sdfr     101,   101,   102,   101,   102,   102,   102,    17,    15,    16,
953178825Sdfr      16,    16,    15,    16,    16,    16,    16,    84,    84,   102,
954178825Sdfr     100,   102,    97,   101,   101,   101,   101,    17,    16,    16,
955178825Sdfr      84,   102,   100,    17,    84,    17,    84
956178825Sdfr};
957178825Sdfr
958178825Sdfr#define yyerrok		(yyerrstatus = 0)
959178825Sdfr#define yyclearin	(yychar = YYEMPTY)
960178825Sdfr#define YYEMPTY		(-2)
961178825Sdfr#define YYEOF		0
962178825Sdfr
963178825Sdfr#define YYACCEPT	goto yyacceptlab
964178825Sdfr#define YYABORT		goto yyabortlab
965178825Sdfr#define YYERROR		goto yyerrorlab
966178825Sdfr
967178825Sdfr
968178825Sdfr/* Like YYERROR except do call yyerror.  This remains here temporarily
969178825Sdfr   to ease the transition to the new meaning of YYERROR, for GCC.
970178825Sdfr   Once GCC version 2 has supplanted version 1, this can go.  */
971178825Sdfr
972178825Sdfr#define YYFAIL		goto yyerrlab
973178825Sdfr
974178825Sdfr#define YYRECOVERING()  (!!yyerrstatus)
975178825Sdfr
976178825Sdfr#define YYBACKUP(Token, Value)					\
977178825Sdfrdo								\
978178825Sdfr  if (yychar == YYEMPTY && yylen == 1)				\
979178825Sdfr    {								\
980178825Sdfr      yychar = (Token);						\
981178825Sdfr      yylval = (Value);						\
982178825Sdfr      yytoken = YYTRANSLATE (yychar);				\
983178825Sdfr      YYPOPSTACK (1);						\
984178825Sdfr      goto yybackup;						\
985178825Sdfr    }								\
986178825Sdfr  else								\
987178825Sdfr    {								\
988178825Sdfr      yyerror (YY_("syntax error: cannot back up")); \
989178825Sdfr      YYERROR;							\
990178825Sdfr    }								\
991178825Sdfrwhile (YYID (0))
992178825Sdfr
993178825Sdfr
994178825Sdfr#define YYTERROR	1
995178825Sdfr#define YYERRCODE	256
996178825Sdfr
997178825Sdfr
998178825Sdfr/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
999178825Sdfr   If N is 0, then set CURRENT to the empty location which ends
1000178825Sdfr   the previous symbol: RHS[0] (always defined).  */
1001178825Sdfr
1002178825Sdfr#define YYRHSLOC(Rhs, K) ((Rhs)[K])
1003178825Sdfr#ifndef YYLLOC_DEFAULT
1004178825Sdfr# define YYLLOC_DEFAULT(Current, Rhs, N)				\
1005178825Sdfr    do									\
1006178825Sdfr      if (YYID (N))                                                    \
1007178825Sdfr	{								\
1008178825Sdfr	  (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;	\
1009178825Sdfr	  (Current).first_column = YYRHSLOC (Rhs, 1).first_column;	\
1010178825Sdfr	  (Current).last_line    = YYRHSLOC (Rhs, N).last_line;		\
1011178825Sdfr	  (Current).last_column  = YYRHSLOC (Rhs, N).last_column;	\
1012178825Sdfr	}								\
1013178825Sdfr      else								\
1014178825Sdfr	{								\
1015178825Sdfr	  (Current).first_line   = (Current).last_line   =		\
1016178825Sdfr	    YYRHSLOC (Rhs, 0).last_line;				\
1017178825Sdfr	  (Current).first_column = (Current).last_column =		\
1018178825Sdfr	    YYRHSLOC (Rhs, 0).last_column;				\
1019178825Sdfr	}								\
1020178825Sdfr    while (YYID (0))
1021178825Sdfr#endif
1022178825Sdfr
1023178825Sdfr
1024178825Sdfr/* YY_LOCATION_PRINT -- Print the location on the stream.
1025178825Sdfr   This macro was not mandated originally: define only if we know
1026178825Sdfr   we won't break user code: when these are the locations we know.  */
1027178825Sdfr
1028178825Sdfr#ifndef YY_LOCATION_PRINT
1029178825Sdfr# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
1030178825Sdfr#  define YY_LOCATION_PRINT(File, Loc)			\
1031178825Sdfr     fprintf (File, "%d.%d-%d.%d",			\
1032178825Sdfr	      (Loc).first_line, (Loc).first_column,	\
1033178825Sdfr	      (Loc).last_line,  (Loc).last_column)
1034178825Sdfr# else
1035178825Sdfr#  define YY_LOCATION_PRINT(File, Loc) ((void) 0)
1036178825Sdfr# endif
1037178825Sdfr#endif
1038178825Sdfr
1039178825Sdfr
1040178825Sdfr/* YYLEX -- calling `yylex' with the right arguments.  */
1041178825Sdfr
1042178825Sdfr#ifdef YYLEX_PARAM
1043178825Sdfr# define YYLEX yylex (YYLEX_PARAM)
1044178825Sdfr#else
1045178825Sdfr# define YYLEX yylex ()
1046178825Sdfr#endif
1047178825Sdfr
1048178825Sdfr/* Enable debugging if requested.  */
1049178825Sdfr#if YYDEBUG
1050178825Sdfr
1051178825Sdfr# ifndef YYFPRINTF
1052178825Sdfr#  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
1053178825Sdfr#  define YYFPRINTF fprintf
1054178825Sdfr# endif
1055178825Sdfr
1056178825Sdfr# define YYDPRINTF(Args)			\
1057178825Sdfrdo {						\
1058178825Sdfr  if (yydebug)					\
1059178825Sdfr    YYFPRINTF Args;				\
1060178825Sdfr} while (YYID (0))
1061178825Sdfr
1062178825Sdfr# define YY_SYMBOL_PRINT(Title, Type, Value, Location)			  \
1063178825Sdfrdo {									  \
1064178825Sdfr  if (yydebug)								  \
1065178825Sdfr    {									  \
1066178825Sdfr      YYFPRINTF (stderr, "%s ", Title);					  \
1067178825Sdfr      yy_symbol_print (stderr,						  \
1068178825Sdfr		  Type, Value); \
1069178825Sdfr      YYFPRINTF (stderr, "\n");						  \
1070178825Sdfr    }									  \
1071178825Sdfr} while (YYID (0))
1072178825Sdfr
1073178825Sdfr
1074178825Sdfr/*--------------------------------.
1075178825Sdfr| Print this symbol on YYOUTPUT.  |
1076178825Sdfr`--------------------------------*/
1077178825Sdfr
1078178825Sdfr/*ARGSUSED*/
1079178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \
1080178825Sdfr     || defined __cplusplus || defined _MSC_VER)
1081178825Sdfrstatic void
1082178825Sdfryy_symbol_value_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
1083178825Sdfr#else
1084178825Sdfrstatic void
1085178825Sdfryy_symbol_value_print (yyoutput, yytype, yyvaluep)
1086178825Sdfr    FILE *yyoutput;
1087178825Sdfr    int yytype;
1088178825Sdfr    YYSTYPE const * const yyvaluep;
1089178825Sdfr#endif
1090178825Sdfr{
1091178825Sdfr  if (!yyvaluep)
1092178825Sdfr    return;
1093178825Sdfr# ifdef YYPRINT
1094178825Sdfr  if (yytype < YYNTOKENS)
1095178825Sdfr    YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
1096178825Sdfr# else
1097178825Sdfr  YYUSE (yyoutput);
1098178825Sdfr# endif
1099178825Sdfr  switch (yytype)
1100178825Sdfr    {
1101178825Sdfr      default:
1102178825Sdfr	break;
1103178825Sdfr    }
1104178825Sdfr}
1105178825Sdfr
1106178825Sdfr
1107178825Sdfr/*--------------------------------.
1108178825Sdfr| Print this symbol on YYOUTPUT.  |
1109178825Sdfr`--------------------------------*/
1110178825Sdfr
1111178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \
1112178825Sdfr     || defined __cplusplus || defined _MSC_VER)
1113178825Sdfrstatic void
1114178825Sdfryy_symbol_print (FILE *yyoutput, int yytype, YYSTYPE const * const yyvaluep)
1115178825Sdfr#else
1116178825Sdfrstatic void
1117178825Sdfryy_symbol_print (yyoutput, yytype, yyvaluep)
1118178825Sdfr    FILE *yyoutput;
1119178825Sdfr    int yytype;
1120178825Sdfr    YYSTYPE const * const yyvaluep;
1121178825Sdfr#endif
1122178825Sdfr{
1123178825Sdfr  if (yytype < YYNTOKENS)
1124178825Sdfr    YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
1125178825Sdfr  else
1126178825Sdfr    YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
1127178825Sdfr
1128178825Sdfr  yy_symbol_value_print (yyoutput, yytype, yyvaluep);
1129178825Sdfr  YYFPRINTF (yyoutput, ")");
1130178825Sdfr}
1131178825Sdfr
1132178825Sdfr/*------------------------------------------------------------------.
1133178825Sdfr| yy_stack_print -- Print the state stack from its BOTTOM up to its |
1134178825Sdfr| TOP (included).                                                   |
1135178825Sdfr`------------------------------------------------------------------*/
1136178825Sdfr
1137178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \
1138178825Sdfr     || defined __cplusplus || defined _MSC_VER)
1139178825Sdfrstatic void
1140178825Sdfryy_stack_print (yytype_int16 *bottom, yytype_int16 *top)
1141178825Sdfr#else
1142178825Sdfrstatic void
1143178825Sdfryy_stack_print (bottom, top)
1144178825Sdfr    yytype_int16 *bottom;
1145178825Sdfr    yytype_int16 *top;
1146178825Sdfr#endif
1147178825Sdfr{
1148178825Sdfr  YYFPRINTF (stderr, "Stack now");
1149178825Sdfr  for (; bottom <= top; ++bottom)
1150178825Sdfr    YYFPRINTF (stderr, " %d", *bottom);
1151178825Sdfr  YYFPRINTF (stderr, "\n");
1152178825Sdfr}
1153178825Sdfr
1154178825Sdfr# define YY_STACK_PRINT(Bottom, Top)				\
1155178825Sdfrdo {								\
1156178825Sdfr  if (yydebug)							\
1157178825Sdfr    yy_stack_print ((Bottom), (Top));				\
1158178825Sdfr} while (YYID (0))
1159178825Sdfr
1160178825Sdfr
1161178825Sdfr/*------------------------------------------------.
1162178825Sdfr| Report that the YYRULE is going to be reduced.  |
1163178825Sdfr`------------------------------------------------*/
1164178825Sdfr
1165178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \
1166178825Sdfr     || defined __cplusplus || defined _MSC_VER)
1167178825Sdfrstatic void
1168178825Sdfryy_reduce_print (YYSTYPE *yyvsp, int yyrule)
1169178825Sdfr#else
1170178825Sdfrstatic void
1171178825Sdfryy_reduce_print (yyvsp, yyrule)
1172178825Sdfr    YYSTYPE *yyvsp;
1173178825Sdfr    int yyrule;
1174178825Sdfr#endif
1175178825Sdfr{
1176178825Sdfr  int yynrhs = yyr2[yyrule];
1177178825Sdfr  int yyi;
1178178825Sdfr  unsigned long int yylno = yyrline[yyrule];
1179178825Sdfr  YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
1180178825Sdfr	     yyrule - 1, yylno);
1181178825Sdfr  /* The symbols being reduced.  */
1182178825Sdfr  for (yyi = 0; yyi < yynrhs; yyi++)
1183178825Sdfr    {
1184178825Sdfr      fprintf (stderr, "   $%d = ", yyi + 1);
1185178825Sdfr      yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
1186178825Sdfr		       &(yyvsp[(yyi + 1) - (yynrhs)])
1187178825Sdfr		       		       );
1188178825Sdfr      fprintf (stderr, "\n");
1189178825Sdfr    }
1190178825Sdfr}
1191178825Sdfr
1192178825Sdfr# define YY_REDUCE_PRINT(Rule)		\
1193178825Sdfrdo {					\
1194178825Sdfr  if (yydebug)				\
1195178825Sdfr    yy_reduce_print (yyvsp, Rule); \
1196178825Sdfr} while (YYID (0))
1197178825Sdfr
1198178825Sdfr/* Nonzero means print parse trace.  It is left uninitialized so that
1199178825Sdfr   multiple parsers can coexist.  */
1200178825Sdfrint yydebug;
1201178825Sdfr#else /* !YYDEBUG */
1202178825Sdfr# define YYDPRINTF(Args)
1203178825Sdfr# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
1204178825Sdfr# define YY_STACK_PRINT(Bottom, Top)
1205178825Sdfr# define YY_REDUCE_PRINT(Rule)
1206178825Sdfr#endif /* !YYDEBUG */
1207178825Sdfr
1208178825Sdfr
1209178825Sdfr/* YYINITDEPTH -- initial size of the parser's stacks.  */
1210178825Sdfr#ifndef	YYINITDEPTH
1211178825Sdfr# define YYINITDEPTH 200
1212178825Sdfr#endif
1213178825Sdfr
1214178825Sdfr/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
1215178825Sdfr   if the built-in stack extension method is used).
1216178825Sdfr
1217178825Sdfr   Do not make this value too large; the results are undefined if
1218178825Sdfr   YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
1219178825Sdfr   evaluated with infinite-precision integer arithmetic.  */
1220178825Sdfr
1221178825Sdfr#ifndef YYMAXDEPTH
1222178825Sdfr# define YYMAXDEPTH 10000
1223178825Sdfr#endif
1224178825Sdfr
1225178825Sdfr
1226178825Sdfr
1227178825Sdfr#if YYERROR_VERBOSE
1228178825Sdfr
1229178825Sdfr# ifndef yystrlen
1230178825Sdfr#  if defined __GLIBC__ && defined _STRING_H
1231178825Sdfr#   define yystrlen strlen
1232178825Sdfr#  else
1233178825Sdfr/* Return the length of YYSTR.  */
1234178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \
1235178825Sdfr     || defined __cplusplus || defined _MSC_VER)
1236178825Sdfrstatic YYSIZE_T
1237178825Sdfryystrlen (const char *yystr)
1238178825Sdfr#else
1239178825Sdfrstatic YYSIZE_T
1240178825Sdfryystrlen (yystr)
1241178825Sdfr    const char *yystr;
1242178825Sdfr#endif
1243178825Sdfr{
1244178825Sdfr  YYSIZE_T yylen;
1245178825Sdfr  for (yylen = 0; yystr[yylen]; yylen++)
1246178825Sdfr    continue;
1247178825Sdfr  return yylen;
1248178825Sdfr}
1249178825Sdfr#  endif
1250178825Sdfr# endif
1251178825Sdfr
1252178825Sdfr# ifndef yystpcpy
1253178825Sdfr#  if defined __GLIBC__ && defined _STRING_H && defined _GNU_SOURCE
1254178825Sdfr#   define yystpcpy stpcpy
1255178825Sdfr#  else
1256178825Sdfr/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in
1257178825Sdfr   YYDEST.  */
1258178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \
1259178825Sdfr     || defined __cplusplus || defined _MSC_VER)
1260178825Sdfrstatic char *
1261178825Sdfryystpcpy (char *yydest, const char *yysrc)
1262178825Sdfr#else
1263178825Sdfrstatic char *
1264178825Sdfryystpcpy (yydest, yysrc)
1265178825Sdfr    char *yydest;
1266178825Sdfr    const char *yysrc;
1267178825Sdfr#endif
1268178825Sdfr{
1269178825Sdfr  char *yyd = yydest;
1270178825Sdfr  const char *yys = yysrc;
1271178825Sdfr
1272178825Sdfr  while ((*yyd++ = *yys++) != '\0')
1273178825Sdfr    continue;
1274178825Sdfr
1275178825Sdfr  return yyd - 1;
1276178825Sdfr}
1277178825Sdfr#  endif
1278178825Sdfr# endif
1279178825Sdfr
1280178825Sdfr# ifndef yytnamerr
1281178825Sdfr/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
1282178825Sdfr   quotes and backslashes, so that it's suitable for yyerror.  The
1283178825Sdfr   heuristic is that double-quoting is unnecessary unless the string
1284178825Sdfr   contains an apostrophe, a comma, or backslash (other than
1285178825Sdfr   backslash-backslash).  YYSTR is taken from yytname.  If YYRES is
1286178825Sdfr   null, do not copy; instead, return the length of what the result
1287178825Sdfr   would have been.  */
1288178825Sdfrstatic YYSIZE_T
1289178825Sdfryytnamerr (char *yyres, const char *yystr)
1290178825Sdfr{
1291178825Sdfr  if (*yystr == '"')
1292178825Sdfr    {
1293178825Sdfr      YYSIZE_T yyn = 0;
1294178825Sdfr      char const *yyp = yystr;
1295178825Sdfr
1296178825Sdfr      for (;;)
1297178825Sdfr	switch (*++yyp)
1298178825Sdfr	  {
1299178825Sdfr	  case '\'':
1300178825Sdfr	  case ',':
1301178825Sdfr	    goto do_not_strip_quotes;
1302178825Sdfr
1303178825Sdfr	  case '\\':
1304178825Sdfr	    if (*++yyp != '\\')
1305178825Sdfr	      goto do_not_strip_quotes;
1306178825Sdfr	    /* Fall through.  */
1307178825Sdfr	  default:
1308178825Sdfr	    if (yyres)
1309178825Sdfr	      yyres[yyn] = *yyp;
1310178825Sdfr	    yyn++;
1311178825Sdfr	    break;
1312178825Sdfr
1313178825Sdfr	  case '"':
1314178825Sdfr	    if (yyres)
1315178825Sdfr	      yyres[yyn] = '\0';
1316178825Sdfr	    return yyn;
1317178825Sdfr	  }
1318178825Sdfr    do_not_strip_quotes: ;
1319178825Sdfr    }
1320178825Sdfr
1321178825Sdfr  if (! yyres)
1322178825Sdfr    return yystrlen (yystr);
1323178825Sdfr
1324178825Sdfr  return yystpcpy (yyres, yystr) - yyres;
1325178825Sdfr}
1326178825Sdfr# endif
1327178825Sdfr
1328178825Sdfr/* Copy into YYRESULT an error message about the unexpected token
1329178825Sdfr   YYCHAR while in state YYSTATE.  Return the number of bytes copied,
1330178825Sdfr   including the terminating null byte.  If YYRESULT is null, do not
1331178825Sdfr   copy anything; just return the number of bytes that would be
1332178825Sdfr   copied.  As a special case, return 0 if an ordinary "syntax error"
1333178825Sdfr   message will do.  Return YYSIZE_MAXIMUM if overflow occurs during
1334178825Sdfr   size calculation.  */
1335178825Sdfrstatic YYSIZE_T
1336178825Sdfryysyntax_error (char *yyresult, int yystate, int yychar)
1337178825Sdfr{
1338178825Sdfr  int yyn = yypact[yystate];
1339178825Sdfr
1340178825Sdfr  if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
1341178825Sdfr    return 0;
1342178825Sdfr  else
1343178825Sdfr    {
1344178825Sdfr      int yytype = YYTRANSLATE (yychar);
1345178825Sdfr      YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
1346178825Sdfr      YYSIZE_T yysize = yysize0;
1347178825Sdfr      YYSIZE_T yysize1;
1348178825Sdfr      int yysize_overflow = 0;
1349178825Sdfr      enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
1350178825Sdfr      char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
1351178825Sdfr      int yyx;
1352178825Sdfr
1353178825Sdfr# if 0
1354178825Sdfr      /* This is so xgettext sees the translatable formats that are
1355178825Sdfr	 constructed on the fly.  */
1356178825Sdfr      YY_("syntax error, unexpected %s");
1357178825Sdfr      YY_("syntax error, unexpected %s, expecting %s");
1358178825Sdfr      YY_("syntax error, unexpected %s, expecting %s or %s");
1359178825Sdfr      YY_("syntax error, unexpected %s, expecting %s or %s or %s");
1360178825Sdfr      YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
1361178825Sdfr# endif
1362178825Sdfr      char *yyfmt;
1363178825Sdfr      char const *yyf;
1364178825Sdfr      static char const yyunexpected[] = "syntax error, unexpected %s";
1365178825Sdfr      static char const yyexpecting[] = ", expecting %s";
1366178825Sdfr      static char const yyor[] = " or %s";
1367178825Sdfr      char yyformat[sizeof yyunexpected
1368178825Sdfr		    + sizeof yyexpecting - 1
1369178825Sdfr		    + ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
1370178825Sdfr		       * (sizeof yyor - 1))];
1371178825Sdfr      char const *yyprefix = yyexpecting;
1372178825Sdfr
1373178825Sdfr      /* Start YYX at -YYN if negative to avoid negative indexes in
1374178825Sdfr	 YYCHECK.  */
1375178825Sdfr      int yyxbegin = yyn < 0 ? -yyn : 0;
1376178825Sdfr
1377178825Sdfr      /* Stay within bounds of both yycheck and yytname.  */
1378178825Sdfr      int yychecklim = YYLAST - yyn + 1;
1379178825Sdfr      int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
1380178825Sdfr      int yycount = 1;
1381178825Sdfr
1382178825Sdfr      yyarg[0] = yytname[yytype];
1383178825Sdfr      yyfmt = yystpcpy (yyformat, yyunexpected);
1384178825Sdfr
1385178825Sdfr      for (yyx = yyxbegin; yyx < yyxend; ++yyx)
1386178825Sdfr	if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
1387178825Sdfr	  {
1388178825Sdfr	    if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
1389178825Sdfr	      {
1390178825Sdfr		yycount = 1;
1391178825Sdfr		yysize = yysize0;
1392178825Sdfr		yyformat[sizeof yyunexpected - 1] = '\0';
1393178825Sdfr		break;
1394178825Sdfr	      }
1395178825Sdfr	    yyarg[yycount++] = yytname[yyx];
1396178825Sdfr	    yysize1 = yysize + yytnamerr (0, yytname[yyx]);
1397178825Sdfr	    yysize_overflow |= (yysize1 < yysize);
1398178825Sdfr	    yysize = yysize1;
1399178825Sdfr	    yyfmt = yystpcpy (yyfmt, yyprefix);
1400178825Sdfr	    yyprefix = yyor;
1401178825Sdfr	  }
1402178825Sdfr
1403178825Sdfr      yyf = YY_(yyformat);
1404178825Sdfr      yysize1 = yysize + yystrlen (yyf);
1405178825Sdfr      yysize_overflow |= (yysize1 < yysize);
1406178825Sdfr      yysize = yysize1;
1407178825Sdfr
1408178825Sdfr      if (yysize_overflow)
1409178825Sdfr	return YYSIZE_MAXIMUM;
1410178825Sdfr
1411178825Sdfr      if (yyresult)
1412178825Sdfr	{
1413178825Sdfr	  /* Avoid sprintf, as that infringes on the user's name space.
1414178825Sdfr	     Don't have undefined behavior even if the translation
1415178825Sdfr	     produced a string with the wrong number of "%s"s.  */
1416178825Sdfr	  char *yyp = yyresult;
1417178825Sdfr	  int yyi = 0;
1418178825Sdfr	  while ((*yyp = *yyf) != '\0')
1419178825Sdfr	    {
1420178825Sdfr	      if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
1421178825Sdfr		{
1422178825Sdfr		  yyp += yytnamerr (yyp, yyarg[yyi++]);
1423178825Sdfr		  yyf += 2;
1424178825Sdfr		}
1425178825Sdfr	      else
1426178825Sdfr		{
1427178825Sdfr		  yyp++;
1428178825Sdfr		  yyf++;
1429178825Sdfr		}
1430178825Sdfr	    }
1431178825Sdfr	}
1432178825Sdfr      return yysize;
1433178825Sdfr    }
1434178825Sdfr}
1435178825Sdfr#endif /* YYERROR_VERBOSE */
1436178825Sdfr
1437178825Sdfr
1438178825Sdfr/*-----------------------------------------------.
1439178825Sdfr| Release the memory associated to this symbol.  |
1440178825Sdfr`-----------------------------------------------*/
1441178825Sdfr
1442178825Sdfr/*ARGSUSED*/
1443178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \
1444178825Sdfr     || defined __cplusplus || defined _MSC_VER)
1445178825Sdfrstatic void
1446178825Sdfryydestruct (const char *yymsg, int yytype, YYSTYPE *yyvaluep)
1447178825Sdfr#else
1448178825Sdfrstatic void
1449178825Sdfryydestruct (yymsg, yytype, yyvaluep)
1450178825Sdfr    const char *yymsg;
1451178825Sdfr    int yytype;
1452178825Sdfr    YYSTYPE *yyvaluep;
1453178825Sdfr#endif
1454178825Sdfr{
1455178825Sdfr  YYUSE (yyvaluep);
1456178825Sdfr
1457178825Sdfr  if (!yymsg)
1458178825Sdfr    yymsg = "Deleting";
1459178825Sdfr  YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
1460178825Sdfr
1461178825Sdfr  switch (yytype)
1462178825Sdfr    {
1463178825Sdfr
1464178825Sdfr      default:
1465178825Sdfr	break;
1466178825Sdfr    }
1467178825Sdfr}
1468178825Sdfr
1469178825Sdfr
1470178825Sdfr/* Prevent warnings from -Wmissing-prototypes.  */
1471178825Sdfr
1472178825Sdfr#ifdef YYPARSE_PARAM
1473178825Sdfr#if defined __STDC__ || defined __cplusplus
1474178825Sdfrint yyparse (void *YYPARSE_PARAM);
1475178825Sdfr#else
1476178825Sdfrint yyparse ();
1477178825Sdfr#endif
1478178825Sdfr#else /* ! YYPARSE_PARAM */
1479178825Sdfr#if defined __STDC__ || defined __cplusplus
1480178825Sdfrint yyparse (void);
1481178825Sdfr#else
1482178825Sdfrint yyparse ();
1483178825Sdfr#endif
1484178825Sdfr#endif /* ! YYPARSE_PARAM */
1485178825Sdfr
1486178825Sdfr
1487178825Sdfr
1488178825Sdfr/* The look-ahead symbol.  */
1489178825Sdfrint yychar;
1490178825Sdfr
1491178825Sdfr/* The semantic value of the look-ahead symbol.  */
1492178825SdfrYYSTYPE yylval;
1493178825Sdfr
1494178825Sdfr/* Number of syntax errors so far.  */
1495178825Sdfrint yynerrs;
1496178825Sdfr
1497178825Sdfr
1498178825Sdfr
1499178825Sdfr/*----------.
1500178825Sdfr| yyparse.  |
1501178825Sdfr`----------*/
1502178825Sdfr
1503178825Sdfr#ifdef YYPARSE_PARAM
1504178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \
1505178825Sdfr     || defined __cplusplus || defined _MSC_VER)
1506178825Sdfrint
1507178825Sdfryyparse (void *YYPARSE_PARAM)
1508178825Sdfr#else
1509178825Sdfrint
1510178825Sdfryyparse (YYPARSE_PARAM)
1511178825Sdfr    void *YYPARSE_PARAM;
1512178825Sdfr#endif
1513178825Sdfr#else /* ! YYPARSE_PARAM */
1514178825Sdfr#if (defined __STDC__ || defined __C99__FUNC__ \
1515178825Sdfr     || defined __cplusplus || defined _MSC_VER)
1516178825Sdfrint
1517178825Sdfryyparse (void)
1518178825Sdfr#else
1519178825Sdfrint
1520178825Sdfryyparse ()
1521178825Sdfr
1522178825Sdfr#endif
1523178825Sdfr#endif
1524178825Sdfr{
1525178825Sdfr
1526178825Sdfr  int yystate;
1527178825Sdfr  int yyn;
1528178825Sdfr  int yyresult;
1529178825Sdfr  /* Number of tokens to shift before error messages enabled.  */
1530178825Sdfr  int yyerrstatus;
1531178825Sdfr  /* Look-ahead token as an internal (translated) token number.  */
1532178825Sdfr  int yytoken = 0;
1533178825Sdfr#if YYERROR_VERBOSE
1534178825Sdfr  /* Buffer for error messages, and its allocated size.  */
1535178825Sdfr  char yymsgbuf[128];
1536178825Sdfr  char *yymsg = yymsgbuf;
1537178825Sdfr  YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
1538178825Sdfr#endif
1539178825Sdfr
1540178825Sdfr  /* Three stacks and their tools:
1541178825Sdfr     `yyss': related to states,
1542178825Sdfr     `yyvs': related to semantic values,
1543178825Sdfr     `yyls': related to locations.
1544178825Sdfr
1545178825Sdfr     Refer to the stacks thru separate pointers, to allow yyoverflow
1546178825Sdfr     to reallocate them elsewhere.  */
1547178825Sdfr
1548178825Sdfr  /* The state stack.  */
1549178825Sdfr  yytype_int16 yyssa[YYINITDEPTH];
1550178825Sdfr  yytype_int16 *yyss = yyssa;
1551178825Sdfr  yytype_int16 *yyssp;
1552178825Sdfr
1553178825Sdfr  /* The semantic value stack.  */
1554178825Sdfr  YYSTYPE yyvsa[YYINITDEPTH];
1555178825Sdfr  YYSTYPE *yyvs = yyvsa;
1556178825Sdfr  YYSTYPE *yyvsp;
1557178825Sdfr
1558178825Sdfr
1559178825Sdfr
1560178825Sdfr#define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N))
1561178825Sdfr
1562178825Sdfr  YYSIZE_T yystacksize = YYINITDEPTH;
1563178825Sdfr
1564178825Sdfr  /* The variables used to return semantic value and location from the
1565178825Sdfr     action routines.  */
1566178825Sdfr  YYSTYPE yyval;
1567178825Sdfr
1568178825Sdfr
1569178825Sdfr  /* The number of symbols on the RHS of the reduced rule.
1570178825Sdfr     Keep to zero when no symbol should be popped.  */
1571178825Sdfr  int yylen = 0;
1572178825Sdfr
1573178825Sdfr  YYDPRINTF ((stderr, "Starting parse\n"));
1574178825Sdfr
1575178825Sdfr  yystate = 0;
1576178825Sdfr  yyerrstatus = 0;
1577178825Sdfr  yynerrs = 0;
1578178825Sdfr  yychar = YYEMPTY;		/* Cause a token to be read.  */
1579178825Sdfr
1580178825Sdfr  /* Initialize stack pointers.
1581178825Sdfr     Waste one element of value and location stack
1582178825Sdfr     so that they stay on the same level as the state stack.
1583178825Sdfr     The wasted elements are never initialized.  */
1584178825Sdfr
1585178825Sdfr  yyssp = yyss;
1586178825Sdfr  yyvsp = yyvs;
1587178825Sdfr
1588178825Sdfr  goto yysetstate;
1589178825Sdfr
1590178825Sdfr/*------------------------------------------------------------.
1591178825Sdfr| yynewstate -- Push a new state, which is found in yystate.  |
1592178825Sdfr`------------------------------------------------------------*/
1593178825Sdfr yynewstate:
1594178825Sdfr  /* In all cases, when you get here, the value and location stacks
1595178825Sdfr     have just been pushed.  So pushing a state here evens the stacks.  */
1596178825Sdfr  yyssp++;
1597178825Sdfr
1598178825Sdfr yysetstate:
1599178825Sdfr  *yyssp = yystate;
1600178825Sdfr
1601178825Sdfr  if (yyss + yystacksize - 1 <= yyssp)
1602178825Sdfr    {
1603178825Sdfr      /* Get the current used size of the three stacks, in elements.  */
1604178825Sdfr      YYSIZE_T yysize = yyssp - yyss + 1;
1605178825Sdfr
1606178825Sdfr#ifdef yyoverflow
1607178825Sdfr      {
1608178825Sdfr	/* Give user a chance to reallocate the stack.  Use copies of
1609178825Sdfr	   these so that the &'s don't force the real ones into
1610178825Sdfr	   memory.  */
1611178825Sdfr	YYSTYPE *yyvs1 = yyvs;
1612178825Sdfr	yytype_int16 *yyss1 = yyss;
1613178825Sdfr
1614178825Sdfr
1615178825Sdfr	/* Each stack pointer address is followed by the size of the
1616178825Sdfr	   data in use in that stack, in bytes.  This used to be a
1617178825Sdfr	   conditional around just the two extra args, but that might
1618178825Sdfr	   be undefined if yyoverflow is a macro.  */
1619178825Sdfr	yyoverflow (YY_("memory exhausted"),
1620178825Sdfr		    &yyss1, yysize * sizeof (*yyssp),
1621178825Sdfr		    &yyvs1, yysize * sizeof (*yyvsp),
1622178825Sdfr
1623178825Sdfr		    &yystacksize);
1624178825Sdfr
1625178825Sdfr	yyss = yyss1;
1626178825Sdfr	yyvs = yyvs1;
1627178825Sdfr      }
1628178825Sdfr#else /* no yyoverflow */
1629178825Sdfr# ifndef YYSTACK_RELOCATE
1630178825Sdfr      goto yyexhaustedlab;
1631178825Sdfr# else
1632178825Sdfr      /* Extend the stack our own way.  */
1633178825Sdfr      if (YYMAXDEPTH <= yystacksize)
1634178825Sdfr	goto yyexhaustedlab;
1635178825Sdfr      yystacksize *= 2;
1636178825Sdfr      if (YYMAXDEPTH < yystacksize)
1637178825Sdfr	yystacksize = YYMAXDEPTH;
1638178825Sdfr
1639178825Sdfr      {
1640178825Sdfr	yytype_int16 *yyss1 = yyss;
1641178825Sdfr	union yyalloc *yyptr =
1642178825Sdfr	  (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
1643178825Sdfr	if (! yyptr)
1644178825Sdfr	  goto yyexhaustedlab;
1645178825Sdfr	YYSTACK_RELOCATE (yyss);
1646178825Sdfr	YYSTACK_RELOCATE (yyvs);
1647178825Sdfr
1648178825Sdfr#  undef YYSTACK_RELOCATE
1649178825Sdfr	if (yyss1 != yyssa)
1650178825Sdfr	  YYSTACK_FREE (yyss1);
1651178825Sdfr      }
1652178825Sdfr# endif
1653178825Sdfr#endif /* no yyoverflow */
1654178825Sdfr
1655178825Sdfr      yyssp = yyss + yysize - 1;
1656178825Sdfr      yyvsp = yyvs + yysize - 1;
1657178825Sdfr
1658178825Sdfr
1659178825Sdfr      YYDPRINTF ((stderr, "Stack size increased to %lu\n",
1660178825Sdfr		  (unsigned long int) yystacksize));
1661178825Sdfr
1662178825Sdfr      if (yyss + yystacksize - 1 <= yyssp)
1663178825Sdfr	YYABORT;
1664178825Sdfr    }
1665178825Sdfr
1666178825Sdfr  YYDPRINTF ((stderr, "Entering state %d\n", yystate));
1667178825Sdfr
1668178825Sdfr  goto yybackup;
1669178825Sdfr
1670178825Sdfr/*-----------.
1671178825Sdfr| yybackup.  |
1672178825Sdfr`-----------*/
1673178825Sdfryybackup:
1674178825Sdfr
1675178825Sdfr  /* Do appropriate processing given the current state.  Read a
1676178825Sdfr     look-ahead token if we need one and don't already have one.  */
1677178825Sdfr
1678178825Sdfr  /* First try to decide what to do without reference to look-ahead token.  */
1679178825Sdfr  yyn = yypact[yystate];
1680178825Sdfr  if (yyn == YYPACT_NINF)
1681178825Sdfr    goto yydefault;
1682178825Sdfr
1683178825Sdfr  /* Not known => get a look-ahead token if don't already have one.  */
1684178825Sdfr
1685178825Sdfr  /* YYCHAR is either YYEMPTY or YYEOF or a valid look-ahead symbol.  */
1686178825Sdfr  if (yychar == YYEMPTY)
1687178825Sdfr    {
1688178825Sdfr      YYDPRINTF ((stderr, "Reading a token: "));
1689178825Sdfr      yychar = YYLEX;
1690178825Sdfr    }
1691178825Sdfr
1692178825Sdfr  if (yychar <= YYEOF)
1693178825Sdfr    {
1694178825Sdfr      yychar = yytoken = YYEOF;
1695178825Sdfr      YYDPRINTF ((stderr, "Now at end of input.\n"));
1696178825Sdfr    }
1697178825Sdfr  else
1698178825Sdfr    {
1699178825Sdfr      yytoken = YYTRANSLATE (yychar);
1700178825Sdfr      YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
1701178825Sdfr    }
1702178825Sdfr
1703178825Sdfr  /* If the proper action on seeing token YYTOKEN is to reduce or to
1704178825Sdfr     detect an error, take that action.  */
1705178825Sdfr  yyn += yytoken;
1706178825Sdfr  if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
1707178825Sdfr    goto yydefault;
1708178825Sdfr  yyn = yytable[yyn];
1709178825Sdfr  if (yyn <= 0)
1710178825Sdfr    {
1711178825Sdfr      if (yyn == 0 || yyn == YYTABLE_NINF)
1712178825Sdfr	goto yyerrlab;
1713178825Sdfr      yyn = -yyn;
1714178825Sdfr      goto yyreduce;
1715178825Sdfr    }
1716178825Sdfr
1717178825Sdfr  if (yyn == YYFINAL)
1718178825Sdfr    YYACCEPT;
1719178825Sdfr
1720178825Sdfr  /* Count tokens shifted since error; after three, turn off error
1721178825Sdfr     status.  */
1722178825Sdfr  if (yyerrstatus)
1723178825Sdfr    yyerrstatus--;
1724178825Sdfr
1725178825Sdfr  /* Shift the look-ahead token.  */
1726178825Sdfr  YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
1727178825Sdfr
1728178825Sdfr  /* Discard the shifted token unless it is eof.  */
1729178825Sdfr  if (yychar != YYEOF)
1730178825Sdfr    yychar = YYEMPTY;
1731178825Sdfr
1732178825Sdfr  yystate = yyn;
1733178825Sdfr  *++yyvsp = yylval;
1734178825Sdfr
1735178825Sdfr  goto yynewstate;
1736178825Sdfr
1737178825Sdfr
1738178825Sdfr/*-----------------------------------------------------------.
1739178825Sdfr| yydefault -- do the default action for the current state.  |
1740178825Sdfr`-----------------------------------------------------------*/
1741178825Sdfryydefault:
1742178825Sdfr  yyn = yydefact[yystate];
1743178825Sdfr  if (yyn == 0)
1744178825Sdfr    goto yyerrlab;
1745178825Sdfr  goto yyreduce;
1746178825Sdfr
1747178825Sdfr
1748178825Sdfr/*-----------------------------.
1749178825Sdfr| yyreduce -- Do a reduction.  |
1750178825Sdfr`-----------------------------*/
1751178825Sdfryyreduce:
1752178825Sdfr  /* yyn is the number of a rule to reduce with.  */
1753178825Sdfr  yylen = yyr2[yyn];
1754178825Sdfr
1755178825Sdfr  /* If YYLEN is nonzero, implement the default value of the action:
1756178825Sdfr     `$$ = $1'.
1757178825Sdfr
1758178825Sdfr     Otherwise, the following line sets YYVAL to garbage.
1759178825Sdfr     This behavior is undocumented and Bison
1760178825Sdfr     users should not rely upon it.  Assigning to YYVAL
1761178825Sdfr     unconditionally makes the parser a bit smaller, and it avoids a
1762178825Sdfr     GCC warning that YYVAL may be used uninitialized.  */
1763178825Sdfr  yyval = yyvsp[1-yylen];
1764178825Sdfr
1765178825Sdfr
1766178825Sdfr  YY_REDUCE_PRINT (yyn);
1767178825Sdfr  switch (yyn)
1768178825Sdfr    {
1769178825Sdfr        case 3:
1770178825Sdfr#line 132 "ftpcmd.y"
1771178825Sdfr    {
1772178825Sdfr			fromname = (char *) 0;
1773178825Sdfr			restart_point = (off_t) 0;
1774178825Sdfr		}
1775178825Sdfr    break;
1776178825Sdfr
1777178825Sdfr  case 5:
1778178825Sdfr#line 141 "ftpcmd.y"
1779178825Sdfr    {
1780178825Sdfr		    if ((yyvsp[(5) - (5)].i))
1781178825Sdfr			user((yyvsp[(3) - (5)].s));
1782178825Sdfr		    free((yyvsp[(3) - (5)].s));
1783178825Sdfr		}
1784178825Sdfr    break;
1785178825Sdfr
1786178825Sdfr  case 6:
1787178825Sdfr#line 147 "ftpcmd.y"
1788178825Sdfr    {
1789178825Sdfr		    if ((yyvsp[(5) - (5)].i))
1790178825Sdfr			pass((yyvsp[(3) - (5)].s));
1791178825Sdfr		    memset ((yyvsp[(3) - (5)].s), 0, strlen((yyvsp[(3) - (5)].s)));
1792178825Sdfr		    free((yyvsp[(3) - (5)].s));
1793178825Sdfr		}
1794178825Sdfr    break;
1795178825Sdfr
1796178825Sdfr  case 7:
1797178825Sdfr#line 154 "ftpcmd.y"
1798178825Sdfr    {
1799178825Sdfr		    if ((yyvsp[(5) - (5)].i)) {
1800178825Sdfr			usedefault = 0;
1801178825Sdfr			if (pdata >= 0) {
1802178825Sdfr				close(pdata);
1803178825Sdfr				pdata = -1;
1804178825Sdfr			}
1805178825Sdfr			reply(200, "PORT command successful.");
1806178825Sdfr		    }
1807178825Sdfr		}
1808178825Sdfr    break;
1809178825Sdfr
1810178825Sdfr  case 8:
1811178825Sdfr#line 165 "ftpcmd.y"
1812178825Sdfr    {
1813178825Sdfr		    if ((yyvsp[(5) - (5)].i))
1814178825Sdfr			eprt ((yyvsp[(3) - (5)].s));
1815178825Sdfr		    free ((yyvsp[(3) - (5)].s));
1816178825Sdfr		}
1817178825Sdfr    break;
1818178825Sdfr
1819178825Sdfr  case 9:
1820178825Sdfr#line 171 "ftpcmd.y"
1821178825Sdfr    {
1822178825Sdfr		    if((yyvsp[(3) - (3)].i))
1823178825Sdfr			pasv ();
1824178825Sdfr		}
1825178825Sdfr    break;
1826178825Sdfr
1827178825Sdfr  case 10:
1828178825Sdfr#line 176 "ftpcmd.y"
1829178825Sdfr    {
1830178825Sdfr		    if((yyvsp[(3) - (3)].i))
1831178825Sdfr			epsv (NULL);
1832178825Sdfr		}
1833178825Sdfr    break;
1834178825Sdfr
1835178825Sdfr  case 11:
1836178825Sdfr#line 181 "ftpcmd.y"
1837178825Sdfr    {
1838178825Sdfr		    if((yyvsp[(5) - (5)].i))
1839178825Sdfr			epsv ((yyvsp[(3) - (5)].s));
1840178825Sdfr		    free ((yyvsp[(3) - (5)].s));
1841178825Sdfr		}
1842178825Sdfr    break;
1843178825Sdfr
1844178825Sdfr  case 12:
1845178825Sdfr#line 187 "ftpcmd.y"
1846178825Sdfr    {
1847178825Sdfr		    if ((yyvsp[(5) - (5)].i)) {
1848178825Sdfr			switch (cmd_type) {
1849178825Sdfr
1850178825Sdfr			case TYPE_A:
1851178825Sdfr				if (cmd_form == FORM_N) {
1852178825Sdfr					reply(200, "Type set to A.");
1853178825Sdfr					type = cmd_type;
1854178825Sdfr					form = cmd_form;
1855178825Sdfr				} else
1856178825Sdfr					reply(504, "Form must be N.");
1857178825Sdfr				break;
1858178825Sdfr
1859178825Sdfr			case TYPE_E:
1860178825Sdfr				reply(504, "Type E not implemented.");
1861178825Sdfr				break;
1862178825Sdfr
1863178825Sdfr			case TYPE_I:
1864178825Sdfr				reply(200, "Type set to I.");
1865178825Sdfr				type = cmd_type;
1866178825Sdfr				break;
1867178825Sdfr
1868178825Sdfr			case TYPE_L:
1869178825Sdfr#if NBBY == 8
1870178825Sdfr				if (cmd_bytesz == 8) {
1871178825Sdfr					reply(200,
1872178825Sdfr					    "Type set to L (byte size 8).");
1873178825Sdfr					type = cmd_type;
1874178825Sdfr				} else
1875178825Sdfr					reply(504, "Byte size must be 8.");
1876178825Sdfr#else /* NBBY == 8 */
1877178825Sdfr				UNIMPLEMENTED for NBBY != 8
1878178825Sdfr#endif /* NBBY == 8 */
1879178825Sdfr			}
1880178825Sdfr		    }
1881178825Sdfr		}
1882178825Sdfr    break;
1883178825Sdfr
1884178825Sdfr  case 13:
1885178825Sdfr#line 224 "ftpcmd.y"
1886178825Sdfr    {
1887178825Sdfr		    if ((yyvsp[(5) - (5)].i)) {
1888178825Sdfr			switch ((yyvsp[(3) - (5)].i)) {
1889178825Sdfr
1890178825Sdfr			case STRU_F:
1891178825Sdfr				reply(200, "STRU F ok.");
1892178825Sdfr				break;
1893178825Sdfr
1894178825Sdfr			default:
1895178825Sdfr				reply(504, "Unimplemented STRU type.");
1896178825Sdfr			}
1897178825Sdfr		    }
1898178825Sdfr		}
1899178825Sdfr    break;
1900178825Sdfr
1901178825Sdfr  case 14:
1902178825Sdfr#line 238 "ftpcmd.y"
1903178825Sdfr    {
1904178825Sdfr		    if ((yyvsp[(5) - (5)].i)) {
1905178825Sdfr			switch ((yyvsp[(3) - (5)].i)) {
1906178825Sdfr
1907178825Sdfr			case MODE_S:
1908178825Sdfr				reply(200, "MODE S ok.");
1909178825Sdfr				break;
1910178825Sdfr
1911178825Sdfr			default:
1912178825Sdfr				reply(502, "Unimplemented MODE type.");
1913178825Sdfr			}
1914178825Sdfr		    }
1915178825Sdfr		}
1916178825Sdfr    break;
1917178825Sdfr
1918178825Sdfr  case 15:
1919178825Sdfr#line 252 "ftpcmd.y"
1920178825Sdfr    {
1921178825Sdfr		    if ((yyvsp[(5) - (5)].i)) {
1922178825Sdfr			reply(202, "ALLO command ignored.");
1923178825Sdfr		    }
1924178825Sdfr		}
1925178825Sdfr    break;
1926178825Sdfr
1927178825Sdfr  case 16:
1928178825Sdfr#line 258 "ftpcmd.y"
1929178825Sdfr    {
1930178825Sdfr		    if ((yyvsp[(9) - (9)].i)) {
1931178825Sdfr			reply(202, "ALLO command ignored.");
1932178825Sdfr		    }
1933178825Sdfr		}
1934178825Sdfr    break;
1935178825Sdfr
1936178825Sdfr  case 17:
1937178825Sdfr#line 264 "ftpcmd.y"
1938178825Sdfr    {
1939178825Sdfr			char *name = (yyvsp[(3) - (5)].s);
1940178825Sdfr
1941178825Sdfr			if ((yyvsp[(5) - (5)].i) && name != NULL)
1942178825Sdfr				retrieve(0, name);
1943178825Sdfr			if (name != NULL)
1944178825Sdfr				free(name);
1945178825Sdfr		}
1946178825Sdfr    break;
1947178825Sdfr
1948178825Sdfr  case 18:
1949178825Sdfr#line 273 "ftpcmd.y"
1950178825Sdfr    {
1951178825Sdfr			char *name = (yyvsp[(3) - (5)].s);
1952178825Sdfr
1953178825Sdfr			if ((yyvsp[(5) - (5)].i) && name != NULL)
1954178825Sdfr				do_store(name, "w", 0);
1955178825Sdfr			if (name != NULL)
1956178825Sdfr				free(name);
1957178825Sdfr		}
1958178825Sdfr    break;
1959178825Sdfr
1960178825Sdfr  case 19:
1961178825Sdfr#line 282 "ftpcmd.y"
1962178825Sdfr    {
1963178825Sdfr			char *name = (yyvsp[(3) - (5)].s);
1964178825Sdfr
1965178825Sdfr			if ((yyvsp[(5) - (5)].i) && name != NULL)
1966178825Sdfr				do_store(name, "a", 0);
1967178825Sdfr			if (name != NULL)
1968178825Sdfr				free(name);
1969178825Sdfr		}
1970178825Sdfr    break;
1971178825Sdfr
1972178825Sdfr  case 20:
1973178825Sdfr#line 291 "ftpcmd.y"
1974178825Sdfr    {
1975178825Sdfr			if ((yyvsp[(3) - (3)].i))
1976178825Sdfr				send_file_list(".");
1977178825Sdfr		}
1978178825Sdfr    break;
1979178825Sdfr
1980178825Sdfr  case 21:
1981178825Sdfr#line 296 "ftpcmd.y"
1982178825Sdfr    {
1983178825Sdfr			char *name = (yyvsp[(3) - (5)].s);
1984178825Sdfr
1985178825Sdfr			if ((yyvsp[(5) - (5)].i) && name != NULL)
1986178825Sdfr				send_file_list(name);
1987178825Sdfr			if (name != NULL)
1988178825Sdfr				free(name);
1989178825Sdfr		}
1990178825Sdfr    break;
1991178825Sdfr
1992178825Sdfr  case 22:
1993178825Sdfr#line 305 "ftpcmd.y"
1994178825Sdfr    {
1995178825Sdfr		    if((yyvsp[(3) - (3)].i))
1996178825Sdfr			list_file(".");
1997178825Sdfr		}
1998178825Sdfr    break;
1999178825Sdfr
2000178825Sdfr  case 23:
2001178825Sdfr#line 310 "ftpcmd.y"
2002178825Sdfr    {
2003178825Sdfr		    if((yyvsp[(5) - (5)].i))
2004178825Sdfr			list_file((yyvsp[(3) - (5)].s));
2005178825Sdfr		    free((yyvsp[(3) - (5)].s));
2006178825Sdfr		}
2007178825Sdfr    break;
2008178825Sdfr
2009178825Sdfr  case 24:
2010178825Sdfr#line 316 "ftpcmd.y"
2011178825Sdfr    {
2012178825Sdfr			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2013178825Sdfr				statfilecmd((yyvsp[(3) - (5)].s));
2014178825Sdfr			if ((yyvsp[(3) - (5)].s) != NULL)
2015178825Sdfr				free((yyvsp[(3) - (5)].s));
2016178825Sdfr		}
2017178825Sdfr    break;
2018178825Sdfr
2019178825Sdfr  case 25:
2020178825Sdfr#line 323 "ftpcmd.y"
2021178825Sdfr    {
2022178825Sdfr		    if ((yyvsp[(3) - (3)].i))
2023178825Sdfr			statcmd();
2024178825Sdfr		}
2025178825Sdfr    break;
2026178825Sdfr
2027178825Sdfr  case 26:
2028178825Sdfr#line 328 "ftpcmd.y"
2029178825Sdfr    {
2030178825Sdfr			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2031178825Sdfr				do_delete((yyvsp[(3) - (5)].s));
2032178825Sdfr			if ((yyvsp[(3) - (5)].s) != NULL)
2033178825Sdfr				free((yyvsp[(3) - (5)].s));
2034178825Sdfr		}
2035178825Sdfr    break;
2036178825Sdfr
2037178825Sdfr  case 27:
2038178825Sdfr#line 335 "ftpcmd.y"
2039178825Sdfr    {
2040178825Sdfr			if((yyvsp[(5) - (5)].i)){
2041178825Sdfr				if (fromname) {
2042178825Sdfr					renamecmd(fromname, (yyvsp[(3) - (5)].s));
2043178825Sdfr					free(fromname);
2044178825Sdfr					fromname = (char *) 0;
2045178825Sdfr				} else {
2046178825Sdfr					reply(503, "Bad sequence of commands.");
2047178825Sdfr				}
2048178825Sdfr			}
2049178825Sdfr			if ((yyvsp[(3) - (5)].s) != NULL)
2050178825Sdfr				free((yyvsp[(3) - (5)].s));
2051178825Sdfr		}
2052178825Sdfr    break;
2053178825Sdfr
2054178825Sdfr  case 28:
2055178825Sdfr#line 349 "ftpcmd.y"
2056178825Sdfr    {
2057178825Sdfr		    if ((yyvsp[(3) - (3)].i))
2058178825Sdfr			reply(225, "ABOR command successful.");
2059178825Sdfr		}
2060178825Sdfr    break;
2061178825Sdfr
2062178825Sdfr  case 29:
2063178825Sdfr#line 354 "ftpcmd.y"
2064178825Sdfr    {
2065178825Sdfr			if ((yyvsp[(3) - (3)].i))
2066178825Sdfr				cwd(pw->pw_dir);
2067178825Sdfr		}
2068178825Sdfr    break;
2069178825Sdfr
2070178825Sdfr  case 30:
2071178825Sdfr#line 359 "ftpcmd.y"
2072178825Sdfr    {
2073178825Sdfr			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2074178825Sdfr				cwd((yyvsp[(3) - (5)].s));
2075178825Sdfr			if ((yyvsp[(3) - (5)].s) != NULL)
2076178825Sdfr				free((yyvsp[(3) - (5)].s));
2077178825Sdfr		}
2078178825Sdfr    break;
2079178825Sdfr
2080178825Sdfr  case 31:
2081178825Sdfr#line 366 "ftpcmd.y"
2082178825Sdfr    {
2083178825Sdfr		    if ((yyvsp[(3) - (3)].i))
2084178825Sdfr			help(cmdtab, (char *) 0);
2085178825Sdfr		}
2086178825Sdfr    break;
2087178825Sdfr
2088178825Sdfr  case 32:
2089178825Sdfr#line 371 "ftpcmd.y"
2090178825Sdfr    {
2091178825Sdfr		    if ((yyvsp[(5) - (5)].i)) {
2092178825Sdfr			char *cp = (yyvsp[(3) - (5)].s);
2093178825Sdfr
2094178825Sdfr			if (strncasecmp(cp, "SITE", 4) == 0) {
2095178825Sdfr				cp = (yyvsp[(3) - (5)].s) + 4;
2096178825Sdfr				if (*cp == ' ')
2097178825Sdfr					cp++;
2098178825Sdfr				if (*cp)
2099178825Sdfr					help(sitetab, cp);
2100178825Sdfr				else
2101178825Sdfr					help(sitetab, (char *) 0);
2102178825Sdfr			} else
2103178825Sdfr				help(cmdtab, (yyvsp[(3) - (5)].s));
2104178825Sdfr		    }
2105178825Sdfr		}
2106178825Sdfr    break;
2107178825Sdfr
2108178825Sdfr  case 33:
2109178825Sdfr#line 388 "ftpcmd.y"
2110178825Sdfr    {
2111178825Sdfr		    if ((yyvsp[(3) - (3)].i))
2112178825Sdfr			reply(200, "NOOP command successful.");
2113178825Sdfr		}
2114178825Sdfr    break;
2115178825Sdfr
2116178825Sdfr  case 34:
2117178825Sdfr#line 393 "ftpcmd.y"
2118178825Sdfr    {
2119178825Sdfr			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2120178825Sdfr				makedir((yyvsp[(3) - (5)].s));
2121178825Sdfr			if ((yyvsp[(3) - (5)].s) != NULL)
2122178825Sdfr				free((yyvsp[(3) - (5)].s));
2123178825Sdfr		}
2124178825Sdfr    break;
2125178825Sdfr
2126178825Sdfr  case 35:
2127178825Sdfr#line 400 "ftpcmd.y"
2128178825Sdfr    {
2129178825Sdfr			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2130178825Sdfr				removedir((yyvsp[(3) - (5)].s));
2131178825Sdfr			if ((yyvsp[(3) - (5)].s) != NULL)
2132178825Sdfr				free((yyvsp[(3) - (5)].s));
2133178825Sdfr		}
2134178825Sdfr    break;
2135178825Sdfr
2136178825Sdfr  case 36:
2137178825Sdfr#line 407 "ftpcmd.y"
2138178825Sdfr    {
2139178825Sdfr			if ((yyvsp[(3) - (3)].i))
2140178825Sdfr				pwd();
2141178825Sdfr		}
2142178825Sdfr    break;
2143178825Sdfr
2144178825Sdfr  case 37:
2145178825Sdfr#line 412 "ftpcmd.y"
2146178825Sdfr    {
2147178825Sdfr			if ((yyvsp[(3) - (3)].i))
2148178825Sdfr				cwd("..");
2149178825Sdfr		}
2150178825Sdfr    break;
2151178825Sdfr
2152178825Sdfr  case 38:
2153178825Sdfr#line 417 "ftpcmd.y"
2154178825Sdfr    {
2155178825Sdfr		    if ((yyvsp[(3) - (3)].i)) {
2156178825Sdfr			lreply(211, "Supported features:");
2157178825Sdfr			lreply(0, " MDTM");
2158178825Sdfr			lreply(0, " REST STREAM");
2159178825Sdfr			lreply(0, " SIZE");
2160178825Sdfr			reply(211, "End");
2161178825Sdfr		    }
2162178825Sdfr		}
2163178825Sdfr    break;
2164178825Sdfr
2165178825Sdfr  case 39:
2166178825Sdfr#line 427 "ftpcmd.y"
2167178825Sdfr    {
2168178825Sdfr		    if ((yyvsp[(5) - (5)].i))
2169178825Sdfr			reply(501, "Bad options");
2170178825Sdfr		    free ((yyvsp[(3) - (5)].s));
2171178825Sdfr		}
2172178825Sdfr    break;
2173178825Sdfr
2174178825Sdfr  case 40:
2175178825Sdfr#line 434 "ftpcmd.y"
2176178825Sdfr    {
2177178825Sdfr		    if ((yyvsp[(5) - (5)].i))
2178178825Sdfr			help(sitetab, (char *) 0);
2179178825Sdfr		}
2180178825Sdfr    break;
2181178825Sdfr
2182178825Sdfr  case 41:
2183178825Sdfr#line 439 "ftpcmd.y"
2184178825Sdfr    {
2185178825Sdfr		    if ((yyvsp[(7) - (7)].i))
2186178825Sdfr			help(sitetab, (yyvsp[(5) - (7)].s));
2187178825Sdfr		}
2188178825Sdfr    break;
2189178825Sdfr
2190178825Sdfr  case 42:
2191178825Sdfr#line 444 "ftpcmd.y"
2192178825Sdfr    {
2193178825Sdfr			if ((yyvsp[(5) - (5)].i)) {
2194178825Sdfr				int oldmask = umask(0);
2195178825Sdfr				umask(oldmask);
2196178825Sdfr				reply(200, "Current UMASK is %03o", oldmask);
2197178825Sdfr			}
2198178825Sdfr		}
2199178825Sdfr    break;
2200178825Sdfr
2201178825Sdfr  case 43:
2202178825Sdfr#line 452 "ftpcmd.y"
2203178825Sdfr    {
2204178825Sdfr			if ((yyvsp[(7) - (7)].i)) {
2205178825Sdfr				if (((yyvsp[(5) - (7)].i) == -1) || ((yyvsp[(5) - (7)].i) > 0777)) {
2206178825Sdfr					reply(501, "Bad UMASK value");
2207178825Sdfr				} else {
2208178825Sdfr					int oldmask = umask((yyvsp[(5) - (7)].i));
2209178825Sdfr					reply(200,
2210178825Sdfr					      "UMASK set to %03o (was %03o)",
2211178825Sdfr					      (yyvsp[(5) - (7)].i), oldmask);
2212178825Sdfr				}
2213178825Sdfr			}
2214178825Sdfr		}
2215178825Sdfr    break;
2216178825Sdfr
2217178825Sdfr  case 44:
2218178825Sdfr#line 465 "ftpcmd.y"
2219178825Sdfr    {
2220178825Sdfr			if ((yyvsp[(9) - (9)].i) && (yyvsp[(7) - (9)].s) != NULL) {
2221178825Sdfr				if ((yyvsp[(5) - (9)].i) > 0777)
2222178825Sdfr					reply(501,
2223178825Sdfr				"CHMOD: Mode value must be between 0 and 0777");
2224178825Sdfr				else if (chmod((yyvsp[(7) - (9)].s), (yyvsp[(5) - (9)].i)) < 0)
2225178825Sdfr					perror_reply(550, (yyvsp[(7) - (9)].s));
2226178825Sdfr				else
2227178825Sdfr					reply(200, "CHMOD command successful.");
2228178825Sdfr			}
2229178825Sdfr			if ((yyvsp[(7) - (9)].s) != NULL)
2230178825Sdfr				free((yyvsp[(7) - (9)].s));
2231178825Sdfr		}
2232178825Sdfr    break;
2233178825Sdfr
2234178825Sdfr  case 45:
2235178825Sdfr#line 479 "ftpcmd.y"
2236178825Sdfr    {
2237178825Sdfr		    if ((yyvsp[(5) - (5)].i))
2238178825Sdfr			reply(200,
2239178825Sdfr			    "Current IDLE time limit is %d seconds; max %d",
2240178825Sdfr				ftpd_timeout, maxtimeout);
2241178825Sdfr		}
2242178825Sdfr    break;
2243178825Sdfr
2244178825Sdfr  case 46:
2245178825Sdfr#line 486 "ftpcmd.y"
2246178825Sdfr    {
2247178825Sdfr		    if ((yyvsp[(7) - (7)].i)) {
2248178825Sdfr			if ((yyvsp[(5) - (7)].i) < 30 || (yyvsp[(5) - (7)].i) > maxtimeout) {
2249178825Sdfr				reply(501,
2250178825Sdfr			"Maximum IDLE time must be between 30 and %d seconds",
2251178825Sdfr				    maxtimeout);
2252178825Sdfr			} else {
2253178825Sdfr				ftpd_timeout = (yyvsp[(5) - (7)].i);
2254178825Sdfr				alarm((unsigned) ftpd_timeout);
2255178825Sdfr				reply(200,
2256178825Sdfr				    "Maximum IDLE time set to %d seconds",
2257178825Sdfr				    ftpd_timeout);
2258178825Sdfr			}
2259178825Sdfr		    }
2260178825Sdfr		}
2261178825Sdfr    break;
2262178825Sdfr
2263178825Sdfr  case 47:
2264178825Sdfr#line 503 "ftpcmd.y"
2265178825Sdfr    {
2266178825Sdfr#ifdef KRB4
2267178825Sdfr			char *p;
2268178825Sdfr
2269178825Sdfr			if(guest)
2270178825Sdfr				reply(500, "Can't be done as guest.");
2271178825Sdfr			else{
2272178825Sdfr				if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL){
2273178825Sdfr				    p = strpbrk((yyvsp[(5) - (7)].s), " \t");
2274178825Sdfr				    if(p){
2275178825Sdfr					*p++ = 0;
2276178825Sdfr					kauth((yyvsp[(5) - (7)].s), p + strspn(p, " \t"));
2277178825Sdfr				    }else
2278178825Sdfr					kauth((yyvsp[(5) - (7)].s), NULL);
2279178825Sdfr				}
2280178825Sdfr			}
2281178825Sdfr			if((yyvsp[(5) - (7)].s) != NULL)
2282178825Sdfr			    free((yyvsp[(5) - (7)].s));
2283178825Sdfr#else
2284178825Sdfr			reply(500, "Command not implemented.");
2285178825Sdfr#endif
2286178825Sdfr		}
2287178825Sdfr    break;
2288178825Sdfr
2289178825Sdfr  case 48:
2290178825Sdfr#line 526 "ftpcmd.y"
2291178825Sdfr    {
2292178825Sdfr		    if((yyvsp[(5) - (5)].i))
2293178825Sdfr			klist();
2294178825Sdfr		}
2295178825Sdfr    break;
2296178825Sdfr
2297178825Sdfr  case 49:
2298178825Sdfr#line 531 "ftpcmd.y"
2299178825Sdfr    {
2300178825Sdfr#ifdef KRB4
2301178825Sdfr		    if((yyvsp[(5) - (5)].i))
2302178825Sdfr			kdestroy();
2303178825Sdfr#else
2304178825Sdfr		    reply(500, "Command not implemented.");
2305178825Sdfr#endif
2306178825Sdfr		}
2307178825Sdfr    break;
2308178825Sdfr
2309178825Sdfr  case 50:
2310178825Sdfr#line 540 "ftpcmd.y"
2311178825Sdfr    {
2312178825Sdfr#ifdef KRB4
2313178825Sdfr		    if(guest)
2314178825Sdfr			reply(500, "Can't be done as guest.");
2315178825Sdfr		    else if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s))
2316178825Sdfr			krbtkfile((yyvsp[(5) - (7)].s));
2317178825Sdfr		    if((yyvsp[(5) - (7)].s))
2318178825Sdfr			free((yyvsp[(5) - (7)].s));
2319178825Sdfr#else
2320178825Sdfr		    reply(500, "Command not implemented.");
2321178825Sdfr#endif
2322178825Sdfr		}
2323178825Sdfr    break;
2324178825Sdfr
2325178825Sdfr  case 51:
2326178825Sdfr#line 553 "ftpcmd.y"
2327178825Sdfr    {
2328178825Sdfr#if defined(KRB4) || defined(KRB5)
2329178825Sdfr		    if(guest)
2330178825Sdfr			reply(500, "Can't be done as guest.");
2331178825Sdfr		    else if((yyvsp[(5) - (5)].i))
2332178825Sdfr			afslog(NULL, 0);
2333178825Sdfr#else
2334178825Sdfr		    reply(500, "Command not implemented.");
2335178825Sdfr#endif
2336178825Sdfr		}
2337178825Sdfr    break;
2338178825Sdfr
2339178825Sdfr  case 52:
2340178825Sdfr#line 564 "ftpcmd.y"
2341178825Sdfr    {
2342178825Sdfr#if defined(KRB4) || defined(KRB5)
2343178825Sdfr		    if(guest)
2344178825Sdfr			reply(500, "Can't be done as guest.");
2345178825Sdfr		    else if((yyvsp[(7) - (7)].i))
2346178825Sdfr			afslog((yyvsp[(5) - (7)].s), 0);
2347178825Sdfr		    if((yyvsp[(5) - (7)].s))
2348178825Sdfr			free((yyvsp[(5) - (7)].s));
2349178825Sdfr#else
2350178825Sdfr		    reply(500, "Command not implemented.");
2351178825Sdfr#endif
2352178825Sdfr		}
2353178825Sdfr    break;
2354178825Sdfr
2355178825Sdfr  case 53:
2356178825Sdfr#line 577 "ftpcmd.y"
2357178825Sdfr    {
2358178825Sdfr		    if((yyvsp[(7) - (7)].i) && (yyvsp[(5) - (7)].s) != NULL)
2359178825Sdfr			find((yyvsp[(5) - (7)].s));
2360178825Sdfr		    if((yyvsp[(5) - (7)].s) != NULL)
2361178825Sdfr			free((yyvsp[(5) - (7)].s));
2362178825Sdfr		}
2363178825Sdfr    break;
2364178825Sdfr
2365178825Sdfr  case 54:
2366178825Sdfr#line 584 "ftpcmd.y"
2367178825Sdfr    {
2368178825Sdfr		    if ((yyvsp[(5) - (5)].i))
2369178825Sdfr			reply(200, "http://www.pdc.kth.se/heimdal/");
2370178825Sdfr		}
2371178825Sdfr    break;
2372178825Sdfr
2373178825Sdfr  case 55:
2374178825Sdfr#line 589 "ftpcmd.y"
2375178825Sdfr    {
2376178825Sdfr			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2377178825Sdfr				do_store((yyvsp[(3) - (5)].s), "w", 1);
2378178825Sdfr			if ((yyvsp[(3) - (5)].s) != NULL)
2379178825Sdfr				free((yyvsp[(3) - (5)].s));
2380178825Sdfr		}
2381178825Sdfr    break;
2382178825Sdfr
2383178825Sdfr  case 56:
2384178825Sdfr#line 596 "ftpcmd.y"
2385178825Sdfr    {
2386178825Sdfr		    if ((yyvsp[(3) - (3)].i)) {
2387178825Sdfr#if !defined(WIN32) && !defined(__EMX__) && !defined(__OS2__) && !defined(__CYGWIN32__)
2388178825Sdfr			reply(215, "UNIX Type: L%d", NBBY);
2389178825Sdfr#else
2390178825Sdfr			reply(215, "UNKNOWN Type: L%d", NBBY);
2391178825Sdfr#endif
2392178825Sdfr		    }
2393178825Sdfr		}
2394178825Sdfr    break;
2395178825Sdfr
2396178825Sdfr  case 57:
2397178825Sdfr#line 614 "ftpcmd.y"
2398178825Sdfr    {
2399178825Sdfr			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL)
2400178825Sdfr				sizecmd((yyvsp[(3) - (5)].s));
2401178825Sdfr			if ((yyvsp[(3) - (5)].s) != NULL)
2402178825Sdfr				free((yyvsp[(3) - (5)].s));
2403178825Sdfr		}
2404178825Sdfr    break;
2405178825Sdfr
2406178825Sdfr  case 58:
2407178825Sdfr#line 631 "ftpcmd.y"
2408178825Sdfr    {
2409178825Sdfr			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s) != NULL) {
2410178825Sdfr				struct stat stbuf;
2411178825Sdfr				if (stat((yyvsp[(3) - (5)].s), &stbuf) < 0)
2412178825Sdfr					reply(550, "%s: %s",
2413178825Sdfr					    (yyvsp[(3) - (5)].s), strerror(errno));
2414178825Sdfr				else if (!S_ISREG(stbuf.st_mode)) {
2415178825Sdfr					reply(550,
2416178825Sdfr					      "%s: not a plain file.", (yyvsp[(3) - (5)].s));
2417178825Sdfr				} else {
2418178825Sdfr					struct tm *t;
2419178825Sdfr					time_t mtime = stbuf.st_mtime;
2420178825Sdfr
2421178825Sdfr					t = gmtime(&mtime);
2422178825Sdfr					reply(213,
2423178825Sdfr					      "%04d%02d%02d%02d%02d%02d",
2424178825Sdfr					      t->tm_year + 1900,
2425178825Sdfr					      t->tm_mon + 1,
2426178825Sdfr					      t->tm_mday,
2427178825Sdfr					      t->tm_hour,
2428178825Sdfr					      t->tm_min,
2429178825Sdfr					      t->tm_sec);
2430178825Sdfr				}
2431178825Sdfr			}
2432178825Sdfr			if ((yyvsp[(3) - (5)].s) != NULL)
2433178825Sdfr				free((yyvsp[(3) - (5)].s));
2434178825Sdfr		}
2435178825Sdfr    break;
2436178825Sdfr
2437178825Sdfr  case 59:
2438178825Sdfr#line 659 "ftpcmd.y"
2439178825Sdfr    {
2440178825Sdfr		    if ((yyvsp[(3) - (3)].i)) {
2441178825Sdfr			reply(221, "Goodbye.");
2442178825Sdfr			dologout(0);
2443178825Sdfr		    }
2444178825Sdfr		}
2445178825Sdfr    break;
2446178825Sdfr
2447178825Sdfr  case 60:
2448178825Sdfr#line 666 "ftpcmd.y"
2449178825Sdfr    {
2450178825Sdfr			yyerrok;
2451178825Sdfr		}
2452178825Sdfr    break;
2453178825Sdfr
2454178825Sdfr  case 61:
2455178825Sdfr#line 672 "ftpcmd.y"
2456178825Sdfr    {
2457178825Sdfr			restart_point = (off_t) 0;
2458178825Sdfr			if ((yyvsp[(5) - (5)].i) && (yyvsp[(3) - (5)].s)) {
2459178825Sdfr				fromname = renamefrom((yyvsp[(3) - (5)].s));
2460178825Sdfr				if (fromname == (char *) 0 && (yyvsp[(3) - (5)].s)) {
2461178825Sdfr					free((yyvsp[(3) - (5)].s));
2462178825Sdfr				}
2463178825Sdfr			}
2464178825Sdfr		}
2465178825Sdfr    break;
2466178825Sdfr
2467178825Sdfr  case 62:
2468178825Sdfr#line 682 "ftpcmd.y"
2469178825Sdfr    {
2470178825Sdfr		    if ((yyvsp[(5) - (5)].i)) {
2471178825Sdfr			fromname = (char *) 0;
2472178825Sdfr			restart_point = (yyvsp[(3) - (5)].i);	/* XXX $3 is only "int" */
2473178825Sdfr			reply(350, "Restarting at %ld. %s",
2474178825Sdfr			      (long)restart_point,
2475178825Sdfr			      "Send STORE or RETRIEVE to initiate transfer.");
2476178825Sdfr		    }
2477178825Sdfr		}
2478178825Sdfr    break;
2479178825Sdfr
2480178825Sdfr  case 63:
2481178825Sdfr#line 692 "ftpcmd.y"
2482178825Sdfr    {
2483178825Sdfr			auth((yyvsp[(3) - (4)].s));
2484178825Sdfr			free((yyvsp[(3) - (4)].s));
2485178825Sdfr		}
2486178825Sdfr    break;
2487178825Sdfr
2488178825Sdfr  case 64:
2489178825Sdfr#line 697 "ftpcmd.y"
2490178825Sdfr    {
2491178825Sdfr			adat((yyvsp[(3) - (4)].s));
2492178825Sdfr			free((yyvsp[(3) - (4)].s));
2493178825Sdfr		}
2494178825Sdfr    break;
2495178825Sdfr
2496178825Sdfr  case 65:
2497178825Sdfr#line 702 "ftpcmd.y"
2498178825Sdfr    {
2499178825Sdfr		    if ((yyvsp[(5) - (5)].i))
2500178825Sdfr			pbsz((yyvsp[(3) - (5)].i));
2501178825Sdfr		}
2502178825Sdfr    break;
2503178825Sdfr
2504178825Sdfr  case 66:
2505178825Sdfr#line 707 "ftpcmd.y"
2506178825Sdfr    {
2507178825Sdfr		    if ((yyvsp[(5) - (5)].i))
2508178825Sdfr			prot((yyvsp[(3) - (5)].s));
2509178825Sdfr		}
2510178825Sdfr    break;
2511178825Sdfr
2512178825Sdfr  case 67:
2513178825Sdfr#line 712 "ftpcmd.y"
2514178825Sdfr    {
2515178825Sdfr		    if ((yyvsp[(3) - (3)].i))
2516178825Sdfr			ccc();
2517178825Sdfr		}
2518178825Sdfr    break;
2519178825Sdfr
2520178825Sdfr  case 68:
2521178825Sdfr#line 717 "ftpcmd.y"
2522178825Sdfr    {
2523178825Sdfr			mec((yyvsp[(3) - (4)].s), prot_safe);
2524178825Sdfr			free((yyvsp[(3) - (4)].s));
2525178825Sdfr		}
2526178825Sdfr    break;
2527178825Sdfr
2528178825Sdfr  case 69:
2529178825Sdfr#line 722 "ftpcmd.y"
2530178825Sdfr    {
2531178825Sdfr			mec((yyvsp[(3) - (4)].s), prot_confidential);
2532178825Sdfr			free((yyvsp[(3) - (4)].s));
2533178825Sdfr		}
2534178825Sdfr    break;
2535178825Sdfr
2536178825Sdfr  case 70:
2537178825Sdfr#line 727 "ftpcmd.y"
2538178825Sdfr    {
2539178825Sdfr			mec((yyvsp[(3) - (4)].s), prot_private);
2540178825Sdfr			free((yyvsp[(3) - (4)].s));
2541178825Sdfr		}
2542178825Sdfr    break;
2543178825Sdfr
2544178825Sdfr  case 72:
2545178825Sdfr#line 739 "ftpcmd.y"
2546178825Sdfr    {
2547178825Sdfr			(yyval.s) = (char *)calloc(1, sizeof(char));
2548178825Sdfr		}
2549178825Sdfr    break;
2550178825Sdfr
2551178825Sdfr  case 75:
2552178825Sdfr#line 752 "ftpcmd.y"
2553178825Sdfr    {
2554178825Sdfr			struct sockaddr_in *sin4 = (struct sockaddr_in *)data_dest;
2555178825Sdfr
2556178825Sdfr			sin4->sin_family = AF_INET;
2557178825Sdfr			sin4->sin_port = htons((yyvsp[(9) - (11)].i) * 256 + (yyvsp[(11) - (11)].i));
2558178825Sdfr			sin4->sin_addr.s_addr =
2559178825Sdfr			    htonl(((yyvsp[(1) - (11)].i) << 24) | ((yyvsp[(3) - (11)].i) << 16) | ((yyvsp[(5) - (11)].i) << 8) | (yyvsp[(7) - (11)].i));
2560178825Sdfr		}
2561178825Sdfr    break;
2562178825Sdfr
2563178825Sdfr  case 76:
2564178825Sdfr#line 764 "ftpcmd.y"
2565178825Sdfr    {
2566178825Sdfr			(yyval.i) = FORM_N;
2567178825Sdfr		}
2568178825Sdfr    break;
2569178825Sdfr
2570178825Sdfr  case 77:
2571178825Sdfr#line 768 "ftpcmd.y"
2572178825Sdfr    {
2573178825Sdfr			(yyval.i) = FORM_T;
2574178825Sdfr		}
2575178825Sdfr    break;
2576178825Sdfr
2577178825Sdfr  case 78:
2578178825Sdfr#line 772 "ftpcmd.y"
2579178825Sdfr    {
2580178825Sdfr			(yyval.i) = FORM_C;
2581178825Sdfr		}
2582178825Sdfr    break;
2583178825Sdfr
2584178825Sdfr  case 79:
2585178825Sdfr#line 779 "ftpcmd.y"
2586178825Sdfr    {
2587178825Sdfr			cmd_type = TYPE_A;
2588178825Sdfr			cmd_form = FORM_N;
2589178825Sdfr		}
2590178825Sdfr    break;
2591178825Sdfr
2592178825Sdfr  case 80:
2593178825Sdfr#line 784 "ftpcmd.y"
2594178825Sdfr    {
2595178825Sdfr			cmd_type = TYPE_A;
2596178825Sdfr			cmd_form = (yyvsp[(3) - (3)].i);
2597178825Sdfr		}
2598178825Sdfr    break;
2599178825Sdfr
2600178825Sdfr  case 81:
2601178825Sdfr#line 789 "ftpcmd.y"
2602178825Sdfr    {
2603178825Sdfr			cmd_type = TYPE_E;
2604178825Sdfr			cmd_form = FORM_N;
2605178825Sdfr		}
2606178825Sdfr    break;
2607178825Sdfr
2608178825Sdfr  case 82:
2609178825Sdfr#line 794 "ftpcmd.y"
2610178825Sdfr    {
2611178825Sdfr			cmd_type = TYPE_E;
2612178825Sdfr			cmd_form = (yyvsp[(3) - (3)].i);
2613178825Sdfr		}
2614178825Sdfr    break;
2615178825Sdfr
2616178825Sdfr  case 83:
2617178825Sdfr#line 799 "ftpcmd.y"
2618178825Sdfr    {
2619178825Sdfr			cmd_type = TYPE_I;
2620178825Sdfr		}
2621178825Sdfr    break;
2622178825Sdfr
2623178825Sdfr  case 84:
2624178825Sdfr#line 803 "ftpcmd.y"
2625178825Sdfr    {
2626178825Sdfr			cmd_type = TYPE_L;
2627178825Sdfr			cmd_bytesz = NBBY;
2628178825Sdfr		}
2629178825Sdfr    break;
2630178825Sdfr
2631178825Sdfr  case 85:
2632178825Sdfr#line 808 "ftpcmd.y"
2633178825Sdfr    {
2634178825Sdfr			cmd_type = TYPE_L;
2635178825Sdfr			cmd_bytesz = (yyvsp[(3) - (3)].i);
2636178825Sdfr		}
2637178825Sdfr    break;
2638178825Sdfr
2639178825Sdfr  case 86:
2640178825Sdfr#line 814 "ftpcmd.y"
2641178825Sdfr    {
2642178825Sdfr			cmd_type = TYPE_L;
2643178825Sdfr			cmd_bytesz = (yyvsp[(2) - (2)].i);
2644178825Sdfr		}
2645178825Sdfr    break;
2646178825Sdfr
2647178825Sdfr  case 87:
2648178825Sdfr#line 822 "ftpcmd.y"
2649178825Sdfr    {
2650178825Sdfr			(yyval.i) = STRU_F;
2651178825Sdfr		}
2652178825Sdfr    break;
2653178825Sdfr
2654178825Sdfr  case 88:
2655178825Sdfr#line 826 "ftpcmd.y"
2656178825Sdfr    {
2657178825Sdfr			(yyval.i) = STRU_R;
2658178825Sdfr		}
2659178825Sdfr    break;
2660178825Sdfr
2661178825Sdfr  case 89:
2662178825Sdfr#line 830 "ftpcmd.y"
2663178825Sdfr    {
2664178825Sdfr			(yyval.i) = STRU_P;
2665178825Sdfr		}
2666178825Sdfr    break;
2667178825Sdfr
2668178825Sdfr  case 90:
2669178825Sdfr#line 837 "ftpcmd.y"
2670178825Sdfr    {
2671178825Sdfr			(yyval.i) = MODE_S;
2672178825Sdfr		}
2673178825Sdfr    break;
2674178825Sdfr
2675178825Sdfr  case 91:
2676178825Sdfr#line 841 "ftpcmd.y"
2677178825Sdfr    {
2678178825Sdfr			(yyval.i) = MODE_B;
2679178825Sdfr		}
2680178825Sdfr    break;
2681178825Sdfr
2682178825Sdfr  case 92:
2683178825Sdfr#line 845 "ftpcmd.y"
2684178825Sdfr    {
2685178825Sdfr			(yyval.i) = MODE_C;
2686178825Sdfr		}
2687178825Sdfr    break;
2688178825Sdfr
2689178825Sdfr  case 93:
2690178825Sdfr#line 852 "ftpcmd.y"
2691178825Sdfr    {
2692178825Sdfr			/*
2693178825Sdfr			 * Problem: this production is used for all pathname
2694178825Sdfr			 * processing, but only gives a 550 error reply.
2695178825Sdfr			 * This is a valid reply in some cases but not in others.
2696178825Sdfr			 */
2697178825Sdfr			if (logged_in && (yyvsp[(1) - (1)].s) && *(yyvsp[(1) - (1)].s) == '~') {
2698178825Sdfr				glob_t gl;
2699178825Sdfr				int flags =
2700178825Sdfr				 GLOB_BRACE|GLOB_NOCHECK|GLOB_QUOTE|GLOB_TILDE;
2701178825Sdfr
2702178825Sdfr				memset(&gl, 0, sizeof(gl));
2703178825Sdfr				if (glob((yyvsp[(1) - (1)].s), flags, NULL, &gl) ||
2704178825Sdfr				    gl.gl_pathc == 0) {
2705178825Sdfr					reply(550, "not found");
2706178825Sdfr					(yyval.s) = NULL;
2707178825Sdfr				} else {
2708178825Sdfr					(yyval.s) = strdup(gl.gl_pathv[0]);
2709178825Sdfr				}
2710178825Sdfr				globfree(&gl);
2711178825Sdfr				free((yyvsp[(1) - (1)].s));
2712178825Sdfr			} else
2713178825Sdfr				(yyval.s) = (yyvsp[(1) - (1)].s);
2714178825Sdfr		}
2715178825Sdfr    break;
2716178825Sdfr
2717178825Sdfr  case 95:
2718178825Sdfr#line 884 "ftpcmd.y"
2719178825Sdfr    {
2720178825Sdfr			int ret, dec, multby, digit;
2721178825Sdfr
2722178825Sdfr			/*
2723178825Sdfr			 * Convert a number that was read as decimal number
2724178825Sdfr			 * to what it would be if it had been read as octal.
2725178825Sdfr			 */
2726178825Sdfr			dec = (yyvsp[(1) - (1)].i);
2727178825Sdfr			multby = 1;
2728178825Sdfr			ret = 0;
2729178825Sdfr			while (dec) {
2730178825Sdfr				digit = dec%10;
2731178825Sdfr				if (digit > 7) {
2732178825Sdfr					ret = -1;
2733178825Sdfr					break;
2734178825Sdfr				}
2735178825Sdfr				ret += digit * multby;
2736178825Sdfr				multby *= 8;
2737178825Sdfr				dec /= 10;
2738178825Sdfr			}
2739178825Sdfr			(yyval.i) = ret;
2740178825Sdfr		}
2741178825Sdfr    break;
2742178825Sdfr
2743178825Sdfr  case 96:
2744178825Sdfr#line 910 "ftpcmd.y"
2745178825Sdfr    {
2746178825Sdfr			(yyval.i) = (yyvsp[(1) - (1)].i) && !guest;
2747178825Sdfr			if((yyvsp[(1) - (1)].i) && !(yyval.i))
2748178825Sdfr				reply(550, "Permission denied");
2749178825Sdfr		}
2750178825Sdfr    break;
2751178825Sdfr
2752178825Sdfr  case 97:
2753178825Sdfr#line 918 "ftpcmd.y"
2754178825Sdfr    {
2755178825Sdfr		    if((yyvsp[(1) - (1)].i)) {
2756178825Sdfr			if(((yyval.i) = logged_in) == 0)
2757178825Sdfr			    reply(530, "Please login with USER and PASS.");
2758178825Sdfr		    } else
2759178825Sdfr			(yyval.i) = 0;
2760178825Sdfr		}
2761178825Sdfr    break;
2762178825Sdfr
2763178825Sdfr  case 98:
2764178825Sdfr#line 928 "ftpcmd.y"
2765178825Sdfr    {
2766178825Sdfr		    (yyval.i) = 1;
2767178825Sdfr		    if(sec_complete && !ccc_passed && !secure_command()) {
2768178825Sdfr			(yyval.i) = 0;
2769178825Sdfr			reply(533, "Command protection level denied "
2770178825Sdfr			      "for paranoid reasons.");
2771178825Sdfr		    }
2772178825Sdfr		}
2773178825Sdfr    break;
2774178825Sdfr
2775178825Sdfr
2776178825Sdfr/* Line 1267 of yacc.c.  */
2777178825Sdfr#line 2778 "ftpcmd.c"
2778178825Sdfr      default: break;
2779178825Sdfr    }
2780178825Sdfr  YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
2781178825Sdfr
2782178825Sdfr  YYPOPSTACK (yylen);
2783178825Sdfr  yylen = 0;
2784178825Sdfr  YY_STACK_PRINT (yyss, yyssp);
2785178825Sdfr
2786178825Sdfr  *++yyvsp = yyval;
2787178825Sdfr
2788178825Sdfr
2789178825Sdfr  /* Now `shift' the result of the reduction.  Determine what state
2790178825Sdfr     that goes to, based on the state we popped back to and the rule
2791178825Sdfr     number reduced by.  */
2792178825Sdfr
2793178825Sdfr  yyn = yyr1[yyn];
2794178825Sdfr
2795178825Sdfr  yystate = yypgoto[yyn - YYNTOKENS] + *yyssp;
2796178825Sdfr  if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp)
2797178825Sdfr    yystate = yytable[yystate];
2798178825Sdfr  else
2799178825Sdfr    yystate = yydefgoto[yyn - YYNTOKENS];
2800178825Sdfr
2801178825Sdfr  goto yynewstate;
2802178825Sdfr
2803178825Sdfr
2804178825Sdfr/*------------------------------------.
2805178825Sdfr| yyerrlab -- here on detecting error |
2806178825Sdfr`------------------------------------*/
2807178825Sdfryyerrlab:
2808178825Sdfr  /* If not already recovering from an error, report this error.  */
2809178825Sdfr  if (!yyerrstatus)
2810178825Sdfr    {
2811178825Sdfr      ++yynerrs;
2812178825Sdfr#if ! YYERROR_VERBOSE
2813178825Sdfr      yyerror (YY_("syntax error"));
2814178825Sdfr#else
2815178825Sdfr      {
2816178825Sdfr	YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
2817178825Sdfr	if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
2818178825Sdfr	  {
2819178825Sdfr	    YYSIZE_T yyalloc = 2 * yysize;
2820178825Sdfr	    if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
2821178825Sdfr	      yyalloc = YYSTACK_ALLOC_MAXIMUM;
2822178825Sdfr	    if (yymsg != yymsgbuf)
2823178825Sdfr	      YYSTACK_FREE (yymsg);
2824178825Sdfr	    yymsg = (char *) YYSTACK_ALLOC (yyalloc);
2825178825Sdfr	    if (yymsg)
2826178825Sdfr	      yymsg_alloc = yyalloc;
2827178825Sdfr	    else
2828178825Sdfr	      {
2829178825Sdfr		yymsg = yymsgbuf;
2830178825Sdfr		yymsg_alloc = sizeof yymsgbuf;
2831178825Sdfr	      }
2832178825Sdfr	  }
2833178825Sdfr
2834178825Sdfr	if (0 < yysize && yysize <= yymsg_alloc)
2835178825Sdfr	  {
2836178825Sdfr	    (void) yysyntax_error (yymsg, yystate, yychar);
2837178825Sdfr	    yyerror (yymsg);
2838178825Sdfr	  }
2839178825Sdfr	else
2840178825Sdfr	  {
2841178825Sdfr	    yyerror (YY_("syntax error"));
2842178825Sdfr	    if (yysize != 0)
2843178825Sdfr	      goto yyexhaustedlab;
2844178825Sdfr	  }
2845178825Sdfr      }
2846178825Sdfr#endif
2847178825Sdfr    }
2848178825Sdfr
2849178825Sdfr
2850178825Sdfr
2851178825Sdfr  if (yyerrstatus == 3)
2852178825Sdfr    {
2853178825Sdfr      /* If just tried and failed to reuse look-ahead token after an
2854178825Sdfr	 error, discard it.  */
2855178825Sdfr
2856178825Sdfr      if (yychar <= YYEOF)
2857178825Sdfr	{
2858178825Sdfr	  /* Return failure if at end of input.  */
2859178825Sdfr	  if (yychar == YYEOF)
2860178825Sdfr	    YYABORT;
2861178825Sdfr	}
2862178825Sdfr      else
2863178825Sdfr	{
2864178825Sdfr	  yydestruct ("Error: discarding",
2865178825Sdfr		      yytoken, &yylval);
2866178825Sdfr	  yychar = YYEMPTY;
2867178825Sdfr	}
2868178825Sdfr    }
2869178825Sdfr
2870178825Sdfr  /* Else will try to reuse look-ahead token after shifting the error
2871178825Sdfr     token.  */
2872178825Sdfr  goto yyerrlab1;
2873178825Sdfr
2874178825Sdfr
2875178825Sdfr/*---------------------------------------------------.
2876178825Sdfr| yyerrorlab -- error raised explicitly by YYERROR.  |
2877178825Sdfr`---------------------------------------------------*/
2878178825Sdfryyerrorlab:
2879178825Sdfr
2880178825Sdfr  /* Pacify compilers like GCC when the user code never invokes
2881178825Sdfr     YYERROR and the label yyerrorlab therefore never appears in user
2882178825Sdfr     code.  */
2883178825Sdfr  if (/*CONSTCOND*/ 0)
2884178825Sdfr     goto yyerrorlab;
2885178825Sdfr
2886178825Sdfr  /* Do not reclaim the symbols of the rule which action triggered
2887178825Sdfr     this YYERROR.  */
2888178825Sdfr  YYPOPSTACK (yylen);
2889178825Sdfr  yylen = 0;
2890178825Sdfr  YY_STACK_PRINT (yyss, yyssp);
2891178825Sdfr  yystate = *yyssp;
2892178825Sdfr  goto yyerrlab1;
2893178825Sdfr
2894178825Sdfr
2895178825Sdfr/*-------------------------------------------------------------.
2896178825Sdfr| yyerrlab1 -- common code for both syntax error and YYERROR.  |
2897178825Sdfr`-------------------------------------------------------------*/
2898178825Sdfryyerrlab1:
2899178825Sdfr  yyerrstatus = 3;	/* Each real token shifted decrements this.  */
2900178825Sdfr
2901178825Sdfr  for (;;)
2902178825Sdfr    {
2903178825Sdfr      yyn = yypact[yystate];
2904178825Sdfr      if (yyn != YYPACT_NINF)
2905178825Sdfr	{
2906178825Sdfr	  yyn += YYTERROR;
2907178825Sdfr	  if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR)
2908178825Sdfr	    {
2909178825Sdfr	      yyn = yytable[yyn];
2910178825Sdfr	      if (0 < yyn)
2911178825Sdfr		break;
2912178825Sdfr	    }
2913178825Sdfr	}
2914178825Sdfr
2915178825Sdfr      /* Pop the current state because it cannot handle the error token.  */
2916178825Sdfr      if (yyssp == yyss)
2917178825Sdfr	YYABORT;
2918178825Sdfr
2919178825Sdfr
2920178825Sdfr      yydestruct ("Error: popping",
2921178825Sdfr		  yystos[yystate], yyvsp);
2922178825Sdfr      YYPOPSTACK (1);
2923178825Sdfr      yystate = *yyssp;
2924178825Sdfr      YY_STACK_PRINT (yyss, yyssp);
2925178825Sdfr    }
2926178825Sdfr
2927178825Sdfr  if (yyn == YYFINAL)
2928178825Sdfr    YYACCEPT;
2929178825Sdfr
2930178825Sdfr  *++yyvsp = yylval;
2931178825Sdfr
2932178825Sdfr
2933178825Sdfr  /* Shift the error token.  */
2934178825Sdfr  YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
2935178825Sdfr
2936178825Sdfr  yystate = yyn;
2937178825Sdfr  goto yynewstate;
2938178825Sdfr
2939178825Sdfr
2940178825Sdfr/*-------------------------------------.
2941178825Sdfr| yyacceptlab -- YYACCEPT comes here.  |
2942178825Sdfr`-------------------------------------*/
2943178825Sdfryyacceptlab:
2944178825Sdfr  yyresult = 0;
2945178825Sdfr  goto yyreturn;
2946178825Sdfr
2947178825Sdfr/*-----------------------------------.
2948178825Sdfr| yyabortlab -- YYABORT comes here.  |
2949178825Sdfr`-----------------------------------*/
2950178825Sdfryyabortlab:
2951178825Sdfr  yyresult = 1;
2952178825Sdfr  goto yyreturn;
2953178825Sdfr
2954178825Sdfr#ifndef yyoverflow
2955178825Sdfr/*-------------------------------------------------.
2956178825Sdfr| yyexhaustedlab -- memory exhaustion comes here.  |
2957178825Sdfr`-------------------------------------------------*/
2958178825Sdfryyexhaustedlab:
2959178825Sdfr  yyerror (YY_("memory exhausted"));
2960178825Sdfr  yyresult = 2;
2961178825Sdfr  /* Fall through.  */
2962178825Sdfr#endif
2963178825Sdfr
2964178825Sdfryyreturn:
2965178825Sdfr  if (yychar != YYEOF && yychar != YYEMPTY)
2966178825Sdfr     yydestruct ("Cleanup: discarding lookahead",
2967178825Sdfr		 yytoken, &yylval);
2968178825Sdfr  /* Do not reclaim the symbols of the rule which action triggered
2969178825Sdfr     this YYABORT or YYACCEPT.  */
2970178825Sdfr  YYPOPSTACK (yylen);
2971178825Sdfr  YY_STACK_PRINT (yyss, yyssp);
2972178825Sdfr  while (yyssp != yyss)
2973178825Sdfr    {
2974178825Sdfr      yydestruct ("Cleanup: popping",
2975178825Sdfr		  yystos[*yyssp], yyvsp);
2976178825Sdfr      YYPOPSTACK (1);
2977178825Sdfr    }
2978178825Sdfr#ifndef yyoverflow
2979178825Sdfr  if (yyss != yyssa)
2980178825Sdfr    YYSTACK_FREE (yyss);
2981178825Sdfr#endif
2982178825Sdfr#if YYERROR_VERBOSE
2983178825Sdfr  if (yymsg != yymsgbuf)
2984178825Sdfr    YYSTACK_FREE (yymsg);
2985178825Sdfr#endif
2986178825Sdfr  /* Make sure YYID is used.  */
2987178825Sdfr  return YYID (yyresult);
2988178825Sdfr}
2989178825Sdfr
2990178825Sdfr
2991178825Sdfr#line 938 "ftpcmd.y"
2992178825Sdfr
2993178825Sdfr
2994178825Sdfr#define	CMD	0	/* beginning of command */
2995178825Sdfr#define	ARGS	1	/* expect miscellaneous arguments */
2996178825Sdfr#define	STR1	2	/* expect SP followed by STRING */
2997178825Sdfr#define	STR2	3	/* expect STRING */
2998178825Sdfr#define	OSTR	4	/* optional SP then STRING */
2999178825Sdfr#define	ZSTR1	5	/* SP then optional STRING */
3000178825Sdfr#define	ZSTR2	6	/* optional STRING after SP */
3001178825Sdfr#define	SITECMD	7	/* SITE command */
3002178825Sdfr#define	NSTR	8	/* Number followed by a string */
3003178825Sdfr
3004178825Sdfrstruct tab cmdtab[] = {		/* In order defined in RFC 765 */
3005178825Sdfr	{ "USER", USER, STR1, 1,	"<sp> username" },
3006178825Sdfr	{ "PASS", PASS, ZSTR1, 1,	"<sp> password" },
3007178825Sdfr	{ "ACCT", ACCT, STR1, 0,	"(specify account)" },
3008178825Sdfr	{ "SMNT", SMNT, ARGS, 0,	"(structure mount)" },
3009178825Sdfr	{ "REIN", REIN, ARGS, 0,	"(reinitialize server state)" },
3010178825Sdfr	{ "QUIT", QUIT, ARGS, 1,	"(terminate service)", },
3011178825Sdfr	{ "PORT", PORT, ARGS, 1,	"<sp> b0, b1, b2, b3, b4" },
3012178825Sdfr	{ "EPRT", EPRT, STR1, 1,	"<sp> string" },
3013178825Sdfr	{ "PASV", PASV, ARGS, 1,	"(set server in passive mode)" },
3014178825Sdfr	{ "EPSV", EPSV, OSTR, 1,	"[<sp> foo]" },
3015178825Sdfr	{ "TYPE", TYPE, ARGS, 1,	"<sp> [ A | E | I | L ]" },
3016178825Sdfr	{ "STRU", STRU, ARGS, 1,	"(specify file structure)" },
3017178825Sdfr	{ "MODE", MODE, ARGS, 1,	"(specify transfer mode)" },
3018178825Sdfr	{ "RETR", RETR, STR1, 1,	"<sp> file-name" },
3019178825Sdfr	{ "STOR", STOR, STR1, 1,	"<sp> file-name" },
3020178825Sdfr	{ "APPE", APPE, STR1, 1,	"<sp> file-name" },
3021178825Sdfr	{ "MLFL", MLFL, OSTR, 0,	"(mail file)" },
3022178825Sdfr	{ "MAIL", MAIL, OSTR, 0,	"(mail to user)" },
3023178825Sdfr	{ "MSND", MSND, OSTR, 0,	"(mail send to terminal)" },
3024178825Sdfr	{ "MSOM", MSOM, OSTR, 0,	"(mail send to terminal or mailbox)" },
3025178825Sdfr	{ "MSAM", MSAM, OSTR, 0,	"(mail send to terminal and mailbox)" },
3026178825Sdfr	{ "MRSQ", MRSQ, OSTR, 0,	"(mail recipient scheme question)" },
3027178825Sdfr	{ "MRCP", MRCP, STR1, 0,	"(mail recipient)" },
3028178825Sdfr	{ "ALLO", ALLO, ARGS, 1,	"allocate storage (vacuously)" },
3029178825Sdfr	{ "REST", REST, ARGS, 1,	"<sp> offset (restart command)" },
3030178825Sdfr	{ "RNFR", RNFR, STR1, 1,	"<sp> file-name" },
3031178825Sdfr	{ "RNTO", RNTO, STR1, 1,	"<sp> file-name" },
3032178825Sdfr	{ "ABOR", ABOR, ARGS, 1,	"(abort operation)" },
3033178825Sdfr	{ "DELE", DELE, STR1, 1,	"<sp> file-name" },
3034178825Sdfr	{ "CWD",  CWD,  OSTR, 1,	"[ <sp> directory-name ]" },
3035178825Sdfr	{ "XCWD", CWD,	OSTR, 1,	"[ <sp> directory-name ]" },
3036178825Sdfr	{ "LIST", LIST, OSTR, 1,	"[ <sp> path-name ]" },
3037178825Sdfr	{ "NLST", NLST, OSTR, 1,	"[ <sp> path-name ]" },
3038178825Sdfr	{ "SITE", SITE, SITECMD, 1,	"site-cmd [ <sp> arguments ]" },
3039178825Sdfr	{ "SYST", SYST, ARGS, 1,	"(get type of operating system)" },
3040178825Sdfr	{ "STAT", sTAT, OSTR, 1,	"[ <sp> path-name ]" },
3041178825Sdfr	{ "HELP", HELP, OSTR, 1,	"[ <sp> <string> ]" },
3042178825Sdfr	{ "NOOP", NOOP, ARGS, 1,	"" },
3043178825Sdfr	{ "MKD",  MKD,  STR1, 1,	"<sp> path-name" },
3044178825Sdfr	{ "XMKD", MKD,  STR1, 1,	"<sp> path-name" },
3045178825Sdfr	{ "RMD",  RMD,  STR1, 1,	"<sp> path-name" },
3046178825Sdfr	{ "XRMD", RMD,  STR1, 1,	"<sp> path-name" },
3047178825Sdfr	{ "PWD",  PWD,  ARGS, 1,	"(return current directory)" },
3048178825Sdfr	{ "XPWD", PWD,  ARGS, 1,	"(return current directory)" },
3049178825Sdfr	{ "CDUP", CDUP, ARGS, 1,	"(change to parent directory)" },
3050178825Sdfr	{ "XCUP", CDUP, ARGS, 1,	"(change to parent directory)" },
3051178825Sdfr	{ "STOU", STOU, STR1, 1,	"<sp> file-name" },
3052178825Sdfr	{ "SIZE", SIZE, OSTR, 1,	"<sp> path-name" },
3053178825Sdfr	{ "MDTM", MDTM, OSTR, 1,	"<sp> path-name" },
3054178825Sdfr
3055178825Sdfr	/* extensions from RFC2228 */
3056178825Sdfr	{ "AUTH", AUTH,	STR1, 1,	"<sp> auth-type" },
3057178825Sdfr	{ "ADAT", ADAT,	STR1, 1,	"<sp> auth-data" },
3058178825Sdfr	{ "PBSZ", PBSZ,	ARGS, 1,	"<sp> buffer-size" },
3059178825Sdfr	{ "PROT", PROT,	STR1, 1,	"<sp> prot-level" },
3060178825Sdfr	{ "CCC",  CCC,	ARGS, 1,	"" },
3061178825Sdfr	{ "MIC",  MIC,	STR1, 1,	"<sp> integrity command" },
3062178825Sdfr	{ "CONF", CONF,	STR1, 1,	"<sp> confidentiality command" },
3063178825Sdfr	{ "ENC",  ENC,	STR1, 1,	"<sp> privacy command" },
3064178825Sdfr
3065178825Sdfr	/* RFC2389 */
3066178825Sdfr	{ "FEAT", FEAT, ARGS, 1,	"" },
3067178825Sdfr	{ "OPTS", OPTS, ARGS, 1,	"<sp> command [<sp> options]" },
3068178825Sdfr
3069178825Sdfr	{ NULL,   0,    0,    0,	0 }
3070178825Sdfr};
3071178825Sdfr
3072178825Sdfrstruct tab sitetab[] = {
3073178825Sdfr	{ "UMASK", UMASK, ARGS, 1,	"[ <sp> umask ]" },
3074178825Sdfr	{ "IDLE", IDLE, ARGS, 1,	"[ <sp> maximum-idle-time ]" },
3075178825Sdfr	{ "CHMOD", CHMOD, NSTR, 1,	"<sp> mode <sp> file-name" },
3076178825Sdfr	{ "HELP", HELP, OSTR, 1,	"[ <sp> <string> ]" },
3077178825Sdfr
3078178825Sdfr	{ "KAUTH", KAUTH, STR1, 1,	"<sp> principal [ <sp> ticket ]" },
3079178825Sdfr	{ "KLIST", KLIST, ARGS, 1,	"(show ticket file)" },
3080178825Sdfr	{ "KDESTROY", KDESTROY, ARGS, 1, "(destroy tickets)" },
3081178825Sdfr	{ "KRBTKFILE", KRBTKFILE, STR1, 1, "<sp> ticket-file" },
3082178825Sdfr	{ "AFSLOG", AFSLOG, OSTR, 1,	"[<sp> cell]" },
3083178825Sdfr
3084178825Sdfr	{ "LOCATE", LOCATE, STR1, 1,	"<sp> globexpr" },
3085178825Sdfr	{ "FIND", LOCATE, STR1, 1,	"<sp> globexpr" },
3086178825Sdfr
3087178825Sdfr	{ "URL",  URL,  ARGS, 1,	"?" },
3088178825Sdfr
3089178825Sdfr	{ NULL,   0,    0,    0,	0 }
3090178825Sdfr};
3091178825Sdfr
3092178825Sdfrstatic struct tab *
3093178825Sdfrlookup(struct tab *p, char *cmd)
3094178825Sdfr{
3095178825Sdfr
3096178825Sdfr	for (; p->name != NULL; p++)
3097178825Sdfr		if (strcmp(cmd, p->name) == 0)
3098178825Sdfr			return (p);
3099178825Sdfr	return (0);
3100178825Sdfr}
3101178825Sdfr
3102178825Sdfr/*
3103178825Sdfr * ftpd_getline - a hacked up version of fgets to ignore TELNET escape codes.
3104178825Sdfr */
3105178825Sdfrchar *
3106178825Sdfrftpd_getline(char *s, int n)
3107178825Sdfr{
3108178825Sdfr	int c;
3109178825Sdfr	char *cs;
3110178825Sdfr
3111178825Sdfr	cs = s;
3112178825Sdfr
3113178825Sdfr	/* might still be data within the security MIC/CONF/ENC */
3114178825Sdfr	if(ftp_command){
3115178825Sdfr	    strlcpy(s, ftp_command, n);
3116178825Sdfr	    if (debug)
3117178825Sdfr		syslog(LOG_DEBUG, "command: %s", s);
3118178825Sdfr	    return s;
3119178825Sdfr	}
3120178825Sdfr	while ((c = getc(stdin)) != EOF) {
3121178825Sdfr		c &= 0377;
3122178825Sdfr		if (c == IAC) {
3123178825Sdfr		    if ((c = getc(stdin)) != EOF) {
3124178825Sdfr			c &= 0377;
3125178825Sdfr			switch (c) {
3126178825Sdfr			case WILL:
3127178825Sdfr			case WONT:
3128178825Sdfr				c = getc(stdin);
3129178825Sdfr				printf("%c%c%c", IAC, DONT, 0377&c);
3130178825Sdfr				fflush(stdout);
3131178825Sdfr				continue;
3132178825Sdfr			case DO:
3133178825Sdfr			case DONT:
3134178825Sdfr				c = getc(stdin);
3135178825Sdfr				printf("%c%c%c", IAC, WONT, 0377&c);
3136178825Sdfr				fflush(stdout);
3137178825Sdfr				continue;
3138178825Sdfr			case IAC:
3139178825Sdfr				break;
3140178825Sdfr			default:
3141178825Sdfr				continue;	/* ignore command */
3142178825Sdfr			}
3143178825Sdfr		    }
3144178825Sdfr		}
3145178825Sdfr		*cs++ = c;
3146178825Sdfr		if (--n <= 0 || c == '\n')
3147178825Sdfr			break;
3148178825Sdfr	}
3149178825Sdfr	if (c == EOF && cs == s)
3150178825Sdfr		return (NULL);
3151178825Sdfr	*cs++ = '\0';
3152178825Sdfr	if (debug) {
3153178825Sdfr		if (!guest && strncasecmp("pass ", s, 5) == 0) {
3154178825Sdfr			/* Don't syslog passwords */
3155178825Sdfr			syslog(LOG_DEBUG, "command: %.5s ???", s);
3156178825Sdfr		} else {
3157178825Sdfr			char *cp;
3158178825Sdfr			int len;
3159178825Sdfr
3160178825Sdfr			/* Don't syslog trailing CR-LF */
3161178825Sdfr			len = strlen(s);
3162178825Sdfr			cp = s + len - 1;
3163178825Sdfr			while (cp >= s && (*cp == '\n' || *cp == '\r')) {
3164178825Sdfr				--cp;
3165178825Sdfr				--len;
3166178825Sdfr			}
3167178825Sdfr			syslog(LOG_DEBUG, "command: %.*s", len, s);
3168178825Sdfr		}
3169178825Sdfr	}
3170178825Sdfr#ifdef XXX
3171178825Sdfr	fprintf(stderr, "%s\n", s);
3172178825Sdfr#endif
3173178825Sdfr	return (s);
3174178825Sdfr}
3175178825Sdfr
3176178825Sdfrstatic RETSIGTYPE
3177178825Sdfrtoolong(int signo)
3178178825Sdfr{
3179178825Sdfr
3180178825Sdfr	reply(421,
3181178825Sdfr	    "Timeout (%d seconds): closing control connection.",
3182178825Sdfr	      ftpd_timeout);
3183178825Sdfr	if (logging)
3184178825Sdfr		syslog(LOG_INFO, "User %s timed out after %d seconds",
3185178825Sdfr		    (pw ? pw -> pw_name : "unknown"), ftpd_timeout);
3186178825Sdfr	dologout(1);
3187178825Sdfr	SIGRETURN(0);
3188178825Sdfr}
3189178825Sdfr
3190178825Sdfrstatic int
3191178825Sdfryylex(void)
3192178825Sdfr{
3193178825Sdfr	static int cpos, state;
3194178825Sdfr	char *cp, *cp2;
3195178825Sdfr	struct tab *p;
3196178825Sdfr	int n;
3197178825Sdfr	char c;
3198178825Sdfr
3199178825Sdfr	for (;;) {
3200178825Sdfr		switch (state) {
3201178825Sdfr
3202178825Sdfr		case CMD:
3203178825Sdfr			hasyyerrored = 0;
3204178825Sdfr
3205178825Sdfr			signal(SIGALRM, toolong);
3206178825Sdfr			alarm((unsigned) ftpd_timeout);
3207178825Sdfr			if (ftpd_getline(cbuf, sizeof(cbuf)-1) == NULL) {
3208178825Sdfr				reply(221, "You could at least say goodbye.");
3209178825Sdfr				dologout(0);
3210178825Sdfr			}
3211178825Sdfr			alarm(0);
3212178825Sdfr#ifdef HAVE_SETPROCTITLE
3213178825Sdfr			if (strncasecmp(cbuf, "PASS", 4) != 0)
3214178825Sdfr				setproctitle("%s: %s", proctitle, cbuf);
3215178825Sdfr#endif /* HAVE_SETPROCTITLE */
3216178825Sdfr			if ((cp = strchr(cbuf, '\r'))) {
3217178825Sdfr				*cp++ = '\n';
3218178825Sdfr				*cp = '\0';
3219178825Sdfr			}
3220178825Sdfr			if ((cp = strpbrk(cbuf, " \n")))
3221178825Sdfr				cpos = cp - cbuf;
3222178825Sdfr			if (cpos == 0)
3223178825Sdfr				cpos = 4;
3224178825Sdfr			c = cbuf[cpos];
3225178825Sdfr			cbuf[cpos] = '\0';
3226178825Sdfr			strupr(cbuf);
3227178825Sdfr			p = lookup(cmdtab, cbuf);
3228178825Sdfr			cbuf[cpos] = c;
3229178825Sdfr			if (p != 0) {
3230178825Sdfr				if (p->implemented == 0) {
3231178825Sdfr					nack(p->name);
3232178825Sdfr					hasyyerrored = 1;
3233178825Sdfr					break;
3234178825Sdfr				}
3235178825Sdfr				state = p->state;
3236178825Sdfr				yylval.s = p->name;
3237178825Sdfr				return (p->token);
3238178825Sdfr			}
3239178825Sdfr			break;
3240178825Sdfr
3241178825Sdfr		case SITECMD:
3242178825Sdfr			if (cbuf[cpos] == ' ') {
3243178825Sdfr				cpos++;
3244178825Sdfr				return (SP);
3245178825Sdfr			}
3246178825Sdfr			cp = &cbuf[cpos];
3247178825Sdfr			if ((cp2 = strpbrk(cp, " \n")))
3248178825Sdfr				cpos = cp2 - cbuf;
3249178825Sdfr			c = cbuf[cpos];
3250178825Sdfr			cbuf[cpos] = '\0';
3251178825Sdfr			strupr(cp);
3252178825Sdfr			p = lookup(sitetab, cp);
3253178825Sdfr			cbuf[cpos] = c;
3254178825Sdfr			if (p != 0) {
3255178825Sdfr				if (p->implemented == 0) {
3256178825Sdfr					state = CMD;
3257178825Sdfr					nack(p->name);
3258178825Sdfr					hasyyerrored = 1;
3259178825Sdfr					break;
3260178825Sdfr				}
3261178825Sdfr				state = p->state;
3262178825Sdfr				yylval.s = p->name;
3263178825Sdfr				return (p->token);
3264178825Sdfr			}
3265178825Sdfr			state = CMD;
3266178825Sdfr			break;
3267178825Sdfr
3268178825Sdfr		case OSTR:
3269178825Sdfr			if (cbuf[cpos] == '\n') {
3270178825Sdfr				state = CMD;
3271178825Sdfr				return (CRLF);
3272178825Sdfr			}
3273178825Sdfr			/* FALLTHROUGH */
3274178825Sdfr
3275178825Sdfr		case STR1:
3276178825Sdfr		case ZSTR1:
3277178825Sdfr		dostr1:
3278178825Sdfr			if (cbuf[cpos] == ' ') {
3279178825Sdfr				cpos++;
3280178825Sdfr				if(state == OSTR)
3281178825Sdfr				    state = STR2;
3282178825Sdfr				else
3283178825Sdfr				    state++;
3284178825Sdfr				return (SP);
3285178825Sdfr			}
3286178825Sdfr			break;
3287178825Sdfr
3288178825Sdfr		case ZSTR2:
3289178825Sdfr			if (cbuf[cpos] == '\n') {
3290178825Sdfr				state = CMD;
3291178825Sdfr				return (CRLF);
3292178825Sdfr			}
3293178825Sdfr			/* FALLTHROUGH */
3294178825Sdfr
3295178825Sdfr		case STR2:
3296178825Sdfr			cp = &cbuf[cpos];
3297178825Sdfr			n = strlen(cp);
3298178825Sdfr			cpos += n - 1;
3299178825Sdfr			/*
3300178825Sdfr			 * Make sure the string is nonempty and \n terminated.
3301178825Sdfr			 */
3302178825Sdfr			if (n > 1 && cbuf[cpos] == '\n') {
3303178825Sdfr				cbuf[cpos] = '\0';
3304178825Sdfr				yylval.s = copy(cp);
3305178825Sdfr				cbuf[cpos] = '\n';
3306178825Sdfr				state = ARGS;
3307178825Sdfr				return (STRING);
3308178825Sdfr			}
3309178825Sdfr			break;
3310178825Sdfr
3311178825Sdfr		case NSTR:
3312178825Sdfr			if (cbuf[cpos] == ' ') {
3313178825Sdfr				cpos++;
3314178825Sdfr				return (SP);
3315178825Sdfr			}
3316178825Sdfr			if (isdigit((unsigned char)cbuf[cpos])) {
3317178825Sdfr				cp = &cbuf[cpos];
3318178825Sdfr				while (isdigit((unsigned char)cbuf[++cpos]))
3319178825Sdfr					;
3320178825Sdfr				c = cbuf[cpos];
3321178825Sdfr				cbuf[cpos] = '\0';
3322178825Sdfr				yylval.i = atoi(cp);
3323178825Sdfr				cbuf[cpos] = c;
3324178825Sdfr				state = STR1;
3325178825Sdfr				return (NUMBER);
3326178825Sdfr			}
3327178825Sdfr			state = STR1;
3328178825Sdfr			goto dostr1;
3329178825Sdfr
3330178825Sdfr		case ARGS:
3331178825Sdfr			if (isdigit((unsigned char)cbuf[cpos])) {
3332178825Sdfr				cp = &cbuf[cpos];
3333178825Sdfr				while (isdigit((unsigned char)cbuf[++cpos]))
3334178825Sdfr					;
3335178825Sdfr				c = cbuf[cpos];
3336178825Sdfr				cbuf[cpos] = '\0';
3337178825Sdfr				yylval.i = atoi(cp);
3338178825Sdfr				cbuf[cpos] = c;
3339178825Sdfr				return (NUMBER);
3340178825Sdfr			}
3341178825Sdfr			switch (cbuf[cpos++]) {
3342178825Sdfr
3343178825Sdfr			case '\n':
3344178825Sdfr				state = CMD;
3345178825Sdfr				return (CRLF);
3346178825Sdfr
3347178825Sdfr			case ' ':
3348178825Sdfr				return (SP);
3349178825Sdfr
3350178825Sdfr			case ',':
3351178825Sdfr				return (COMMA);
3352178825Sdfr
3353178825Sdfr			case 'A':
3354178825Sdfr			case 'a':
3355178825Sdfr				return (A);
3356178825Sdfr
3357178825Sdfr			case 'B':
3358178825Sdfr			case 'b':
3359178825Sdfr				return (B);
3360178825Sdfr
3361178825Sdfr			case 'C':
3362178825Sdfr			case 'c':
3363178825Sdfr				return (C);
3364178825Sdfr
3365178825Sdfr			case 'E':
3366178825Sdfr			case 'e':
3367178825Sdfr				return (E);
3368178825Sdfr
3369178825Sdfr			case 'F':
3370178825Sdfr			case 'f':
3371178825Sdfr				return (F);
3372178825Sdfr
3373178825Sdfr			case 'I':
3374178825Sdfr			case 'i':
3375178825Sdfr				return (I);
3376178825Sdfr
3377178825Sdfr			case 'L':
3378178825Sdfr			case 'l':
3379178825Sdfr				return (L);
3380178825Sdfr
3381178825Sdfr			case 'N':
3382178825Sdfr			case 'n':
3383178825Sdfr				return (N);
3384178825Sdfr
3385178825Sdfr			case 'P':
3386178825Sdfr			case 'p':
3387178825Sdfr				return (P);
3388178825Sdfr
3389178825Sdfr			case 'R':
3390178825Sdfr			case 'r':
3391178825Sdfr				return (R);
3392178825Sdfr
3393178825Sdfr			case 'S':
3394178825Sdfr			case 's':
3395178825Sdfr				return (S);
3396178825Sdfr
3397178825Sdfr			case 'T':
3398178825Sdfr			case 't':
3399178825Sdfr				return (T);
3400178825Sdfr
3401178825Sdfr			}
3402178825Sdfr			break;
3403178825Sdfr
3404178825Sdfr		default:
3405178825Sdfr			fatal("Unknown state in scanner.");
3406178825Sdfr		}
3407178825Sdfr		yyerror(NULL);
3408178825Sdfr		state = CMD;
3409178825Sdfr		return (0);
3410178825Sdfr	}
3411178825Sdfr}
3412178825Sdfr
3413178825Sdfr/* ARGSUSED */
3414178825Sdfrvoid
3415178825Sdfryyerror(char *s)
3416178825Sdfr{
3417178825Sdfr	char *cp;
3418178825Sdfr
3419178825Sdfr	if (hasyyerrored)
3420178825Sdfr	    return;
3421178825Sdfr
3422178825Sdfr	if ((cp = strchr(cbuf,'\n')))
3423178825Sdfr		*cp = '\0';
3424178825Sdfr	reply(500, "'%s': command not understood.", cbuf);
3425178825Sdfr	hasyyerrored = 1;
3426178825Sdfr}
3427178825Sdfr
3428178825Sdfrstatic char *
3429178825Sdfrcopy(char *s)
3430178825Sdfr{
3431178825Sdfr	char *p;
3432178825Sdfr
3433178825Sdfr	p = strdup(s);
3434178825Sdfr	if (p == NULL)
3435178825Sdfr		fatal("Ran out of memory.");
3436178825Sdfr	return p;
3437178825Sdfr}
3438178825Sdfr
3439178825Sdfrstatic void
3440178825Sdfrhelp(struct tab *ctab, char *s)
3441178825Sdfr{
3442178825Sdfr	struct tab *c;
3443178825Sdfr	int width, NCMDS;
3444178825Sdfr	char *t;
3445178825Sdfr	char buf[1024];
3446178825Sdfr
3447178825Sdfr	if (ctab == sitetab)
3448178825Sdfr		t = "SITE ";
3449178825Sdfr	else
3450178825Sdfr		t = "";
3451178825Sdfr	width = 0, NCMDS = 0;
3452178825Sdfr	for (c = ctab; c->name != NULL; c++) {
3453178825Sdfr		int len = strlen(c->name);
3454178825Sdfr
3455178825Sdfr		if (len > width)
3456178825Sdfr			width = len;
3457178825Sdfr		NCMDS++;
3458178825Sdfr	}
3459178825Sdfr	width = (width + 8) &~ 7;
3460178825Sdfr	if (s == 0) {
3461178825Sdfr		int i, j, w;
3462178825Sdfr		int columns, lines;
3463178825Sdfr
3464178825Sdfr		lreply(214, "The following %scommands are recognized %s.",
3465178825Sdfr		    t, "(* =>'s unimplemented)");
3466178825Sdfr		columns = 76 / width;
3467178825Sdfr		if (columns == 0)
3468178825Sdfr			columns = 1;
3469178825Sdfr		lines = (NCMDS + columns - 1) / columns;
3470178825Sdfr		for (i = 0; i < lines; i++) {
3471178825Sdfr		    strlcpy (buf, "   ", sizeof(buf));
3472178825Sdfr		    for (j = 0; j < columns; j++) {
3473178825Sdfr			c = ctab + j * lines + i;
3474178825Sdfr			snprintf (buf + strlen(buf),
3475178825Sdfr				  sizeof(buf) - strlen(buf),
3476178825Sdfr				  "%s%c",
3477178825Sdfr				  c->name,
3478178825Sdfr				  c->implemented ? ' ' : '*');
3479178825Sdfr			if (c + lines >= &ctab[NCMDS])
3480178825Sdfr			    break;
3481178825Sdfr			w = strlen(c->name) + 1;
3482178825Sdfr			while (w < width) {
3483178825Sdfr			    strlcat (buf,
3484178825Sdfr					     " ",
3485178825Sdfr					     sizeof(buf));
3486178825Sdfr			    w++;
3487178825Sdfr			}
3488178825Sdfr		    }
3489178825Sdfr		    lreply(214, "%s", buf);
3490178825Sdfr		}
3491178825Sdfr		reply(214, "Direct comments to kth-krb-bugs@pdc.kth.se");
3492178825Sdfr		return;
3493178825Sdfr	}
3494178825Sdfr	strupr(s);
3495178825Sdfr	c = lookup(ctab, s);
3496178825Sdfr	if (c == (struct tab *)0) {
3497178825Sdfr		reply(502, "Unknown command %s.", s);
3498178825Sdfr		return;
3499178825Sdfr	}
3500178825Sdfr	if (c->implemented)
3501178825Sdfr		reply(214, "Syntax: %s%s %s", t, c->name, c->help);
3502178825Sdfr	else
3503178825Sdfr		reply(214, "%s%-*s\t%s; unimplemented.", t, width,
3504178825Sdfr		    c->name, c->help);
3505178825Sdfr}
3506178825Sdfr
3507178825Sdfrstatic void
3508178825Sdfrsizecmd(char *filename)
3509178825Sdfr{
3510178825Sdfr	switch (type) {
3511178825Sdfr	case TYPE_L:
3512178825Sdfr	case TYPE_I: {
3513178825Sdfr		struct stat stbuf;
3514178825Sdfr		if (stat(filename, &stbuf) < 0 || !S_ISREG(stbuf.st_mode))
3515178825Sdfr			reply(550, "%s: not a plain file.", filename);
3516178825Sdfr		else
3517178825Sdfr			reply(213, "%lu", (unsigned long)stbuf.st_size);
3518178825Sdfr		break;
3519178825Sdfr	}
3520178825Sdfr	case TYPE_A: {
3521178825Sdfr		FILE *fin;
3522178825Sdfr		int c;
3523178825Sdfr		size_t count;
3524178825Sdfr		struct stat stbuf;
3525178825Sdfr		fin = fopen(filename, "r");
3526178825Sdfr		if (fin == NULL) {
3527178825Sdfr			perror_reply(550, filename);
3528178825Sdfr			return;
3529178825Sdfr		}
3530178825Sdfr		if (fstat(fileno(fin), &stbuf) < 0 || !S_ISREG(stbuf.st_mode)) {
3531178825Sdfr			reply(550, "%s: not a plain file.", filename);
3532178825Sdfr			fclose(fin);
3533178825Sdfr			return;
3534178825Sdfr		}
3535178825Sdfr
3536178825Sdfr		count = 0;
3537178825Sdfr		while((c=getc(fin)) != EOF) {
3538178825Sdfr			if (c == '\n')	/* will get expanded to \r\n */
3539178825Sdfr				count++;
3540178825Sdfr			count++;
3541178825Sdfr		}
3542178825Sdfr		fclose(fin);
3543178825Sdfr
3544178825Sdfr		reply(213, "%lu", (unsigned long)count);
3545178825Sdfr		break;
3546178825Sdfr	}
3547178825Sdfr	default:
3548178825Sdfr		reply(504, "SIZE not implemented for Type %c.", "?AEIL"[type]);
3549178825Sdfr	}
3550178825Sdfr}
3551178825Sdfr
3552