// Ryzom - MMORPG Framework
// Copyright (C) 2010 Winch Gate Property Limited
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as
// published by the Free Software Foundation, either version 3 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see .
#ifndef AI_SHARE_H
#define AI_SHARE_H
namespace NLLIGO
{
class CLigoConfig;
class CPrimitives;
}
namespace AI_SHARE
{
extern bool LinkWithAiSpawnCommands;
extern bool LinkWithAiActionCommands;
extern bool LinkWithPrimitiveParser;
extern NLLIGO::CLigoConfig *LigoConfig;
inline void init(NLLIGO::CLigoConfig *config)
{
// this code forces the linker to link in files that would otherwise be lost
// these files use constructors of static objects to instantiate objects
LinkWithAiSpawnCommands=true;
LinkWithAiActionCommands=true;
LinkWithPrimitiveParser=true;
LigoConfig=config;
}
// the parser for '.primitive' files
extern void parsePrimFile(const std::string &filename);
// the parser for 'AiActions' stream in pdr (R2 format)
extern void parsePrimStream(NLMISC::IStream & stream, const std::string & streamName);
// the parser for 'AiActions' primitives in pdr (R2 format)
extern void parsePrimNoStream( NLLIGO::CPrimitives* primDoc, const std::string & streamName );
//-------------------------------------------------------------------------------------------------
// some handy utilities
//-------------------------------------------------------------------------------------------------
// dumb routine to simplify repetitive text parsing code
inline bool isWhiteSpace(char c)
{
return (c==' ' || c=='\t');
}
// -- stringToKeywordAndTail() --
// The following routine splits a text string into a keyword and a tail.
// A ':' is used as separator between keyword and tail
// All leading and trailing ' ' and '\t' round keyword and tail characters are stripped
// If no keyword is found routine retuns false (keyword and tail retain previous content)
inline bool stringToKeywordAndTail(const std::string &input,std::string &keyword, std::string &tail)
{
uint i=0, j, k;
// skip white space
while (ii && isWhiteSpace(input[k-1]);)--k; // k points to character after end of keyword
// if no keyword found then give up
if (k==i) return false;
// copy out the keyword
keyword=input.substr(i,k-i);
// find the end of the tail text
for (k=(uint)input.size();k>j && isWhiteSpace(input[k-1]);) --k; // k points to character after end of tail text
// find start of tail text
do { ++j; } while(jj && isWhiteSpace(input[i-1]);) --i; // i points to character after end of tail text
// find start of tail text
do { ++j; } while(j