Coverage Report

Created: 2025-11-24 06:37

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aspell/common/getdata.cpp
Line
Count
Source
1
// This file is part of The New Aspell
2
// Copyright (C) 2001 by Kevin Atkinson under the GNU LGPL license
3
// version 2.0 or 2.1.  You should have received a copy of the LGPL
4
// license along with this library if you did not you can find
5
// it at http://www.gnu.org/.
6
7
#include <string.h>
8
9
#include "getdata.hpp"
10
#include "string.hpp"
11
#include "asc_ctype.hpp"
12
13
#include "iostream.hpp"
14
15
namespace acommon {
16
  unsigned int linenumber = 0 ;
17
18
  bool getdata_pair(IStream & in, DataPair & d, String & buf)
19
2.40M
  {
20
2.40M
    char * p;
21
22
    // get first non blank line and count all read ones
23
2.75M
    do {
24
2.75M
      buf.clear();
25
2.75M
      buf.append('\0'); // to avoid some special cases
26
2.75M
      if (!in.append_line(buf)) return false;
27
2.74M
      d.line_num++;
28
2.74M
      p = buf.mstr() + 1;
29
2.75M
      while (*p == ' ' || *p == '\t') ++p;
30
2.74M
    } while (*p == '#' || *p == '\0');
31
32
    // get key
33
2.40M
    d.key.str = p;
34
10.0M
    while (*p != '\0' &&
35
10.0M
           ((*p != ' ' && *p != '\t' && *p != '#') || *(p-1) == '\\')) ++p;
36
2.40M
    d.key.size = p - d.key.str;
37
38
    // figure out if there is a value and add terminate key
39
2.40M
    d.value.str = p; // in case there is no value
40
2.40M
    d.value.size = 0;
41
2.40M
    if (*p == '#' || *p == '\0') {*p = '\0'; return true;}
42
2.37M
    *p = '\0';
43
44
    // skip any whitespace
45
2.37M
    ++p;
46
5.13M
    while (*p == ' ' || *p == '\t') ++p;
47
2.37M
    if (*p == '\0' || *p == '#') {return true;}
48
49
    // get value
50
2.37M
    d.value.str = p;
51
65.9M
    while (*p != '\0' && (*p != '#' || *(p-1) == '\\')) ++p;
52
    
53
    // remove trailing white space and terminate value
54
2.37M
    --p;
55
2.38M
    while (*p == ' ' || *p == '\t') --p;
56
2.37M
    if (*p == '\\' && *(p + 1) != '\0') ++p;
57
2.37M
    ++p;
58
2.37M
    d.value.size = p - d.value.str;
59
2.37M
    *p = '\0';
60
61
2.37M
    return true;
62
2.37M
  }
63
64
  char * unescape(char * dest, const char * src)
65
50.1k
  {
66
1.23M
    while (*src) {
67
1.18M
      if (*src == '\\' && src[1]) {
68
6.70k
  ++src;
69
6.70k
  switch (*src) {
70
2
  case 'n': *dest = '\n'; break;
71
556
  case 'r': *dest = '\r'; break;
72
742
  case 't': *dest = '\t'; break;
73
0
  case 'f': *dest = '\f'; break;
74
0
  case 'v': *dest = '\v'; break;
75
5.40k
  default: *dest = *src;
76
6.70k
  }
77
1.17M
      } else {
78
1.17M
  *dest = *src;
79
1.17M
      }
80
1.18M
      ++src;
81
1.18M
      ++dest;
82
1.18M
    }
83
50.1k
    *dest = '\0';
84
50.1k
    return dest;
85
50.1k
  }
86
87
  bool escape(char * dest, const char * src, size_t limit, const char * others)
88
0
  {
89
0
    const char * begin = src;
90
0
    const char * end = dest + limit;
91
0
    if (asc_isspace(*src)) {
92
0
      if (dest == end) return false;
93
0
      *dest++ = '\\';
94
0
      if (dest == end) return false;
95
0
      *dest++ = *src++;
96
0
    }
97
0
    while (*src) {
98
0
      if (dest == end) return false;
99
0
      switch (*src) {
100
0
      case '\n': *dest++ = '\\'; *dest = 'n'; break;
101
0
      case '\r': *dest++ = '\\'; *dest = 'r'; break;
102
0
      case '\t': *dest++ = '\\'; *dest = 't'; break;
103
0
      case '\f': *dest++ = '\\'; *dest = 'f'; break;
104
0
      case '\v': *dest++ = '\\'; *dest = 'v'; break;
105
0
      case '\\': *dest++ = '\\'; *dest = '\\'; break;
106
0
      case '#' : *dest++ = '\\'; *dest = '#'; break;
107
0
      default:
108
0
  if (others && strchr(others, *src)) *dest++ = '\\';
109
0
  *dest = *src;
110
0
      }
111
0
      ++src;
112
0
      ++dest;
113
0
    }
114
0
    if (src > begin + 1 && asc_isspace(src[-1])) {
115
0
      --dest;
116
0
      *dest++ = '\\';
117
0
      if (dest == end) return false;
118
0
      *dest++ = src[-1];
119
0
    }
120
0
    *dest = '\0';
121
0
    return true;
122
0
  }
123
124
  void to_lower(char * str)
125
104k
  {
126
493k
    for (; *str; str++) *str = asc_tolower(*str);
127
104k
  }
128
129
  void to_lower(String & res, const char * str)
130
0
  {
131
0
    for (; *str; str++) res += asc_tolower(*str);
132
0
  }
133
134
  bool split(DataPair & d)
135
7.77M
  {
136
7.77M
    char * p   = d.value;
137
7.77M
    char * end = p + d.value.size;
138
7.77M
    d.key.str = p;
139
27.6M
    while (p != end) {
140
25.6M
      ++p;
141
25.6M
      if ((*p == ' ' || *p == '\t') && *(p-1) != '\\') break;
142
25.6M
    }
143
7.77M
    d.key.size = p - d.key.str;
144
7.77M
    *p = 0;
145
7.77M
    if (p != end) {
146
5.84M
      ++p;
147
35.0M
      while (p != end && (*p == ' ' || *p == '\t')) ++p;
148
5.84M
    }
149
7.77M
    d.value.str = p;
150
7.77M
    d.value.size = end - p;
151
7.77M
    return d.key.size != 0;
152
7.77M
  }
153
154
  void init(ParmString str, DataPair & d, String & buf)
155
947
  {
156
947
    const char * s = str;
157
947
    while (*s == ' ' || *s == '\t') ++s;
158
947
    size_t l = str.size() - (s - str);
159
947
    buf.assign(s, l);
160
947
    d.value.str  = buf.mstr();
161
947
    d.value.size = l;
162
947
  }
163
164
  bool getline(IStream & in, DataPair & d, String & buf)
165
0
  {
166
0
    if (!in.getline(buf)) return false;
167
0
    d.value.str  = buf.mstr();
168
0
    d.value.size = buf.size();
169
0
    return true;
170
0
  }
171
172
  char * get_nb_line(IStream & in, String & buf)
173
1.93M
  {
174
1.93M
    char * p;
175
    // get first non blank line
176
1.94M
    do {
177
1.94M
      if (!in.getline(buf)) return 0;
178
1.94M
      p = buf.mstr();
179
2.68M
      while (*p == ' ' || *p == '\t') ++p;
180
1.94M
    } while (*p == '#' || *p == '\0');
181
1.93M
    return p;
182
1.93M
  }
183
184
  void remove_comments(String & buf)
185
8.78k
  {
186
8.78k
    char * p = buf.mstr();
187
8.78k
    char * b = p;
188
37.7k
    while (*p && *p != '#') ++p;
189
8.78k
    if (*p == '#') {--p; while (p >= b && asc_isspace(*p)) --p; ++p;}
190
8.78k
    buf.resize(p - b);
191
8.78k
  }
192
193
}