Regex.cc
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:3k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /* 
  2. Copyright (C) 1988 Free Software Foundation
  3.     written by Doug Lea (dl@rocky.oswego.edu)
  4. This file is part of the GNU C++ Library.  This library is free
  5. software; you can redistribute it and/or modify it under the terms of
  6. the GNU Library General Public License as published by the Free
  7. Software Foundation; either version 2 of the License, or (at your
  8. option) any later version.  This library is distributed in the hope
  9. that it will be useful, but WITHOUT ANY WARRANTY; without even the
  10. implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  11. PURPOSE.  See the GNU Library General Public License for more details.
  12. You should have received a copy of the GNU Library General Public
  13. License along with this library; if not, write to the Free Software
  14. Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  15. */
  16. /* 
  17.   Regex class implementation
  18.  */
  19. #ifdef __GNUG__
  20. #pragma implementation
  21. #endif
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <unistd.h>
  25. #include <ctype.h>
  26. #include <new.h>
  27. #include <builtin.h>
  28. extern "C" {
  29. #if 1
  30. #include <rx.h>
  31. #else
  32. #include <regex.h>
  33. #endif
  34. }
  35. #include <Regex.h>
  36. Regex::~Regex()
  37. {
  38.   if (buf->buffer) free(buf->buffer);
  39.   if (buf->fastmap) free(buf->fastmap);
  40.   delete(buf);
  41.   delete(reg);
  42. }
  43. Regex::Regex(const char* t, int fast, int bufsize, 
  44.                const char* transtable)
  45. {
  46.   int tlen = (t == 0)? 0 : strlen(t);
  47.   buf = new re_pattern_buffer;
  48.   memset (buf, 0, sizeof(re_pattern_buffer));
  49.   reg = new re_registers;
  50.   if (fast)
  51.     buf->fastmap = (char*)malloc(256);
  52.   else
  53.     buf->fastmap = 0;
  54.   buf->translate = (unsigned char*)transtable;
  55.   if (tlen > bufsize)
  56.     bufsize = tlen;
  57.   buf->allocated = bufsize;
  58.   buf->buffer = (char *)malloc(buf->allocated);
  59.   const char* msg = re_compile_pattern((const char*)t, tlen, buf);
  60.   if (msg != 0)
  61.     (*lib_error_handler)("Regex", msg);
  62.   else if (fast)
  63.     re_compile_fastmap(buf);
  64. }
  65. int Regex::match_info(int& start, int& length, int nth) const
  66. {
  67.   if ((unsigned)(nth) >= RE_NREGS)
  68.     return 0;
  69.   else
  70.   {
  71.     start = reg->start[nth];
  72.     length = reg->end[nth] - start;
  73.     return start >= 0 && length >= 0;
  74.   }
  75. }
  76. int Regex::search(const char* s, int len, int& matchlen, int startpos) const
  77. {
  78.   int matchpos, pos, range;
  79.   if (startpos >= 0)
  80.   {
  81.     pos = startpos;
  82.     range = len - startpos;
  83.   }
  84.   else
  85.   {
  86.     pos = len + startpos;
  87.     range = -pos;
  88.   }
  89.   matchpos = re_search_2(buf, 0, 0, (char*)s, len, pos, range, reg, len);
  90.   if (matchpos >= 0)
  91.     matchlen = reg->end[0] - reg->start[0];
  92.   else
  93.     matchlen = 0;
  94.   return matchpos;
  95. }
  96. int Regex::match(const char*s, int len, int p) const
  97. {
  98.   if (p < 0)
  99.   {
  100.     p += len;
  101.     if (p > len)
  102.       return -1;
  103.     return re_match_2(buf, 0, 0, (char*)s, p, 0, reg, p);
  104.   }
  105.   else if (p > len)
  106.     return -1;
  107.   else
  108.     return re_match_2(buf, 0, 0, (char*)s, len, p, reg, len);
  109. }
  110. int Regex::OK() const
  111. {
  112. // can't verify much, since we've lost the original string
  113.   int v = buf != 0;             // have a regex buf
  114.   v &= buf->buffer != 0;        // with a pat
  115.   if (!v) (*lib_error_handler)("Regex", "invariant failure");
  116.   return v;
  117. }
  118. /*
  119.  some built-in Regular expressions
  120. */
  121. const Regex RXwhite("[ ntrvf]+", 1);
  122. const Regex RXint("-?[0-9]+", 1);
  123. const Regex RXdouble("-?\(\([0-9]+\.[0-9]*\)\|\([0-9]+\)\|\(\.[0-9]+\)\)\([eE][---+]?[0-9]+\)?", 1, 200);
  124. const Regex RXalpha("[A-Za-z]+", 1);
  125. const Regex RXlowercase("[a-z]+", 1);
  126. const Regex RXuppercase("[A-Z]+", 1);
  127. const Regex RXalphanum("[0-9A-Za-z]+", 1);
  128. const Regex RXidentifier("[A-Za-z_][A-Za-z0-9_]*", 1);