📄 valid.c
字号:
/* -*- mode: c; mode: fold -*- */# include "config.h"/*# undef HAVE_REGEX_H*/# include <stdlib.h># include <string.h># include "pager.h"# include "valid.h"valid_t *v_new (char *pattern){ valid_t *v;# if ! HAVE_REGEX_H int cnt, siz; char *ptr, *sav; int n;# endif /* ! HAVE_REGEX_H */ if (v = (valid_t *) malloc (sizeof (valid_t))) {# if HAVE_REGEX_H if (regcomp (& v -> r, pattern, REG_EXTENDED)) { free (v); v = NULL; }# else /* HAVE_REGEX_H */ v -> pats = NULL; v -> lens = NULL; v -> malways = 0; if (! strcmp (pattern, "-")) v -> malways = 1; else if (pattern = strdup (pattern)) { cnt = 0; siz = 0; for (ptr = pattern; ptr; ) { sav = ptr; if (ptr = strchr (ptr, '|')) *ptr++ = '\0'; if (cnt >= siz) { siz += 4; if (! (v -> pats = Realloc (v -> pats, (siz + 1) * sizeof (char *)))) break; } if (! (v -> pats[cnt] = strdup (sav))) { while (--cnt >= 0) free (v -> pats[cnt]); free (v -> pats); v -> pats = NULL; break; } ++cnt; } free (pattern); if (v -> pats) { v -> pats[cnt] = NULL; if (! (v -> lens = (int *) malloc ((cnt + 1) * sizeof (int)))) { for (n = 0; n < cnt; ++n) free (v -> pats[n]); free (v -> pats); v -> pats = NULL; } else for (n = 0; n < cnt; ++n) v -> lens[n] = strlen (v -> pats[n]); } if (! v -> pats) { free (v); v = NULL; } }# endif /* HAVE_REGEX_H */ } return v;}Boolv_alidate (valid_t *v, char *str, int *start, int *end){ Bool ret = False;# if HAVE_REGEX_H regmatch_t mt; if (! regexec (& v -> r, str, 1, & mt, 0)) { *start = mt.rm_so; *end = mt.rm_eo; ret = True; }# else /* HAVE_REGEX_H */ int n; if (v -> pats) { for (n = 0; v -> pats[n]; ++n) if (! strncmp (v -> pats[n], str, v -> lens[n])) break; if (v -> pats[n]) { *start = 0; *end = v -> lens[n]; ret = True; } } else if (v -> malways) { *start = 0; *end = 0; ret = True; }# endif /* HAVE_REGEX_H */ return ret;}voidv_free (valid_t *v){# if HAVE_REGEX_H regfree (& v -> r);# else /* HAVE_REGEX_H */ int n; if (v -> pats) { for (n = 0; v -> pats[n]; ++n) free (v -> pats[n]); free (v -> pats); } if (v -> lens) { free (v -> lens); v -> lens = NULL; }# endif /* HAVE_REGEX_H */ free (v);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -