Annotation of embedaddon/quagga/bgpd/bgp_regex.c, revision 1.1
1.1 ! misho 1: /* AS regular expression routine
! 2: Copyright (C) 1999 Kunihiro Ishiguro
! 3:
! 4: This file is part of GNU Zebra.
! 5:
! 6: GNU Zebra is free software; you can redistribute it and/or modify it
! 7: under the terms of the GNU General Public License as published by the
! 8: Free Software Foundation; either version 2, or (at your option) any
! 9: later version.
! 10:
! 11: GNU Zebra is distributed in the hope that it will be useful, but
! 12: WITHOUT ANY WARRANTY; without even the implied warranty of
! 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
! 14: General Public License for more details.
! 15:
! 16: You should have received a copy of the GNU General Public License
! 17: along with GNU Zebra; see the file COPYING. If not, write to the Free
! 18: Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
! 19: 02111-1307, USA. */
! 20:
! 21: #include <zebra.h>
! 22:
! 23: #include "log.h"
! 24: #include "command.h"
! 25: #include "memory.h"
! 26:
! 27: #include "bgpd.h"
! 28: #include "bgp_aspath.h"
! 29: #include "bgp_regex.h"
! 30:
! 31: /* Character `_' has special mean. It represents [,{}() ] and the
! 32: beginning of the line(^) and the end of the line ($).
! 33:
! 34: (^|[,{}() ]|$) */
! 35:
! 36: regex_t *
! 37: bgp_regcomp (const char *regstr)
! 38: {
! 39: /* Convert _ character to generic regular expression. */
! 40: int i, j;
! 41: int len;
! 42: int magic = 0;
! 43: char *magic_str;
! 44: char magic_regexp[] = "(^|[,{}() ]|$)";
! 45: int ret;
! 46: regex_t *regex;
! 47:
! 48: len = strlen (regstr);
! 49: for (i = 0; i < len; i++)
! 50: if (regstr[i] == '_')
! 51: magic++;
! 52:
! 53: magic_str = XMALLOC (MTYPE_TMP, len + (14 * magic) + 1);
! 54:
! 55: for (i = 0, j = 0; i < len; i++)
! 56: {
! 57: if (regstr[i] == '_')
! 58: {
! 59: memcpy (magic_str + j, magic_regexp, strlen (magic_regexp));
! 60: j += strlen (magic_regexp);
! 61: }
! 62: else
! 63: magic_str[j++] = regstr[i];
! 64: }
! 65: magic_str[j] = '\0';
! 66:
! 67: regex = XMALLOC (MTYPE_BGP_REGEXP, sizeof (regex_t));
! 68:
! 69: ret = regcomp (regex, magic_str, REG_EXTENDED|REG_NOSUB);
! 70:
! 71: XFREE (MTYPE_TMP, magic_str);
! 72:
! 73: if (ret != 0)
! 74: {
! 75: XFREE (MTYPE_BGP_REGEXP, regex);
! 76: return NULL;
! 77: }
! 78:
! 79: return regex;
! 80: }
! 81:
! 82: int
! 83: bgp_regexec (regex_t *regex, struct aspath *aspath)
! 84: {
! 85: return regexec (regex, aspath->str, 0, NULL, 0);
! 86: }
! 87:
! 88: void
! 89: bgp_regex_free (regex_t *regex)
! 90: {
! 91: regfree (regex);
! 92: XFREE (MTYPE_BGP_REGEXP, regex);
! 93: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>