Coverage Report

Created: 2026-01-17 06:12

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/aspell/common/itemize.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
#include <stdlib.h>
9
10
#include "asc_ctype.hpp"
11
#include "itemize.hpp"
12
#include "mutable_container.hpp"
13
#include <stdio.h>
14
#include <cstdio>
15
16
//FIXME: it should be possible to escape ',' '+' '-' '!' so that they can
17
//       appear in values
18
//       If '\' is used, then what about when the option file is parsed
19
//         as it strips away all '\' escapes.
20
21
namespace acommon {
22
23
  struct ItemizeItem {
24
    char   action;
25
    const char * name;
26
884
    ItemizeItem() : action('\0'), name(0) {}
27
  };
28
29
  class ItemizeTokenizer {
30
  private:
31
    char * list;
32
    char * i;
33
  public:
34
    ItemizeTokenizer(const char * l);
35
    ~ItemizeTokenizer();
36
  private:
37
    ItemizeTokenizer(const ItemizeTokenizer & other) ;
38
    ItemizeTokenizer & operator=(const ItemizeTokenizer & other);
39
  public:
40
    ItemizeItem next();
41
  };
42
43
  ItemizeTokenizer::ItemizeTokenizer(const char * l) 
44
221
  {
45
221
    size_t size = strlen(l) + 1;
46
221
    list = new char[size];
47
221
    i = list;
48
221
    strncpy(list, l, size);
49
221
  }
50
51
  ItemizeTokenizer::~ItemizeTokenizer() 
52
221
  {
53
221
    delete[] list;
54
221
  }
55
56
57
  ItemizeItem ItemizeTokenizer::next() 
58
663
  {
59
663
    ItemizeItem li;
60
663
    while (*i != '\0' && (asc_isspace(*i) || *i == ',')) ++i;
61
663
    if (*i == '\0') return li;
62
442
    li.action = *i;
63
442
    if (*i == '+' || *i == '-') {
64
0
      ++i;
65
442
    } else if (*i == '!') {
66
0
      li.name = "";
67
0
      ++i;
68
0
      return li;
69
442
    } else {
70
442
      li.action = '+';
71
442
    }
72
442
    while (*i != '\0' && *i != ',' && asc_isspace(*i)) ++i;
73
442
    if (*i == '\0' || *i == ',') return next();
74
442
    li.name = i;
75
3.09k
    while (*i != '\0' && *i != ',') ++i;
76
442
    while (i != list && asc_isspace(*(i-1))) --i;
77
442
    if (*i != '\0') {
78
221
      *i = '\0';
79
221
      ++i;
80
221
    }
81
442
    return li;
82
442
  }
83
84
85
221
  PosibErr<void> itemize (ParmString s, MutableContainer & d) {
86
221
    ItemizeTokenizer els(s);
87
221
    ItemizeItem li;
88
663
    while (li = els.next(), li.name != 0) {
89
442
      switch (li.action) {
90
442
      case '+':
91
442
  RET_ON_ERR(d.add(li.name));
92
442
  break;
93
442
      case '-':
94
0
  RET_ON_ERR(d.remove(li.name));
95
0
  break;
96
0
      case '!':
97
0
  RET_ON_ERR(d.clear());
98
0
  break;
99
0
      default:
100
0
  abort();
101
442
      }
102
442
    }
103
221
    return no_err;
104
221
  }
105
106
}