Blame win32/tre.h

Packit Service ff689b
/*
Packit Service ff689b
  tre-internal.h - TRE internal definitions
Packit Service ff689b
Packit Service ff689b
  Copyright (c) 2001-2009 Ville Laurikari <vl@iki.fi>
Packit Service ff689b
  All rights reserved.
Packit Service ff689b
Packit Service ff689b
  Redistribution and use in source and binary forms, with or without
Packit Service ff689b
  modification, are permitted provided that the following conditions
Packit Service ff689b
  are met:
Packit Service ff689b
Packit Service ff689b
    1. Redistributions of source code must retain the above copyright
Packit Service ff689b
       notice, this list of conditions and the following disclaimer.
Packit Service ff689b
Packit Service ff689b
    2. Redistributions in binary form must reproduce the above copyright
Packit Service ff689b
       notice, this list of conditions and the following disclaimer in the
Packit Service ff689b
       documentation and/or other materials provided with the distribution.
Packit Service ff689b
Packit Service ff689b
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND CONTRIBUTORS
Packit Service ff689b
  ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Packit Service ff689b
  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Packit Service ff689b
  A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT
Packit Service ff689b
  HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Packit Service ff689b
  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Packit Service ff689b
  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Packit Service ff689b
  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Packit Service ff689b
  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Packit Service ff689b
  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Packit Service ff689b
  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Packit Service ff689b
Packit Service ff689b
*/
Packit Service ff689b
Packit Service ff689b
#include <regex.h>
Packit Service ff689b
#include <wchar.h>
Packit Service ff689b
#include <wctype.h>
Packit Service ff689b
Packit Service ff689b
#undef  TRE_MBSTATE
Packit Service ff689b
Packit Service ff689b
#define NDEBUG
Packit Service ff689b
Packit Service ff689b
#define TRE_REGEX_T_FIELD __opaque
Packit Service ff689b
typedef int reg_errcode_t;
Packit Service ff689b
Packit Service ff689b
typedef wchar_t tre_char_t;
Packit Service ff689b
Packit Service ff689b
#define DPRINT(msg) do { } while(0)
Packit Service ff689b
Packit Service ff689b
#define elementsof(x) ( sizeof(x) / sizeof(x[0]) )
Packit Service ff689b
Packit Service ff689b
#define tre_mbrtowc(pwc, s, n, ps) (mbtowc((pwc), (s), (n)))
Packit Service ff689b
Packit Service ff689b
/* Wide characters. */
Packit Service ff689b
typedef wint_t tre_cint_t;
Packit Service ff689b
#define TRE_CHAR_MAX 0x10ffff
Packit Service ff689b
Packit Service ff689b
#define tre_isalnum iswalnum
Packit Service ff689b
#define tre_isalpha iswalpha
Packit Service ff689b
#define tre_isblank iswblank
Packit Service ff689b
#define tre_iscntrl iswcntrl
Packit Service ff689b
#define tre_isdigit iswdigit
Packit Service ff689b
#define tre_isgraph iswgraph
Packit Service ff689b
#define tre_islower iswlower
Packit Service ff689b
#define tre_isprint iswprint
Packit Service ff689b
#define tre_ispunct iswpunct
Packit Service ff689b
#define tre_isspace iswspace
Packit Service ff689b
#define tre_isupper iswupper
Packit Service ff689b
#define tre_isxdigit iswxdigit
Packit Service ff689b
Packit Service ff689b
#define tre_tolower towlower
Packit Service ff689b
#define tre_toupper towupper
Packit Service ff689b
#define tre_strlen  wcslen
Packit Service ff689b
Packit Service ff689b
/* Use system provided iswctype() and wctype(). */
Packit Service ff689b
typedef wctype_t tre_ctype_t;
Packit Service ff689b
#define tre_isctype iswctype
Packit Service ff689b
#define tre_ctype   wctype
Packit Service ff689b
Packit Service ff689b
/* Returns number of bytes to add to (char *)ptr to make it
Packit Service ff689b
   properly aligned for the type. */
Packit Service ff689b
#define ALIGN(ptr, type) \
Packit Service ff689b
  ((((long)ptr) % sizeof(type)) \
Packit Service ff689b
   ? (sizeof(type) - (((long)ptr) % sizeof(type))) \
Packit Service ff689b
   : 0)
