/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 | | |