-void check_opt(int argc, char **argv, int n_opt, int n, const char *help) {
- if(n_opt + n >= argc) {
- cerr << "Missing argument for " << argv[n_opt] << "."
- << " "
- << "Expecting " << help << "."
- << endl;
- exit(1);
+void free_matcher(matcher_t *matcher) {
+ if(matcher->nb_patterns >= 0) {
+ delete[] matcher->splitted_patterns;
+ delete[] matcher->patterns;
+ } else {
+ if(!matcher->regexp_error) regfree(&matcher->preg);
+ }
+}
+
+void initialize_matcher(int use_regexp, int case_sensitive,
+ matcher_t *matcher, const char *pattern) {
+
+ if(use_regexp) {
+ matcher->nb_patterns = -1;
+ matcher->regexp_error = regcomp(&matcher->preg, pattern, case_sensitive ? 0 : REG_ICASE);
+ } else {
+ matcher->regexp_error = 0;
+ matcher->nb_patterns = 1;
+ matcher->case_sensitive = case_sensitive;
+
+ for(const char *s = pattern; *s; s++) {
+ if(*s == pattern_separator) {
+ matcher->nb_patterns++;
+ }
+ }
+
+ matcher->splitted_patterns = new char[strlen(pattern) + 1];
+ matcher->patterns = new char*[matcher->nb_patterns];
+
+ strcpy(matcher->splitted_patterns, pattern);
+
+ int n = 0;
+ char *last_pattern_start = matcher->splitted_patterns;
+ for(char *s = matcher->splitted_patterns; n < matcher->nb_patterns; s++) {
+ if(*s == pattern_separator || *s == '\0') {
+ *s = '\0';
+ matcher->patterns[n++] = last_pattern_start;
+ last_pattern_start = s + 1;
+ }
+ }
+ }
+}
+
+//////////////////////////////////////////////////////////////////////
+// Buffer edition
+
+void delete_char(char *buffer, int *position) {
+ if(buffer[*position]) {
+ int c = *position;
+ while(c < buffer_size && buffer[c]) {
+ buffer[c] = buffer[c+1];
+ c++;
+ }
+ }
+}
+
+void backspace_char(char *buffer, int *position) {
+ if(*position > 0) {
+ if(buffer[*position]) {
+ int c = *position - 1;
+ while(buffer[c]) {
+ buffer[c] = buffer[c+1];
+ c++;
+ }
+ } else {
+ buffer[*position - 1] = '\0';
+ }
+
+ (*position)--;