31 static ossimTrace traceDebug(
"ossimKeywordlist:debug");
33 #ifdef OSSIM_ID_ENABLED 34 static const bool TRACE =
false;
35 static const char OSSIM_ID[] =
"$Id: ossimKeywordlist.cpp 23632 2015-11-19 20:43:06Z dburken $";
42 m_delimiter(src.m_delimiter),
43 m_preserveKeyValues(src.m_preserveKeyValues),
44 m_expandEnvVars(src.m_expandEnvVars)
50 m_delimiter(DEFAULT_DELIMITER),
51 m_preserveKeyValues(
true),
61 m_delimiter(delimiter),
62 m_preserveKeyValues(
true),
63 m_expandEnvVars(expandEnvVars)
65 #ifdef OSSIM_ID_ENABLED 72 bool ignoreBinaryChars,
76 m_delimiter(delimiter),
77 m_preserveKeyValues(
true),
79 m_expandEnvVars(expandEnvVars)
83 if (!
parseFile(in_file, ignoreBinaryChars))
91 bool ignoreBinaryChars,
95 m_delimiter(delimiter),
96 m_preserveKeyValues(
true),
97 m_expandEnvVars(expandEnvVars)
135 KeywordMap::const_iterator i = src.
m_map.begin();
137 while (i != src.
m_map.end())
139 addPair( (*i).first, (*i).second, overwrite );
148 std::map<std::string, std::string>::const_iterator iter = kwl.
m_map.begin();
153 std::string tmpPrefix;
154 if (prefix) tmpPrefix = prefix;
156 regExp.
compile((
"^("+tmpPrefix+
")").c_str());
158 while(iter != kwl.
m_map.end())
162 if(regExp.
find( (*iter).first.c_str()))
164 newKey = (*iter).first;
165 if(stripPrefix && prefix)
181 std::string p = prefix ? prefix :
"";
182 std::map<std::string, std::string>::const_iterator iter = kwl.
m_map.begin();
183 while(iter != kwl.
m_map.end())
185 std::string k( p + (*iter).first );
186 addPair( k, (*iter).second, overwrite );
192 const std::string& value,
205 if (i ==
m_map.end())
217 const std::string& key,
218 const std::string& value,
221 std::string k(prefix + key);
232 std::string v(value?value:
"");
244 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
245 std::string v(value ? value :
"");
257 std::string v(1, value);
269 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
270 std::string v(1, value);
294 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
319 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
344 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
369 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
394 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
419 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
446 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
473 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
480 const char* comment)
const 486 <<
"ossimKeywordlist::write, Error opening file: " 487 << file << std::endl;
494 commentStr += comment;
497 filename << commentStr.
c_str() << std::endl;
513 KeywordMap::const_iterator i;
518 result += (*i).first;
521 result += (*i).second;
535 KeywordMap::const_iterator i;
539 result += (*i).first;
542 result += (*i).second;
550 KeywordMap::const_iterator i;
560 value =
"\"\"\"" + value +
"\"\"\"";
565 << value << std::endl;
572 KeywordMap::const_iterator i =
m_map.find(key);
573 if (i !=
m_map.end())
583 KeywordMap::const_iterator i =
m_map.find(key);
584 if (i !=
m_map.end())
593 const std::string& key)
const 595 std::string k = prefix+key;
601 const char* result = 0;
605 KeywordMap::const_iterator i =
m_map.find( k );
606 if (i !=
m_map.end())
608 result = (*i).second.c_str();
615 const char* key)
const 617 const char* result = 0;
621 if (prefix) k = prefix;
623 KeywordMap::const_iterator i =
m_map.find( k );
624 if (i !=
m_map.end())
626 result = (*i).second.c_str();
636 KeywordMap::iterator i =
m_map.find(k);
649 if (prefix) k = prefix;
652 KeywordMap::iterator i =
m_map.find(k);
667 KeywordMap::const_iterator i =
m_map.begin();
669 while (i !=
m_map.end())
683 const char* key)
const 687 std::string k(prefix ? (std::string(prefix)+std::string(key)) : key);
698 ossimKeywordlist::KeywordMap::iterator
704 return m_map.find(k);
712 ossimKeywordlist::KeywordMap::iterator
715 return m_map.find(key);
718 ossimKeywordlist::KeywordMap::iterator
729 bool ignoreBinaryChars)
734 createIstream( file.
string() );
759 if((c>=0x20&&c<=0x7e))
777 ( (c ==
' ') || (c ==
'\t') || (c ==
'\n') || (c ==
'\r') ) )
787 char c = (char)in.peek();
790 sequence += (char)in.get();
796 while(!in.bad()&&!in.eof())
799 if (in.bad() || in.eof())
807 if((c ==
'\n')|| (c ==
'\r'))
822 char c = (char)in.peek();
834 if (directive ==
"#include")
837 if (includeFile.
empty())
839 includeFile.
trim(
"\"");
843 if (includeFile.
string()[0] !=
'/')
866 if(!sequence.
empty())
875 while(!in.eof() && in.good())
880 if ( (c ==
'\n') || (c ==
'\r') )
883 if ( in.peek() == EOF )
907 sequence = sequence.
trim();
933 while(!in.eof()&&!in.bad())
935 if(in.peek() ==
' '||
940 else if(in.peek() ==
'\n' ||
955 while(!in.eof()&&!in.bad()&&in.peek()!=EOF)
960 if(((c ==
'\n'||c==
'\r') && !quoteCount) || in.eof())
965 if(sequence.
size() >2)
993 std::string::size_type startPos = sequence.
string().find_first_not_of(quote);
994 std::string::size_type stopPos = sequence.
string().find_last_not_of(quote);
995 if ( ( startPos != std::string::npos ) && (stopPos != std::string::npos) )
997 sequence = sequence.
string().substr( startPos, stopPos-startPos+1 );
1017 static_cast<int>(valueState)) );
1030 while(!is.eof() && !is.bad())
1033 if(is.eof() || is.bad())
1080 sequence = key = value =
"";
1090 prefixValues.
clear();
1091 std::vector<ossimString> keys;
1097 std::vector<ossim_uint32> numberList(nKeys);
1098 for(idx = 0; idx < (
ossim_uint32)numberList.size();++idx)
1102 numberList[idx] = numberStr.
toInt();
1104 std::sort(numberList.begin(), numberList.end());
1114 KeywordMap::const_iterator i;
1115 std::vector<ossimString> result;
1117 for(i =
m_map.begin(); i !=
m_map.end(); ++i)
1121 result.push_back((*i).first);
1131 KeywordMap::const_iterator i;
1134 for(i =
m_map.begin(); i !=
m_map.end(); ++i)
1136 if(regExp.
find( (*i).first.c_str()))
1138 result.push_back((*i).first);
1147 KeywordMap::const_iterator i;
1150 for(i =
m_map.begin(); i !=
m_map.end(); ++i)
1152 if(regExp.
find( (*i).first.c_str()))
1163 KeywordMap::const_iterator i;
1164 std::vector<ossimString> result;
1169 for(i =
m_map.begin(); i !=
m_map.end(); ++i)
1171 if(regExp.
find( (*i).first.c_str()))
1173 kwl.
addPair((*i).first, (*i).second);
1180 KeywordMap::const_iterator i;
1181 std::vector<ossimString> result;
1186 for(i =
m_map.begin(); i !=
m_map.end(); ++i)
1188 if(regExp.
find( (*i).first.c_str()))
1190 result.push_back((*i).first);
1201 std::vector<ossimString> result;
1209 KeywordMap::const_iterator i;
1214 for(i =
m_map.begin(); i !=
m_map.end(); ++i)
1216 if(regExp.
find( (*i).first.c_str()))
1219 (*i).first.begin()+regExp.
start()+regExp.
end());
1221 if(std::find(result.begin(), result.end(), value) == result.end())
1231 KeywordMap::const_iterator i;
1232 std::vector<ossimString> currentList;
1243 KeywordMap::const_iterator values = tempKwl.
m_map.begin();
1245 while(values != tempKwl.
m_map.end())
1247 std::string newKey = prefix.
string() + (*values).first;
1248 addPair(newKey, (*values).second,
true);
1260 KeywordMap::const_iterator values = tempKwl.
m_map.begin();
1265 while(values != tempKwl.
m_map.end())
1267 std::string newKey = prefix.
string()+(*values).first;
1268 if(regExp.
find( (*values).first.c_str()))
1271 addPair(newKey, (*values).second,
true);
1275 addPair((*values).first, (*values).second,
true);
1287 KeywordMap::const_iterator values = tempKwl.
m_map.begin();
1292 while(values != tempKwl.
m_map.end())
1294 std::string newKey = (*values).first;
1295 if(regExp.
find( (*values).first.c_str()))
1297 newKey.erase(newKey.begin()+regExp.
start(),
1298 newKey.begin()+regExp.
start()+regExp.
end());
1300 addPair(newKey, (*values).second,
true);
1304 addPair(newKey, (*values).second,
true);
1345 KeywordMap::const_iterator i;
1347 for(i =
m_map.begin(); i !=
m_map.end(); ++i)
1350 << (*i).second << std::endl;
1397 KeywordMap::iterator iter =
m_map.begin();
1399 while(iter !=
m_map.end())
1402 tempMap.insert(std::make_pair(k.
downcase().
string(), iter->second));
1413 KeywordMap::iterator iter =
m_map.begin();
1415 while(iter !=
m_map.end())
1418 tempMap.insert(std::make_pair(k.
upcase().
string(), iter->second));
1428 KeywordMap::iterator iter =
m_map.begin();
1430 while(iter !=
m_map.end())
1454 const char* keyword,
1455 const char* prefix)
const 1458 const char* val_str =
find(prefix, keyword);
1464 if ((yesno ==
"YES") || (yesno ==
"TRUE") || (yesno ==
"1"))
1466 else if ((yesno ==
"NO") || (yesno ==
"FALSE") || (yesno ==
"0"))
1503 std::string::const_iterator textChars = value.begin();
1505 if(!isalpha(*(textChars) ))
1509 else if(!value.empty())
1511 for(++textChars;textChars!=value.end();++textChars)
1513 if(!isalnum(*(textChars) ))
1532 while(iter!=value.
end())
1534 if(!(isdigit(*iter) ||
1546 std::string rootTagStr = rootTag;
1549 rootTagStr =
"info";
1553 metadata->
setTag(
"metadata");
1554 ossimKeywordlist::KeywordMap::const_iterator iter =
m_map.begin();
1555 while(iter !=
m_map.end())
1558 bool outputValue =
true;
1560 if(path.
contains(
"unformatted_tag_data"))
1565 value =
"XML not converted";
1566 outputValue =
false;
1575 std::vector<ossimString> splitValues;
1576 path.
split(splitValues,
"/");
1577 if(splitValues.size())
1579 splitValues[splitValues.size()-1] = splitValues[splitValues.size()-1].downcase();
1581 for(idx = 0; ((idx < splitValues.size()-1)&&tagOk);++idx)
1587 splitValues[idx] = splitValues[idx].upcase();
1592 path.
join(splitValues,
"/");
1605 out <<
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>" << std::endl
1606 <<
"<" << rootTagStr <<
">\n";
1609 ossimXmlNode::ChildListType::const_iterator iter = children.begin();
1610 while(iter != children.end())
1612 out << *(iter->get());
1615 out <<
"\n</" << rootTagStr <<
">" << std::endl;
1619 out << *(metadata.
get()) << std::endl;
1626 const std::string C =
": ";
1627 const std::string DQ =
"\"";
1628 const std::string LB =
"{";
1629 const std::string CNL =
",\n";
1630 const std::string NL =
"\n";
1631 const std::string RB =
"}";
1632 const std::string S =
" ";
1638 bool stringify =
true;
1639 bool closeObject =
false;
1640 std::vector<ossimString> objectStack;
1645 if( rootTag.size() )
1649 indentOffset = indentCount;
1650 std::string indent(indentCount,
' ');
1651 out << NL << indent;
1658 out << DQ << rootTag << DQ << C << LB << NL;
1661 ossimKeywordlist::KeywordMap::const_iterator iter =
m_map.begin();
1662 while(iter !=
m_map.end())
1664 bool outputValue =
true;
1667 value = value.
trim();
1670 if(key.
contains(
"unformatted_tag_data"))
1675 value =
"data not converted";
1676 outputValue =
false;
1681 if ( outputValue && key.
size() )
1683 std::vector<ossimString> keys;
1684 key.
split(keys,
".");
1692 bool sameObject =
isSame( keys, objectStack );
1693 if ( !sameObject && keys.size() )
1697 if ( i < objectStack.size() )
1699 if ( keys[i] == objectStack[i] )
1707 while ( i < objectStack.size() )
1712 std::string indent(indentOffset+(indentCount*objectStack.size()),
' ');
1713 out << NL << indent << RB;
1719 objectStack.pop_back();
1722 if ( objectStack.size() )
1724 lastObject = objectStack[objectStack.size()-1];
1745 objectStack.push_back( keys[i] );
1750 closeObject =
false;
1755 std::string indent(indentOffset+(indentCount*objectStack.size()),
' ');
1758 out << DQ << keys[i] << DQ << C << LB << NL;
1762 while ( keys.size() < objectStack.size() )
1767 std::string indent(indentOffset+(indentCount*objectStack.size()),
' ');
1768 out << NL << indent << RB;
1774 objectStack.pop_back();
1777 if ( objectStack.size() )
1779 lastObject = objectStack[objectStack.size()-1];
1788 if ( objectStack.size() )
1790 if ( lastObject == objectStack[objectStack.size()-1] )
1793 closeObject =
false;
1796 else if ( nameCount )
1804 std::string indent(indentOffset+indentCount*(objectStack.size()+1),
' ');
1807 out << DQ << name << DQ << C << DQ << value << DQ;
1809 if ( objectStack.size() )
1811 lastObject = objectStack[objectStack.size()-1];
1833 std::string indent(indentOffset+indentCount*i,
' ');
1834 out << NL << indent << RB;
1843 if( rootTag.size() )
1847 std::string indent(indentCount,
' ');
1848 out << NL << indent << RB;
1857 out << NL << RB << std::endl;
1861 const std::vector<ossimString>& b )
const 1864 if ( a.size() == b.size() )
void clear()
Erases the entire container.
void addPrefixToKeysThatMatch(const ossimString &prefix, const ossimString ®ularExpression)
ossimString before(const ossimString &str, std::string::size_type pos=0) const
METHOD: before(str, pos) Returns string beginning at pos and ending one before the token str If strin...
void setTag(const ossimString &tag)
ossimString substitute(const ossimString &searchKey, const ossimString &replacementValue, bool replaceAll=false) const
Substitutes searchKey string with replacementValue and returns a string.
void stripPrefixFromAll(const ossimString ®ularExpression)
virtual std::ostream & print(std::ostream &os) const
Outputs theErrorStatus as an ossimErrorCode and an ossimString.
static ossimString upcase(const ossimString &aString)
ossim_uint32 numberOf(const char *str) const
std::basic_ostringstream< char > ostringstream
Class for char output memory streams.
ossim_uint32 getNumberOfSubstringKeys(const ossimString ®ularExpression) const
ossimKeywordlist & upcaseKeywords()
std::string::iterator iterator
const ossimString & join(const std::vector< ossimString > &stringList, const ossimString &separator)
OSSIMDLLEXPORT std::ostream & operator<<(std::ostream &os, const ossimKeywordlist &kwl)
std::vector< ossimString > findAllKeysThatContains(const ossimString &searchString) const
KeywordlistParseState readKey(ossimString &sequence, ossim::istream &in) const
Represents serializable keyword/value map.
bool addFile(const char *file)
const std::string & findKey(const std::string &key) const
Find methods that take std::string(s).
const char * find(const char *key) const
const ossimXmlNode::ChildListType & getChildNodes() const
ossimKeywordlist & downcaseKeywords()
bool contains(char aChar) const
bool hasKey(const std::string &key) const
Checks for key in map.
void addList(const ossimKeywordlist &src, bool overwrite=true)
KeywordlistParseState readComments(ossimString &sequence, ossim::istream &in) const
static ossimString toString(bool aValue)
Numeric to string methods.
void toXML(std::ostream &out, const std::string &rootTag="info") const
Outputs in xml format.
void change_delimiter(char del)
void split(std::vector< ossimString > &result, const ossimString &separatorList, bool skipBlankFields=false) const
Splits this string into a vector of strings (fields) using the delimiter list specified.
std::string::const_iterator const_iterator
void addPair(const std::string &key, const std::string &value, bool overwrite=true)
static const ossimErrorCode OSSIM_ERROR
static StreamFactoryRegistry * instance()
bool getExpandEnvVarsFlag(void) const
ossimRefPtr< ossimXmlNode > addNode(const ossimString &relPath, const ossimString &text="")
unsigned short ossim_uint16
void findAllKeysThatMatch(std::vector< ossimString > &result, const ossimString ®ularExpression) const
Finds keys that match regular expression.
virtual bool write(const char *file, const char *comment=0) const
Methods to dump the ossimKeywordlist to a file on disk.
void skipWhitespace(ossim::istream &in) const
std::string::iterator end()
KeywordlistParseState readPreprocDirective(ossim::istream &in)
ossim_uint32 getNumberOfKeysThatMatch(const ossimString ®ularExpression) const
Gets number keys that match regular expression.
std::vector< ossimRefPtr< ossimXmlNode > > ChildListType
void removeKeysThatMatch(const ossimString ®ularExpression)
void push_back(char c)
Equivalent to insert(end(), c).
void add(const char *prefix, const ossimKeywordlist &kwl, bool overwrite=true)
bool isValidTag(const std::string &value) const
ossimString expandEnvironmentVariable() const
If the variable "$(env_var_name)" is found in the string, where "env_var_name" is any system environm...
std::map< std::string, std::string > KeywordMap
KeywordMap::iterator getMapEntry(const std::string &key)
std::string::size_type size() const
std::string::iterator begin()
unsigned long long ossim_uint64
unsigned int ossim_uint32
ossimString trim(const ossimString &valueToTrim=ossimString(" \\)) const
this will strip lead and trailing character passed in.
void extractKeysThatMatch(ossimKeywordlist &kwl, const ossimString ®ularExpression) const
static ossimString downcase(const ossimString &aString)
virtual void writeToStream(std::ostream &out) const
bool isSpecialXmlCharacters(const ossimString &value) const
void compile(const char *)
ossimErrorCode theErrorStatus
bool getBoolKeywordValue(bool &rtn_val, const char *keyword, const char *prefix=0) const
[OLK, Aug/2008] Sets the boolean <rtn_val> depending on value associated with keyword for values = (y...
bool operator!=(ossimKeywordlist &kwl) const
virtual bool parseString(const std::string &inString)
KeywordlistParseState readKeyAndValuePair(ossimString &key, ossimString &value, ossim::istream &in) const
ossim_uint32 start() const
void addPrefixToAll(const ossimString &prefix)
std::vector< ossimString > getSubstringKeyList(const ossimString ®ularExpression) const
bool operator==(ossimKeywordlist &kwl) const
void toJSON(std::ostream &out, const std::string &rootTag="info") const
Outputs in json format.
std::basic_istream< char > istream
Base class for char input streams.
const ossimKeywordlist::KeywordMap & getMap() const
static const std::string NULL_KW
ossimKeywordlist(const ossimKeywordlist &src)
void getSortedList(std::vector< ossimString > &prefixValues, const ossimString &prefixKey) const
This return the sorted keys if you have a list.
void setCDataFlag(bool value)
virtual bool parseStream(ossim::istream &is, bool ignoreBinaryChars)
deprecated method
ossim_uint32 getSize() const
ossimFilename m_currentlyParsing
void replaceSpecialCharacters(ossimString &value) const
const char * c_str() const
Returns a pointer to a null-terminated array of characters representing the string's contents...
ossimString delimiter_str() const
bool isSame(const std::vector< ossimString > &a, const std::vector< ossimString > &b) const
bool isValidKeywordlistCharacter(ossim_uint8 c) const
std::basic_ofstream< char > ofstream
Class for char output file streams.
virtual ossimString toString() const
std::basic_istringstream< char > istringstream
Class for char input memory streams.
ossimString after(const ossimString &str, std::string::size_type pos=0) const
METHOD: after(str, pos) Returns string immediately after the token str.
bool parseFile(const ossimFilename &file, bool ignoreBinaryChars=false)
void setExpandEnvVarsFlag(bool flag)
ossimFilename path() const
void remove(const char *key)
unsigned char ossim_uint8
OSSIMDLLEXPORT std::ostream & ossimNotify(ossimNotifyLevel level=ossimNotifyLevel_WARN)
std::basic_ostream< char > ostream
Base class for char output streams.
ossimKeywordlist & trimAllValues(const ossimString &valueToTrim=ossimString(" \\))
KeywordlistParseState readValue(ossimString &sequence, ossim::istream &in) const
const std::string & string() const