Coverage Report

Created: 2025-07-01 06:08

/src/logging-log4cxx/src/main/cpp/properties.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Licensed to the Apache Software Foundation (ASF) under one or more
3
 * contributor license agreements.  See the NOTICE file distributed with
4
 * this work for additional information regarding copyright ownership.
5
 * The ASF licenses this file to You under the Apache License, Version 2.0
6
 * (the "License"); you may not use this file except in compliance with
7
 * the License.  You may obtain a copy of the License at
8
 *
9
 *      http://www.apache.org/licenses/LICENSE-2.0
10
 *
11
 * Unless required by applicable law or agreed to in writing, software
12
 * distributed under the License is distributed on an "AS IS" BASIS,
13
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
 * See the License for the specific language governing permissions and
15
 * limitations under the License.
16
 */
17
18
#include <log4cxx/logstring.h>
19
#include <log4cxx/helpers/properties.h>
20
#include <log4cxx/helpers/inputstreamreader.h>
21
#include <log4cxx/helpers/exception.h>
22
#include <log4cxx/helpers/pool.h>
23
24
using namespace LOG4CXX_NS;
25
using namespace LOG4CXX_NS::helpers;
26
27
class PropertyParser
28
{
29
  public:
30
    void parse(LogString& in, Properties& properties)
31
2
    {
32
2
      LogString key, element;
33
2
      LexemType lexemType = BEGIN;
34
2
      logchar c;
35
2
      bool finished = false;
36
37
2
      if (!get(in, c))
38
0
      {
39
0
        return;
40
0
      }
41
42
2.05k
      while (!finished)
43
2.05k
      {
44
2.05k
        switch (lexemType)
45
2.05k
        {
46
44
          case BEGIN:
47
44
            switch (c)
48
44
            {
49
0
              case 0x20: // ' '
50
0
              case 0x09: // '\t'
51
4
              case 0x0A: // '\n'
52
4
              case 0x0D: // '\r'
53
4
                if (!get(in, c))
54
0
                {
55
0
                  finished = true;
56
0
                }
57
58
4
                break;
59
60
32
              case 0x23: // '#'
61
32
              case 0x21: // '!'
62
32
                lexemType = COMMENT;
63
64
32
                if (!get(in, c))
65
0
                {
66
0
                  finished = true;
67
0
                }
68
69
32
                break;
70
71
8
              default:
72
8
                lexemType = KEY;
73
8
                break;
74
44
            }
75
76
44
            break;
77
78
242
          case KEY:
79
242
            switch (c)
80
242
            {
81
0
              case 0x5C: // '\\'
82
0
                lexemType = KEY_ESCAPE;
83
84
0
                if (!get(in, c))
85
0
                {
86
0
                  finished = true;
87
0
                }
88
89
0
                break;
90
91
0
              case 0x09: // '\t'
92
0
              case 0x20: // ' '
93
0
              case 0x3A: // ':'
94
8
              case 0x3D: // '='
95
8
                lexemType = DELIMITER;
96
97
8
                if (!get(in, c))
98
0
                {
99
0
                  finished = true;
100
0
                }
101
102
8
                break;
103
104
0
              case 0x0A:
105
0
              case 0x0D:
106
                // key associated with an empty string element
107
0
                properties.setProperty(key, LogString());
108
0
                key.erase(key.begin(), key.end());
109
0
                lexemType = BEGIN;
110
111
0
                if (!get(in, c))
112
0
                {
113
0
                  finished = true;
114
0
                }
115
116
0
                break;
117
118
234
              default:
119
234
                key.append(1, c);
120
121
234
                if (!get(in, c))
122
0
                {
123
0
                  finished = true;
124
0
                }
125
126
234
                break;
127
242
            }
128
129
242
            break;
130
131
242
          case KEY_ESCAPE:
132
0
            switch (c)
133
0
            {
134
0
              case 0x74: // 't'
135
0
                key.append(1, 0x09);
136
0
                lexemType = KEY;
137
0
                break;
138
139
0
              case 0x6E: // 'n'
140
0
                key.append(1, 0x0A);
141
0
                lexemType = KEY;
142
0
                break;
143
144
0
              case 0x72: // 'r'
145
0
                key.append(1, 0x0D);
146
0
                lexemType = KEY;
147
0
                break;
148
149
0
              case 0x0A: // '\n'
150
0
                lexemType = KEY_CONTINUE;
151
0
                break;
152
153
0
              case 0x0D: // '\r'
154
0
                lexemType = KEY_CONTINUE2;
155
0
                break;
156
157
0
              default:
158
0
                key.append(1, c);
159
0
                lexemType = KEY;
160
0
            }
161
162
0
            if (!get(in, c))
163
0
            {
164
0
              finished = true;
165
0
            }
166
167
0
            break;
168
169
0
          case KEY_CONTINUE:
170
0
            switch (c)
171
0
            {
172
0
              case 0x20:  // ' '
173
0
              case 0x09: //  '\t'
174
0
                if (!get(in, c))
175
0
                {
176
0
                  finished = true;
177
0
                }
178
179
0
                break;
180
181
0
              default:
182
0
                lexemType = KEY;
183
0
                break;
184
0
            }
185
186
0
            break;
187
188
0
          case KEY_CONTINUE2:
189
0
            switch (c)
190
0
            {
191
0
              case 0x0A: // '\n'
192
0
                if (!get(in, c))
193
0
                {
194
0
                  finished = true;
195
0
                }
196
197
0
                lexemType = KEY_CONTINUE;
198
0
                break;
199
200
0
              default:
201
0
                lexemType = KEY_CONTINUE;
202
0
                break;
203
0
            }
204
205
0
            break;
206
207
8
          case DELIMITER:
208
8
            switch (c)
209
8
            {
210
0
              case 0x09: // '\t'
211
0
              case 0x20: // ' '
212
0
              case 0x3A: // ':'
213
0
              case 0x3D: // '='
214
0
                if (!get(in, c))
215
0
                {
216
0
                  finished = true;
217
0
                }
218
219
0
                break;
220
221
8
              default:
222
8
                lexemType = ELEMENT;
223
8
                break;
224
8
            }
225
226
8
            break;
227
228
220
          case ELEMENT:
229
220
            switch (c)
230
220
            {
231
0
              case 0x5C: // '\\'
232
0
                lexemType = ELEMENT_ESCAPE;
233
234
0
                if (!get(in, c))
235
0
                {
236
0
                  finished = true;
237
0
                }
238
239
0
                break;
240
241
8
              case 0x0A: // '\n'
242
8
              case 0x0D: // '\r'
243
                // key associated with an empty string element
244
8
                properties.setProperty(key, element);
245
8
                key.erase(key.begin(), key.end());
246
8
                element.erase(element.begin(), element.end());
247
8
                lexemType = BEGIN;
248
249
8
                if (!get(in, c))
250
2
                {
251
2
                  finished = true;
252
2
                }
253
254
8
                break;
255
256
212
              default:
257
212
                element.append(1, c);
258
259
212
                if (!get(in, c))
260
0
                {
261
0
                  finished = true;
262
0
                }
263
264
212
                break;
265
220
            }
266
267
220
            break;
268
269
220
          case ELEMENT_ESCAPE:
270
0
            switch (c)
271
0
            {
272
0
              case 0x74: // 't'
273
0
                element.append(1, 0x09);
274
0
                lexemType = ELEMENT;
275
0
                break;
276
277
0
              case 0x6E: // 'n'
278
0
                element.append(1, 0x0A);
279
0
                lexemType = ELEMENT;
280
0
                break;
281
282
0
              case 0x72: // 'r'
283
0
                element.append(1, 0x0D);
284
0
                lexemType = ELEMENT;
285
0
                break;
286
287
0
              case 0x0A: // '\n'
288
0
                lexemType = ELEMENT_CONTINUE;
289
0
                break;
290
291
0
              case 0x0D: // '\r'
292
0
                lexemType = ELEMENT_CONTINUE2;
293
0
                break;
294
295
0
              default:
296
0
                element.append(1, c);
297
0
                lexemType = ELEMENT;
298
0
                break;
299
0
            }
300
301
0
            if (!get(in, c))
302
0
            {
303
0
              finished = true;
304
0
            }
305
306
0
            break;
307
308
0
          case ELEMENT_CONTINUE:
309
0
            switch (c)
310
0
            {
311
0
              case 0x20: // ' '
312
0
              case 0x09: // '\t'
313
0
                if (!get(in, c))
314
0
                {
315
0
                  finished = true;
316
0
                }
317
318
0
                break;
319
320
0
              default:
321
0
                lexemType = ELEMENT;
322
0
                break;
323
0
            }
324
325
0
            break;
326
327
0
          case ELEMENT_CONTINUE2:
328
0
            switch (c)
329
0
            {
330
0
              case 0x0A: // '\n'
331
0
                if (!get(in, c))
332
0
                {
333
0
                  finished = true;
334
0
                }
335
336
0
                lexemType = ELEMENT_CONTINUE;
337
0
                break;
338
339
0
              default:
340
0
                lexemType = ELEMENT_CONTINUE;
341
0
                break;
342
0
            }
343
344
0
            break;
345
346
1.54k
          case COMMENT:
347
1.54k
            if (c == 0x0A || c == 0x0D)
348
32
            {
349
32
              lexemType = BEGIN;
350
32
            }
351
352
1.54k
            if (!get(in, c))
353
0
            {
354
0
              finished = true;
355
0
            }
356
357
1.54k
            break;
358
2.05k
        }
359
2.05k
      }
360
361
2
      if (!key.empty())
362
0
      {
363
0
        properties.setProperty(key, element);
364
0
      }
365
2
    }
PropertyParser::parse(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, log4cxx::helpers::Properties&)
Line
Count
Source
31
1
    {
32
1
      LogString key, element;
33
1
      LexemType lexemType = BEGIN;
34
1
      logchar c;
35
1
      bool finished = false;
36
37
1
      if (!get(in, c))
38
0
      {
39
0
        return;
40
0
      }
41
42
1.02k
      while (!finished)
43
1.02k
      {
44
1.02k
        switch (lexemType)
45
1.02k
        {
46
22
          case BEGIN:
47
22
            switch (c)
48
22
            {
49
0
              case 0x20: // ' '
50
0
              case 0x09: // '\t'
51
2
              case 0x0A: // '\n'
52
2
              case 0x0D: // '\r'
53
2
                if (!get(in, c))
54
0
                {
55
0
                  finished = true;
56
0
                }
57
58
2
                break;
59
60
16
              case 0x23: // '#'
61
16
              case 0x21: // '!'
62
16
                lexemType = COMMENT;
63
64
16
                if (!get(in, c))
65
0
                {
66
0
                  finished = true;
67
0
                }
68
69
16
                break;
70
71
4
              default:
72
4
                lexemType = KEY;
73
4
                break;
74
22
            }
75
76
22
            break;
77
78
121
          case KEY:
79
121
            switch (c)
80
121
            {
81
0
              case 0x5C: // '\\'
82
0
                lexemType = KEY_ESCAPE;
83
84
0
                if (!get(in, c))
85
0
                {
86
0
                  finished = true;
87
0
                }
88
89
0
                break;
90
91
0
              case 0x09: // '\t'
92
0
              case 0x20: // ' '
93
0
              case 0x3A: // ':'
94
4
              case 0x3D: // '='
95
4
                lexemType = DELIMITER;
96
97
4
                if (!get(in, c))
98
0
                {
99
0
                  finished = true;
100
0
                }
101
102
4
                break;
103
104
0
              case 0x0A:
105
0
              case 0x0D:
106
                // key associated with an empty string element
107
0
                properties.setProperty(key, LogString());
108
0
                key.erase(key.begin(), key.end());
109
0
                lexemType = BEGIN;
110
111
0
                if (!get(in, c))
112
0
                {
113
0
                  finished = true;
114
0
                }
115
116
0
                break;
117
118
117
              default:
119
117
                key.append(1, c);
120
121
117
                if (!get(in, c))
122
0
                {
123
0
                  finished = true;
124
0
                }
125
126
117
                break;
127
121
            }
128
129
121
            break;
130
131
121
          case KEY_ESCAPE:
132
0
            switch (c)
133
0
            {
134
0
              case 0x74: // 't'
135
0
                key.append(1, 0x09);
136
0
                lexemType = KEY;
137
0
                break;
138
139
0
              case 0x6E: // 'n'
140
0
                key.append(1, 0x0A);
141
0
                lexemType = KEY;
142
0
                break;
143
144
0
              case 0x72: // 'r'
145
0
                key.append(1, 0x0D);
146
0
                lexemType = KEY;
147
0
                break;
148
149
0
              case 0x0A: // '\n'
150
0
                lexemType = KEY_CONTINUE;
151
0
                break;
152
153
0
              case 0x0D: // '\r'
154
0
                lexemType = KEY_CONTINUE2;
155
0
                break;
156
157
0
              default:
158
0
                key.append(1, c);
159
0
                lexemType = KEY;
160
0
            }
161
162
0
            if (!get(in, c))
163
0
            {
164
0
              finished = true;
165
0
            }
166
167
0
            break;
168
169
0
          case KEY_CONTINUE:
170
0
            switch (c)
171
0
            {
172
0
              case 0x20:  // ' '
173
0
              case 0x09: //  '\t'
174
0
                if (!get(in, c))
175
0
                {
176
0
                  finished = true;
177
0
                }
178
179
0
                break;
180
181
0
              default:
182
0
                lexemType = KEY;
183
0
                break;
184
0
            }
185
186
0
            break;
187
188
0
          case KEY_CONTINUE2:
189
0
            switch (c)
190
0
            {
191
0
              case 0x0A: // '\n'
192
0
                if (!get(in, c))
193
0
                {
194
0
                  finished = true;
195
0
                }
196
197
0
                lexemType = KEY_CONTINUE;
198
0
                break;
199
200
0
              default:
201
0
                lexemType = KEY_CONTINUE;
202
0
                break;
203
0
            }
204
205
0
            break;
206
207
4
          case DELIMITER:
208
4
            switch (c)
209
4
            {
210
0
              case 0x09: // '\t'
211
0
              case 0x20: // ' '
212
0
              case 0x3A: // ':'
213
0
              case 0x3D: // '='
214
0
                if (!get(in, c))
215
0
                {
216
0
                  finished = true;
217
0
                }
218
219
0
                break;
220
221
4
              default:
222
4
                lexemType = ELEMENT;
223
4
                break;
224
4
            }
225
226
4
            break;
227
228
110
          case ELEMENT:
229
110
            switch (c)
230
110
            {
231
0
              case 0x5C: // '\\'
232
0
                lexemType = ELEMENT_ESCAPE;
233
234
0
                if (!get(in, c))
235
0
                {
236
0
                  finished = true;
237
0
                }
238
239
0
                break;
240
241
4
              case 0x0A: // '\n'
242
4
              case 0x0D: // '\r'
243
                // key associated with an empty string element
244
4
                properties.setProperty(key, element);
245
4
                key.erase(key.begin(), key.end());
246
4
                element.erase(element.begin(), element.end());
247
4
                lexemType = BEGIN;
248
249
4
                if (!get(in, c))
250
1
                {
251
1
                  finished = true;
252
1
                }
253
254
4
                break;
255
256
106
              default:
257
106
                element.append(1, c);
258
259
106
                if (!get(in, c))
260
0
                {
261
0
                  finished = true;
262
0
                }
263
264
106
                break;
265
110
            }
266
267
110
            break;
268
269
110
          case ELEMENT_ESCAPE:
270
0
            switch (c)
271
0
            {
272
0
              case 0x74: // 't'
273
0
                element.append(1, 0x09);
274
0
                lexemType = ELEMENT;
275
0
                break;
276
277
0
              case 0x6E: // 'n'
278
0
                element.append(1, 0x0A);
279
0
                lexemType = ELEMENT;
280
0
                break;
281
282
0
              case 0x72: // 'r'
283
0
                element.append(1, 0x0D);
284
0
                lexemType = ELEMENT;
285
0
                break;
286
287
0
              case 0x0A: // '\n'
288
0
                lexemType = ELEMENT_CONTINUE;
289
0
                break;
290
291
0
              case 0x0D: // '\r'
292
0
                lexemType = ELEMENT_CONTINUE2;
293
0
                break;
294
295
0
              default:
296
0
                element.append(1, c);
297
0
                lexemType = ELEMENT;
298
0
                break;
299
0
            }
300
301
0
            if (!get(in, c))
302
0
            {
303
0
              finished = true;
304
0
            }
305
306
0
            break;
307
308
0
          case ELEMENT_CONTINUE:
309
0
            switch (c)
310
0
            {
311
0
              case 0x20: // ' '
312
0
              case 0x09: // '\t'
313
0
                if (!get(in, c))
314
0
                {
315
0
                  finished = true;
316
0
                }
317
318
0
                break;
319
320
0
              default:
321
0
                lexemType = ELEMENT;
322
0
                break;
323
0
            }
324
325
0
            break;
326
327
0
          case ELEMENT_CONTINUE2:
328
0
            switch (c)
329
0
            {
330
0
              case 0x0A: // '\n'
331
0
                if (!get(in, c))
332
0
                {
333
0
                  finished = true;
334
0
                }
335
336
0
                lexemType = ELEMENT_CONTINUE;
337
0
                break;
338
339
0
              default:
340
0
                lexemType = ELEMENT_CONTINUE;
341
0
                break;
342
0
            }
343
344
0
            break;
345
346
771
          case COMMENT:
347
771
            if (c == 0x0A || c == 0x0D)
348
16
            {
349
16
              lexemType = BEGIN;
350
16
            }
351
352
771
            if (!get(in, c))
353
0
            {
354
0
              finished = true;
355
0
            }
356
357
771
            break;
358
1.02k
        }
359
1.02k
      }
360
361
1
      if (!key.empty())
362
0
      {
363
0
        properties.setProperty(key, element);
364
0
      }
365
1
    }
PropertyParser::parse(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >&, log4cxx::helpers::Properties&)
Line
Count
Source
31
1
    {
32
1
      LogString key, element;
33
1
      LexemType lexemType = BEGIN;
34
1
      logchar c;
35
1
      bool finished = false;
36
37
1
      if (!get(in, c))
38
0
      {
39
0
        return;
40
0
      }
41
42
1.02k
      while (!finished)
43
1.02k
      {
44
1.02k
        switch (lexemType)
45
1.02k
        {
46
22
          case BEGIN:
47
22
            switch (c)
48
22
            {
49
0
              case 0x20: // ' '
50
0
              case 0x09: // '\t'
51
2
              case 0x0A: // '\n'
52
2
              case 0x0D: // '\r'
53
2
                if (!get(in, c))
54
0
                {
55
0
                  finished = true;
56
0
                }
57
58
2
                break;
59
60
16
              case 0x23: // '#'
61
16
              case 0x21: // '!'
62
16
                lexemType = COMMENT;
63
64
16
                if (!get(in, c))
65
0
                {
66
0
                  finished = true;
67
0
                }
68
69
16
                break;
70
71
4
              default:
72
4
                lexemType = KEY;
73
4
                break;
74
22
            }
75
76
22
            break;
77
78
121
          case KEY:
79
121
            switch (c)
80
121
            {
81
0
              case 0x5C: // '\\'
82
0
                lexemType = KEY_ESCAPE;
83
84
0
                if (!get(in, c))
85
0
                {
86
0
                  finished = true;
87
0
                }
88
89
0
                break;
90
91
0
              case 0x09: // '\t'
92
0
              case 0x20: // ' '
93
0
              case 0x3A: // ':'
94
4
              case 0x3D: // '='
95
4
                lexemType = DELIMITER;
96
97
4
                if (!get(in, c))
98
0
                {
99
0
                  finished = true;
100
0
                }
101
102
4
                break;
103
104
0
              case 0x0A:
105
0
              case 0x0D:
106
                // key associated with an empty string element
107
0
                properties.setProperty(key, LogString());
108
0
                key.erase(key.begin(), key.end());
109
0
                lexemType = BEGIN;
110
111
0
                if (!get(in, c))
112
0
                {
113
0
                  finished = true;
114
0
                }
115
116
0
                break;
117
118
117
              default:
119
117
                key.append(1, c);
120
121
117
                if (!get(in, c))
122
0
                {
123
0
                  finished = true;
124
0
                }
125
126
117
                break;
127
121
            }
128
129
121
            break;
130
131
121
          case KEY_ESCAPE:
132
0
            switch (c)
133
0
            {
134
0
              case 0x74: // 't'
135
0
                key.append(1, 0x09);
136
0
                lexemType = KEY;
137
0
                break;
138
139
0
              case 0x6E: // 'n'
140
0
                key.append(1, 0x0A);
141
0
                lexemType = KEY;
142
0
                break;
143
144
0
              case 0x72: // 'r'
145
0
                key.append(1, 0x0D);
146
0
                lexemType = KEY;
147
0
                break;
148
149
0
              case 0x0A: // '\n'
150
0
                lexemType = KEY_CONTINUE;
151
0
                break;
152
153
0
              case 0x0D: // '\r'
154
0
                lexemType = KEY_CONTINUE2;
155
0
                break;
156
157
0
              default:
158
0
                key.append(1, c);
159
0
                lexemType = KEY;
160
0
            }
161
162
0
            if (!get(in, c))
163
0
            {
164
0
              finished = true;
165
0
            }
166
167
0
            break;
168
169
0
          case KEY_CONTINUE:
170
0
            switch (c)
171
0
            {
172
0
              case 0x20:  // ' '
173
0
              case 0x09: //  '\t'
174
0
                if (!get(in, c))
175
0
                {
176
0
                  finished = true;
177
0
                }
178
179
0
                break;
180
181
0
              default:
182
0
                lexemType = KEY;
183
0
                break;
184
0
            }
185
186
0
            break;
187
188
0
          case KEY_CONTINUE2:
189
0
            switch (c)
190
0
            {
191
0
              case 0x0A: // '\n'
192
0
                if (!get(in, c))
193
0
                {
194
0
                  finished = true;
195
0
                }
196
197
0
                lexemType = KEY_CONTINUE;
198
0
                break;
199
200
0
              default:
201
0
                lexemType = KEY_CONTINUE;
202
0
                break;
203
0
            }
204
205
0
            break;
206
207
4
          case DELIMITER:
208
4
            switch (c)
209
4
            {
210
0
              case 0x09: // '\t'
211
0
              case 0x20: // ' '
212
0
              case 0x3A: // ':'
213
0
              case 0x3D: // '='
214
0
                if (!get(in, c))
215
0
                {
216
0
                  finished = true;
217
0
                }
218
219
0
                break;
220
221
4
              default:
222
4
                lexemType = ELEMENT;
223
4
                break;
224
4
            }
225
226
4
            break;
227
228
110
          case ELEMENT:
229
110
            switch (c)
230
110
            {
231
0
              case 0x5C: // '\\'
232
0
                lexemType = ELEMENT_ESCAPE;
233
234
0
                if (!get(in, c))
235
0
                {
236
0
                  finished = true;
237
0
                }
238
239
0
                break;
240
241
4
              case 0x0A: // '\n'
242
4
              case 0x0D: // '\r'
243
                // key associated with an empty string element
244
4
                properties.setProperty(key, element);
245
4
                key.erase(key.begin(), key.end());
246
4
                element.erase(element.begin(), element.end());
247
4
                lexemType = BEGIN;
248
249
4
                if (!get(in, c))
250
1
                {
251
1
                  finished = true;
252
1
                }
253
254
4
                break;
255
256
106
              default:
257
106
                element.append(1, c);
258
259
106
                if (!get(in, c))
260
0
                {
261
0
                  finished = true;
262
0
                }
263
264
106
                break;
265
110
            }
266
267
110
            break;
268
269
110
          case ELEMENT_ESCAPE:
270
0
            switch (c)
271
0
            {
272
0
              case 0x74: // 't'
273
0
                element.append(1, 0x09);
274
0
                lexemType = ELEMENT;
275
0
                break;
276
277
0
              case 0x6E: // 'n'
278
0
                element.append(1, 0x0A);
279
0
                lexemType = ELEMENT;
280
0
                break;
281
282
0
              case 0x72: // 'r'
283
0
                element.append(1, 0x0D);
284
0
                lexemType = ELEMENT;
285
0
                break;
286
287
0
              case 0x0A: // '\n'
288
0
                lexemType = ELEMENT_CONTINUE;
289
0
                break;
290
291
0
              case 0x0D: // '\r'
292
0
                lexemType = ELEMENT_CONTINUE2;
293
0
                break;
294
295
0
              default:
296
0
                element.append(1, c);
297
0
                lexemType = ELEMENT;
298
0
                break;
299
0
            }
300
301
0
            if (!get(in, c))
302
0
            {
303
0
              finished = true;
304
0
            }
305
306
0
            break;
307
308
0
          case ELEMENT_CONTINUE:
309
0
            switch (c)
310
0
            {
311
0
              case 0x20: // ' '
312
0
              case 0x09: // '\t'
313
0
                if (!get(in, c))
314
0
                {
315
0
                  finished = true;
316
0
                }
317
318
0
                break;
319
320
0
              default:
321
0
                lexemType = ELEMENT;
322
0
                break;
323
0
            }
324
325
0
            break;
326
327
0
          case ELEMENT_CONTINUE2:
328
0
            switch (c)
329
0
            {
330
0
              case 0x0A: // '\n'
331
0
                if (!get(in, c))
332
0
                {
333
0
                  finished = true;
334
0
                }
335
336
0
                lexemType = ELEMENT_CONTINUE;
337
0
                break;
338
339
0
              default:
340
0
                lexemType = ELEMENT_CONTINUE;
341
0
                break;
342
0
            }
343
344
0
            break;
345
346
771
          case COMMENT:
347
771
            if (c == 0x0A || c == 0x0D)
348
16
            {
349
16
              lexemType = BEGIN;
350
16
            }
351
352
771
            if (!get(in, c))
353
0
            {
354
0
              finished = true;
355
0
            }
356
357
771
            break;
358
1.02k
        }
359
1.02k
      }
360
361
1
      if (!key.empty())
362
0
      {
363
0
        properties.setProperty(key, element);
364
0
      }
365
1
    }
366
367
  protected:
368
    static bool get(LogString& in, logchar& c)
369
2.04k
    {
370
2.04k
      if (in.empty())
371
2
      {
372
2
        c = 0;
373
2
        return false;
374
2
      }
375
376
2.04k
      c = in[0];
377
2.04k
      in.erase(in.begin());
378
2.04k
      return true;
379
2.04k
    }
PropertyParser::get(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >&, char&)
Line
Count
Source
369
1.02k
    {
370
1.02k
      if (in.empty())
371
1
      {
372
1
        c = 0;
373
1
        return false;
374
1
      }
375
376
1.02k
      c = in[0];
377
1.02k
      in.erase(in.begin());
378
1.02k
      return true;
379
1.02k
    }
PropertyParser::get(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> >&, wchar_t&)
Line
Count
Source
369
1.02k
    {
370
1.02k
      if (in.empty())
371
1
      {
372
1
        c = 0;
373
1
        return false;
374
1
      }
375
376
1.02k
      c = in[0];
377
1.02k
      in.erase(in.begin());
378
1.02k
      return true;
379
1.02k
    }
380
381
    typedef enum
382
    {
383
      BEGIN,
384
      KEY,
385
      KEY_ESCAPE,
386
      KEY_CONTINUE,
387
      KEY_CONTINUE2,
388
      DELIMITER,
389
      ELEMENT,
390
      ELEMENT_ESCAPE,
391
      ELEMENT_CONTINUE,
392
      ELEMENT_CONTINUE2,
393
      COMMENT
394
    }
395
    LexemType;
396
};
397
398
3.58k
Properties::Properties() : properties(new PropertyMap())
399
3.58k
{
400
3.58k
}
401
402
Properties::~Properties()
403
3.58k
{
404
3.58k
  delete properties;
405
3.58k
}
406
407
LogString Properties::setProperty(const LogString& key, const LogString& value)
408
8
{
409
8
  return put(key, value);
410
8
}
log4cxx::helpers::Properties::setProperty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
408
4
{
409
4
  return put(key, value);
410
4
}
log4cxx::helpers::Properties::setProperty(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&)
Line
Count
Source
408
4
{
409
4
  return put(key, value);
410
4
}
411
412
LogString Properties::put(const LogString& key, const LogString& value)
413
8
{
414
8
  LogString oldValue((*properties)[key]);
415
8
  (*properties)[key] = value;
416
8
  return oldValue;
417
8
}
log4cxx::helpers::Properties::put(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)
Line
Count
Source
413
4
{
414
4
  LogString oldValue((*properties)[key]);
415
4
  (*properties)[key] = value;
416
4
  return oldValue;
417
4
}
log4cxx::helpers::Properties::put(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&, std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&)
Line
Count
Source
413
4
{
414
4
  LogString oldValue((*properties)[key]);
415
4
  (*properties)[key] = value;
416
4
  return oldValue;
417
4
}
418
419
LogString Properties::getProperty(const LogString& key) const
420
6.86k
{
421
6.86k
  return get(key);
422
6.86k
}
log4cxx::helpers::Properties::getProperty(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const
Line
Count
Source
420
1.59k
{
421
1.59k
  return get(key);
422
1.59k
}
log4cxx::helpers::Properties::getProperty(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&) const
Line
Count
Source
420
5.26k
{
421
5.26k
  return get(key);
422
5.26k
}
423
424
LogString Properties::get(const LogString& key) const
425
6.86k
{
426
6.86k
  PropertyMap::const_iterator it = properties->find(key);
427
6.86k
  return (it != properties->end()) ? it->second : LogString();
428
6.86k
}
log4cxx::helpers::Properties::get(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&) const
Line
Count
Source
425
1.59k
{
426
1.59k
  PropertyMap::const_iterator it = properties->find(key);
427
1.59k
  return (it != properties->end()) ? it->second : LogString();
428
1.59k
}
log4cxx::helpers::Properties::get(std::__1::basic_string<wchar_t, std::__1::char_traits<wchar_t>, std::__1::allocator<wchar_t> > const&) const
Line
Count
Source
425
5.26k
{
426
5.26k
  PropertyMap::const_iterator it = properties->find(key);
427
5.26k
  return (it != properties->end()) ? it->second : LogString();
428
5.26k
}
429
430
void Properties::load(InputStreamPtr inStream)
431
2
{
432
2
  Pool pool;
433
2
  auto lineReader = std::make_shared<InputStreamReader>(inStream, CharsetDecoder::getISOLatinDecoder());
434
2
  LogString contents = lineReader->read(pool);
435
2
  properties->clear();
436
2
  PropertyParser parser;
437
2
  parser.parse(contents, *this);
438
2
}
439
440
std::vector<LogString> Properties::propertyNames() const
441
6
{
442
6
  std::vector<LogString> names;
443
6
  names.reserve(properties->size());
444
445
6
  for (auto const& item : *properties)
446
24
  {
447
24
    const LogString& key = item.first;
448
24
    names.push_back(key);
449
24
  }
450
451
6
  return names;
452
6
}
453