Coverage Report

Created: 2023-12-08 06:59

/src/aspell/common/filter.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
3
 * license version 2.0 or 2.1.  You should have received a copy of the
4
 * LGPL license along with this library if you did not you can find it
5
 * at http://www.gnu.org/.                                              */
6
7
#include "settings.h"
8
9
#include "config.hpp"
10
#include "filter.hpp"
11
#include "speller.hpp"
12
#include "indiv_filter.hpp"
13
#include "strtonum.hpp"
14
#include "errors.hpp"
15
#include "asc_ctype.hpp"
16
17
#ifdef HAVE_LIBDL
18
#  include <dlfcn.h>
19
#endif
20
21
namespace acommon {
22
23
  FilterHandle::~FilterHandle() 
24
7.22k
  {
25
    //FIXME: This causes a seg fault
26
    //if (handle) dlclose(handle);
27
7.22k
  } 
28
29
9.25k
  Filter::Filter() {}
30
31
  void Filter::add_filter(IndividualFilter * filter)
32
862
  {
33
862
    Filters::iterator cur, end;
34
862
    cur = filters_.begin();
35
862
    end = filters_.end();
36
862
    while ((cur != end) && (filter->order_num() > (*cur)->order_num())){
37
0
      ++cur;
38
0
    }
39
862
    filters_.insert(cur, filter);
40
862
  }
41
42
  void Filter::reset()
43
0
  {
44
0
    Filters::iterator cur, end;
45
0
    cur = filters_.begin();
46
0
    end = filters_.end();
47
0
    for (; cur != end; ++cur)
48
0
      (*cur)->reset();
49
0
  }
50
51
  void Filter::process(FilterChar * & start, FilterChar * & stop)
52
1.33k
  {
53
1.33k
    Filters::iterator cur, end;
54
1.33k
    cur = filters_.begin();
55
1.33k
    end = filters_.end();
56
2.75k
    for (; cur != end; ++cur)
57
1.42k
      (*cur)->process(start, stop);
58
1.33k
  }
59
60
  void Filter::clear()
61
12.7k
  {
62
12.7k
    Filters::iterator cur, end;
63
12.7k
    cur = filters_.begin();
64
12.7k
    end = filters_.end();
65
13.6k
    for (; cur != end; ++cur){
66
862
      delete *cur;
67
862
    }
68
12.7k
    filters_.clear();
69
12.7k
  }
70
71
  Filter::~Filter() 
72
9.25k
  {
73
9.25k
    clear();
74
9.25k
  }
75
76
  static PosibErr<int> version_compare(const char * x, const char * y)
77
0
  {
78
0
    do {
79
0
      int xn = 0, yn = 0;
80
0
      if (*x) {
81
0
        if (!asc_isdigit(*x)) return make_err(bad_version_string);
82
0
        xn = strtoi_c(x, &x);}
83
0
      if (*y) {
84
0
        if (!asc_isdigit(*y)) return make_err(bad_version_string);
85
0
        yn = strtoi_c(y, &y);}
86
0
      int diff = xn - yn;
87
0
      if (diff != 0) return diff;
88
0
      if (*x) {
89
0
        if (*x != '.') return make_err(bad_version_string);
90
0
        ++x;}
91
0
      if (*y) {
92
0
        if (*y != '.') return make_err(bad_version_string);
93
0
        ++y;}
94
0
    } while (*x || *y);
95
0
    return 0;
96
0
  }
97
98
  PosibErr<bool> verify_version(const char * rel_op, 
99
                                const char * actual, const char * required) 
100
0
  {
101
0
    assert(actual != NULL && required != NULL);
102
103
0
    RET_ON_ERR_SET(version_compare(actual, required), int, cmp);
104
105
0
    if (cmp == 0 && strchr(rel_op, '=')) return true;
106
0
    if (cmp < 0  && strchr(rel_op, '<')) return true;
107
0
    if (cmp > 0  && strchr(rel_op, '>')) return true;
108
0
    return false;
109
0
  }
110
111
  PosibErr<void> check_version(const char * requirement)
112
0
  {
113
0
    const char * s = requirement;
114
    
115
0
    if (*s == '>' || *s == '<') s++;
116
0
    if (*s == '=')              s++;
117
118
0
    String rel_op(requirement, s - requirement);
119
0
    String req_ver(s);
120
    
121
0
    char act_ver[] = PACKAGE_VERSION;
122
123
0
    char * seek = act_ver;
124
0
    while (*seek && *seek != '-') ++seek; // remove any part after the '-'
125
0
    *seek = '\0';
126
127
0
    PosibErr<bool> peb = verify_version(rel_op.str(), act_ver, req_ver.str());
128
    
129
0
    if (peb.has_err()) {
130
0
      peb.ignore_err();
131
0
      return make_err(confusing_version);
132
0
    } else if ( peb == false ) {
133
0
      return make_err(bad_version);
134
0
    } else {
135
0
      return no_err;
136
0
    }
137
0
  }
138
}
139