source: regex.c @ d4ecc78

release-1.4release-1.5release-1.6release-1.7release-1.8release-1.9
Last change on this file since d4ecc78 was 41c9a96, checked in by Anders Kaseorg <andersk@mit.edu>, 12 years ago
Reimplement search in terms of owl_regex. The current implementation of stristr has problems and there isn’t a good replacement available. This was its only caller, so we can get rid of it now. Also, this will make it possible to search with arbitrary regexes if someone feels like coming up with a syntax. Signed-off-by: Anders Kaseorg <andersk@mit.edu>
  • Property mode set to 100644
File size: 1.6 KB
Line 
1#include <string.h>
2#include "owl.h"
3
4void owl_regex_init(owl_regex *re)
5{
6  re->negate=0;
7  re->string=NULL;
8}
9
10int owl_regex_create(owl_regex *re, char *string)
11{
12  int ret;
13  char buff1[LINE];
14  char *ptr;
15 
16  re->string=owl_strdup(string);
17
18  ptr=string;
19  re->negate=0;
20  if (string[0]=='!') {
21    ptr++;
22    re->negate=1;
23  }
24
25  /* set the regex */
26  ret=regcomp(&(re->re), ptr, REG_EXTENDED|REG_ICASE);
27  if (ret) {
28    regerror(ret, NULL, buff1, LINE);
29    owl_function_makemsg("Error in regular expression: %s", buff1);
30    owl_free(re->string);
31    re->string=NULL;
32    return(-1);
33  }
34
35  return(0);
36}
37
38int owl_regex_create_quoted(owl_regex *re, char *string)
39{
40  char *quoted;
41 
42  quoted=owl_text_quote(string, OWL_REGEX_QUOTECHARS, OWL_REGEX_QUOTEWITH);
43  owl_regex_create(re, quoted);
44  owl_free(quoted);
45  return(0);
46}
47
48int owl_regex_compare(owl_regex *re, char *string, int *start, int *end)
49{
50  int out, ret;
51  regmatch_t match;
52
53  /* if the regex is not set we match */
54  if (!owl_regex_is_set(re)) {
55    return(0);
56  }
57 
58  ret=regexec(&(re->re), string, 1, &match, 0);
59  out=ret;
60  if (re->negate) {
61    out=!out;
62    match.rm_so = 0;
63    match.rm_eo = strlen(string);
64  }
65  if (start != NULL) *start = match.rm_so;
66  if (end != NULL) *end = match.rm_eo;
67  return(out);
68}
69
70int owl_regex_is_set(owl_regex *re)
71{
72  if (re->string) return(1);
73  return(0);
74}
75
76char *owl_regex_get_string(owl_regex *re)
77{
78  return(re->string);
79}
80
81void owl_regex_copy(owl_regex *a, owl_regex *b)
82{
83  owl_regex_create(b, a->string);
84}
85
86void owl_regex_free(owl_regex *re)
87{
88    if (re->string) {
89        owl_free(re->string);
90        regfree(&(re->re));
91    }
92}
Note: See TracBrowser for help on using the repository browser.