Coverage Report

Created: 2026-06-15 06:20

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
1.12M
  {
20
1.12M
    char * p;
21
22
    // get first non blank line and count all read ones
23
1.43M
    do {
24
1.43M
      buf.clear();
25
1.43M
      buf.append('\0'); // to avoid some special cases
26
1.43M
      if (!in.append_line(buf)) return false;
27
1.42M
      d.line_num++;
28
1.42M
      p = buf.mstr() + 1;
29
1.43M
      while (*p == ' ' || *p == '\t') ++p;
30
1.42M
    } while (*p == '#' || *p == '\0');
31
32
    // get key
33
1.11M
    d.key.str = p;
34
4.84M
    while (*p != '\0' &&
35
4.82M
           ((*p != ' ' && *p != '\t' && *p != '#') || *(p-1) == '\\')) ++p;
36
1.11M
    d.key.size = p - d.key.str;
37
38
    // figure out if there is a value and add terminate key
39
1.11M
    d.value.str = p; // in case there is no value
40
1.11M
    d.value.size = 0;
41
1.11M
    if (*p == '#' || *p == '\0') {*p = '\0'; return true;}
42
1.09M
    *p = '\0';
43
44
    // skip any whitespace
45
1.09M
    ++p;
46
3.79M
    while (*p == ' ' || *p == '\t') ++p;
47
1.09M
    if (*p == '\0' || *p == '#') {return true;}
48
49
    // get value
50
1.09M
    d.value.str = p;
51
26.0M
    while (*p != '\0' && (*p != '#' || *(p-1) == '\\')) ++p;
52
    
53
    // remove trailing white space and terminate value
54
1.09M
    --p;
55
1.09M
    while (*p == ' ' || *p == '\t') --p;
56
1.09M
    if (*p == '\\' && *(p + 1) != '\0') ++p;
57
1.09M
    ++p;
58
1.09M
    d.value.size = p - d.value.str;
59
1.09M
    *p = '\0';
60
61
1.09M
    return true;
62
1.09M
  }
63
64
  char * unescape(char * dest, const char * src)
65
45.9k
  {
66
803k
    while (*src) {
67
757k
      if (*src == '\\' && src[1]) {
68
6.94k
  ++src;
69
6.94k
  switch (*src) {
70
0
  case 'n': *dest = '\n'; break;
71
698
  case 'r': *dest = '\r'; break;
72
595
  case 't': *dest = '\t'; break;
73
0
  case 'f': *dest = '\f'; break;
74
155
  case 'v': *dest = '\v'; break;
75
5.49k
  default: *dest = *src;
76
6.94k
  }
77
750k
      } else {
78
750k
  *dest = *src;
79
750k
      }
80
757k
      ++src;
81
757k
      ++dest;
82
757k
    }
83
45.9k
    *dest = '\0';
84
45.9k
    return dest;
85
45.9k
  }
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
39.1k
  {
126
188k
    for (; *str; str++) *str = asc_tolower(*str);
127
39.1k
  }
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
3.06M
  {
136
3.06M
    char * p   = d.value;
137
3.06M
    char * end = p + d.value.size;
138
3.06M
    d.key.str = p;
139
10.6M
    while (p != end) {
140
9.90M
      ++p;
141
9.90M
      if ((*p == ' ' || *p == '\t') && *(p-1) != '\\') break;
142
9.90M
    }
143
3.06M
    d.key.size = p - d.key.str;
144
3.06M
    *p = 0;
145
3.06M
    if (p != end) {
146
2.29M
      ++p;
147
13.5M
      while (p != end && (*p == ' ' || *p == '\t')) ++p;
148
2.29M
    }
149
3.06M
    d.value.str = p;
150
3.06M
    d.value.size = end - p;
151
3.06M
    return d.key.size != 0;
152
3.06M
  }
153
154
  void init(ParmString str, DataPair & d, String & buf)
155
884
  {
156
884
    const char * s = str;
157
884
    while (*s == ' ' || *s == '\t') ++s;
158
884
    size_t l = str.size() - (s - str);
159
884
    buf.assign(s, l);
160
884
    d.value.str  = buf.mstr();
161
884
    d.value.size = l;
162
884
  }
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.82M
  {
174
1.82M
    char * p;
175
    // get first non blank line
176
1.83M
    do {
177
1.83M
      if (!in.getline(buf)) return 0;
178
1.83M
      p = buf.mstr();
179
2.53M
      while (*p == ' ' || *p == '\t') ++p;
180
1.83M
    } while (*p == '#' || *p == '\0');
181
1.82M
    return p;
182
1.82M
  }
183
184
  void remove_comments(String & buf)
185
8.27k
  {
186
8.27k
    char * p = buf.mstr();
187
8.27k
    char * b = p;
188
35.5k
    while (*p && *p != '#') ++p;
189
8.27k
    if (*p == '#') {--p; while (p >= b && asc_isspace(*p)) --p; ++p;}
190
8.27k
    buf.resize(p - b);
191
8.27k
  }
192
193
}