⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uscan.l

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

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -