File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / quagga / bgpd / bgp_regex.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 17:26:11 2012 UTC (12 years, 4 months ago) by misho
Branches: quagga, MAIN
CVS tags: v0_99_22p0, v0_99_22, v0_99_21, v0_99_20_1, v0_99_20, HEAD
quagga

    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>