added Ezc::SplitUnixDirectory(...)

it's possible to give the path into the working directory in the Pattern::ParseFile(...) without using the Pattern::Directory(...)
added [#] (commentary)
[include] now can open a file only in a specific directory


git-svn-id: svn://ttmath.org/publicrep/cgi/ezc/trunk@9 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
Tomasz Sowa 2007-01-27 13:52:18 +00:00
parent e42117714a
commit 69bd57f428
3 changed files with 99 additions and 25 deletions

View File

@ -1,4 +1,4 @@
Copyright (c) 2006-2007, Tomasz Sowa Copyright (c) 2007, Tomasz Sowa
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without

View File

@ -56,6 +56,52 @@ return buffer.str();
} }
/*
this method splits the input file name into a directory and a file name
e.g
if 'name' is "/this/is/dummy/file.ezc"
the result will be:
dir = "/this/is/dummy"
file = "file.ezc"
*/
void SplitUnixDirectory(const char * name, std::string & dir, std::string & file)
{
dir.clear();
file.clear();
int i;
for( i=0 ; name[i] != 0 ; ++i );
if( i == 0 )
return;
for( --i ; i>=0 && name[i]!='\\' && name[i]!='/' ; --i );
if( i < 0 )
{
file.assign(name);
}
else
{
if( i == 0 )
// we're leaving one '/' in the directory
// (we have only the root directory)
dir.assign(name, 1);
else
dir.assign(name, i);
file.assign(name + i + 1 );
}
return;
}
void SplitUnixDirectory(const std::string & name, std::string & dir, std::string & file)
{
SplitUnixDirectory(name.c_str(), dir, file);
}
/* /*
* *
@ -64,20 +110,26 @@ return buffer.str();
* *
*/ */
void Pattern::ParseFile(std::string file_name) void Pattern::ParseFile(const std::string & file_name)
{ {
file_name.insert(file_name.begin(), '\"'); ParseFile( file_name.c_str() );
item_root.directives.clear();
item_root.directives.push_back( file_name );
CreateTreeReadInclude(item_root);
} }
void Pattern::ParseFile(const char * file_name) void Pattern::ParseFile(const char * file_name)
{ {
ParseFile( std::string(file_name) ); std::string file;
if( directory.empty() )
SplitUnixDirectory(file_name, directory, file);
else
file = file_name;
file.insert(file.begin(), '\"');
item_root.directives.clear();
item_root.directives.push_back( file );
CreateTreeReadInclude(item_root);
} }
@ -107,6 +159,9 @@ return true;
} }
/*
'name' must be a relative path
*/
std::string Pattern::ReadFile(const char * name) std::string Pattern::ReadFile(const char * name)
{ {
// for security reason we can't open a file which has two dots // for security reason we can't open a file which has two dots
@ -114,16 +169,10 @@ std::string Pattern::ReadFile(const char * name)
if( !CheckFileName(name) ) if( !CheckFileName(name) )
return CreateMsg("incorrect file name:", name); return CreateMsg("incorrect file name:", name);
std::string file_name; std::string file_name(directory);
if( name[0]!='\\' && name[0]!='/' ) if( !file_name.empty() )
{ file_name += '/';
// name is a relative path
file_name += directory;
if( !file_name.empty() )
file_name += '/';
}
file_name += name; file_name += name;
@ -173,7 +222,7 @@ std::string directive;
while( (*itext>='a' && *itext<='z') || while( (*itext>='a' && *itext<='z') ||
(*itext>='A' && *itext<='Z') || (*itext>='A' && *itext<='Z') ||
(*itext>='0' && *itext<='9') || (*itext>='0' && *itext<='9') ||
*itext=='_' || *itext=='-' || *itext=='.' ) *itext=='_' || *itext=='-' || *itext=='.' || *itext=='#' )
{ {
directive += *itext; directive += *itext;
@ -326,6 +375,15 @@ void Pattern::ReadDirectiveFor(Item & item)
} }
void Pattern::ReadDirectiveComment(Item & item)
{
item.type = Item::item_comment;
while( *itext && *itext!=']' && *itext!='\n' )
++itext;
}
void Pattern::ReadDirectiveInclude(Item & item) void Pattern::ReadDirectiveInclude(Item & item)
{ {
item.type = Item::item_include; item.type = Item::item_include;
@ -369,6 +427,9 @@ void Pattern::CreateTreeReadItemDirective(Item & item)
if( directive == "include" ) if( directive == "include" )
ReadDirectiveInclude(item); ReadDirectiveInclude(item);
else else
if( directive == "#" )
ReadDirectiveComment(item);
else
{ {
// user defined // user defined
item.directives.push_back(directive); item.directives.push_back(directive);
@ -462,6 +523,9 @@ void Pattern::CreateTree(Item & item)
while( CreateTreeReadItem(item_temp) ) while( CreateTreeReadItem(item_temp) )
{ {
if( item_temp.type == Item::item_comment )
continue;
Item * pitem = item.AddItem(item_temp); Item * pitem = item.AddItem(item_temp);
if( item_temp.type==Item::item_end || item_temp.type==Item::item_else ) if( item_temp.type==Item::item_end || item_temp.type==Item::item_else )

View File

@ -35,6 +35,12 @@
* THE POSSIBILITY OF SUCH DAMAGE. * THE POSSIBILITY OF SUCH DAMAGE.
*/ */
/*
* version 0.9.0
*
*/
#ifndef headerfileezc #ifndef headerfileezc
#define headerfileezc #define headerfileezc
@ -51,12 +57,14 @@ namespace Ezc
{ {
std::string CreateMsg(const char * type, const char * arg = 0); std::string CreateMsg(const char * type, const char * arg = 0);
void SplitUnixDirectory(const char * name, std::string & dir, std::string & file);
void SplitUnixDirectory(const std::string & name, std::string & dir, std::string & file);
class Pattern class Pattern
{ {
public: public:
void ParseFile(std::string file_name); void ParseFile(const std::string & file_name);
void ParseFile(const char * file_name); void ParseFile(const char * file_name);
void Directory(const char * d); void Directory(const char * d);
void Directory(const std::string & d); void Directory(const std::string & d);
@ -65,8 +73,9 @@ public:
{ {
enum ItemType enum ItemType
{ {
item_none, item_container, item_text, item_ifany, item_for, item_else, item_none, item_container, item_text, item_ifany, item_for,
item_end, item_err, item_normal, item_ifindex, item_include, item_is, item_ifone item_else, item_end, item_err, item_normal, item_ifindex,
item_include, item_is, item_ifone, item_comment
}; };
ItemType type; ItemType type;
@ -112,7 +121,9 @@ private:
void ReadDirectiveIs(Item & item); void ReadDirectiveIs(Item & item);
void ReadDirectiveIfindex(Item & item); void ReadDirectiveIfindex(Item & item);
void ReadDirectiveFor(Item & item); void ReadDirectiveFor(Item & item);
void ReadDirectiveComment(Item & item);
void ReadDirectiveInclude(Item & item); void ReadDirectiveInclude(Item & item);
void CreateTreeReadItemDirective(Item & item); void CreateTreeReadItemDirective(Item & item);
void CreateTreeReadItemText(Item & item); void CreateTreeReadItemText(Item & item);
@ -163,7 +174,6 @@ private:
UserInfoTable user_info_table; UserInfoTable user_info_table;
std::string otext; std::string otext;
bool Find(const std::string & key, UserInfo ** user_info); bool Find(const std::string & key, UserInfo ** user_info);
void MakeTextIf_go(Pattern::Item & item, bool result); void MakeTextIf_go(Pattern::Item & item, bool result);
bool MakeTextIfindexnumber(Pattern::Item & item, UserInfo * user_info, bool & result); bool MakeTextIfindexnumber(Pattern::Item & item, UserInfo * user_info, bool & result);