Blame oldrecover-src/uscan.l

Packit 23ab03
/*
Packit 23ab03
 * amanda, the advanced maryland automatic network disk archiver
Packit 23ab03
 * Copyright (c) 1991-2000 University of Maryland at College Park
Packit 23ab03
 * Copyright (c) 2007-2012 Zmanda, Inc.  All Rights Reserved.
Packit 23ab03
 * Copyright (c) 2013-2016 Carbonite, Inc.  All Rights Reserved.
Packit 23ab03
 * All Rights Reserved.
Packit 23ab03
 *
Packit 23ab03
 * Permission to use, copy, modify, distribute, and sell this software and its
Packit 23ab03
 * documentation for any purpose is hereby granted without fee, provided that
Packit 23ab03
 * the above copyright notice appear in all copies and that both that
Packit 23ab03
 * copyright notice and this permission notice appear in supporting
Packit 23ab03
 * documentation, and that the name of U.M. not be used in advertising or
Packit 23ab03
 * publicity pertaining to distribution of the software without specific,
Packit 23ab03
 * written prior permission.  U.M. makes no representations about the
Packit 23ab03
 * suitability of this software for any purpose.  It is provided "as is"
Packit 23ab03
 * without express or implied warranty.
Packit 23ab03
 *
Packit 23ab03
 * U.M. DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL
Packit 23ab03
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL U.M.
Packit 23ab03
 * BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
Packit 23ab03
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
Packit 23ab03
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
Packit 23ab03
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Packit 23ab03
 *
Packit 23ab03
 * Authors: the Amanda Development Team.  Its members are listed in a
Packit 23ab03
 * file named AUTHORS, in the root directory of this distribution.
Packit 23ab03
 */
Packit 23ab03
/*
Packit 23ab03
 * $Id: uscan.l,v 1.3 2006/07/05 11:15:56 martinea Exp $
Packit 23ab03
 *
Packit 23ab03
 * lexer for amrecover interactive language
Packit 23ab03
 */
Packit 23ab03
%{
Packit 23ab03
#include "amanda.h"
Packit 23ab03
#include "uparse.h"
Packit 23ab03
Packit 23ab03
/*
Packit 23ab03
 * We redefine this here to prevent compiler warning about ignoring fwrite
Packit 23ab03
 * return value...
Packit 23ab03
 */
Packit 23ab03
#undef ECHO
Packit 23ab03
#define ECHO do {						\
Packit 23ab03
		if (fwrite(yytext, (size_t)yyleng, 1, yyout) <= 0) {	\
Packit 23ab03
		    yyerror("ECHO failure");			\
Packit 23ab03
		}						\
Packit 23ab03
	} while (0)
