home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 1999 mARCH / PCWK3A99.iso / Linux / DDD331 / DDD-3_1_.000 / DDD-3_1_ / ddd-3.1.1 / ddd / rxclass.h < prev    next >
C/C++ Source or Header  |  1998-03-25  |  6KB  |  197 lines

  1. // $Id: rxclass.h,v 1.17 1998/03/25 12:46:27 zeller Exp $  -*- C++ -*-
  2. // Regular expression class, based on POSIX regcomp()/regexec() interface
  3.  
  4. // Copyright (C) 1996 Technische Universitaet Braunschweig, Germany.
  5. // Written by Andreas Zeller <zeller@ips.cs.tu-bs.de>.
  6. // 
  7. // This file is part of DDD.
  8. // 
  9. // DDD is free software; you can redistribute it and/or
  10. // modify it under the terms of the GNU General Public
  11. // License as published by the Free Software Foundation; either
  12. // version 2 of the License, or (at your option) any later version.
  13. // 
  14. // DDD is distributed in the hope that it will be useful,
  15. // but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  17. // See the GNU General Public License for more details.
  18. // 
  19. // You should have received a copy of the GNU General Public
  20. // License along with DDD -- see the file COPYING.
  21. // If not, write to the Free Software Foundation, Inc.,
  22. // 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  23. // 
  24. // DDD is the data display debugger.
  25. // For details, see the DDD World-Wide-Web page, 
  26. // `http://www.cs.tu-bs.de/softech/ddd/',
  27. // or send a mail to the DDD developers <ddd@ips.cs.tu-bs.de>.
  28.  
  29. #ifndef _ICE_rxclass_h
  30. #define _ICE_rxclass_h
  31.  
  32. #ifdef __GNUG__
  33. #pragma interface
  34. #endif
  35.  
  36. #include "config.h"
  37. #include "bool.h"
  38.  
  39. #ifndef WITH_RUNTIME_REGEX
  40. #define WITH_RUNTIME_REGEX 1
  41. #endif
  42.  
  43. #if WITH_RUNTIME_REGEX
  44. extern "C" {
  45. #include <sys/types.h>
  46.  
  47. // Avoid conflicts with `regex()' function
  48. #define regex c_regex
  49.  
  50. // Don't include old libg++ `regex.h' contents
  51. #define __REGEXP_LIBRARY
  52.  
  53. #ifndef __STDC__
  54. #define __STDC__ 1              // Reguired for KCC when using GNU includes
  55. #endif
  56.  
  57. #if HAVE_REGCOMP && HAVE_REGEXEC && !REGCOMP_BROKEN
  58.  
  59. // Some old versions of libg++ contain a `regex.h' file.  Avoid this.
  60. #if !defined(REG_EXTENDED) && HAVE_REGEX_H
  61. #include <regex.h>        // POSIX.2 interface
  62. #endif
  63.  
  64. // Try hard-wired path to get native <regex.h>.
  65. #if !defined(REG_EXTENDED) && HAVE_REGEX_H
  66. #include </usr/include/regex.h>    // POSIX.2 interface
  67. #endif
  68.  
  69. // Some more GNU headers.
  70. #if !defined(REG_EXTENDED) && HAVE_RX_H
  71. #include <rx.h>                 // Header from GNU rx 0.07
  72. #endif
  73.  
  74. #if !defined(REG_EXTENDED) && HAVE_RXPOSIX_H
  75. #include <rxposix.h>        // Header from GNU rx 1.0 and later
  76. #endif
  77.  
  78. #endif // !defined(REGCOMP_BROKEN)
  79.  
  80. // Use GNU rx as shipped with DDD.
  81. #if !defined(REG_EXTENDED)
  82. #include <librx/rx.h>        // Header from GNU rx 0.07, as shipped with DDD
  83. #define GNU_LIBrx_USED
  84. #endif
  85.  
  86. #undef regex
  87.  
  88. #ifdef RE_DUP_MAX
  89. #undef RE_DUP_MAX        // Avoid trouble with later redefinitions
  90. #endif
  91. }
  92. #endif // WITH_RUNTIME_REGEX
  93.  
  94. // Iff S is matched at POS, return length of matched string; 
  95. // -1, otherwise.  LEN is the length of S.
  96. typedef int (*rxmatchproc)(void *data, const char *s, int len, int pos);
  97.  
  98. // This `regex' class is similar to Doug Lea's libg++ `Regex' class,
  99. // except that we use extended regexps and rely on POSIX.2 functions.
  100.  
  101. class regex
  102. {
  103. protected:
  104. #if WITH_RUNTIME_REGEX
  105.     regex_t compiled;        // "^" + regexp
  106.     char prefix[32];        // constant prefix (for faster search)
  107.  
  108.     regmatch_t *exprs;        // Matched expressions
  109.     size_t nexprs() const;    // Number of expressions
  110.  
  111.     // Fatal error ERRCODE with regexp source SRC
  112.     void fatal(int errcode, const char *src = 0);
  113.  
  114.     // Create a prefix from T and FLAGS
  115.     static char get_prefix(const char *& t, int flags);
  116. #endif
  117.  
  118.     // For regexes supplying their own function
  119.     rxmatchproc matcher;
  120.     void *data;
  121.  
  122. public:
  123. #if WITH_RUNTIME_REGEX
  124.     // Create and compile an (extended) regular expression in T.
  125.     regex(const char* t, int flags = REG_EXTENDED);
  126. #endif
  127.  
  128.     // Alternate version supplying its own match function
  129.     regex(rxmatchproc p, void *data);
  130.  
  131.     // Destructor
  132.     ~regex();
  133.  
  134.     // Iff T matches S at POS, return length of matched string;
  135.     // -1, otherwise.  LEN is the length of S.
  136.     int match(const char* s, int len, int pos = 0) const;
  137.  
  138.     // Search T in S; return position of first occurrence.
  139.     // If STARTPOS is positive, start search from that position.
  140.     // If STARTPOS is negative, perform reverse search from that position 
  141.     // and return last occurrence.
  142.     // LEN is the length of S.
  143.     // MATCHLEN contains the length of the matched expression.
  144.     // If T is not found, return -1.
  145.     int search(const char* s, int len, 
  146.            int& matchlen, int startpos = 0) const;
  147.  
  148. #if WITH_RUNTIME_REGEX
  149.     // Return matching info for NTH expression in START and LENGTH
  150.     // Expression 0 is the entire regexp T; expression 1 and later are
  151.     // the subexpressions of T.  Returns true iff successful.
  152.     bool match_info(int& start, int& length, int nth = 0) const;
  153. #endif
  154.  
  155.     bool OK() const;  // Representation invariant
  156.  
  157. private:
  158.     regex(const regex&) :
  159. #if WITH_RUNTIME_REGEX
  160.     exprs(0),
  161. #endif
  162.     matcher(0), data(0) {} // no X(X&)
  163.  
  164.     regex& operator = (const regex&) { return *this; } // no assignment
  165. };
  166.  
  167. #if WITH_RUNTIME_REGEX
  168. // Return number of expressions
  169. inline size_t regex::nexprs() const
  170. {
  171. #if HAVE_REGEX_T_RE_NSUB
  172.     return compiled.re_nsub + 1;
  173. #elif HAVE_REGEX_T_N_SUBEXPS
  174.     return compiled.n_subexps + 1;
  175. #else
  176.     return 32;  // Should be sufficient
  177. #endif
  178. }
  179. #endif
  180.  
  181. #if WITH_RUNTIME_REGEX
  182. // Some built-in regular expressions
  183. extern const regex rxwhite;          // = "[ \n\t\r\v\f]+"
  184. extern const regex rxint;            // = "-?[0-9]+"
  185. extern const regex rxdouble;         // = "-?(([0-9]+.[0-9]*)|
  186.                                      //    ([0-9]+)|(.[0-9]+))
  187.                                      //    ([eE][---+]?[0-9]+)?"
  188. extern const regex rxalpha;          // = "[A-Za-z]+"
  189. extern const regex rxlowercase;      // = "[a-z]+"
  190. extern const regex rxuppercase;      // = "[A-Z]+"
  191. extern const regex rxalphanum;       // = "[0-9A-Za-z]+"
  192. extern const regex rxidentifier;     // = "[A-Za-z_][A-Za-z0-9_]*"
  193. #endif
  194.  
  195. #endif // _ICE_rxclass_h
  196. // DON'T ADD ANYTHING behind this #endif
  197.