%{
/*******************************************************************************
* Copyright (c) 2007, Perforce Software, Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PERFORCE
* SOFTWARE, INC. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
* THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
* DAMAGE.
*******************************************************************************/
/*******************************************************************************
* Lexer for p4dctl
******************************************************************************/
/*
* Definition section
*/
#include <stdlib.h>
#include <dirent.h>
#include <sys/stat.h>
#include "parsesupp.h"
#include "configparse.h"
int lineno = 1;
const char *fname = 0;
static void include_push()
{
parser_ctx *pc = malloc( sizeof( parser_ctx ) );
pc->fname = fname;
pc->lineno = lineno;
pc->state = YY_CURRENT_BUFFER;
parser_push( pc );
}
static int include_pop()
{
parser_ctx *pc = parser_pop();
if( pc )
{
free( (char *)fname );
fname = pc->fname;
lineno = pc->lineno;
yy_delete_buffer( YY_CURRENT_BUFFER );
yy_switch_to_buffer( pc->state );
free( pc );
return 1;
}
return 0;
}
static int
include_file( const char *path )
{
yyin = fopen( path, "r" );
if( !yyin )
yyerror( "Error opening include file");
include_push();
fname = path;
lineno = 1;
yy_switch_to_buffer(yy_create_buffer( yyin, YY_BUF_SIZE ));
return 1;
}
static int
include_dir( char *path )
{
struct dirent *ent;
DIR *dir = opendir( path );
static const char *extension = ".conf";
if( !dir )
{
free( path );
yyerror( "Failed to open directory" );
}
while( ent = readdir( dir ) )
{
char p[1024];
int len;
int elen;
char *t;
if( !strcmp( ent->d_name, "." ) ) continue;
if( !strcmp( ent->d_name, ".." ) ) continue;
len = strlen( ent->d_name );
elen = strlen( extension );
// If the name's too short to be well formed, move on.
if( len <= elen ) continue;
// Does it end in .conf?
t = ent->d_name + len - elen;
if( strcmp( t, extension ) ) continue;
snprintf( p, 1024, "%s/%s", path, ent->d_name );
if( !include_file( strdup(p) ) )
{
free( path );
return 0;
}
}
closedir( dir );
free( path );
return 1;
}
%}
%x INCLUDE
%%
[ \t]* {}
\n { lineno++; }
<INCLUDE>[ \t]* { }
<INCLUDE>[^ \t\n]+ {
struct stat stb;
if(stat( yytext, &stb ) )
yyerror( "Error accessing include file" );
if( S_ISREG( stb.st_mode ) )
include_file( strdup( yytext ) );
else if( S_ISDIR( stb.st_mode ) )
include_dir( strdup( yytext ) );
else
yyerror( "Can't include files of this type" );
BEGIN( INITIAL );
}
<<EOF>> {
if( !include_pop() )
{
yyterminate();
}
}
#[^\n]* { }
[0-9]+ {
yylval.sval = strdup(yytext);
return NUMBER;
}
include {
BEGIN( INCLUDE );
}
p4d { return P4D; }
p4p { return P4P; }
p4broker { return P4BROKER; }
p4ftp { return P4FTP; }
p4web { return P4WEB; }
p4dtg { return P4DTG; }
other { return OTHER; }
Args { return ARGS; }
Enabled { return ENABLED; }
Environment { return ENVIRONMENT; }
Execute { return EXECUTE; }
Owner { return OWNER; }
Prefix { return PREFIX; }
PrettyNames { return PRETTYNAMES; }
Umask { return UMASK; }
[A-Za-z][A-Za-z0-9]* {
yylval.sval = strdup(yytext);
return WORD;
}
(\/[-_A-Za-z0-9]+)+ {
yylval.sval = strdup(yytext);
return PATH;
}
[./A-Za-z0-9][-_.:/A-Za-z0-9]* {
yylval.sval = strdup(yytext);
return WORD;
}
\"[^"]*\" {
yytext[ yyleng - 1] = 0;
yylval.sval = strdup(yytext+1);
return STRING;
}
. { return yytext[0]; }
# |
Change |
User |
Description |
Committed |
|
#1
|
16543 |
Matt Attaway |
Update P4DCTL with code from 15.2 and reorg files |
|
|