Packit 23ab03
Packit 23ab03
#define YY_NO_UNPUT
Packit 23ab03
Packit 23ab03
#define	DATE_ALLOC_SIZE		sizeof("YYYY-MM-DD-HH-MM-SS")	/* includes null */
Packit 23ab03
Packit 23ab03
#define YY_DECL	int yylex()
Packit 23ab03
extern int yylex(void);
Packit 23ab03
Packit 23ab03
extern void	yyerror(char *s);
Packit 23ab03
extern int	yyparse(void);
Packit 23ab03
static int	ll_parse_date(int type, char *text);
Packit 23ab03
int		process_line(char *line);
Packit 23ab03
%}
Packit 23ab03
Packit 23ab03
%x quotedpath
Packit 23ab03
Packit 23ab03
%{
Packit 23ab03
static char *string_buf = NULL;
Packit 23ab03
%}
Packit 23ab03
Packit 23ab03
%%
Packit 23ab03
Packit 23ab03
%{
Packit 23ab03
    /* literal keyword tokens */
Packit 23ab03
%}
Packit 23ab03
Packit 23ab03
listhost	{ return LISTHOST; }
Packit 23ab03
listdisk	{ return LISTDISK; }
Packit 23ab03
sethost	{ return SETHOST; }
Packit 23ab03
setdisk	{ return SETDISK; }
Packit 23ab03
setdate { return SETDATE; }
Packit 23ab03
setmode	{ return SETMODE; }
Packit 23ab03
settape { return SETTAPE; }
Packit 23ab03
cd	{ return CD; }
Packit 23ab03
cdx	{ return CDX; }
Packit 23ab03
quit    { return QUIT; }
Packit 23ab03
exit    { return QUIT; }
Packit 23ab03
history { return DHIST; }
Packit 23ab03
ls      { return LS; }
Packit 23ab03
add     { return ADD; }
Packit 23ab03
addx    { return ADDX; }
Packit 23ab03
list    { return LIST; }
Packit 23ab03
delete  { return DELETE; }
Packit 23ab03
deletex { return DELETEX; }
Packit 23ab03
pwd     { return PWD; }
Packit 23ab03
clear   { return CLEAR; }
Packit 23ab03
help    { return HELP; }
Packit 23ab03
\?      { return HELP; }
Packit 23ab03
lcd     { return LCD; }
Packit 23ab03
lpwd    { return LPWD; }
Packit 23ab03
extract { return EXTRACT; }
Packit 23ab03
smb     { return SMB; }
Packit 23ab03
tar     { return TAR; }
Packit 23ab03
mode    { return MODE; }
Packit 23ab03
Packit 23ab03
%{
Packit 23ab03
    /* dates */
Packit 23ab03
%}
Packit 23ab03
Packit 23ab03
---[0-9]+		{ return ll_parse_date(1, yytext); }
Packit 23ab03
--[0-9]+-[0-9]+		{ return ll_parse_date(2, yytext); }
Packit 23ab03
[0-9]+-[0-9]+-[0-9]+	{ return ll_parse_date(3, yytext); }
Packit 23ab03
[0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+	{ return ll_parse_date(4, yytext); }
Packit 23ab03
[0-9]+-[0-9]+-[0-9]+-[0-9]+-[0-9]+	{ return ll_parse_date(5, yytext); }
Packit 23ab03
Packit 23ab03
%{
Packit 23ab03
    /* quoted file names */
Packit 23ab03
%}
Packit 23ab03
Packit 23ab03
\"			{
Packit 23ab03
    if(string_buf != NULL) {
Packit 23ab03
	g_printf("ERROR:string_buf != NULL: %s\n",string_buf);
Packit 23ab03
    }
Packit 23ab03
    BEGIN(quotedpath);
Packit 23ab03
    strappend(string_buf, yytext);
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
<quotedpath>[^\\\"]+	{
Packit 23ab03
    strappend(string_buf, yytext);
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
<quotedpath>\\.	{
Packit 23ab03
    /* escaped character (including quote) */
Packit 23ab03
    strappend(string_buf, yytext);
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
<quotedpath>\"	{ /* saw closing quote - all done */
Packit 23ab03
    strappend(string_buf, yytext);
Packit 23ab03
    yylval.strval = string_buf;
Packit 23ab03
    string_buf = NULL;
Packit 23ab03
    BEGIN(INITIAL);
Packit 23ab03
    return PATH;
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
%{
Packit 23ab03
    /* file names */
Packit 23ab03
%}
Packit 23ab03
Packit 23ab03
[^[:space:][:cntrl:]"]+		{
Packit 23ab03
    yylval.strval = g_strdup(yytext);
Packit 23ab03
    return PATH;
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
%{
Packit 23ab03
    /* whitespace */
Packit 23ab03
%}
Packit 23ab03
Packit 23ab03
[[:space:]]+	;     /* whitespace */
Packit 23ab03
Packit 23ab03
%{
Packit 23ab03
    /* anything else */
Packit 23ab03
    /* everything should have been handled by now, so this rule is disabled */
Packit 23ab03
%}
Packit 23ab03
Packit 23ab03
%{
Packit 23ab03
#if 0
Packit 23ab03
.	{ yyerror("invalid character"); }
Packit 23ab03
#endif
Packit 23ab03
%}
Packit 23ab03
Packit 23ab03
%%
Packit 23ab03
Packit 23ab03
int
Packit 23ab03
process_line(
Packit 23ab03
    char *	line)
Packit 23ab03
{
Packit 23ab03
    YY_BUFFER_STATE b;
Packit 23ab03
    int result;
Packit 23ab03
Packit 23ab03
    b = yy_scan_string(line);		/* tell lex to scan lineread */
Packit 23ab03
    result = yyparse();			/* parse lineread and act */
Packit 23ab03
    yy_delete_buffer(b);
Packit 23ab03
    return result;
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
static int
Packit 23ab03
ll_parse_date(
Packit 23ab03
    int		type,
Packit 23ab03
    char *	text)
Packit 23ab03
{
Packit 23ab03
    time_t now;
Packit 23ab03
    struct tm *t;
Packit 23ab03
    int y=2000, m=0, d=1, h=0, mi=0, s=0;
Packit 23ab03
    int ret;
Packit 23ab03
Packit 23ab03
    now = time((time_t *)NULL);
Packit 23ab03
    t = localtime(&now;;
Packit 23ab03
    if (t) {
Packit 23ab03
	y = 1900+t->tm_year;
Packit 23ab03
	m = t->tm_mon+1;
Packit 23ab03
	d = t->tm_mday;
Packit 23ab03
    }
Packit 23ab03
    switch(type) {
Packit 23ab03
    case 1:
Packit 23ab03
	if (sscanf(text, "---%d", &d) != 1) {
Packit 23ab03
	    yyerror("invalid date");
Packit 23ab03
        }
Packit 23ab03
        break;
Packit 23ab03
    case 2:
Packit 23ab03
	if (sscanf(text, "--%d-%d", &m, &d) != 2) {
Packit 23ab03
	    yyerror("invalid date");
Packit 23ab03
        }
Packit 23ab03
        break;
Packit 23ab03
    case 3:
Packit 23ab03
	if (sscanf(text, "%d-%d-%d", &y, &m, &d) != 3) {
Packit 23ab03
	    yyerror("invalid date");	    
Packit 23ab03
        }
Packit 23ab03
        break;
Packit 23ab03
    case 4:
Packit 23ab03
	if (sscanf(text, "%d-%d-%d-%d-%d-%d", &y, &m, &d, &h, &mi, &s) != 6) {
Packit 23ab03
	    yyerror("invalid date");
Packit 23ab03
	}
Packit 23ab03
        break;
Packit 23ab03
    case 5:
Packit 23ab03
	if (sscanf(text, "%d-%d-%d-%d-%d", &y, &m, &d, &h, &mi) != 5) {
Packit 23ab03
	    yyerror("invalid date");
Packit 23ab03
	}
Packit 23ab03
        break;
Packit 23ab03
    }
Packit 23ab03
Packit 23ab03
    ret = PATH;				/* cause a parse error */
Packit 23ab03
    if(y < 70) {
Packit 23ab03
	y += 2000;
Packit 23ab03
    } else if(y < 100) {
Packit 23ab03
	y += 1900;
Packit 23ab03
    }
Packit 23ab03
    if(y < 1000 || y > 9999) {
Packit 23ab03
	yyerror("invalid year");
Packit 23ab03
    } else if(m < 1 || m > 12) {
Packit 23ab03
	yyerror("invalid month");
Packit 23ab03
    } else if(d < 1 || d > 31) {
Packit 23ab03
	yyerror("invalid day");
Packit 23ab03
    } else if(h < 0 || h > 24) {
Packit 23ab03
	yyerror("invalid hour");
Packit 23ab03
    } else if(mi < 0 || mi > 59) {
Packit 23ab03
	yyerror("invalid minute");
Packit 23ab03
    } else if(s < 0 || s > 59) {
Packit 23ab03
	yyerror("invalid second");
Packit 23ab03
    } else if(type < 4) {
Packit 23ab03
	yylval.strval = g_malloc(DATE_ALLOC_SIZE);
Packit 23ab03
	g_snprintf(yylval.strval, DATE_ALLOC_SIZE, "%04d-%02d-%02d", y, m, d);
Packit 23ab03
	ret = DATE;
Packit 23ab03
    } else {
Packit 23ab03
	yylval.strval = g_malloc(DATE_ALLOC_SIZE);
Packit 23ab03
	g_snprintf(yylval.strval, DATE_ALLOC_SIZE, "%04d-%02d-%02d-%02d-%02d-%02d", y, m, d, h, mi, s);
Packit 23ab03
	ret = DATE;
Packit 23ab03
    }
Packit 23ab03
    return ret;
Packit 23ab03
}
Packit 23ab03
Packit 23ab03
int
Packit 23ab03
yywrap(void)
Packit 23ab03
{
Packit 23ab03
  return 1;
Packit 23ab03
}