Packit Service ff689b
Packit Service ff689b
#undef MAX
Packit Service ff689b
#undef MIN
Packit Service ff689b
#define MAX(a, b) (((a) >= (b)) ? (a) : (b))
Packit Service ff689b
#define MIN(a, b) (((a) <= (b)) ? (a) : (b))
Packit Service ff689b
Packit Service ff689b
/* TNFA transition type. A TNFA state is an array of transitions,
Packit Service ff689b
   the terminator is a transition with NULL `state'. */
Packit Service ff689b
typedef struct tnfa_transition tre_tnfa_transition_t;
Packit Service ff689b
Packit Service ff689b
struct tnfa_transition {
Packit Service ff689b
  /* Range of accepted characters. */
Packit Service ff689b
  tre_cint_t code_min;
Packit Service ff689b
  tre_cint_t code_max;
Packit Service ff689b
  /* Pointer to the destination state. */
Packit Service ff689b
  tre_tnfa_transition_t *state;
Packit Service ff689b
  /* ID number of the destination state. */
Packit Service ff689b
  int state_id;
Packit Service ff689b
  /* -1 terminated array of tags (or NULL). */
Packit Service ff689b
  int *tags;
Packit Service ff689b
  /* Assertion bitmap. */
Packit Service ff689b
  int assertions;
Packit Service ff689b
  /* Assertion parameters. */
Packit Service ff689b
  union {
Packit Service ff689b
    /* Character class assertion. */
Packit Service ff689b
    tre_ctype_t class;
Packit Service ff689b
    /* Back reference assertion. */
Packit Service ff689b
    int backref;
Packit Service ff689b
  } u;
Packit Service ff689b
  /* Negative character class assertions. */
Packit Service ff689b
  tre_ctype_t *neg_classes;
Packit Service ff689b
};
Packit Service ff689b
Packit Service ff689b
Packit Service ff689b
/* Assertions. */
Packit Service ff689b
#define ASSERT_AT_BOL     1   /* Beginning of line. */
Packit Service ff689b
#define ASSERT_AT_EOL     2   /* End of line. */
Packit Service ff689b
#define ASSERT_CHAR_CLASS   4   /* Character class in `class'. */
Packit Service ff689b
#define ASSERT_CHAR_CLASS_NEG   8   /* Character classes in `neg_classes'. */
Packit Service ff689b
#define ASSERT_AT_BOW    16   /* Beginning of word. */
Packit Service ff689b
#define ASSERT_AT_EOW    32   /* End of word. */
Packit Service ff689b
#define ASSERT_AT_WB     64   /* Word boundary. */
Packit Service ff689b
#define ASSERT_AT_WB_NEG  128   /* Not a word boundary. */
Packit Service ff689b
#define ASSERT_BACKREF    256   /* A back reference in `backref'. */
Packit Service ff689b
#define ASSERT_LAST   256
Packit Service ff689b
Packit Service ff689b
/* Tag directions. */
Packit Service ff689b
typedef enum {
Packit Service ff689b
  TRE_TAG_MINIMIZE = 0,
Packit Service ff689b
  TRE_TAG_MAXIMIZE = 1
Packit Service ff689b
} tre_tag_direction_t;
Packit Service ff689b
Packit Service ff689b
/* Instructions to compute submatch register values from tag values
Packit Service ff689b
   after a successful match.  */
