Home | History | Annotate | Line # | Download | only in ure
README revision 1.1.1.1.8.2
      1  1.1.1.1.8.2  lukem #
      2  1.1.1.1.8.2  lukem # $Id: README,v 1.1.1.1.8.2 2008/05/22 14:20:37 lukem Exp $
      3  1.1.1.1.8.2  lukem #
      4  1.1.1.1.8.2  lukem # Copyright 1997, 1998, 1999 Computing Research Labs,
      5  1.1.1.1.8.2  lukem # New Mexico State University
      6  1.1.1.1.8.2  lukem #
      7  1.1.1.1.8.2  lukem # Permission is hereby granted, free of charge, to any person obtaining a
      8  1.1.1.1.8.2  lukem # copy of this software and associated documentation files (the "Software"),
      9  1.1.1.1.8.2  lukem # to deal in the Software without restriction, including without limitation
     10  1.1.1.1.8.2  lukem # the rights to use, copy, modify, merge, publish, distribute, sublicense,
     11  1.1.1.1.8.2  lukem # and/or sell copies of the Software, and to permit persons to whom the
     12  1.1.1.1.8.2  lukem # Software is furnished to do so, subject to the following conditions:
     13  1.1.1.1.8.2  lukem #
     14  1.1.1.1.8.2  lukem # The above copyright notice and this permission notice shall be included in
     15  1.1.1.1.8.2  lukem # all copies or substantial portions of the Software.
     16  1.1.1.1.8.2  lukem #
     17  1.1.1.1.8.2  lukem # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  1.1.1.1.8.2  lukem # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  1.1.1.1.8.2  lukem # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     20  1.1.1.1.8.2  lukem # THE COMPUTING RESEARCH LAB OR NEW MEXICO STATE UNIVERSITY BE LIABLE FOR ANY
     21  1.1.1.1.8.2  lukem # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT
     22  1.1.1.1.8.2  lukem # OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
     23  1.1.1.1.8.2  lukem # THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     24  1.1.1.1.8.2  lukem #
     25  1.1.1.1.8.2  lukem 
     26  1.1.1.1.8.2  lukem 
     27  1.1.1.1.8.2  lukem                        Unicode and Regular Expressions
     28  1.1.1.1.8.2  lukem                                  Version 0.5
     29  1.1.1.1.8.2  lukem 
     30  1.1.1.1.8.2  lukem This is a simple regular expression package for matching against Unicode text
     31  1.1.1.1.8.2  lukem in UCS2 form.  The implementation of this URE package is a variation on the
     32  1.1.1.1.8.2  lukem RE->DFA algorithm done by Mark Hopkins (markh@csd4.csd.uwm.edu).  Mark
     33  1.1.1.1.8.2  lukem Hopkins' algorithm had the virtue of being very simple, so it was used as a
     34  1.1.1.1.8.2  lukem model.
     35  1.1.1.1.8.2  lukem 
     36  1.1.1.1.8.2  lukem ---------------------------------------------------------------------------
     37  1.1.1.1.8.2  lukem 
     38  1.1.1.1.8.2  lukem Assumptions:
     39  1.1.1.1.8.2  lukem 
     40  1.1.1.1.8.2  lukem   o  Regular expression and text already normalized.
     41  1.1.1.1.8.2  lukem 
     42  1.1.1.1.8.2  lukem   o  Conversion to lower case assumes a 1-1 mapping.
     43  1.1.1.1.8.2  lukem 
     44  1.1.1.1.8.2  lukem Definitions:
     45  1.1.1.1.8.2  lukem 
     46  1.1.1.1.8.2  lukem   Separator - any one of U+2028, U+2029, '\n', '\r'.
     47  1.1.1.1.8.2  lukem 
     48  1.1.1.1.8.2  lukem Operators:
     49  1.1.1.1.8.2  lukem   .   - match any character.
     50  1.1.1.1.8.2  lukem   *   - match zero or more of the last subexpression.
     51  1.1.1.1.8.2  lukem   +   - match one or more of the last subexpression.
     52  1.1.1.1.8.2  lukem   ?   - match zero or one of the last subexpression.
     53  1.1.1.1.8.2  lukem   ()  - subexpression grouping.
     54  1.1.1.1.8.2  lukem 
     55  1.1.1.1.8.2  lukem   Notes:
     56  1.1.1.1.8.2  lukem 
     57  1.1.1.1.8.2  lukem     o  The "." operator normally does not match separators, but a flag is
     58  1.1.1.1.8.2  lukem        available for the ure_exec() function that will allow this operator to
     59  1.1.1.1.8.2  lukem        match a separator.
     60  1.1.1.1.8.2  lukem 
     61  1.1.1.1.8.2  lukem Literals and Constants:
     62  1.1.1.1.8.2  lukem 
     63  1.1.1.1.8.2  lukem   c       - literal UCS2 character.
     64  1.1.1.1.8.2  lukem   \x....  - hexadecimal number of up to 4 digits.
     65  1.1.1.1.8.2  lukem   \X....  - hexadecimal number of up to 4 digits.
     66  1.1.1.1.8.2  lukem   \u....  - hexadecimal number of up to 4 digits.
     67  1.1.1.1.8.2  lukem   \U....  - hexadecimal number of up to 4 digits.
     68  1.1.1.1.8.2  lukem 
     69  1.1.1.1.8.2  lukem Character classes:
     70  1.1.1.1.8.2  lukem 
     71  1.1.1.1.8.2  lukem   [...]           - Character class.
     72  1.1.1.1.8.2  lukem   [^...]          - Negated character class.
     73  1.1.1.1.8.2  lukem   \pN1,N2,...,Nn  - Character properties class.
     74  1.1.1.1.8.2  lukem   \PN1,N2,...,Nn  - Negated character properties class.
     75  1.1.1.1.8.2  lukem 
     76  1.1.1.1.8.2  lukem   POSIX character classes recognized:
     77  1.1.1.1.8.2  lukem 
     78  1.1.1.1.8.2  lukem     :alnum:
     79  1.1.1.1.8.2  lukem     :alpha:
     80  1.1.1.1.8.2  lukem     :cntrl:
     81  1.1.1.1.8.2  lukem     :digit:
     82  1.1.1.1.8.2  lukem     :graph:
     83  1.1.1.1.8.2  lukem     :lower:
     84  1.1.1.1.8.2  lukem     :print:
     85  1.1.1.1.8.2  lukem     :punct:
     86  1.1.1.1.8.2  lukem     :space:
     87  1.1.1.1.8.2  lukem     :upper:
     88  1.1.1.1.8.2  lukem     :xdigit:
     89  1.1.1.1.8.2  lukem 
     90  1.1.1.1.8.2  lukem   Notes:
     91  1.1.1.1.8.2  lukem 
     92  1.1.1.1.8.2  lukem     o  Character property classes are \p or \P followed by a comma separated
     93  1.1.1.1.8.2  lukem        list of integers between 1 and 32.  These integers are references to
     94  1.1.1.1.8.2  lukem        the following character properties:
     95  1.1.1.1.8.2  lukem 
     96  1.1.1.1.8.2  lukem         N	Character Property
     97  1.1.1.1.8.2  lukem         --------------------------
     98  1.1.1.1.8.2  lukem         1	_URE_NONSPACING
     99  1.1.1.1.8.2  lukem         2	_URE_COMBINING
    100  1.1.1.1.8.2  lukem         3	_URE_NUMDIGIT
    101  1.1.1.1.8.2  lukem         4	_URE_NUMOTHER
    102  1.1.1.1.8.2  lukem         5	_URE_SPACESEP
    103  1.1.1.1.8.2  lukem         6	_URE_LINESEP
    104  1.1.1.1.8.2  lukem         7	_URE_PARASEP
    105  1.1.1.1.8.2  lukem         8	_URE_CNTRL
    106  1.1.1.1.8.2  lukem         9	_URE_PUA
    107  1.1.1.1.8.2  lukem         10	_URE_UPPER
    108  1.1.1.1.8.2  lukem         11	_URE_LOWER
    109  1.1.1.1.8.2  lukem         12	_URE_TITLE
    110  1.1.1.1.8.2  lukem         13	_URE_MODIFIER
    111  1.1.1.1.8.2  lukem         14	_URE_OTHERLETTER
    112  1.1.1.1.8.2  lukem         15	_URE_DASHPUNCT
    113  1.1.1.1.8.2  lukem         16	_URE_OPENPUNCT
    114  1.1.1.1.8.2  lukem         17	_URE_CLOSEPUNCT
    115  1.1.1.1.8.2  lukem         18	_URE_OTHERPUNCT
    116  1.1.1.1.8.2  lukem         19	_URE_MATHSYM
    117  1.1.1.1.8.2  lukem         20	_URE_CURRENCYSYM
    118  1.1.1.1.8.2  lukem         21	_URE_OTHERSYM
    119  1.1.1.1.8.2  lukem         22	_URE_LTR
    120  1.1.1.1.8.2  lukem         23	_URE_RTL
    121  1.1.1.1.8.2  lukem         24	_URE_EURONUM
    122  1.1.1.1.8.2  lukem         25	_URE_EURONUMSEP
    123  1.1.1.1.8.2  lukem         26	_URE_EURONUMTERM
    124  1.1.1.1.8.2  lukem         27	_URE_ARABNUM
    125  1.1.1.1.8.2  lukem         28	_URE_COMMONSEP
    126  1.1.1.1.8.2  lukem         29	_URE_BLOCKSEP
    127  1.1.1.1.8.2  lukem         30	_URE_SEGMENTSEP
    128  1.1.1.1.8.2  lukem         31	_URE_WHITESPACE
    129  1.1.1.1.8.2  lukem         32	_URE_OTHERNEUT
    130  1.1.1.1.8.2  lukem 
    131  1.1.1.1.8.2  lukem     o  Character classes can contain literals, constants, and character
    132  1.1.1.1.8.2  lukem        property classes. Example:
    133  1.1.1.1.8.2  lukem 
    134  1.1.1.1.8.2  lukem        [abc\U10A\p1,3,4]
    135  1.1.1.1.8.2  lukem 
    136  1.1.1.1.8.2  lukem ---------------------------------------------------------------------------
    137  1.1.1.1.8.2  lukem 
    138  1.1.1.1.8.2  lukem Before using URE
    139  1.1.1.1.8.2  lukem ----------------
    140  1.1.1.1.8.2  lukem Before URE is used, two functions need to be created.  One to check if a
    141  1.1.1.1.8.2  lukem character matches a set of URE character properties, and one to convert a
    142  1.1.1.1.8.2  lukem character to lower case.
    143  1.1.1.1.8.2  lukem 
    144  1.1.1.1.8.2  lukem Stubs for these function are located in the urestubs.c file.
    145  1.1.1.1.8.2  lukem 
    146  1.1.1.1.8.2  lukem Using URE
    147  1.1.1.1.8.2  lukem ---------
    148  1.1.1.1.8.2  lukem 
    149  1.1.1.1.8.2  lukem Sample pseudo-code fragment.
    150  1.1.1.1.8.2  lukem 
    151  1.1.1.1.8.2  lukem   ure_buffer_t rebuf;
    152  1.1.1.1.8.2  lukem   ure_dfa_t dfa;
    153  1.1.1.1.8.2  lukem   ucs2_t *re, *text;
    154  1.1.1.1.8.2  lukem   unsigned long relen, textlen;
    155  1.1.1.1.8.2  lukem   unsigned long match_start, match_end;
    156  1.1.1.1.8.2  lukem 
    157  1.1.1.1.8.2  lukem   /*
    158  1.1.1.1.8.2  lukem    * Allocate the dynamic storage needed to compile regular expressions.
    159  1.1.1.1.8.2  lukem    */
    160  1.1.1.1.8.2  lukem   rebuf = ure_buffer_create();
    161  1.1.1.1.8.2  lukem 
    162  1.1.1.1.8.2  lukem   for each regular expression in a list {
    163  1.1.1.1.8.2  lukem       re = next regular expression;
    164  1.1.1.1.8.2  lukem       relen = length(re);
    165  1.1.1.1.8.2  lukem 
    166  1.1.1.1.8.2  lukem       /*
    167  1.1.1.1.8.2  lukem        * Compile the regular expression with the case insensitive flag
    168  1.1.1.1.8.2  lukem        * turned on.
    169  1.1.1.1.8.2  lukem        */
    170  1.1.1.1.8.2  lukem       dfa = ure_compile(re, relen, 1, rebuf);
    171  1.1.1.1.8.2  lukem 
    172  1.1.1.1.8.2  lukem       /*
    173  1.1.1.1.8.2  lukem        * Look for the first match in some text.  The matching will be done
    174  1.1.1.1.8.2  lukem        * in a case insensitive manner because the expression was compiled
    175  1.1.1.1.8.2  lukem        * with the case insensitive flag on.
    176  1.1.1.1.8.2  lukem        */
    177  1.1.1.1.8.2  lukem       if (ure_exec(dfa, 0, text, textlen, &match_start, &match_end))
    178  1.1.1.1.8.2  lukem         printf("MATCH: %ld %ld\n", match_start, match_end);
    179  1.1.1.1.8.2  lukem 
    180  1.1.1.1.8.2  lukem       /*
    181  1.1.1.1.8.2  lukem        * Look for the first match in some text, ignoring non-spacing
    182  1.1.1.1.8.2  lukem        * characters.
    183  1.1.1.1.8.2  lukem        */
    184  1.1.1.1.8.2  lukem       if (ure_exec(dfa, URE_IGNORE_NONSPACING, text, textlen,
    185  1.1.1.1.8.2  lukem                    &match_start, &match_end))
    186  1.1.1.1.8.2  lukem         printf("MATCH: %ld %ld\n", match_start, match_end);
    187  1.1.1.1.8.2  lukem 
    188  1.1.1.1.8.2  lukem       /*
    189  1.1.1.1.8.2  lukem        * Free the DFA.
    190  1.1.1.1.8.2  lukem        */
    191  1.1.1.1.8.2  lukem       ure_free_dfa(dfa);
    192  1.1.1.1.8.2  lukem   }
    193  1.1.1.1.8.2  lukem 
    194  1.1.1.1.8.2  lukem   /*
    195  1.1.1.1.8.2  lukem    * Free the dynamic storage used for compiling the expressions.
    196  1.1.1.1.8.2  lukem    */
    197  1.1.1.1.8.2  lukem   ure_free_buffer(rebuf);
    198  1.1.1.1.8.2  lukem 
    199  1.1.1.1.8.2  lukem ---------------------------------------------------------------------------
    200  1.1.1.1.8.2  lukem 
    201  1.1.1.1.8.2  lukem Mark Leisher <mleisher (at] crl.nmsu.edu>
    202  1.1.1.1.8.2  lukem 29 March 1997
    203  1.1.1.1.8.2  lukem 
    204  1.1.1.1.8.2  lukem ===========================================================================
    205  1.1.1.1.8.2  lukem 
    206  1.1.1.1.8.2  lukem CHANGES
    207  1.1.1.1.8.2  lukem -------
    208  1.1.1.1.8.2  lukem 
    209  1.1.1.1.8.2  lukem Version: 0.5
    210  1.1.1.1.8.2  lukem Date   : 21 September 1999
    211  1.1.1.1.8.2  lukem ==========================
    212  1.1.1.1.8.2  lukem   1. Added copyright stuff and put in CVS.
    213