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 ~FilterHandle()23 FilterHandle::~FilterHandle() 24 { 25 //FIXME: This causes a seg fault 26 //if (handle) dlclose(handle); 27 } 28 Filter()29 Filter::Filter() {} 30 add_filter(IndividualFilter * filter)31 void Filter::add_filter(IndividualFilter * filter) 32 { 33 Filters::iterator cur, end; 34 cur = filters_.begin(); 35 end = filters_.end(); 36 while ((cur != end) && (filter->order_num() > (*cur)->order_num())){ 37 ++cur; 38 } 39 filters_.insert(cur, filter); 40 } 41 reset()42 void Filter::reset() 43 { 44 Filters::iterator cur, end; 45 cur = filters_.begin(); 46 end = filters_.end(); 47 for (; cur != end; ++cur) 48 (*cur)->reset(); 49 } 50 process(FilterChar * & start,FilterChar * & stop)51 void Filter::process(FilterChar * & start, FilterChar * & stop) 52 { 53 Filters::iterator cur, end; 54 cur = filters_.begin(); 55 end = filters_.end(); 56 for (; cur != end; ++cur) 57 (*cur)->process(start, stop); 58 } 59 clear()60 void Filter::clear() 61 { 62 Filters::iterator cur, end; 63 cur = filters_.begin(); 64 end = filters_.end(); 65 for (; cur != end; ++cur){ 66 delete *cur; 67 } 68 filters_.clear(); 69 } 70 ~Filter()71 Filter::~Filter() 72 { 73 clear(); 74 } 75 version_compare(const char * x,const char * y)76 static PosibErr<int> version_compare(const char * x, const char * y) 77 { 78 do { 79 int xn = 0, yn = 0; 80 if (*x) { 81 if (!asc_isdigit(*x)) return make_err(bad_version_string); 82 xn = strtoi_c(x, &x);} 83 if (*y) { 84 if (!asc_isdigit(*y)) return make_err(bad_version_string); 85 yn = strtoi_c(y, &y);} 86 int diff = xn - yn; 87 if (diff != 0) return diff; 88 if (*x) { 89 if (*x != '.') return make_err(bad_version_string); 90 ++x;} 91 if (*y) { 92 if (*y != '.') return make_err(bad_version_string); 93 ++y;} 94 } while (*x || *y); 95 return 0; 96 } 97 verify_version(const char * rel_op,const char * actual,const char * required)98 PosibErr<bool> verify_version(const char * rel_op, 99 const char * actual, const char * required) 100 { 101 assert(actual != NULL && required != NULL); 102 103 RET_ON_ERR_SET(version_compare(actual, required), int, cmp); 104 105 if (cmp == 0 && strchr(rel_op, '=')) return true; 106 if (cmp < 0 && strchr(rel_op, '<')) return true; 107 if (cmp > 0 && strchr(rel_op, '>')) return true; 108 return false; 109 } 110 check_version(const char * requirement)111 PosibErr<void> check_version(const char * requirement) 112 { 113 const char * s = requirement; 114 115 if (*s == '>' || *s == '<') s++; 116 if (*s == '=') s++; 117 118 String rel_op(requirement, s - requirement); 119 String req_ver(s); 120 121 char act_ver[] = PACKAGE_VERSION; 122 123 char * seek = act_ver; 124 while (*seek && *seek != '-') ++seek; // remove any part after the '-' 125 *seek = '\0'; 126 127 PosibErr<bool> peb = verify_version(rel_op.str(), act_ver, req_ver.str()); 128 129 if (peb.has_err()) { 130 peb.ignore_err(); 131 return make_err(confusing_version); 132 } else if ( peb == false ) { 133 return make_err(bad_version); 134 } else { 135 return no_err; 136 } 137 } 138 } 139 140