Packit Service ff689b
struct tre_submatch_data {
Packit Service ff689b
  /* Tag that gives the value for rm_so (submatch start offset). */
Packit Service ff689b
  int so_tag;
Packit Service ff689b
  /* Tag that gives the value for rm_eo (submatch end offset). */
Packit Service ff689b
  int eo_tag;
Packit Service ff689b
  /* List of submatches this submatch is contained in. */
Packit Service ff689b
  int *parents;
Packit Service ff689b
};
Packit Service ff689b
Packit Service ff689b
typedef struct tre_submatch_data tre_submatch_data_t;
Packit Service ff689b
Packit Service ff689b
Packit Service ff689b
/* TNFA definition. */
Packit Service ff689b
typedef struct tnfa tre_tnfa_t;
Packit Service ff689b
Packit Service ff689b
struct tnfa {
Packit Service ff689b
  tre_tnfa_transition_t *transitions;
Packit Service ff689b
  unsigned int num_transitions;
Packit Service ff689b
  tre_tnfa_transition_t *initial;
Packit Service ff689b
  tre_tnfa_transition_t *final;
Packit Service ff689b
  tre_submatch_data_t *submatch_data;
Packit Service ff689b
  char *firstpos_chars;
Packit Service ff689b
  int first_char;
Packit Service ff689b
  unsigned int num_submatches;
Packit Service ff689b
  tre_tag_direction_t *tag_directions;
Packit Service ff689b
  int *minimal_tags;
Packit Service ff689b
  int num_tags;
Packit Service ff689b
  int num_minimals;
Packit Service ff689b
  int end_tag;
Packit Service ff689b
  int num_states;
Packit Service ff689b
  int cflags;
Packit Service ff689b
  int have_backrefs;
Packit Service ff689b
  int have_approx;
Packit Service ff689b
};
Packit Service ff689b
Packit Service ff689b
/* from tre-mem.h: */
Packit Service ff689b
Packit Service ff689b
#define TRE_MEM_BLOCK_SIZE 1024
Packit Service ff689b
Packit Service ff689b
typedef struct tre_list {
Packit Service ff689b
  void *data;
Packit Service ff689b
  struct tre_list *next;
Packit Service ff689b
} tre_list_t;
Packit Service ff689b
Packit Service ff689b
typedef struct tre_mem_struct {
Packit Service ff689b
  tre_list_t *blocks;
Packit Service ff689b
  tre_list_t *current;
Packit Service ff689b
  char *ptr;
Packit Service ff689b
  size_t n;
Packit Service ff689b
  int failed;
Packit Service ff689b
  void **provided;
Packit Service ff689b
} *tre_mem_t;
Packit Service ff689b
Packit Service ff689b
#define tre_mem_new_impl   __tre_mem_new_impl
Packit Service ff689b
#define tre_mem_alloc_impl __tre_mem_alloc_impl
Packit Service ff689b
#define tre_mem_destroy    __tre_mem_destroy
Packit Service ff689b
Packit Service ff689b
tre_mem_t tre_mem_new_impl(int provided, void *provided_block);
Packit Service ff689b
void *tre_mem_alloc_impl(tre_mem_t mem, int provided, void *provided_block,
Packit Service ff689b
                                int zero, size_t size);
Packit Service ff689b
Packit Service ff689b
/* Returns a new memory allocator or NULL if out of memory. */
Packit Service ff689b
#define tre_mem_new()  tre_mem_new_impl(0, NULL)
Packit Service ff689b
Packit Service ff689b
/* Allocates a block of `size' bytes from `mem'.  Returns a pointer to the
Packit Service ff689b
   allocated block or NULL if an underlying malloc() failed. */
Packit Service ff689b
#define tre_mem_alloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 0, size)
Packit Service ff689b
Packit Service ff689b
/* Allocates a block of `size' bytes from `mem'.  Returns a pointer to the
Packit Service ff689b
   allocated block or NULL if an underlying malloc() failed.  The memory
Packit Service ff689b
   is set to zero. */
Packit Service ff689b
#define tre_mem_calloc(mem, size) tre_mem_alloc_impl(mem, 0, NULL, 1, size)
Packit Service ff689b
Packit Service ff689b
#ifdef TRE_USE_ALLOCA
Packit Service ff689b
/* alloca() versions.  Like above, but memory is allocated with alloca()
Packit Service ff689b
   instead of malloc(). */
Packit Service ff689b
Packit Service ff689b
#define tre_mem_newa() \
Packit Service ff689b
  tre_mem_new_impl(1, alloca(sizeof(struct tre_mem_struct)))
Packit Service ff689b
Packit Service ff689b
#define tre_mem_alloca(mem, size)               \
Packit Service ff689b
  ((mem)->n >= (size)                   \
Packit Service ff689b
   ? tre_mem_alloc_impl((mem), 1, NULL, 0, (size))            \
Packit Service ff689b
   : tre_mem_alloc_impl((mem), 1, alloca(TRE_MEM_BLOCK_SIZE), 0, (size)))
Packit Service ff689b
#endif /* TRE_USE_ALLOCA */
Packit Service ff689b
Packit Service ff689b
Packit Service ff689b
/* Frees the memory allocator and all memory allocated with it. */
Packit Service ff689b
void tre_mem_destroy(tre_mem_t mem);
Packit Service ff689b
Packit Service ff689b
#define xmalloc malloc
Packit Service ff689b
#define xcalloc calloc
Packit Service ff689b
#define xfree free
Packit Service ff689b
#define xrealloc realloc