1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 23 #ifndef SOLTOOLS_GI_PARSE_HXX 24 #define SOLTOOLS_GI_PARSE_HXX 25 26 #include "simstr.hxx" 27 #include "gilacces.hxx" 28 #include <fstream> 29 30 class GenericInfoList_Builder; 31 class GenericInfoList_Browser; 32 33 /** Reads generic information files into a simple structure in memory. 34 35 Information files used by this parser have the following format: 36 37 key [value] 38 { 39 key [value] 40 key [value] 41 { 42 key [value] 43 ... 44 ... 45 } 46 } 47 key [value] 48 ... 49 ... 50 51 */ 52 53 54 class GenericInfo_Parser : public GenericInfoParseTypes 55 { 56 public: 57 typedef unsigned long UINT32; 58 typedef short INT16; 59 60 GenericInfo_Parser(); 61 ~GenericInfo_Parser(); 62 63 /** reads a information file and stores the data in a 64 List_GenericInfo 65 */ 66 bool LoadList( 67 GenericInfoList_Builder & 68 o_rResult, 69 const Simstr & i_sSourceFileName ); 70 71 /** save the InformationList to rSourceFile 72 returns false on error 73 */ 74 bool SaveList( 75 const Simstr & i_rOutputFile, 76 GenericInfoList_Browser & 77 io_rListBrowser ); 78 79 E_Error GetLastError( 80 UINT32 * o_pErrorLine = 0 ) const; 81 82 private: 83 enum E_LineType 84 { 85 lt_empty = 0, 86 lt_key, 87 lt_open_list, 88 lt_close_list, 89 lt_comment 90 }; 91 92 void SetError( 93 E_Error i_eError ); 94 void ResetState( 95 GenericInfoList_Builder & 96 io_rResult ); 97 void ResetState( 98 GenericInfoList_Browser & 99 io_rSrc ); 100 101 void ReadLine(); 102 bool InterpretLine(); 103 E_LineType ClassifyLine(); 104 105 void ReadKey(); 106 void PushLevel_Read(); /// When list is opened by '{': 107 void PopLevel_Read(); /// When list is closed by '}': 108 void AddCurLine2CurComment(); 109 110 void WriteList( 111 std::ostream & o_rFile ); 112 113 void PushLevel_Write(); /// When SubList is pushed in pResource 114 void PopLevel_Write(); /// When SubList is popped in pResource 115 116 void WriteComment( 117 std::ostream & o_rFile, 118 const char * i_sStr ); 119 void WriteKey( 120 std::ostream & o_rFile, 121 const char * i_sStr ); 122 void WriteValue( 123 std::ostream & o_rFile, 124 const char * i_sStr ); 125 void WriteIndentation( 126 std::ostream & o_rFile ); 127 128 // DATA 129 const char * sCurParsePosition; 130 131 UINT32 nCurLine; 132 INT16 nLevel; 133 bool bGoon; 134 135 Simstr sCurComment; 136 137 E_Error eErrorCode; 138 UINT32 nErrorLine; 139 140 GenericInfoList_Builder * 141 pResult; 142 GenericInfoList_Browser * 143 pResource; 144 145 char * dpBuffer; 146 char * sFilePtr; 147 }; 148 149 150 inline GenericInfo_Parser::E_Error 151 GenericInfo_Parser::GetLastError( UINT32 * o_pErrorLine ) const 152 { 153 if ( o_pErrorLine != 0 ) 154 *o_pErrorLine = nErrorLine; 155 return eErrorCode; 156 } 157 158 159 #endif 160 161 162