15 std::ifstream inFile(fileName.c_str());
16 if (!inFile.is_open()) {
17 std::string envBasedFileName = fileName;
19 if (getenv(
"WIBMOD_SHARE") != NULL) {
20 envBasedFileName = getenv(
"WIBMOD_SHARE");
21 envBasedFileName +=
"/config/WIB1/tables/";
22 envBasedFileName += fileName;
23 inFile.open(envBasedFileName.c_str());
25 if (!inFile.is_open()) {
26 BUException::BAD_FILE e;
27 e.Append(
"File not found: ");
28 e.Append(envBasedFileName.c_str());
32 const size_t bufferSize = 1000;
33 char buffer[bufferSize + 1];
34 memset(buffer, 0, bufferSize + 1);
35 uint32_t lineNumber = 1;
36 while (!inFile.eof()) {
37 inFile.getline(buffer, bufferSize);
47 std::string activeLine = line.substr(0, line.find(
'#'));
50 boost::char_separator<char> sep(
" ");
51 boost::tokenizer<boost::char_separator<char>> tokens(activeLine, sep);
52 boost::tokenizer<boost::char_separator<char>>::iterator itToken = tokens.begin();
57 for (; itToken != tokens.end(); itToken++) {
62 std::string name(*itToken);
63 if (!prefix.empty()) {
65 name = prefix + std::string(
".") + name;
68 while ((name.size() > 0) && (
'.' == name[name.size() - 1])) {
70 name.erase(name.size() - 1);
73 if (name.size() == 0) {
75 BUException::INVALID_NAME e;
76 e.Append(
"Empty name");
80 boost::to_upper(name);
83 item->
name.assign(name);
95 if (!isdigit((itToken->c_str()[0]))) {
99 while (itToken != tokens.end()) {
108 BUException::MAX_INCLUDE_FILE_DEPTH e;
111 e.Append(
" at prefix ");
112 e.Append(item->
name);
113 e.Append(
" is too deep\n");
124 item->
mask = strtoul(itToken->c_str(), NULL, 0);
128 unsigned int v = item->
mask;
134 if (v & 0x0000FFFF) {
137 if (v & 0x00FF00FF) {
140 if (v & 0x0F0F0F0F) {
143 if (v & 0x33333333) {
146 if (v & 0x55555555) {
159 if (itToken->find(
'r') != std::string::npos) {
161 }
else if (itToken->find(
'R') != std::string::npos) {
166 if (itToken->find(
'w') != std::string::npos) {
168 }
else if (itToken->find(
'W') != std::string::npos) {
173 if (itToken->find(
'a') != std::string::npos) {
175 }
else if (itToken->find(
'A') != std::string::npos) {
186 if (itToken->find(
'=') == std::string::npos) {
188 item->
user[*itToken];
192 size_t equalSignPos = itToken->find(
'=');
194 if (itToken->find(
'"') != std::string::npos) {
195 if (itToken->find(
'"') < equalSignPos) {
196 BUException::BAD_TOKEN e;
197 e.Append(
"Malformed token : ");
198 e.Append(itToken->c_str());
199 e.Append(
" on line ");
200 char numberBuffer[14] =
"\0\0\0\0\0\0\0\0\0\0\0\0";
201 snprintf(numberBuffer, 12,
"%zu\n", lineNumber);
202 e.Append(numberBuffer);
203 e.Append(
"Bad line: ");
204 e.Append(activeLine);
210 std::string name = itToken->substr(0, equalSignPos);
212 if (itToken->size() - 1 == equalSignPos) {
213 BUException::BAD_TOKEN e;
214 e.Append(
"Malformed token : ");
215 e.Append(itToken->c_str());
216 e.Append(
" on line ");
217 char numberBuffer[14] =
"\0\0\0\0\0\0\0\0\0\0\0\0";
218 snprintf(numberBuffer, 12,
"%zu\n", lineNumber);
219 e.Append(numberBuffer);
223 std::string val = itToken->substr(equalSignPos + 1);
226 item->
user[name] = val;
233 if (val.find(
'"') != std::string::npos) {
235 val = val.substr(0, val.find(
'"'));
239 while (itToken != tokens.end()) {
241 val.append(*itToken);
242 if ((*itToken)[itToken->size() - 1] ==
'"') {
245 val.erase(val.size() - 1);
253 while (val.find(
"\\n") != std::string::npos) {
254 val.replace(val.find(
"\\n"), 2, std::string(
"\n"));
256 item->
user[name] = val;
261 if (itToken == tokens.end()) {