Coverage Report

Created: 2025-07-11 06:34

/src/aspell/common/getdata.cpp
Line
Count
Source (jump to first uncovered line)
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.18M
  {
20
1.18M
    char * p;
21
22
    // get first non blank line and count all read ones
23
1.55M
    do {
24
1.55M
      buf.clear();
25
1.55M
      buf.append('\0'); // to avoid some special cases
26
1.55M
      if (!in.append_line(buf)) return false;
27
1.55M
      d.line_num++;
28
1.55M
      p = buf.mstr() + 1;
29
1.56M
      while (*p == ' ' || *p == '\t') ++p;
30
1.55M
    } while (*p == '#' || *p == '\0');
31
32
    // get key
33
1.17M
    d.key.str = p;
34
5.18M
    while (*p != '\0' &&
35
5.18M
           ((*p != ' ' && *p != '\t' && *p != '#') || *(p-1) == '\\')) ++p;
36
1.17M
    d.key.size = p - d.key.str;
37
38
    // figure out if there is a value and add terminate key
39
1.17M
    d.value.str = p; // in case there is no value
40
1.17M
    d.value.size = 0;
41
1.17M
    if (*p == '#' || *p == '\0') {*p = '\0'; return true;}
42
1.15M
    *p = '\0';
43
44
    // skip any whitespace
45
1.15M
    ++p;
46
4.32M
    while (*p == ' ' || *p == '\t') ++p;
47
1.15M
    if (*p == '\0' || *p == '#') {return true;}
48
49
    // get value
50
1.15M
    d.value.str = p;
51
26.5M
    while (*p != '\0' && (*p != '#' || *(p-1) == '\\')) ++p;
52
    
53
    // remove trailing white space and terminate value
54
1.15M
    --p;
55
1.16M
    while (*p == ' ' || *p == '\t') --p;
56
1.15M
    if (*p == '\\' && *(p + 1) != '\0') ++p;
57
1.15M
    ++p;
58
1.15M
    d.value.size = p - d.value.str;
59
1.15M
    *p = '\0';
60
61
1.15M
    return true;
62
1.15M
  }
63
64
  char * unescape(char * dest, const char * src)
65
49.6k
  {
66
714k
    while (*src) {
67
664k
      if (*src == '\\' && src[1]) {
68
3.46k
  ++src;
69
3.46k
  switch (*src) {
70
477
  case 'n': *dest = '\n'; break;
71
257
  case 'r': *dest = '\r'; break;
72
225
  case 't': *dest = '\t'; break;
73
140
  case 'f': *dest = '\f'; break;
74
90
  case 'v': *dest = '\v'; break;
75
2.27k
  default: *dest = *src;
76
3.46k
  }
77
661k
      } else {
78
661k
  *dest = *src;
79
661k
      }
80
664k
      ++src;
81
664k
      ++dest;
82
664k
    }
83
49.6k
    *dest = '\0';
84
49.6k
    return dest;
85
49.6k
  }
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
48.5k
  {
126
251k
    for (; *str; str++) *str = asc_tolower(*str);
127
48.5k
  }
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.10M
  {
136
3.10M
    char * p   = d.value;
137
3.10M
    char * end = p + d.value.size;
138
3.10M
    d.key.str = p;
139
10.7M
    while (p != end) {
140
10.0M
      ++p;
141
10.0M
      if ((*p == ' ' || *p == '\t') && *(p-1) != '\\') break;
142
10.0M
    }
143
3.10M
    d.key.size = p - d.key.str;
144
3.10M
    *p = 0;
145
3.10M
    if (p != end) {
146
2.32M
      ++p;
147
13.7M
      while (p != end && (*p == ' ' || *p == '\t')) ++p;
148
2.32M
    }
149
3.10M
    d.value.str = p;
150
3.10M
    d.value.size = end - p;
151
3.10M
    return d.key.size != 0;
152
3.10M
  }
153
154
  void init(ParmString str, DataPair & d, String & buf)
155
1.03k
  {
156
1.03k
    const char * s = str;
157
1.03k
    while (*s == ' ' || *s == '\t') ++s;
158
1.03k
    size_t l = str.size() - (s - str);
159
1.03k
    buf.assign(s, l);
160
1.03k
    d.value.str  = buf.mstr();
161
1.03k
    d.value.size = l;
162
1.03k
  }
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
2.20M
  {
174
2.20M
    char * p;
175
    // get first non blank line
176
2.21M
    do {
177
2.21M
      if (!in.getline(buf)) return 0;
178
2.21M
      p = buf.mstr();
179
3.06M
      while (*p == ' ' || *p == '\t') ++p;
180
2.21M
    } while (*p == '#' || *p == '\0');
181
2.20M
    return p;
182
2.20M
  }
183
184
  void remove_comments(String & buf)
185
10.0k
  {
186
10.0k
    char * p = buf.mstr();
187
10.0k
    char * b = p;
188
43.0k
    while (*p && *p != '#') ++p;
189
10.0k
    if (*p == '#') {--p; while (p >= b && asc_isspace(*p)) --p; ++p;}
190
10.0k
    buf.resize(p - b);
191
10.0k
  }
192
193
}