This commit was manufactured by cvs2svn to create tag 'ALPHA_3_8'.
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/tags/ALPHA_3_8@10995 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -1,778 +0,0 @@
|
|||||||
/*
|
|
||||||
* colorings of characters
|
|
||||||
* This file is #included by regcomp.c.
|
|
||||||
*
|
|
||||||
* Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.
|
|
||||||
*
|
|
||||||
* Development of this software was funded, in part, by Cray Research Inc.,
|
|
||||||
* UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
|
|
||||||
* Corporation, none of whom are responsible for the results. The author
|
|
||||||
* thanks all of them.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms -- with or without
|
|
||||||
* modification -- are permitted for any purpose, provided that
|
|
||||||
* redistributions in source form retain this entire copyright notice and
|
|
||||||
* indicate the origin and nature of any modifications.
|
|
||||||
*
|
|
||||||
* I'd appreciate being given credit for this package in the documentation
|
|
||||||
* of software which uses it, but that is not a requirement.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
||||||
* HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Note that there are some incestuous relationships between this code and
|
|
||||||
* NFA arc maintenance, which perhaps ought to be cleaned up sometime.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define CISERR() VISERR(cm->v)
|
|
||||||
#define CERR(e) VERR(cm->v, (e))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
- initcm - set up new colormap
|
|
||||||
^ static VOID initcm(struct vars *, struct colormap *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
initcm(v, cm)
|
|
||||||
struct vars *v;
|
|
||||||
struct colormap *cm;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
int j;
|
|
||||||
union tree *t;
|
|
||||||
union tree *nextt;
|
|
||||||
struct colordesc *cd;
|
|
||||||
|
|
||||||
cm->magic = CMMAGIC;
|
|
||||||
cm->v = v;
|
|
||||||
|
|
||||||
cm->ncds = NINLINECDS;
|
|
||||||
cm->cd = cm->cdspace;
|
|
||||||
cm->max = 0;
|
|
||||||
cm->free = 0;
|
|
||||||
|
|
||||||
cd = cm->cd; /* cm->cd[WHITE] */
|
|
||||||
cd->sub = NOSUB;
|
|
||||||
cd->arcs = NULL;
|
|
||||||
cd->flags = 0;
|
|
||||||
cd->nchrs = CHR_MAX - CHR_MIN + 1;
|
|
||||||
|
|
||||||
/* upper levels of tree */
|
|
||||||
for (t = &cm->tree[0], j = NBYTS-1; j > 0; t = nextt, j--) {
|
|
||||||
nextt = t + 1;
|
|
||||||
for (i = BYTTAB-1; i >= 0; i--)
|
|
||||||
t->tptr[i] = nextt;
|
|
||||||
}
|
|
||||||
/* bottom level is solid white */
|
|
||||||
t = &cm->tree[NBYTS-1];
|
|
||||||
for (i = BYTTAB-1; i >= 0; i--)
|
|
||||||
t->tcolor[i] = WHITE;
|
|
||||||
cd->block = t;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- freecm - free dynamically-allocated things in a colormap
|
|
||||||
^ static VOID freecm(struct colormap *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
freecm(cm)
|
|
||||||
struct colormap *cm;
|
|
||||||
{
|
|
||||||
size_t i;
|
|
||||||
union tree *cb;
|
|
||||||
|
|
||||||
cm->magic = 0;
|
|
||||||
if (NBYTS > 1)
|
|
||||||
cmtreefree(cm, cm->tree, 0);
|
|
||||||
for (i = 1; i <= cm->max; i++) /* skip WHITE */
|
|
||||||
if (!UNUSEDCOLOR(&cm->cd[i])) {
|
|
||||||
cb = cm->cd[i].block;
|
|
||||||
if (cb != NULL)
|
|
||||||
FREE(cb);
|
|
||||||
}
|
|
||||||
if (cm->cd != cm->cdspace)
|
|
||||||
FREE(cm->cd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- cmtreefree - free a non-terminal part of a colormap tree
|
|
||||||
^ static VOID cmtreefree(struct colormap *, union tree *, int);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
cmtreefree(cm, tree, level)
|
|
||||||
struct colormap *cm;
|
|
||||||
union tree *tree;
|
|
||||||
int level; /* level number (top == 0) of this block */
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
union tree *t;
|
|
||||||
union tree *fillt = &cm->tree[level+1];
|
|
||||||
union tree *cb;
|
|
||||||
|
|
||||||
assert(level < NBYTS-1); /* this level has pointers */
|
|
||||||
for (i = BYTTAB-1; i >= 0; i--) {
|
|
||||||
t = tree->tptr[i];
|
|
||||||
assert(t != NULL);
|
|
||||||
if (t != fillt) {
|
|
||||||
if (level < NBYTS-2) { /* more pointer blocks below */
|
|
||||||
cmtreefree(cm, t, level+1);
|
|
||||||
FREE(t);
|
|
||||||
} else { /* color block below */
|
|
||||||
cb = cm->cd[t->tcolor[0]].block;
|
|
||||||
if (t != cb) /* not a solid block */
|
|
||||||
FREE(t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- setcolor - set the color of a character in a colormap
|
|
||||||
^ static color setcolor(struct colormap *, pchr, pcolor);
|
|
||||||
*/
|
|
||||||
static color /* previous color */
|
|
||||||
setcolor(cm, c, co)
|
|
||||||
struct colormap *cm;
|
|
||||||
pchr c;
|
|
||||||
pcolor co;
|
|
||||||
{
|
|
||||||
uchr uc = c;
|
|
||||||
int shift;
|
|
||||||
int level;
|
|
||||||
int b;
|
|
||||||
int bottom;
|
|
||||||
union tree *t;
|
|
||||||
union tree *newt;
|
|
||||||
union tree *fillt;
|
|
||||||
union tree *lastt;
|
|
||||||
union tree *cb;
|
|
||||||
color prev;
|
|
||||||
|
|
||||||
assert(cm->magic == CMMAGIC);
|
|
||||||
if (CISERR() || co == COLORLESS)
|
|
||||||
return COLORLESS;
|
|
||||||
|
|
||||||
t = cm->tree;
|
|
||||||
for (level = 0, shift = BYTBITS * (NBYTS - 1); shift > 0;
|
|
||||||
level++, shift -= BYTBITS) {
|
|
||||||
b = (uc >> shift) & BYTMASK;
|
|
||||||
lastt = t;
|
|
||||||
t = lastt->tptr[b];
|
|
||||||
assert(t != NULL);
|
|
||||||
fillt = &cm->tree[level+1];
|
|
||||||
bottom = (shift <= BYTBITS) ? 1 : 0;
|
|
||||||
cb = (bottom) ? cm->cd[t->tcolor[0]].block : fillt;
|
|
||||||
if (t == fillt || t == cb) { /* must allocate a new block */
|
|
||||||
newt = (union tree *)MALLOC((bottom) ?
|
|
||||||
sizeof(struct colors) : sizeof(struct ptrs));
|
|
||||||
if (newt == NULL) {
|
|
||||||
CERR(REG_ESPACE);
|
|
||||||
return COLORLESS;
|
|
||||||
}
|
|
||||||
if (bottom)
|
|
||||||
memcpy(VS(newt->tcolor), VS(t->tcolor),
|
|
||||||
BYTTAB*sizeof(color));
|
|
||||||
else
|
|
||||||
memcpy(VS(newt->tptr), VS(t->tptr),
|
|
||||||
BYTTAB*sizeof(union tree *));
|
|
||||||
t = newt;
|
|
||||||
lastt->tptr[b] = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
b = uc & BYTMASK;
|
|
||||||
prev = t->tcolor[b];
|
|
||||||
t->tcolor[b] = (color)co;
|
|
||||||
return prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- maxcolor - report largest color number in use
|
|
||||||
^ static color maxcolor(struct colormap *);
|
|
||||||
*/
|
|
||||||
static color
|
|
||||||
maxcolor(cm)
|
|
||||||
struct colormap *cm;
|
|
||||||
{
|
|
||||||
if (CISERR())
|
|
||||||
return COLORLESS;
|
|
||||||
|
|
||||||
return (color)cm->max;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- newcolor - find a new color (must be subject of setcolor at once)
|
|
||||||
* Beware: may relocate the colordescs.
|
|
||||||
^ static color newcolor(struct colormap *);
|
|
||||||
*/
|
|
||||||
static color /* COLORLESS for error */
|
|
||||||
newcolor(cm)
|
|
||||||
struct colormap *cm;
|
|
||||||
{
|
|
||||||
struct colordesc *cd;
|
|
||||||
struct colordesc *new;
|
|
||||||
size_t n;
|
|
||||||
|
|
||||||
if (CISERR())
|
|
||||||
return COLORLESS;
|
|
||||||
|
|
||||||
if (cm->free != 0) {
|
|
||||||
assert(cm->free > 0);
|
|
||||||
assert((size_t)cm->free < cm->ncds);
|
|
||||||
cd = &cm->cd[cm->free];
|
|
||||||
assert(UNUSEDCOLOR(cd));
|
|
||||||
assert(cd->arcs == NULL);
|
|
||||||
cm->free = cd->sub;
|
|
||||||
} else if (cm->max < cm->ncds - 1) {
|
|
||||||
cm->max++;
|
|
||||||
cd = &cm->cd[cm->max];
|
|
||||||
} else {
|
|
||||||
/* oops, must allocate more */
|
|
||||||
n = cm->ncds * 2;
|
|
||||||
if (cm->cd == cm->cdspace) {
|
|
||||||
new = (struct colordesc *)MALLOC(n *
|
|
||||||
sizeof(struct colordesc));
|
|
||||||
if (new != NULL)
|
|
||||||
memcpy(VS(new), VS(cm->cdspace), cm->ncds *
|
|
||||||
sizeof(struct colordesc));
|
|
||||||
} else
|
|
||||||
new = (struct colordesc *)REALLOC(cm->cd,
|
|
||||||
n * sizeof(struct colordesc));
|
|
||||||
if (new == NULL) {
|
|
||||||
CERR(REG_ESPACE);
|
|
||||||
return COLORLESS;
|
|
||||||
}
|
|
||||||
cm->cd = new;
|
|
||||||
cm->ncds = n;
|
|
||||||
assert(cm->max < cm->ncds - 1);
|
|
||||||
cm->max++;
|
|
||||||
cd = &cm->cd[cm->max];
|
|
||||||
}
|
|
||||||
|
|
||||||
cd->nchrs = 0;
|
|
||||||
cd->sub = NOSUB;
|
|
||||||
cd->arcs = NULL;
|
|
||||||
cd->flags = 0;
|
|
||||||
cd->block = NULL;
|
|
||||||
|
|
||||||
return (color)(cd - cm->cd);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- freecolor - free a color (must have no arcs or subcolor)
|
|
||||||
^ static VOID freecolor(struct colormap *, pcolor);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
freecolor(cm, co)
|
|
||||||
struct colormap *cm;
|
|
||||||
pcolor co;
|
|
||||||
{
|
|
||||||
struct colordesc *cd = &cm->cd[co];
|
|
||||||
color pco, nco; /* for freelist scan */
|
|
||||||
|
|
||||||
assert(co >= 0);
|
|
||||||
if (co == WHITE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
assert(cd->arcs == NULL);
|
|
||||||
assert(cd->sub == NOSUB);
|
|
||||||
assert(cd->nchrs == 0);
|
|
||||||
cd->flags = FREECOL;
|
|
||||||
if (cd->block != NULL) {
|
|
||||||
FREE(cd->block);
|
|
||||||
cd->block = NULL; /* just paranoia */
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((size_t)co == cm->max) {
|
|
||||||
while (cm->max > WHITE && UNUSEDCOLOR(&cm->cd[cm->max]))
|
|
||||||
cm->max--;
|
|
||||||
assert(cm->free >= 0);
|
|
||||||
while ((size_t)cm->free > cm->max)
|
|
||||||
cm->free = cm->cd[cm->free].sub;
|
|
||||||
if (cm->free > 0) {
|
|
||||||
assert(cm->free < cm->max);
|
|
||||||
pco = cm->free;
|
|
||||||
nco = cm->cd[pco].sub;
|
|
||||||
while (nco > 0)
|
|
||||||
if ((size_t)nco > cm->max) {
|
|
||||||
/* take this one out of freelist */
|
|
||||||
nco = cm->cd[nco].sub;
|
|
||||||
cm->cd[pco].sub = nco;
|
|
||||||
} else {
|
|
||||||
assert(nco < cm->max);
|
|
||||||
pco = nco;
|
|
||||||
nco = cm->cd[pco].sub;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
cd->sub = cm->free;
|
|
||||||
cm->free = (color)(cd - cm->cd);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- pseudocolor - allocate a false color, to be managed by other means
|
|
||||||
^ static color pseudocolor(struct colormap *);
|
|
||||||
*/
|
|
||||||
static color
|
|
||||||
pseudocolor(cm)
|
|
||||||
struct colormap *cm;
|
|
||||||
{
|
|
||||||
color co;
|
|
||||||
|
|
||||||
co = newcolor(cm);
|
|
||||||
if (CISERR())
|
|
||||||
return COLORLESS;
|
|
||||||
cm->cd[co].nchrs = 1;
|
|
||||||
cm->cd[co].flags = PSEUDO;
|
|
||||||
return co;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- subcolor - allocate a new subcolor (if necessary) to this chr
|
|
||||||
^ static color subcolor(struct colormap *, pchr c);
|
|
||||||
*/
|
|
||||||
static color
|
|
||||||
subcolor(cm, c)
|
|
||||||
struct colormap *cm;
|
|
||||||
pchr c;
|
|
||||||
{
|
|
||||||
color co; /* current color of c */
|
|
||||||
color sco; /* new subcolor */
|
|
||||||
|
|
||||||
co = GETCOLOR(cm, c);
|
|
||||||
sco = newsub(cm, co);
|
|
||||||
if (CISERR())
|
|
||||||
return COLORLESS;
|
|
||||||
assert(sco != COLORLESS);
|
|
||||||
|
|
||||||
if (co == sco) /* already in an open subcolor */
|
|
||||||
return co; /* rest is redundant */
|
|
||||||
cm->cd[co].nchrs--;
|
|
||||||
cm->cd[sco].nchrs++;
|
|
||||||
setcolor(cm, c, sco);
|
|
||||||
return sco;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- newsub - allocate a new subcolor (if necessary) for a color
|
|
||||||
^ static color newsub(struct colormap *, pcolor);
|
|
||||||
*/
|
|
||||||
static color
|
|
||||||
newsub(cm, co)
|
|
||||||
struct colormap *cm;
|
|
||||||
pcolor co;
|
|
||||||
{
|
|
||||||
color sco; /* new subcolor */
|
|
||||||
|
|
||||||
sco = cm->cd[co].sub;
|
|
||||||
if (sco == NOSUB) { /* color has no open subcolor */
|
|
||||||
if (cm->cd[co].nchrs == 1) /* optimization */
|
|
||||||
return co;
|
|
||||||
sco = newcolor(cm); /* must create subcolor */
|
|
||||||
if (sco == COLORLESS) {
|
|
||||||
assert(CISERR());
|
|
||||||
return COLORLESS;
|
|
||||||
}
|
|
||||||
cm->cd[co].sub = sco;
|
|
||||||
cm->cd[sco].sub = sco; /* open subcolor points to self */
|
|
||||||
}
|
|
||||||
assert(sco != NOSUB);
|
|
||||||
|
|
||||||
return sco;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- subrange - allocate new subcolors to this range of chrs, fill in arcs
|
|
||||||
^ static VOID subrange(struct vars *, pchr, pchr, struct state *,
|
|
||||||
^ struct state *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
subrange(v, from, to, lp, rp)
|
|
||||||
struct vars *v;
|
|
||||||
pchr from;
|
|
||||||
pchr to;
|
|
||||||
struct state *lp;
|
|
||||||
struct state *rp;
|
|
||||||
{
|
|
||||||
uchr uf;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
assert(from <= to);
|
|
||||||
|
|
||||||
/* first, align "from" on a tree-block boundary */
|
|
||||||
uf = (uchr)from;
|
|
||||||
i = (int)( ((uf + BYTTAB-1) & (uchr)~BYTMASK) - uf );
|
|
||||||
for (; from <= to && i > 0; i--, from++)
|
|
||||||
newarc(v->nfa, PLAIN, subcolor(v->cm, from), lp, rp);
|
|
||||||
if (from > to) /* didn't reach a boundary */
|
|
||||||
return;
|
|
||||||
|
|
||||||
/* deal with whole blocks */
|
|
||||||
for (; to - from >= BYTTAB; from += BYTTAB)
|
|
||||||
subblock(v, from, lp, rp);
|
|
||||||
|
|
||||||
/* clean up any remaining partial table */
|
|
||||||
for (; from <= to; from++)
|
|
||||||
newarc(v->nfa, PLAIN, subcolor(v->cm, from), lp, rp);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- subblock - allocate new subcolors for one tree block of chrs, fill in arcs
|
|
||||||
^ static VOID subblock(struct vars *, pchr, struct state *, struct state *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
subblock(v, start, lp, rp)
|
|
||||||
struct vars *v;
|
|
||||||
pchr start; /* first of BYTTAB chrs */
|
|
||||||
struct state *lp;
|
|
||||||
struct state *rp;
|
|
||||||
{
|
|
||||||
uchr uc = start;
|
|
||||||
struct colormap *cm = v->cm;
|
|
||||||
int shift;
|
|
||||||
int level;
|
|
||||||
int i;
|
|
||||||
int b;
|
|
||||||
union tree *t;
|
|
||||||
union tree *cb;
|
|
||||||
union tree *fillt;
|
|
||||||
union tree *lastt;
|
|
||||||
int previ;
|
|
||||||
int ndone;
|
|
||||||
color co;
|
|
||||||
color sco;
|
|
||||||
|
|
||||||
assert((uc % BYTTAB) == 0);
|
|
||||||
|
|
||||||
/* find its color block, making new pointer blocks as needed */
|
|
||||||
t = cm->tree;
|
|
||||||
fillt = NULL;
|
|
||||||
for (level = 0, shift = BYTBITS * (NBYTS - 1); shift > 0;
|
|
||||||
level++, shift -= BYTBITS) {
|
|
||||||
b = (uc >> shift) & BYTMASK;
|
|
||||||
lastt = t;
|
|
||||||
t = lastt->tptr[b];
|
|
||||||
assert(t != NULL);
|
|
||||||
fillt = &cm->tree[level+1];
|
|
||||||
if (t == fillt && shift > BYTBITS) { /* need new ptr block */
|
|
||||||
t = (union tree *)MALLOC(sizeof(struct ptrs));
|
|
||||||
if (t == NULL) {
|
|
||||||
CERR(REG_ESPACE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
memcpy(VS(t->tptr), VS(fillt->tptr),
|
|
||||||
BYTTAB*sizeof(union tree *));
|
|
||||||
lastt->tptr[b] = t;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* special cases: fill block or solid block */
|
|
||||||
co = t->tcolor[0];
|
|
||||||
cb = cm->cd[co].block;
|
|
||||||
if (t == fillt || t == cb) {
|
|
||||||
/* either way, we want a subcolor solid block */
|
|
||||||
sco = newsub(cm, co);
|
|
||||||
t = cm->cd[sco].block;
|
|
||||||
if (t == NULL) { /* must set it up */
|
|
||||||
t = (union tree *)MALLOC(sizeof(struct colors));
|
|
||||||
if (t == NULL) {
|
|
||||||
CERR(REG_ESPACE);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
for (i = 0; i < BYTTAB; i++)
|
|
||||||
t->tcolor[i] = sco;
|
|
||||||
cm->cd[sco].block = t;
|
|
||||||
}
|
|
||||||
/* find loop must have run at least once */
|
|
||||||
lastt->tptr[b] = t;
|
|
||||||
newarc(v->nfa, PLAIN, sco, lp, rp);
|
|
||||||
cm->cd[co].nchrs -= BYTTAB;
|
|
||||||
cm->cd[sco].nchrs += BYTTAB;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* general case, a mixed block to be altered */
|
|
||||||
i = 0;
|
|
||||||
while (i < BYTTAB) {
|
|
||||||
co = t->tcolor[i];
|
|
||||||
sco = newsub(cm, co);
|
|
||||||
newarc(v->nfa, PLAIN, sco, lp, rp);
|
|
||||||
previ = i;
|
|
||||||
do {
|
|
||||||
t->tcolor[i++] = sco;
|
|
||||||
} while (i < BYTTAB && t->tcolor[i] == co);
|
|
||||||
ndone = i - previ;
|
|
||||||
cm->cd[co].nchrs -= ndone;
|
|
||||||
cm->cd[sco].nchrs += ndone;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- okcolors - promote subcolors to full colors
|
|
||||||
^ static VOID okcolors(struct nfa *, struct colormap *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
okcolors(nfa, cm)
|
|
||||||
struct nfa *nfa;
|
|
||||||
struct colormap *cm;
|
|
||||||
{
|
|
||||||
struct colordesc *cd;
|
|
||||||
struct colordesc *end = CDEND(cm);
|
|
||||||
struct colordesc *scd;
|
|
||||||
struct arc *a;
|
|
||||||
color co;
|
|
||||||
color sco;
|
|
||||||
|
|
||||||
for (cd = cm->cd, co = 0; cd < end; cd++, co++) {
|
|
||||||
sco = cd->sub;
|
|
||||||
if (UNUSEDCOLOR(cd) || sco == NOSUB) {
|
|
||||||
/* has no subcolor, no further action */
|
|
||||||
} else if (sco == co) {
|
|
||||||
/* is subcolor, let parent deal with it */
|
|
||||||
} else if (cd->nchrs == 0) {
|
|
||||||
/* parent empty, its arcs change color to subcolor */
|
|
||||||
cd->sub = NOSUB;
|
|
||||||
scd = &cm->cd[sco];
|
|
||||||
assert(scd->nchrs > 0);
|
|
||||||
assert(scd->sub == sco);
|
|
||||||
scd->sub = NOSUB;
|
|
||||||
while ((a = cd->arcs) != NULL) {
|
|
||||||
assert(a->co == co);
|
|
||||||
/* uncolorchain(cm, a); */
|
|
||||||
cd->arcs = a->colorchain;
|
|
||||||
a->co = sco;
|
|
||||||
/* colorchain(cm, a); */
|
|
||||||
a->colorchain = scd->arcs;
|
|
||||||
scd->arcs = a;
|
|
||||||
}
|
|
||||||
freecolor(cm, co);
|
|
||||||
} else {
|
|
||||||
/* parent's arcs must gain parallel subcolor arcs */
|
|
||||||
cd->sub = NOSUB;
|
|
||||||
scd = &cm->cd[sco];
|
|
||||||
assert(scd->nchrs > 0);
|
|
||||||
assert(scd->sub == sco);
|
|
||||||
scd->sub = NOSUB;
|
|
||||||
for (a = cd->arcs; a != NULL; a = a->colorchain) {
|
|
||||||
assert(a->co == co);
|
|
||||||
newarc(nfa, a->type, sco, a->from, a->to);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- colorchain - add this arc to the color chain of its color
|
|
||||||
^ static VOID colorchain(struct colormap *, struct arc *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
colorchain(cm, a)
|
|
||||||
struct colormap *cm;
|
|
||||||
struct arc *a;
|
|
||||||
{
|
|
||||||
struct colordesc *cd = &cm->cd[a->co];
|
|
||||||
|
|
||||||
a->colorchain = cd->arcs;
|
|
||||||
cd->arcs = a;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- uncolorchain - delete this arc from the color chain of its color
|
|
||||||
^ static VOID uncolorchain(struct colormap *, struct arc *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
uncolorchain(cm, a)
|
|
||||||
struct colormap *cm;
|
|
||||||
struct arc *a;
|
|
||||||
{
|
|
||||||
struct colordesc *cd = &cm->cd[a->co];
|
|
||||||
struct arc *aa;
|
|
||||||
|
|
||||||
aa = cd->arcs;
|
|
||||||
if (aa == a) /* easy case */
|
|
||||||
cd->arcs = a->colorchain;
|
|
||||||
else {
|
|
||||||
for (; aa != NULL && aa->colorchain != a; aa = aa->colorchain)
|
|
||||||
continue;
|
|
||||||
assert(aa != NULL);
|
|
||||||
aa->colorchain = a->colorchain;
|
|
||||||
}
|
|
||||||
a->colorchain = NULL; /* paranoia */
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- singleton - is this character in its own color?
|
|
||||||
^ static int singleton(struct colormap *, pchr c);
|
|
||||||
*/
|
|
||||||
static int /* predicate */
|
|
||||||
singleton(cm, c)
|
|
||||||
struct colormap *cm;
|
|
||||||
pchr c;
|
|
||||||
{
|
|
||||||
color co; /* color of c */
|
|
||||||
|
|
||||||
co = GETCOLOR(cm, c);
|
|
||||||
if (cm->cd[co].nchrs == 1 && cm->cd[co].sub == NOSUB)
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- rainbow - add arcs of all full colors (but one) between specified states
|
|
||||||
^ static VOID rainbow(struct nfa *, struct colormap *, int, pcolor,
|
|
||||||
^ struct state *, struct state *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
rainbow(nfa, cm, type, but, from, to)
|
|
||||||
struct nfa *nfa;
|
|
||||||
struct colormap *cm;
|
|
||||||
int type;
|
|
||||||
pcolor but; /* COLORLESS if no exceptions */
|
|
||||||
struct state *from;
|
|
||||||
struct state *to;
|
|
||||||
{
|
|
||||||
struct colordesc *cd;
|
|
||||||
struct colordesc *end = CDEND(cm);
|
|
||||||
color co;
|
|
||||||
|
|
||||||
for (cd = cm->cd, co = 0; cd < end && !CISERR(); cd++, co++)
|
|
||||||
if (!UNUSEDCOLOR(cd) && cd->sub != co && co != but &&
|
|
||||||
!(cd->flags&PSEUDO))
|
|
||||||
newarc(nfa, type, co, from, to);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- colorcomplement - add arcs of complementary colors
|
|
||||||
* The calling sequence ought to be reconciled with cloneouts().
|
|
||||||
^ static VOID colorcomplement(struct nfa *, struct colormap *, int,
|
|
||||||
^ struct state *, struct state *, struct state *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
colorcomplement(nfa, cm, type, of, from, to)
|
|
||||||
struct nfa *nfa;
|
|
||||||
struct colormap *cm;
|
|
||||||
int type;
|
|
||||||
struct state *of; /* complements of this guy's PLAIN outarcs */
|
|
||||||
struct state *from;
|
|
||||||
struct state *to;
|
|
||||||
{
|
|
||||||
struct colordesc *cd;
|
|
||||||
struct colordesc *end = CDEND(cm);
|
|
||||||
color co;
|
|
||||||
|
|
||||||
assert(of != from);
|
|
||||||
for (cd = cm->cd, co = 0; cd < end && !CISERR(); cd++, co++)
|
|
||||||
if (!UNUSEDCOLOR(cd) && !(cd->flags&PSEUDO))
|
|
||||||
if (findarc(of, PLAIN, co) == NULL)
|
|
||||||
newarc(nfa, type, co, from, to);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef REG_DEBUG
|
|
||||||
/*
|
|
||||||
^ #ifdef REG_DEBUG
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
- dumpcolors - debugging output
|
|
||||||
^ static VOID dumpcolors(struct colormap *, FILE *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
dumpcolors(cm, f)
|
|
||||||
struct colormap *cm;
|
|
||||||
FILE *f;
|
|
||||||
{
|
|
||||||
struct colordesc *cd;
|
|
||||||
struct colordesc *end;
|
|
||||||
color co;
|
|
||||||
chr c;
|
|
||||||
char *has;
|
|
||||||
|
|
||||||
fprintf(f, "max %ld\n", (long)cm->max);
|
|
||||||
if (NBYTS > 1)
|
|
||||||
fillcheck(cm, cm->tree, 0, f);
|
|
||||||
end = CDEND(cm);
|
|
||||||
for (cd = cm->cd + 1, co = 1; cd < end; cd++, co++) /* skip 0 */
|
|
||||||
if (!UNUSEDCOLOR(cd)) {
|
|
||||||
assert(cd->nchrs > 0);
|
|
||||||
has = (cd->block != NULL) ? "#" : "";
|
|
||||||
if (cd->flags&PSEUDO)
|
|
||||||
fprintf(f, "#%2ld%s(ps): ", (long)co, has);
|
|
||||||
else
|
|
||||||
fprintf(f, "#%2ld%s(%2d): ", (long)co,
|
|
||||||
has, cd->nchrs);
|
|
||||||
/* it's hard to do this more efficiently */
|
|
||||||
for (c = CHR_MIN; c < CHR_MAX; c++)
|
|
||||||
if (GETCOLOR(cm, c) == co)
|
|
||||||
dumpchr(c, f);
|
|
||||||
assert(c == CHR_MAX);
|
|
||||||
if (GETCOLOR(cm, c) == co)
|
|
||||||
dumpchr(c, f);
|
|
||||||
fprintf(f, "\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- fillcheck - check proper filling of a tree
|
|
||||||
^ static VOID fillcheck(struct colormap *, union tree *, int, FILE *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
fillcheck(cm, tree, level, f)
|
|
||||||
struct colormap *cm;
|
|
||||||
union tree *tree;
|
|
||||||
int level; /* level number (top == 0) of this block */
|
|
||||||
FILE *f;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
union tree *t;
|
|
||||||
union tree *fillt = &cm->tree[level+1];
|
|
||||||
|
|
||||||
assert(level < NBYTS-1); /* this level has pointers */
|
|
||||||
for (i = BYTTAB-1; i >= 0; i--) {
|
|
||||||
t = tree->tptr[i];
|
|
||||||
if (t == NULL)
|
|
||||||
fprintf(f, "NULL found in filled tree!\n");
|
|
||||||
else if (t == fillt)
|
|
||||||
{}
|
|
||||||
else if (level < NBYTS-2) /* more pointer blocks below */
|
|
||||||
fillcheck(cm, t, level+1, f);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- dumpchr - print a chr
|
|
||||||
* Kind of char-centric but works well enough for debug use.
|
|
||||||
^ static VOID dumpchr(pchr, FILE *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
dumpchr(c, f)
|
|
||||||
pchr c;
|
|
||||||
FILE *f;
|
|
||||||
{
|
|
||||||
if (c == '\\')
|
|
||||||
fprintf(f, "\\\\");
|
|
||||||
else if (c > ' ' && c <= '~')
|
|
||||||
putc((char)c, f);
|
|
||||||
else
|
|
||||||
fprintf(f, "\\u%04lx", (long)c);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
^ #endif
|
|
||||||
*/
|
|
||||||
#endif /* ifdef REG_DEBUG */
|
|
1061
src/regex/regc_lex.c
1061
src/regex/regc_lex.c
File diff suppressed because it is too large
Load Diff
1575
src/regex/regc_nfa.c
1575
src/regex/regc_nfa.c
File diff suppressed because it is too large
Load Diff
@@ -1,677 +0,0 @@
|
|||||||
/*
|
|
||||||
* DFA routines
|
|
||||||
* This file is #included by regexec.c.
|
|
||||||
*
|
|
||||||
* Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.
|
|
||||||
*
|
|
||||||
* Development of this software was funded, in part, by Cray Research Inc.,
|
|
||||||
* UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
|
|
||||||
* Corporation, none of whom are responsible for the results. The author
|
|
||||||
* thanks all of them.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms -- with or without
|
|
||||||
* modification -- are permitted for any purpose, provided that
|
|
||||||
* redistributions in source form retain this entire copyright notice and
|
|
||||||
* indicate the origin and nature of any modifications.
|
|
||||||
*
|
|
||||||
* I'd appreciate being given credit for this package in the documentation
|
|
||||||
* of software which uses it, but that is not a requirement.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
||||||
* HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
- longest - longest-preferred matching engine
|
|
||||||
^ static chr *longest(struct vars *, struct dfa *, chr *, chr *, int *);
|
|
||||||
*/
|
|
||||||
static chr * /* endpoint, or NULL */
|
|
||||||
longest(v, d, start, stop, hitstopp)
|
|
||||||
struct vars *v; /* used only for debug and exec flags */
|
|
||||||
struct dfa *d;
|
|
||||||
chr *start; /* where the match should start */
|
|
||||||
chr *stop; /* match must end at or before here */
|
|
||||||
int *hitstopp; /* record whether hit v->stop, if non-NULL */
|
|
||||||
{
|
|
||||||
chr *cp;
|
|
||||||
chr *realstop = (stop == v->stop) ? stop : stop + 1;
|
|
||||||
color co;
|
|
||||||
struct sset *css;
|
|
||||||
struct sset *ss;
|
|
||||||
chr *post;
|
|
||||||
int i;
|
|
||||||
struct colormap *cm = d->cm;
|
|
||||||
|
|
||||||
/* initialize */
|
|
||||||
css = initialize(v, d, start);
|
|
||||||
cp = start;
|
|
||||||
if (hitstopp != NULL)
|
|
||||||
*hitstopp = 0;
|
|
||||||
|
|
||||||
/* startup */
|
|
||||||
FDEBUG(("+++ startup +++\n"));
|
|
||||||
if (cp == v->start) {
|
|
||||||
co = d->cnfa->bos[(v->eflags®_NOTBOL) ? 0 : 1];
|
|
||||||
FDEBUG(("color %ld\n", (long)co));
|
|
||||||
} else {
|
|
||||||
co = GETCOLOR(cm, *(cp - 1));
|
|
||||||
FDEBUG(("char %c, color %ld\n", (char)*(cp-1), (long)co));
|
|
||||||
}
|
|
||||||
css = miss(v, d, css, co, cp, start);
|
|
||||||
if (css == NULL)
|
|
||||||
return NULL;
|
|
||||||
css->lastseen = cp;
|
|
||||||
|
|
||||||
/* main loop */
|
|
||||||
if (v->eflags®_FTRACE)
|
|
||||||
while (cp < realstop) {
|
|
||||||
FDEBUG(("+++ at c%d +++\n", css - d->ssets));
|
|
||||||
co = GETCOLOR(cm, *cp);
|
|
||||||
FDEBUG(("char %c, color %ld\n", (char)*cp, (long)co));
|
|
||||||
ss = css->outs[co];
|
|
||||||
if (ss == NULL) {
|
|
||||||
ss = miss(v, d, css, co, cp+1, start);
|
|
||||||
if (ss == NULL)
|
|
||||||
break; /* NOTE BREAK OUT */
|
|
||||||
}
|
|
||||||
cp++;
|
|
||||||
ss->lastseen = cp;
|
|
||||||
css = ss;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
while (cp < realstop) {
|
|
||||||
co = GETCOLOR(cm, *cp);
|
|
||||||
ss = css->outs[co];
|
|
||||||
if (ss == NULL) {
|
|
||||||
ss = miss(v, d, css, co, cp+1, start);
|
|
||||||
if (ss == NULL)
|
|
||||||
break; /* NOTE BREAK OUT */
|
|
||||||
}
|
|
||||||
cp++;
|
|
||||||
ss->lastseen = cp;
|
|
||||||
css = ss;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* shutdown */
|
|
||||||
FDEBUG(("+++ shutdown at c%d +++\n", css - d->ssets));
|
|
||||||
if (cp == v->stop && stop == v->stop) {
|
|
||||||
if (hitstopp != NULL)
|
|
||||||
*hitstopp = 1;
|
|
||||||
co = d->cnfa->eos[(v->eflags®_NOTEOL) ? 0 : 1];
|
|
||||||
FDEBUG(("color %ld\n", (long)co));
|
|
||||||
ss = miss(v, d, css, co, cp, start);
|
|
||||||
/* special case: match ended at eol? */
|
|
||||||
if (ss != NULL && (ss->flags&POSTSTATE))
|
|
||||||
return cp;
|
|
||||||
else if (ss != NULL)
|
|
||||||
ss->lastseen = cp; /* to be tidy */
|
|
||||||
}
|
|
||||||
|
|
||||||
/* find last match, if any */
|
|
||||||
post = d->lastpost;
|
|
||||||
for (ss = d->ssets, i = d->nssused; i > 0; ss++, i--)
|
|
||||||
if ((ss->flags&POSTSTATE) && post != ss->lastseen &&
|
|
||||||
(post == NULL || post < ss->lastseen))
|
|
||||||
post = ss->lastseen;
|
|
||||||
if (post != NULL) /* found one */
|
|
||||||
return post - 1;
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- shortest - shortest-preferred matching engine
|
|
||||||
^ static chr *shortest(struct vars *, struct dfa *, chr *, chr *, chr *,
|
|
||||||
^ chr **, int *);
|
|
||||||
*/
|
|
||||||
static chr * /* endpoint, or NULL */
|
|
||||||
shortest(v, d, start, min, max, coldp, hitstopp)
|
|
||||||
struct vars *v;
|
|
||||||
struct dfa *d;
|
|
||||||
chr *start; /* where the match should start */
|
|
||||||
chr *min; /* match must end at or after here */
|
|
||||||
chr *max; /* match must end at or before here */
|
|
||||||
chr **coldp; /* store coldstart pointer here, if nonNULL */
|
|
||||||
int *hitstopp; /* record whether hit v->stop, if non-NULL */
|
|
||||||
{
|
|
||||||
chr *cp;
|
|
||||||
chr *realmin = (min == v->stop) ? min : min + 1;
|
|
||||||
chr *realmax = (max == v->stop) ? max : max + 1;
|
|
||||||
color co;
|
|
||||||
struct sset *css;
|
|
||||||
struct sset *ss;
|
|
||||||
struct colormap *cm = d->cm;
|
|
||||||
|
|
||||||
/* initialize */
|
|
||||||
css = initialize(v, d, start);
|
|
||||||
cp = start;
|
|
||||||
if (hitstopp != NULL)
|
|
||||||
*hitstopp = 0;
|
|
||||||
|
|
||||||
/* startup */
|
|
||||||
FDEBUG(("--- startup ---\n"));
|
|
||||||
if (cp == v->start) {
|
|
||||||
co = d->cnfa->bos[(v->eflags®_NOTBOL) ? 0 : 1];
|
|
||||||
FDEBUG(("color %ld\n", (long)co));
|
|
||||||
} else {
|
|
||||||
co = GETCOLOR(cm, *(cp - 1));
|
|
||||||
FDEBUG(("char %c, color %ld\n", (char)*(cp-1), (long)co));
|
|
||||||
}
|
|
||||||
css = miss(v, d, css, co, cp, start);
|
|
||||||
if (css == NULL)
|
|
||||||
return NULL;
|
|
||||||
css->lastseen = cp;
|
|
||||||
ss = css;
|
|
||||||
|
|
||||||
/* main loop */
|
|
||||||
if (v->eflags®_FTRACE)
|
|
||||||
while (cp < realmax) {
|
|
||||||
FDEBUG(("--- at c%d ---\n", css - d->ssets));
|
|
||||||
co = GETCOLOR(cm, *cp);
|
|
||||||
FDEBUG(("char %c, color %ld\n", (char)*cp, (long)co));
|
|
||||||
ss = css->outs[co];
|
|
||||||
if (ss == NULL) {
|
|
||||||
ss = miss(v, d, css, co, cp+1, start);
|
|
||||||
if (ss == NULL)
|
|
||||||
break; /* NOTE BREAK OUT */
|
|
||||||
}
|
|
||||||
cp++;
|
|
||||||
ss->lastseen = cp;
|
|
||||||
css = ss;
|
|
||||||
if ((ss->flags&POSTSTATE) && cp >= realmin)
|
|
||||||
break; /* NOTE BREAK OUT */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
while (cp < realmax) {
|
|
||||||
co = GETCOLOR(cm, *cp);
|
|
||||||
ss = css->outs[co];
|
|
||||||
if (ss == NULL) {
|
|
||||||
ss = miss(v, d, css, co, cp+1, start);
|
|
||||||
if (ss == NULL)
|
|
||||||
break; /* NOTE BREAK OUT */
|
|
||||||
}
|
|
||||||
cp++;
|
|
||||||
ss->lastseen = cp;
|
|
||||||
css = ss;
|
|
||||||
if ((ss->flags&POSTSTATE) && cp >= realmin)
|
|
||||||
break; /* NOTE BREAK OUT */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ss == NULL)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
if (coldp != NULL) /* report last no-progress state set, if any */
|
|
||||||
*coldp = lastcold(v, d);
|
|
||||||
|
|
||||||
if ((ss->flags&POSTSTATE) && cp > min) {
|
|
||||||
assert(cp >= realmin);
|
|
||||||
cp--;
|
|
||||||
} else if (cp == v->stop && max == v->stop) {
|
|
||||||
co = d->cnfa->eos[(v->eflags®_NOTEOL) ? 0 : 1];
|
|
||||||
FDEBUG(("color %ld\n", (long)co));
|
|
||||||
ss = miss(v, d, css, co, cp, start);
|
|
||||||
/* match might have ended at eol */
|
|
||||||
if ((ss == NULL || !(ss->flags&POSTSTATE)) && hitstopp != NULL)
|
|
||||||
*hitstopp = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ss == NULL || !(ss->flags&POSTSTATE))
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
return cp;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- lastcold - determine last point at which no progress had been made
|
|
||||||
^ static chr *lastcold(struct vars *, struct dfa *);
|
|
||||||
*/
|
|
||||||
static chr * /* endpoint, or NULL */
|
|
||||||
lastcold(v, d)
|
|
||||||
struct vars *v;
|
|
||||||
struct dfa *d;
|
|
||||||
{
|
|
||||||
struct sset *ss;
|
|
||||||
chr *nopr;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
nopr = d->lastnopr;
|
|
||||||
if (nopr == NULL)
|
|
||||||
nopr = v->start;
|
|
||||||
for (ss = d->ssets, i = d->nssused; i > 0; ss++, i--)
|
|
||||||
if ((ss->flags&NOPROGRESS) && nopr < ss->lastseen)
|
|
||||||
nopr = ss->lastseen;
|
|
||||||
return nopr;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- newdfa - set up a fresh DFA
|
|
||||||
^ static struct dfa *newdfa(struct vars *, struct cnfa *,
|
|
||||||
^ struct colormap *, struct smalldfa *);
|
|
||||||
*/
|
|
||||||
static struct dfa *
|
|
||||||
newdfa(v, cnfa, cm, small)
|
|
||||||
struct vars *v;
|
|
||||||
struct cnfa *cnfa;
|
|
||||||
struct colormap *cm;
|
|
||||||
struct smalldfa *small; /* preallocated space, may be NULL */
|
|
||||||
{
|
|
||||||
struct dfa *d;
|
|
||||||
size_t nss = cnfa->nstates * 2;
|
|
||||||
int wordsper = (cnfa->nstates + UBITS - 1) / UBITS;
|
|
||||||
struct smalldfa *smallwas = small;
|
|
||||||
|
|
||||||
assert(cnfa != NULL && cnfa->nstates != 0);
|
|
||||||
|
|
||||||
if (nss <= FEWSTATES && cnfa->ncolors <= FEWCOLORS) {
|
|
||||||
assert(wordsper == 1);
|
|
||||||
if (small == NULL) {
|
|
||||||
small = (struct smalldfa *)MALLOC(
|
|
||||||
sizeof(struct smalldfa));
|
|
||||||
if (small == NULL) {
|
|
||||||
ERR(REG_ESPACE);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
d = &small->dfa;
|
|
||||||
d->ssets = small->ssets;
|
|
||||||
d->statesarea = small->statesarea;
|
|
||||||
d->work = &d->statesarea[nss];
|
|
||||||
d->outsarea = small->outsarea;
|
|
||||||
d->incarea = small->incarea;
|
|
||||||
d->cptsmalloced = 0;
|
|
||||||
d->mallocarea = (smallwas == NULL) ? (char *)small : NULL;
|
|
||||||
} else {
|
|
||||||
d = (struct dfa *)MALLOC(sizeof(struct dfa));
|
|
||||||
if (d == NULL) {
|
|
||||||
ERR(REG_ESPACE);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
d->ssets = (struct sset *)MALLOC(nss * sizeof(struct sset));
|
|
||||||
d->statesarea = (unsigned *)MALLOC((nss+WORK) * wordsper *
|
|
||||||
sizeof(unsigned));
|
|
||||||
d->work = &d->statesarea[nss * wordsper];
|
|
||||||
d->outsarea = (struct sset **)MALLOC(nss * cnfa->ncolors *
|
|
||||||
sizeof(struct sset *));
|
|
||||||
d->incarea = (struct arcp *)MALLOC(nss * cnfa->ncolors *
|
|
||||||
sizeof(struct arcp));
|
|
||||||
d->cptsmalloced = 1;
|
|
||||||
d->mallocarea = (char *)d;
|
|
||||||
if (d->ssets == NULL || d->statesarea == NULL ||
|
|
||||||
d->outsarea == NULL || d->incarea == NULL) {
|
|
||||||
freedfa(d);
|
|
||||||
ERR(REG_ESPACE);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
d->nssets = (v->eflags®_SMALL) ? 7 : nss;
|
|
||||||
d->nssused = 0;
|
|
||||||
d->nstates = cnfa->nstates;
|
|
||||||
d->ncolors = cnfa->ncolors;
|
|
||||||
d->wordsper = wordsper;
|
|
||||||
d->cnfa = cnfa;
|
|
||||||
d->cm = cm;
|
|
||||||
d->lastpost = NULL;
|
|
||||||
d->lastnopr = NULL;
|
|
||||||
d->search = d->ssets;
|
|
||||||
|
|
||||||
/* initialization of sset fields is done as needed */
|
|
||||||
|
|
||||||
return d;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- freedfa - free a DFA
|
|
||||||
^ static VOID freedfa(struct dfa *);
|
|
||||||
*/
|
|
||||||
static VOID
|
|
||||||
freedfa(d)
|
|
||||||
struct dfa *d;
|
|
||||||
{
|
|
||||||
if (d->cptsmalloced) {
|
|
||||||
if (d->ssets != NULL)
|
|
||||||
FREE(d->ssets);
|
|
||||||
if (d->statesarea != NULL)
|
|
||||||
FREE(d->statesarea);
|
|
||||||
if (d->outsarea != NULL)
|
|
||||||
FREE(d->outsarea);
|
|
||||||
if (d->incarea != NULL)
|
|
||||||
FREE(d->incarea);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (d->mallocarea != NULL)
|
|
||||||
FREE(d->mallocarea);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- hash - construct a hash code for a bitvector
|
|
||||||
* There are probably better ways, but they're more expensive.
|
|
||||||
^ static unsigned hash(unsigned *, int);
|
|
||||||
*/
|
|
||||||
static unsigned
|
|
||||||
hash(uv, n)
|
|
||||||
unsigned *uv;
|
|
||||||
int n;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
unsigned h;
|
|
||||||
|
|
||||||
h = 0;
|
|
||||||
for (i = 0; i < n; i++)
|
|
||||||
h ^= uv[i];
|
|
||||||
return h;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- initialize - hand-craft a cache entry for startup, otherwise get ready
|
|
||||||
^ static struct sset *initialize(struct vars *, struct dfa *, chr *);
|
|
||||||
*/
|
|
||||||
static struct sset *
|
|
||||||
initialize(v, d, start)
|
|
||||||
struct vars *v; /* used only for debug flags */
|
|
||||||
struct dfa *d;
|
|
||||||
chr *start;
|
|
||||||
{
|
|
||||||
struct sset *ss;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
/* is previous one still there? */
|
|
||||||
if (d->nssused > 0 && (d->ssets[0].flags&STARTER))
|
|
||||||
ss = &d->ssets[0];
|
|
||||||
else { /* no, must (re)build it */
|
|
||||||
ss = getvacant(v, d, start, start);
|
|
||||||
for (i = 0; i < d->wordsper; i++)
|
|
||||||
ss->states[i] = 0;
|
|
||||||
BSET(ss->states, d->cnfa->pre);
|
|
||||||
ss->hash = HASH(ss->states, d->wordsper);
|
|
||||||
assert(d->cnfa->pre != d->cnfa->post);
|
|
||||||
ss->flags = STARTER|LOCKED|NOPROGRESS;
|
|
||||||
/* lastseen dealt with below */
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < d->nssused; i++)
|
|
||||||
d->ssets[i].lastseen = NULL;
|
|
||||||
ss->lastseen = start; /* maybe untrue, but harmless */
|
|
||||||
d->lastpost = NULL;
|
|
||||||
d->lastnopr = NULL;
|
|
||||||
return ss;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- miss - handle a cache miss
|
|
||||||
^ static struct sset *miss(struct vars *, struct dfa *, struct sset *,
|
|
||||||
^ pcolor, chr *, chr *);
|
|
||||||
*/
|
|
||||||
static struct sset * /* NULL if goes to empty set */
|
|
||||||
miss(v, d, css, co, cp, start)
|
|
||||||
struct vars *v; /* used only for debug flags */
|
|
||||||
struct dfa *d;
|
|
||||||
struct sset *css;
|
|
||||||
pcolor co;
|
|
||||||
chr *cp; /* next chr */
|
|
||||||
chr *start; /* where the attempt got started */
|
|
||||||
{
|
|
||||||
struct cnfa *cnfa = d->cnfa;
|
|
||||||
int i;
|
|
||||||
unsigned h;
|
|
||||||
struct carc *ca;
|
|
||||||
struct sset *p;
|
|
||||||
int ispost;
|
|
||||||
int noprogress;
|
|
||||||
int gotstate;
|
|
||||||
int dolacons;
|
|
||||||
int sawlacons;
|
|
||||||
|
|
||||||
/* for convenience, we can be called even if it might not be a miss */
|
|
||||||
if (css->outs[co] != NULL) {
|
|
||||||
FDEBUG(("hit\n"));
|
|
||||||
return css->outs[co];
|
|
||||||
}
|
|
||||||
FDEBUG(("miss\n"));
|
|
||||||
|
|
||||||
/* first, what set of states would we end up in? */
|
|
||||||
for (i = 0; i < d->wordsper; i++)
|
|
||||||
d->work[i] = 0;
|
|
||||||
ispost = 0;
|
|
||||||
noprogress = 1;
|
|
||||||
gotstate = 0;
|
|
||||||
for (i = 0; i < d->nstates; i++)
|
|
||||||
if (ISBSET(css->states, i))
|
|
||||||
for (ca = cnfa->states[i]+1; ca->co != COLORLESS; ca++)
|
|
||||||
if (ca->co == co) {
|
|
||||||
BSET(d->work, ca->to);
|
|
||||||
gotstate = 1;
|
|
||||||
if (ca->to == cnfa->post)
|
|
||||||
ispost = 1;
|
|
||||||
if (!cnfa->states[ca->to]->co)
|
|
||||||
noprogress = 0;
|
|
||||||
FDEBUG(("%d -> %d\n", i, ca->to));
|
|
||||||
}
|
|
||||||
dolacons = (gotstate) ? (cnfa->flags&HASLACONS) : 0;
|
|
||||||
sawlacons = 0;
|
|
||||||
while (dolacons) { /* transitive closure */
|
|
||||||
dolacons = 0;
|
|
||||||
for (i = 0; i < d->nstates; i++)
|
|
||||||
if (ISBSET(d->work, i))
|
|
||||||
for (ca = cnfa->states[i]+1; ca->co != COLORLESS;
|
|
||||||
ca++) {
|
|
||||||
if (ca->co <= cnfa->ncolors)
|
|
||||||
continue; /* NOTE CONTINUE */
|
|
||||||
sawlacons = 1;
|
|
||||||
if (ISBSET(d->work, ca->to))
|
|
||||||
continue; /* NOTE CONTINUE */
|
|
||||||
if (!lacon(v, cnfa, cp, ca->co))
|
|
||||||
continue; /* NOTE CONTINUE */
|
|
||||||
BSET(d->work, ca->to);
|
|
||||||
dolacons = 1;
|
|
||||||
if (ca->to == cnfa->post)
|
|
||||||
ispost = 1;
|
|
||||||
if (!cnfa->states[ca->to]->co)
|
|
||||||
noprogress = 0;
|
|
||||||
FDEBUG(("%d :> %d\n", i, ca->to));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!gotstate)
|
|
||||||
return NULL;
|
|
||||||
h = HASH(d->work, d->wordsper);
|
|
||||||
|
|
||||||
/* next, is that in the cache? */
|
|
||||||
for (p = d->ssets, i = d->nssused; i > 0; p++, i--)
|
|
||||||
if (HIT(h, d->work, p, d->wordsper)) {
|
|
||||||
FDEBUG(("cached c%d\n", p - d->ssets));
|
|
||||||
break; /* NOTE BREAK OUT */
|
|
||||||
}
|
|
||||||
if (i == 0) { /* nope, need a new cache entry */
|
|
||||||
p = getvacant(v, d, cp, start);
|
|
||||||
assert(p != css);
|
|
||||||
for (i = 0; i < d->wordsper; i++)
|
|
||||||
p->states[i] = d->work[i];
|
|
||||||
p->hash = h;
|
|
||||||
p->flags = (ispost) ? POSTSTATE : 0;
|
|
||||||
if (noprogress)
|
|
||||||
p->flags |= NOPROGRESS;
|
|
||||||
/* lastseen to be dealt with by caller */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sawlacons) { /* lookahead conds. always cache miss */
|
|
||||||
FDEBUG(("c%d[%d]->c%d\n", css - d->ssets, co, p - d->ssets));
|
|
||||||
css->outs[co] = p;
|
|
||||||
css->inchain[co] = p->ins;
|
|
||||||
p->ins.ss = css;
|
|
||||||
p->ins.co = (color)co;
|
|
||||||
}
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- lacon - lookahead-constraint checker for miss()
|
|
||||||
^ static int lacon(struct vars *, struct cnfa *, chr *, pcolor);
|
|
||||||
*/
|
|
||||||
static int /* predicate: constraint satisfied? */
|
|
||||||
lacon(v, pcnfa, cp, co)
|
|
||||||
struct vars *v;
|
|
||||||
struct cnfa *pcnfa; /* parent cnfa */
|
|
||||||
chr *cp;
|
|
||||||
pcolor co; /* "color" of the lookahead constraint */
|
|
||||||
{
|
|
||||||
int n;
|
|
||||||
struct subre *sub;
|
|
||||||
struct dfa *d;
|
|
||||||
struct smalldfa sd;
|
|
||||||
chr *end;
|
|
||||||
|
|
||||||
n = co - pcnfa->ncolors;
|
|
||||||
assert(n < v->g->nlacons && v->g->lacons != NULL);
|
|
||||||
FDEBUG(("=== testing lacon %d\n", n));
|
|
||||||
sub = &v->g->lacons[n];
|
|
||||||
d = newdfa(v, &sub->cnfa, &v->g->cmap, &sd);
|
|
||||||
if (d == NULL) {
|
|
||||||
ERR(REG_ESPACE);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
end = longest(v, d, cp, v->stop, (int *)NULL);
|
|
||||||
freedfa(d);
|
|
||||||
FDEBUG(("=== lacon %d match %d\n", n, (end != NULL)));
|
|
||||||
return (sub->subno) ? (end != NULL) : (end == NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- getvacant - get a vacant state set
|
|
||||||
* This routine clears out the inarcs and outarcs, but does not otherwise
|
|
||||||
* clear the innards of the state set -- that's up to the caller.
|
|
||||||
^ static struct sset *getvacant(struct vars *, struct dfa *, chr *, chr *);
|
|
||||||
*/
|
|
||||||
static struct sset *
|
|
||||||
getvacant(v, d, cp, start)
|
|
||||||
struct vars *v; /* used only for debug flags */
|
|
||||||
struct dfa *d;
|
|
||||||
chr *cp;
|
|
||||||
chr *start;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct sset *ss;
|
|
||||||
struct sset *p;
|
|
||||||
struct arcp ap;
|
|
||||||
struct arcp lastap;
|
|
||||||
color co;
|
|
||||||
|
|
||||||
ss = pickss(v, d, cp, start);
|
|
||||||
assert(!(ss->flags&LOCKED));
|
|
||||||
|
|
||||||
/* clear out its inarcs, including self-referential ones */
|
|
||||||
ap = ss->ins;
|
|
||||||
while ((p = ap.ss) != NULL) {
|
|
||||||
co = ap.co;
|
|
||||||
FDEBUG(("zapping c%d's %ld outarc\n", p - d->ssets, (long)co));
|
|
||||||
p->outs[co] = NULL;
|
|
||||||
ap = p->inchain[co];
|
|
||||||
p->inchain[co].ss = NULL; /* paranoia */
|
|
||||||
}
|
|
||||||
ss->ins.ss = NULL;
|
|
||||||
|
|
||||||
/* take it off the inarc chains of the ssets reached by its outarcs */
|
|
||||||
for (i = 0; i < d->ncolors; i++) {
|
|
||||||
p = ss->outs[i];
|
|
||||||
assert(p != ss); /* not self-referential */
|
|
||||||
if (p == NULL)
|
|
||||||
continue; /* NOTE CONTINUE */
|
|
||||||
FDEBUG(("del outarc %d from c%d's in chn\n", i, p - d->ssets));
|
|
||||||
if (p->ins.ss == ss && p->ins.co == i)
|
|
||||||
p->ins = ss->inchain[i];
|
|
||||||
else {
|
|
||||||
assert(p->ins.ss != NULL);
|
|
||||||
for (ap = p->ins; ap.ss != NULL &&
|
|
||||||
!(ap.ss == ss && ap.co == i);
|
|
||||||
ap = ap.ss->inchain[ap.co])
|
|
||||||
lastap = ap;
|
|
||||||
assert(ap.ss != NULL);
|
|
||||||
lastap.ss->inchain[lastap.co] = ss->inchain[i];
|
|
||||||
}
|
|
||||||
ss->outs[i] = NULL;
|
|
||||||
ss->inchain[i].ss = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if ss was a success state, may need to remember location */
|
|
||||||
if ((ss->flags&POSTSTATE) && ss->lastseen != d->lastpost &&
|
|
||||||
(d->lastpost == NULL || d->lastpost < ss->lastseen))
|
|
||||||
d->lastpost = ss->lastseen;
|
|
||||||
|
|
||||||
/* likewise for a no-progress state */
|
|
||||||
if ((ss->flags&NOPROGRESS) && ss->lastseen != d->lastnopr &&
|
|
||||||
(d->lastnopr == NULL || d->lastnopr < ss->lastseen))
|
|
||||||
d->lastnopr = ss->lastseen;
|
|
||||||
|
|
||||||
return ss;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- pickss - pick the next stateset to be used
|
|
||||||
^ static struct sset *pickss(struct vars *, struct dfa *, chr *, chr *);
|
|
||||||
*/
|
|
||||||
static struct sset *
|
|
||||||
pickss(v, d, cp, start)
|
|
||||||
struct vars *v; /* used only for debug flags */
|
|
||||||
struct dfa *d;
|
|
||||||
chr *cp;
|
|
||||||
chr *start;
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
struct sset *ss;
|
|
||||||
struct sset *end;
|
|
||||||
chr *ancient;
|
|
||||||
|
|
||||||
/* shortcut for cases where cache isn't full */
|
|
||||||
if (d->nssused < d->nssets) {
|
|
||||||
i = d->nssused;
|
|
||||||
d->nssused++;
|
|
||||||
ss = &d->ssets[i];
|
|
||||||
FDEBUG(("new c%d\n", i));
|
|
||||||
/* set up innards */
|
|
||||||
ss->states = &d->statesarea[i * d->wordsper];
|
|
||||||
ss->flags = 0;
|
|
||||||
ss->ins.ss = NULL;
|
|
||||||
ss->ins.co = WHITE; /* give it some value */
|
|
||||||
ss->outs = &d->outsarea[i * d->ncolors];
|
|
||||||
ss->inchain = &d->incarea[i * d->ncolors];
|
|
||||||
for (i = 0; i < d->ncolors; i++) {
|
|
||||||
ss->outs[i] = NULL;
|
|
||||||
ss->inchain[i].ss = NULL;
|
|
||||||
}
|
|
||||||
return ss;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* look for oldest, or old enough anyway */
|
|
||||||
if (cp - start > d->nssets*2/3) /* oldest 33% are expendable */
|
|
||||||
ancient = cp - d->nssets*2/3;
|
|
||||||
else
|
|
||||||
ancient = start;
|
|
||||||
for (ss = d->search, end = &d->ssets[d->nssets]; ss < end; ss++)
|
|
||||||
if ((ss->lastseen == NULL || ss->lastseen < ancient) &&
|
|
||||||
!(ss->flags&LOCKED)) {
|
|
||||||
d->search = ss + 1;
|
|
||||||
FDEBUG(("replacing c%d\n", ss - d->ssets));
|
|
||||||
return ss;
|
|
||||||
}
|
|
||||||
for (ss = d->ssets, end = d->search; ss < end; ss++)
|
|
||||||
if ((ss->lastseen == NULL || ss->lastseen < ancient) &&
|
|
||||||
!(ss->flags&LOCKED)) {
|
|
||||||
d->search = ss + 1;
|
|
||||||
FDEBUG(("replacing c%d\n", ss - d->ssets));
|
|
||||||
return ss;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* nobody's old enough?!? -- something's really wrong */
|
|
||||||
FDEBUG(("can't find victim to replace!\n"));
|
|
||||||
assert(NOTREACHED);
|
|
||||||
ERR(REG_ASSERT);
|
|
||||||
return d->ssets;
|
|
||||||
}
|
|
@@ -1,109 +1,126 @@
|
|||||||
|
#include <sys/types.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <regex.h>
|
||||||
|
|
||||||
|
#include "utils.h"
|
||||||
|
#include "regerror.ih"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* regerror - error-code expansion
|
= #define REG_OKAY 0
|
||||||
*
|
= #define REG_NOMATCH 1
|
||||||
* Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.
|
= #define REG_BADPAT 2
|
||||||
*
|
= #define REG_ECOLLATE 3
|
||||||
* Development of this software was funded, in part, by Cray Research Inc.,
|
= #define REG_ECTYPE 4
|
||||||
* UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
|
= #define REG_EESCAPE 5
|
||||||
* Corporation, none of whom are responsible for the results. The author
|
= #define REG_ESUBREG 6
|
||||||
* thanks all of them.
|
= #define REG_EBRACK 7
|
||||||
*
|
= #define REG_EPAREN 8
|
||||||
* Redistribution and use in source and binary forms -- with or without
|
= #define REG_EBRACE 9
|
||||||
* modification -- are permitted for any purpose, provided that
|
= #define REG_BADBR 10
|
||||||
* redistributions in source form retain this entire copyright notice and
|
= #define REG_ERANGE 11
|
||||||
* indicate the origin and nature of any modifications.
|
= #define REG_ESPACE 12
|
||||||
*
|
= #define REG_BADRPT 13
|
||||||
* I'd appreciate being given credit for this package in the documentation
|
= #define REG_EMPTY 14
|
||||||
* of software which uses it, but that is not a requirement.
|
= #define REG_ASSERT 15
|
||||||
*
|
= #define REG_INVARG 16
|
||||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
= #define REG_ATOI 255 // convert name to number (!)
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
= #define REG_ITOA 0400 // convert number to name (!)
|
||||||
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
||||||
* HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "regguts.h"
|
|
||||||
|
|
||||||
/* unknown-error explanation */
|
|
||||||
static char unk[] = "*** unknown regex error code 0x%x ***";
|
|
||||||
|
|
||||||
/* struct to map among codes, code names, and explanations */
|
|
||||||
static struct rerr {
|
static struct rerr {
|
||||||
int code;
|
int code;
|
||||||
char *name;
|
char *name;
|
||||||
char *explain;
|
char *explain;
|
||||||
} rerrs[] = {
|
} rerrs[] = {
|
||||||
/* the actual table is built from regex.h */
|
REG_OKAY, "REG_OKAY", "no errors detected",
|
||||||
# include "regerrs.h"
|
REG_NOMATCH, "REG_NOMATCH", "regexec() failed to match",
|
||||||
{ -1, "", "oops" }, /* explanation special-cased in code */
|
REG_BADPAT, "REG_BADPAT", "invalid regular expression",
|
||||||
|
REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element",
|
||||||
|
REG_ECTYPE, "REG_ECTYPE", "invalid character class",
|
||||||
|
REG_EESCAPE, "REG_EESCAPE", "trailing backslash (\\)",
|
||||||
|
REG_ESUBREG, "REG_ESUBREG", "invalid backreference number",
|
||||||
|
REG_EBRACK, "REG_EBRACK", "brackets ([ ]) not balanced",
|
||||||
|
REG_EPAREN, "REG_EPAREN", "parentheses not balanced",
|
||||||
|
REG_EBRACE, "REG_EBRACE", "braces not balanced",
|
||||||
|
REG_BADBR, "REG_BADBR", "invalid repetition count(s)",
|
||||||
|
REG_ERANGE, "REG_ERANGE", "invalid character range",
|
||||||
|
REG_ESPACE, "REG_ESPACE", "out of memory",
|
||||||
|
REG_BADRPT, "REG_BADRPT", "repetition-operator operand invalid",
|
||||||
|
REG_EMPTY, "REG_EMPTY", "empty (sub)expression",
|
||||||
|
REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug",
|
||||||
|
REG_INVARG, "REG_INVARG", "invalid argument to regex routine",
|
||||||
|
-1, "", "*** unknown regexp error code ***",
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
- regerror - the interface to error numbers
|
- regerror - the interface to error numbers
|
||||||
|
= extern size_t regerror(int, const regex_t *, char *, size_t);
|
||||||
*/
|
*/
|
||||||
/* ARGSUSED */
|
/* ARGSUSED */
|
||||||
size_t /* actual space needed (including NUL) */
|
size_t
|
||||||
regerror(errcode, preg, errbuf, errbuf_size)
|
regerror(errcode, preg, errbuf, errbuf_size)
|
||||||
int errcode; /* error code, or REG_ATOI or REG_ITOA */
|
int errcode;
|
||||||
CONST regex_t *preg; /* associated regex_t (unused at present) */
|
const regex_t *preg;
|
||||||
char *errbuf; /* result buffer (unless errbuf_size==0) */
|
char *errbuf;
|
||||||
size_t errbuf_size; /* available space in errbuf, can be 0 */
|
size_t errbuf_size;
|
||||||
{
|
{
|
||||||
struct rerr *r;
|
register struct rerr *r;
|
||||||
char *msg;
|
register size_t len;
|
||||||
char convbuf[sizeof(unk)+50]; /* 50 = plenty for int */
|
register int target = errcode &~ REG_ITOA;
|
||||||
size_t len;
|
register char *s;
|
||||||
int icode;
|
char convbuf[50];
|
||||||
|
|
||||||
switch (errcode) {
|
if (errcode == REG_ATOI)
|
||||||
case REG_ATOI: /* convert name to number */
|
s = regatoi(preg, convbuf);
|
||||||
|
else {
|
||||||
for (r = rerrs; r->code >= 0; r++)
|
for (r = rerrs; r->code >= 0; r++)
|
||||||
if (strcmp(r->name, errbuf) == 0)
|
if (r->code == target)
|
||||||
break;
|
|
||||||
sprintf(convbuf, "%d", r->code); /* -1 for unknown */
|
|
||||||
msg = convbuf;
|
|
||||||
break;
|
|
||||||
case REG_ITOA: /* convert number to name */
|
|
||||||
icode = atoi(errbuf); /* not our problem if this fails */
|
|
||||||
for (r = rerrs; r->code >= 0; r++)
|
|
||||||
if (r->code == icode)
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
if (errcode®_ITOA) {
|
||||||
if (r->code >= 0)
|
if (r->code >= 0)
|
||||||
msg = r->name;
|
(void) strcpy(convbuf, r->name);
|
||||||
else { /* unknown; tell him the number */
|
else
|
||||||
sprintf(convbuf, "REG_%u", (unsigned)icode);
|
sprintf(convbuf, "REG_0x%x", target);
|
||||||
msg = convbuf;
|
assert(strlen(convbuf) < sizeof(convbuf));
|
||||||
}
|
s = convbuf;
|
||||||
break;
|
} else
|
||||||
default: /* a real, normal error code */
|
s = r->explain;
|
||||||
for (r = rerrs; r->code >= 0; r++)
|
|
||||||
if (r->code == errcode)
|
|
||||||
break;
|
|
||||||
if (r->code >= 0)
|
|
||||||
msg = r->explain;
|
|
||||||
else { /* unknown; say so */
|
|
||||||
sprintf(convbuf, unk, errcode);
|
|
||||||
msg = convbuf;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
len = strlen(msg) + 1; /* space needed, including NUL */
|
len = strlen(s) + 1;
|
||||||
if (errbuf_size > 0) {
|
if (errbuf_size > 0) {
|
||||||
if (errbuf_size > len)
|
if (errbuf_size > len)
|
||||||
strcpy(errbuf, msg);
|
(void) strcpy(errbuf, s);
|
||||||
else { /* truncate to fit */
|
else {
|
||||||
strncpy(errbuf, msg, errbuf_size-1);
|
(void) strncpy(errbuf, s, errbuf_size-1);
|
||||||
errbuf[errbuf_size-1] = '\0';
|
errbuf[errbuf_size-1] = '\0';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return(len);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
- regatoi - internal routine to implement REG_ATOI
|
||||||
|
== static char *regatoi(const regex_t *preg, char *localbuf);
|
||||||
|
*/
|
||||||
|
static char *
|
||||||
|
regatoi(preg, localbuf)
|
||||||
|
const regex_t *preg;
|
||||||
|
char *localbuf;
|
||||||
|
{
|
||||||
|
register struct rerr *r;
|
||||||
|
|
||||||
|
for (r = rerrs; r->code >= 0; r++)
|
||||||
|
if (strcmp(r->name, preg->re_endp) == 0)
|
||||||
|
break;
|
||||||
|
if (r->code < 0)
|
||||||
|
return("0");
|
||||||
|
|
||||||
|
sprintf(localbuf, "%d", r->code);
|
||||||
|
return(localbuf);
|
||||||
}
|
}
|
||||||
|
@@ -1,18 +0,0 @@
|
|||||||
{ REG_OKAY, "REG_OKAY", "no errors detected" },
|
|
||||||
{ REG_NOMATCH, "REG_NOMATCH", "failed to match" },
|
|
||||||
{ REG_BADPAT, "REG_BADPAT", "invalid regexp (reg version 0.8)" },
|
|
||||||
{ REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element" },
|
|
||||||
{ REG_ECTYPE, "REG_ECTYPE", "invalid character class" },
|
|
||||||
{ REG_EESCAPE, "REG_EESCAPE", "invalid escape \\ sequence" },
|
|
||||||
{ REG_ESUBREG, "REG_ESUBREG", "invalid backreference number" },
|
|
||||||
{ REG_EBRACK, "REG_EBRACK", "brackets [] not balanced" },
|
|
||||||
{ REG_EPAREN, "REG_EPAREN", "parentheses () not balanced" },
|
|
||||||
{ REG_EBRACE, "REG_EBRACE", "braces {} not balanced" },
|
|
||||||
{ REG_BADBR, "REG_BADBR", "invalid repetition count(s)" },
|
|
||||||
{ REG_ERANGE, "REG_ERANGE", "invalid character range" },
|
|
||||||
{ REG_ESPACE, "REG_ESPACE", "out of memory" },
|
|
||||||
{ REG_BADRPT, "REG_BADRPT", "quantifier operand invalid" },
|
|
||||||
{ REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug" },
|
|
||||||
{ REG_INVARG, "REG_INVARG", "invalid argument to regex function" },
|
|
||||||
{ REG_MIXED, "REG_MIXED", "character widths of regex and string differ" },
|
|
||||||
{ REG_BADOPT, "REG_BADOPT", "invalid embedded option" },
|
|
@@ -1,341 +0,0 @@
|
|||||||
#ifndef _REGEX_H_
|
|
||||||
#define _REGEX_H_ /* never again */
|
|
||||||
/*
|
|
||||||
* regular expressions
|
|
||||||
*
|
|
||||||
* Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.
|
|
||||||
*
|
|
||||||
* Development of this software was funded, in part, by Cray Research Inc.,
|
|
||||||
* UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
|
|
||||||
* Corporation, none of whom are responsible for the results. The author
|
|
||||||
* thanks all of them.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms -- with or without
|
|
||||||
* modification -- are permitted for any purpose, provided that
|
|
||||||
* redistributions in source form retain this entire copyright notice and
|
|
||||||
* indicate the origin and nature of any modifications.
|
|
||||||
*
|
|
||||||
* I'd appreciate being given credit for this package in the documentation
|
|
||||||
* of software which uses it, but that is not a requirement.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
||||||
* HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Prototypes etc. marked with "^" within comments get gathered up (and
|
|
||||||
* possibly edited) by the regfwd program and inserted near the bottom of
|
|
||||||
* this file.
|
|
||||||
*
|
|
||||||
* We offer the option of declaring one wide-character version of the
|
|
||||||
* RE functions as well as the char versions. To do that, define
|
|
||||||
* __REG_WIDE_T to the type of wide characters (unfortunately, there
|
|
||||||
* is no consensus that wchar_t is suitable) and __REG_WIDE_COMPILE and
|
|
||||||
* __REG_WIDE_EXEC to the names to be used for the compile and execute
|
|
||||||
* functions (suggestion: re_Xcomp and re_Xexec, where X is a letter
|
|
||||||
* suggestive of the wide type, e.g. re_ucomp and re_uexec for Unicode).
|
|
||||||
* For cranky old compilers, it may be necessary to do something like:
|
|
||||||
* #define __REG_WIDE_COMPILE(a,b,c,d) re_Xcomp(a,b,c,d)
|
|
||||||
* #define __REG_WIDE_EXEC(a,b,c,d,e,f,g) re_Xexec(a,b,c,d,e,f,g)
|
|
||||||
* rather than just #defining the names as parameterless macros.
|
|
||||||
*
|
|
||||||
* For some specialized purposes, it may be desirable to suppress the
|
|
||||||
* declarations of the "front end" functions, regcomp() and regexec(),
|
|
||||||
* or of the char versions of the compile and execute functions. To
|
|
||||||
* suppress the front-end functions, define __REG_NOFRONT. To suppress
|
|
||||||
* the char versions, define __REG_NOCHAR.
|
|
||||||
*
|
|
||||||
* The right place to do those defines (and some others you may want, see
|
|
||||||
* below) would be <sys/types.h>. If you don't have control of that file,
|
|
||||||
* the right place to add your own defines to this file is marked below.
|
|
||||||
* This is normally done automatically, by the makefile and regmkhdr, based
|
|
||||||
* on the contents of regcustom.h.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* voodoo for C++
|
|
||||||
*/
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Add your own defines, if needed, here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Location where a chunk of regcustom.h is automatically spliced into
|
|
||||||
* this file (working from its prototype, regproto.h).
|
|
||||||
*/
|
|
||||||
/* --- begin --- */
|
|
||||||
/* ensure certain things don't sneak in from system headers */
|
|
||||||
#ifdef __REG_WIDE_T
|
|
||||||
#undef __REG_WIDE_T
|
|
||||||
#endif
|
|
||||||
#ifdef __REG_WIDE_COMPILE
|
|
||||||
#undef __REG_WIDE_COMPILE
|
|
||||||
#endif
|
|
||||||
#ifdef __REG_WIDE_EXEC
|
|
||||||
#undef __REG_WIDE_EXEC
|
|
||||||
#endif
|
|
||||||
#ifdef __REG_REGOFF_T
|
|
||||||
#undef __REG_REGOFF_T
|
|
||||||
#endif
|
|
||||||
#ifdef __REG_VOID_T
|
|
||||||
#undef __REG_VOID_T
|
|
||||||
#endif
|
|
||||||
#ifdef __REG_CONST
|
|
||||||
#undef __REG_CONST
|
|
||||||
#endif
|
|
||||||
#ifdef __REG_NOFRONT
|
|
||||||
#undef __REG_NOFRONT
|
|
||||||
#endif
|
|
||||||
#ifdef __REG_NOCHAR
|
|
||||||
#undef __REG_NOCHAR
|
|
||||||
#endif
|
|
||||||
/* interface types */
|
|
||||||
#define __REG_WIDE_T Tcl_UniChar
|
|
||||||
#define __REG_REGOFF_T long /* not really right, but good enough... */
|
|
||||||
#define __REG_VOID_T VOID
|
|
||||||
#define __REG_CONST CONST
|
|
||||||
/* names and declarations */
|
|
||||||
#define __REG_WIDE_COMPILE TclReComp
|
|
||||||
#define __REG_WIDE_EXEC TclReExec
|
|
||||||
#define __REG_NOFRONT /* don't want regcomp() and regexec() */
|
|
||||||
#define __REG_NOCHAR /* or the char versions */
|
|
||||||
#define regfree TclReFree
|
|
||||||
#define regerror TclReError
|
|
||||||
/* --- end --- */
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* interface types etc.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* regoff_t has to be large enough to hold either off_t or ssize_t,
|
|
||||||
* and must be signed; it's only a guess that long is suitable, so we
|
|
||||||
* offer <sys/types.h> an override.
|
|
||||||
*/
|
|
||||||
#ifdef __REG_REGOFF_T
|
|
||||||
typedef __REG_REGOFF_T regoff_t;
|
|
||||||
#else
|
|
||||||
typedef long regoff_t;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* For benefit of old compilers, we offer <sys/types.h> the option of
|
|
||||||
* overriding the `void' type used to declare nonexistent return types.
|
|
||||||
*/
|
|
||||||
#ifdef __REG_VOID_T
|
|
||||||
typedef __REG_VOID_T re_void;
|
|
||||||
#else
|
|
||||||
typedef void re_void;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Also for benefit of old compilers, <sys/types.h> can supply a macro
|
|
||||||
* which expands to a substitute for `const'.
|
|
||||||
*/
|
|
||||||
#ifndef __REG_CONST
|
|
||||||
#define __REG_CONST const
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* other interface types
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* the biggie, a compiled RE (or rather, a front end to same) */
|
|
||||||
typedef struct {
|
|
||||||
int re_magic; /* magic number */
|
|
||||||
size_t re_nsub; /* number of subexpressions */
|
|
||||||
long re_info; /* information about RE */
|
|
||||||
# define REG_UBACKREF 000001
|
|
||||||
# define REG_ULOOKAHEAD 000002
|
|
||||||
# define REG_UBOUNDS 000004
|
|
||||||
# define REG_UBRACES 000010
|
|
||||||
# define REG_UBSALNUM 000020
|
|
||||||
# define REG_UPBOTCH 000040
|
|
||||||
# define REG_UBBS 000100
|
|
||||||
# define REG_UNONPOSIX 000200
|
|
||||||
# define REG_UUNSPEC 000400
|
|
||||||
# define REG_UUNPORT 001000
|
|
||||||
# define REG_ULOCALE 002000
|
|
||||||
# define REG_UEMPTYMATCH 004000
|
|
||||||
# define REG_UIMPOSSIBLE 010000
|
|
||||||
# define REG_USHORTEST 020000
|
|
||||||
int re_csize; /* sizeof(character) */
|
|
||||||
char *re_endp; /* backward compatibility kludge */
|
|
||||||
/* the rest is opaque pointers to hidden innards */
|
|
||||||
char *re_guts; /* `char *' is more portable than `void *' */
|
|
||||||
char *re_fns;
|
|
||||||
} regex_t;
|
|
||||||
|
|
||||||
/* result reporting (may acquire more fields later) */
|
|
||||||
typedef struct {
|
|
||||||
regoff_t rm_so; /* start of substring */
|
|
||||||
regoff_t rm_eo; /* end of substring */
|
|
||||||
} regmatch_t;
|
|
||||||
|
|
||||||
/* supplementary control and reporting */
|
|
||||||
typedef struct {
|
|
||||||
regmatch_t rm_extend; /* see REG_EXPECT */
|
|
||||||
} rm_detail_t;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* compilation
|
|
||||||
^ #ifndef __REG_NOCHAR
|
|
||||||
^ int re_comp(regex_t *, __REG_CONST char *, size_t, int);
|
|
||||||
^ #endif
|
|
||||||
^ #ifndef __REG_NOFRONT
|
|
||||||
^ int regcomp(regex_t *, __REG_CONST char *, int);
|
|
||||||
^ #endif
|
|
||||||
^ #ifdef __REG_WIDE_T
|
|
||||||
^ int __REG_WIDE_COMPILE(regex_t *, __REG_CONST __REG_WIDE_T *, size_t, int);
|
|
||||||
^ #endif
|
|
||||||
*/
|
|
||||||
#define REG_BASIC 000000 /* BREs (convenience) */
|
|
||||||
#define REG_EXTENDED 000001 /* EREs */
|
|
||||||
#define REG_ADVF 000002 /* advanced features in EREs */
|
|
||||||
#define REG_ADVANCED 000003 /* AREs (which are also EREs) */
|
|
||||||
#define REG_QUOTE 000004 /* no special characters, none */
|
|
||||||
#define REG_NOSPEC REG_QUOTE /* historical synonym */
|
|
||||||
#define REG_ICASE 000010 /* ignore case */
|
|
||||||
#define REG_NOSUB 000020 /* don't care about subexpressions */
|
|
||||||
#define REG_EXPANDED 000040 /* expanded format, white space & comments */
|
|
||||||
#define REG_NLSTOP 000100 /* \n doesn't match . or [^ ] */
|
|
||||||
#define REG_NLANCH 000200 /* ^ matches after \n, $ before */
|
|
||||||
#define REG_NEWLINE 000300 /* newlines are line terminators */
|
|
||||||
#define REG_PEND 000400 /* ugh -- backward-compatibility hack */
|
|
||||||
#define REG_EXPECT 001000 /* report details on partial/limited matches */
|
|
||||||
#define REG_BOSONLY 002000 /* temporary kludge for BOS-only matches */
|
|
||||||
#define REG_DUMP 004000 /* none of your business :-) */
|
|
||||||
#define REG_FAKE 010000 /* none of your business :-) */
|
|
||||||
#define REG_PROGRESS 020000 /* none of your business :-) */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* execution
|
|
||||||
^ #ifndef __REG_NOCHAR
|
|
||||||
^ int re_exec(regex_t *, __REG_CONST char *, size_t,
|
|
||||||
^ rm_detail_t *, size_t, regmatch_t [], int);
|
|
||||||
^ #endif
|
|
||||||
^ #ifndef __REG_NOFRONT
|
|
||||||
^ int regexec(regex_t *, __REG_CONST char *, size_t, regmatch_t [], int);
|
|
||||||
^ #endif
|
|
||||||
^ #ifdef __REG_WIDE_T
|
|
||||||
^ int __REG_WIDE_EXEC(regex_t *, __REG_CONST __REG_WIDE_T *, size_t,
|
|
||||||
^ rm_detail_t *, size_t, regmatch_t [], int);
|
|
||||||
^ #endif
|
|
||||||
*/
|
|
||||||
#define REG_NOTBOL 0001 /* BOS is not BOL */
|
|
||||||
#define REG_NOTEOL 0002 /* EOS is not EOL */
|
|
||||||
#define REG_STARTEND 0004 /* backward compatibility kludge */
|
|
||||||
#define REG_FTRACE 0010 /* none of your business */
|
|
||||||
#define REG_MTRACE 0020 /* none of your business */
|
|
||||||
#define REG_SMALL 0040 /* none of your business */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* misc generics (may be more functions here eventually)
|
|
||||||
^ re_void regfree(regex_t *);
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* error reporting
|
|
||||||
* Be careful if modifying the list of error codes -- the table used by
|
|
||||||
* regerror() is generated automatically from this file!
|
|
||||||
*
|
|
||||||
* Note that there is no wide-char variant of regerror at this time; what
|
|
||||||
* kind of character is used for error reports is independent of what kind
|
|
||||||
* is used in matching.
|
|
||||||
*
|
|
||||||
^ extern size_t regerror(int, __REG_CONST regex_t *, char *, size_t);
|
|
||||||
*/
|
|
||||||
#define REG_OKAY 0 /* no errors detected */
|
|
||||||
#define REG_NOMATCH 1 /* failed to match */
|
|
||||||
#define REG_BADPAT 2 /* invalid regexp */
|
|
||||||
#define REG_ECOLLATE 3 /* invalid collating element */
|
|
||||||
#define REG_ECTYPE 4 /* invalid character class */
|
|
||||||
#define REG_EESCAPE 5 /* invalid escape \ sequence */
|
|
||||||
#define REG_ESUBREG 6 /* invalid backreference number */
|
|
||||||
#define REG_EBRACK 7 /* brackets [] not balanced */
|
|
||||||
#define REG_EPAREN 8 /* parentheses () not balanced */
|
|
||||||
#define REG_EBRACE 9 /* braces {} not balanced */
|
|
||||||
#define REG_BADBR 10 /* invalid repetition count(s) */
|
|
||||||
#define REG_ERANGE 11 /* invalid character range */
|
|
||||||
#define REG_ESPACE 12 /* out of memory */
|
|
||||||
#define REG_BADRPT 13 /* quantifier operand invalid */
|
|
||||||
#define REG_ASSERT 15 /* "can't happen" -- you found a bug */
|
|
||||||
#define REG_INVARG 16 /* invalid argument to regex function */
|
|
||||||
#define REG_MIXED 17 /* character widths of regex and string differ */
|
|
||||||
#define REG_BADOPT 18 /* invalid embedded option */
|
|
||||||
/* two specials for debugging and testing */
|
|
||||||
#define REG_ATOI 101 /* convert error-code name to number */
|
|
||||||
#define REG_ITOA 102 /* convert error-code number to name */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the prototypes, as possibly munched by regfwd
|
|
||||||
*/
|
|
||||||
/* =====^!^===== begin forwards =====^!^===== */
|
|
||||||
/* automatically gathered by fwd; do not hand-edit */
|
|
||||||
/* === regproto.h === */
|
|
||||||
#ifndef __REG_NOCHAR
|
|
||||||
int re_comp _ANSI_ARGS_((regex_t *, __REG_CONST char *, size_t, int));
|
|
||||||
#endif
|
|
||||||
#ifndef __REG_NOFRONT
|
|
||||||
int regcomp _ANSI_ARGS_((regex_t *, __REG_CONST char *, int));
|
|
||||||
#endif
|
|
||||||
#ifdef __REG_WIDE_T
|
|
||||||
int __REG_WIDE_COMPILE _ANSI_ARGS_((regex_t *, __REG_CONST __REG_WIDE_T *, size_t, int));
|
|
||||||
#endif
|
|
||||||
#ifndef __REG_NOCHAR
|
|
||||||
int re_exec _ANSI_ARGS_((regex_t *, __REG_CONST char *, size_t, rm_detail_t *, size_t, regmatch_t [], int));
|
|
||||||
#endif
|
|
||||||
#ifndef __REG_NOFRONT
|
|
||||||
int regexec _ANSI_ARGS_((regex_t *, __REG_CONST char *, size_t, regmatch_t [], int));
|
|
||||||
#endif
|
|
||||||
#ifdef __REG_WIDE_T
|
|
||||||
int __REG_WIDE_EXEC _ANSI_ARGS_((regex_t *, __REG_CONST __REG_WIDE_T *, size_t, rm_detail_t *, size_t, regmatch_t [], int));
|
|
||||||
#endif
|
|
||||||
re_void regfree _ANSI_ARGS_((regex_t *));
|
|
||||||
extern size_t regerror _ANSI_ARGS_((int, __REG_CONST regex_t *, char *, size_t));
|
|
||||||
/* automatically gathered by fwd; do not hand-edit */
|
|
||||||
/* =====^!^===== end forwards =====^!^===== */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* more C++ voodoo
|
|
||||||
*/
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#endif
|
|
1136
src/regex/regexec.c
1136
src/regex/regexec.c
File diff suppressed because it is too large
Load Diff
@@ -1,53 +1,37 @@
|
|||||||
/*
|
#include <sys/types.h>
|
||||||
* regfree - free an RE
|
#include <stdio.h>
|
||||||
*
|
#include <stdlib.h>
|
||||||
* Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.
|
#include <regex.h>
|
||||||
*
|
|
||||||
* Development of this software was funded, in part, by Cray Research Inc.,
|
|
||||||
* UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
|
|
||||||
* Corporation, none of whom are responsible for the results. The author
|
|
||||||
* thanks all of them.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms -- with or without
|
|
||||||
* modification -- are permitted for any purpose, provided that
|
|
||||||
* redistributions in source form retain this entire copyright notice and
|
|
||||||
* indicate the origin and nature of any modifications.
|
|
||||||
*
|
|
||||||
* I'd appreciate being given credit for this package in the documentation
|
|
||||||
* of software which uses it, but that is not a requirement.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
||||||
* HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* You might think that this could be incorporated into regcomp.c, and
|
|
||||||
* that would be a reasonable idea... except that this is a generic
|
|
||||||
* function (with a generic name), applicable to all compiled REs
|
|
||||||
* regardless of the size of their characters, whereas the stuff in
|
|
||||||
* regcomp.c gets compiled once per character size.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "regguts.h"
|
#include "utils.h"
|
||||||
|
#include "regex2.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
- regfree - free an RE (generic function, punts to RE-specific function)
|
- regfree - free everything
|
||||||
*
|
= extern void regfree(regex_t *);
|
||||||
* Ignoring invocation with NULL is a convenience.
|
|
||||||
*/
|
*/
|
||||||
VOID
|
void
|
||||||
regfree(re)
|
regfree(preg)
|
||||||
regex_t *re;
|
regex_t *preg;
|
||||||
{
|
{
|
||||||
if (re == NULL)
|
register struct re_guts *g;
|
||||||
|
|
||||||
|
if (preg->re_magic != MAGIC1) /* oops */
|
||||||
|
return; /* nice to complain, but hard */
|
||||||
|
|
||||||
|
g = preg->re_g;
|
||||||
|
if (g == NULL || g->magic != MAGIC2) /* oops again */
|
||||||
return;
|
return;
|
||||||
(*((struct fns *)re->re_fns)->free)(re);
|
preg->re_magic = 0; /* mark it invalid */
|
||||||
|
g->magic = 0; /* mark it invalid */
|
||||||
|
|
||||||
|
if (g->strip != NULL)
|
||||||
|
free((char *)g->strip);
|
||||||
|
if (g->sets != NULL)
|
||||||
|
free((char *)g->sets);
|
||||||
|
if (g->setbits != NULL)
|
||||||
|
free((char *)g->setbits);
|
||||||
|
if (g->must != NULL)
|
||||||
|
free(g->must);
|
||||||
|
free((char *)g);
|
||||||
}
|
}
|
||||||
|
@@ -1,83 +0,0 @@
|
|||||||
/*
|
|
||||||
* regcomp and regexec - front ends to re_ routines
|
|
||||||
*
|
|
||||||
* Mostly for implementation of backward-compatibility kludges. Note
|
|
||||||
* that these routines exist ONLY in char versions.
|
|
||||||
*
|
|
||||||
* Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.
|
|
||||||
*
|
|
||||||
* Development of this software was funded, in part, by Cray Research Inc.,
|
|
||||||
* UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
|
|
||||||
* Corporation, none of whom are responsible for the results. The author
|
|
||||||
* thanks all of them.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms -- with or without
|
|
||||||
* modification -- are permitted for any purpose, provided that
|
|
||||||
* redistributions in source form retain this entire copyright notice and
|
|
||||||
* indicate the origin and nature of any modifications.
|
|
||||||
*
|
|
||||||
* I'd appreciate being given credit for this package in the documentation
|
|
||||||
* of software which uses it, but that is not a requirement.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
||||||
* HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "regguts.h"
|
|
||||||
|
|
||||||
/*
|
|
||||||
- regcomp - compile regular expression
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
regcomp(re, str, flags)
|
|
||||||
regex_t *re;
|
|
||||||
CONST char *str;
|
|
||||||
int flags;
|
|
||||||
{
|
|
||||||
size_t len;
|
|
||||||
int f = flags;
|
|
||||||
|
|
||||||
if (f®_PEND) {
|
|
||||||
len = re->re_endp - str;
|
|
||||||
f &= ~REG_PEND;
|
|
||||||
} else
|
|
||||||
len = strlen(str);
|
|
||||||
|
|
||||||
return re_comp(re, str, len, f);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
- regexec - execute regular expression
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
regexec(re, str, nmatch, pmatch, flags)
|
|
||||||
regex_t *re;
|
|
||||||
CONST char *str;
|
|
||||||
size_t nmatch;
|
|
||||||
regmatch_t pmatch[];
|
|
||||||
int flags;
|
|
||||||
{
|
|
||||||
CONST char *start;
|
|
||||||
size_t len;
|
|
||||||
int f = flags;
|
|
||||||
|
|
||||||
if (f®_STARTEND) {
|
|
||||||
start = str + pmatch[0].rm_so;
|
|
||||||
len = pmatch[0].rm_eo - pmatch[0].rm_so;
|
|
||||||
f &= ~REG_STARTEND;
|
|
||||||
} else {
|
|
||||||
start = str;
|
|
||||||
len = strlen(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
return re_exec(re, start, len, nmatch, pmatch, f);
|
|
||||||
}
|
|
@@ -1,418 +0,0 @@
|
|||||||
/*
|
|
||||||
* Internal interface definitions, etc., for the reg package
|
|
||||||
*
|
|
||||||
* Copyright (c) 1998, 1999 Henry Spencer. All rights reserved.
|
|
||||||
*
|
|
||||||
* Development of this software was funded, in part, by Cray Research Inc.,
|
|
||||||
* UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics
|
|
||||||
* Corporation, none of whom are responsible for the results. The author
|
|
||||||
* thanks all of them.
|
|
||||||
*
|
|
||||||
* Redistribution and use in source and binary forms -- with or without
|
|
||||||
* modification -- are permitted for any purpose, provided that
|
|
||||||
* redistributions in source form retain this entire copyright notice and
|
|
||||||
* indicate the origin and nature of any modifications.
|
|
||||||
*
|
|
||||||
* I'd appreciate being given credit for this package in the documentation
|
|
||||||
* of software which uses it, but that is not a requirement.
|
|
||||||
*
|
|
||||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
|
|
||||||
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
|
|
||||||
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
|
|
||||||
* HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
|
||||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
|
||||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
|
||||||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
||||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
||||||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
||||||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Environmental customization. It should not (I hope) be necessary to
|
|
||||||
* alter the file you are now reading -- regcustom.h should handle it all,
|
|
||||||
* given care here and elsewhere.
|
|
||||||
*/
|
|
||||||
#include "regcustom.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Things that regcustom.h might override.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* standard header files (NULL is a reasonable indicator for them) */
|
|
||||||
#ifndef NULL
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <string.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* assertions */
|
|
||||||
#ifndef assert
|
|
||||||
# ifndef REG_DEBUG
|
|
||||||
# define NDEBUG /* no assertions */
|
|
||||||
# endif
|
|
||||||
#include <assert.h>
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* voids */
|
|
||||||
#ifndef VOID
|
|
||||||
#define VOID void /* for function return values */
|
|
||||||
#endif
|
|
||||||
#ifndef DISCARD
|
|
||||||
#define DISCARD VOID /* for throwing values away */
|
|
||||||
#endif
|
|
||||||
#ifndef PVOID
|
|
||||||
#define PVOID VOID * /* generic pointer */
|
|
||||||
#endif
|
|
||||||
#ifndef VS
|
|
||||||
#define VS(x) ((PVOID)(x)) /* cast something to generic ptr */
|
|
||||||
#endif
|
|
||||||
#ifndef NOPARMS
|
|
||||||
#define NOPARMS VOID /* for empty parm lists */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* const */
|
|
||||||
#ifndef CONST
|
|
||||||
#define CONST const /* for old compilers, might be empty */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* function-pointer declarator */
|
|
||||||
#ifndef FUNCPTR
|
|
||||||
#if __STDC__ >= 1
|
|
||||||
#define FUNCPTR(name, args) (*name)args
|
|
||||||
#else
|
|
||||||
#define FUNCPTR(name, args) (*name)()
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* memory allocation */
|
|
||||||
#ifndef MALLOC
|
|
||||||
#define MALLOC(n) malloc(n)
|
|
||||||
#endif
|
|
||||||
#ifndef REALLOC
|
|
||||||
#define REALLOC(p, n) realloc(VS(p), n)
|
|
||||||
#endif
|
|
||||||
#ifndef FREE
|
|
||||||
#define FREE(p) free(VS(p))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* want size of a char in bits, and max value in bounded quantifiers */
|
|
||||||
#ifndef CHAR_BIT
|
|
||||||
#include <limits.h>
|
|
||||||
#endif
|
|
||||||
#ifndef _POSIX2_RE_DUP_MAX
|
|
||||||
#define _POSIX2_RE_DUP_MAX 255 /* normally from <limits.h> */
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* misc
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define NOTREACHED 0
|
|
||||||
#define xxx 1
|
|
||||||
|
|
||||||
#define DUPMAX _POSIX2_RE_DUP_MAX
|
|
||||||
#define INFINITY (DUPMAX+1)
|
|
||||||
|
|
||||||
#define REMAGIC 0xfed7 /* magic number for main struct */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* debugging facilities
|
|
||||||
*/
|
|
||||||
#ifdef REG_DEBUG
|
|
||||||
/* FDEBUG does finite-state tracing */
|
|
||||||
#define FDEBUG(arglist) { if (v->eflags®_FTRACE) printf arglist; }
|
|
||||||
/* MDEBUG does higher-level tracing */
|
|
||||||
#define MDEBUG(arglist) { if (v->eflags®_MTRACE) printf arglist; }
|
|
||||||
#else
|
|
||||||
#define FDEBUG(arglist) {}
|
|
||||||
#define MDEBUG(arglist) {}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* bitmap manipulation
|
|
||||||
*/
|
|
||||||
#define UBITS (CHAR_BIT * sizeof(unsigned))
|
|
||||||
#define BSET(uv, sn) ((uv)[(sn)/UBITS] |= (unsigned)1 << ((sn)%UBITS))
|
|
||||||
#define ISBSET(uv, sn) ((uv)[(sn)/UBITS] & ((unsigned)1 << ((sn)%UBITS)))
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* We dissect a chr into byts for colormap table indexing. Here we define
|
|
||||||
* a byt, which will be the same as a byte on most machines... The exact
|
|
||||||
* size of a byt is not critical, but about 8 bits is good, and extraction
|
|
||||||
* of 8-bit chunks is sometimes especially fast.
|
|
||||||
*/
|
|
||||||
#ifndef BYTBITS
|
|
||||||
#define BYTBITS 8 /* bits in a byt */
|
|
||||||
#endif
|
|
||||||
#define BYTTAB (1<<BYTBITS) /* size of table with one entry per byt value */
|
|
||||||
#define BYTMASK (BYTTAB-1) /* bit mask for byt */
|
|
||||||
#define NBYTS ((CHRBITS+BYTBITS-1)/BYTBITS)
|
|
||||||
/* the definition of GETCOLOR(), below, assumes NBYTS <= 4 */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* As soon as possible, we map chrs into equivalence classes -- "colors" --
|
|
||||||
* which are of much more manageable number.
|
|
||||||
*/
|
|
||||||
typedef short color; /* colors of characters */
|
|
||||||
typedef int pcolor; /* what color promotes to */
|
|
||||||
#define COLORLESS (-1) /* impossible color */
|
|
||||||
#define WHITE 0 /* default color, parent of all others */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A colormap is a tree -- more precisely, a DAG -- indexed at each level
|
|
||||||
* by a byt of the chr, to map the chr to a color efficiently. Because
|
|
||||||
* lower sections of the tree can be shared, it can exploit the usual
|
|
||||||
* sparseness of such a mapping table. The tree is always NBYTS levels
|
|
||||||
* deep (in the past it was shallower during construction but was "filled"
|
|
||||||
* to full depth at the end of that); areas that are unaltered as yet point
|
|
||||||
* to "fill blocks" which are entirely WHITE in color.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* the tree itself */
|
|
||||||
struct colors {
|
|
||||||
color ccolor[BYTTAB];
|
|
||||||
};
|
|
||||||
struct ptrs {
|
|
||||||
union tree *pptr[BYTTAB];
|
|
||||||
};
|
|
||||||
union tree {
|
|
||||||
struct colors colors;
|
|
||||||
struct ptrs ptrs;
|
|
||||||
};
|
|
||||||
#define tcolor colors.ccolor
|
|
||||||
#define tptr ptrs.pptr
|
|
||||||
|
|
||||||
/* internal per-color structure for the color machinery */
|
|
||||||
struct colordesc {
|
|
||||||
uchr nchrs; /* number of chars of this color */
|
|
||||||
color sub; /* open subcolor (if any); free chain ptr */
|
|
||||||
# define NOSUB COLORLESS
|
|
||||||
struct arc *arcs; /* color chain */
|
|
||||||
int flags;
|
|
||||||
# define FREECOL 01 /* currently free */
|
|
||||||
# define PSEUDO 02 /* pseudocolor, no real chars */
|
|
||||||
# define UNUSEDCOLOR(cd) ((cd)->flags&FREECOL)
|
|
||||||
union tree *block; /* block of solid color, if any */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* the color map itself */
|
|
||||||
struct colormap {
|
|
||||||
int magic;
|
|
||||||
# define CMMAGIC 0x876
|
|
||||||
struct vars *v; /* for compile error reporting */
|
|
||||||
size_t ncds; /* number of colordescs */
|
|
||||||
size_t max; /* highest in use */
|
|
||||||
color free; /* beginning of free chain (if non-0) */
|
|
||||||
struct colordesc *cd;
|
|
||||||
# define CDEND(cm) (&(cm)->cd[(cm)->max + 1])
|
|
||||||
# define NINLINECDS ((size_t)10)
|
|
||||||
struct colordesc cdspace[NINLINECDS];
|
|
||||||
union tree tree[NBYTS]; /* tree top, plus fill blocks */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* optimization magic to do fast chr->color mapping */
|
|
||||||
#define B0(c) ((c) & BYTMASK)
|
|
||||||
#define B1(c) (((c)>>BYTBITS) & BYTMASK)
|
|
||||||
#define B2(c) (((c)>>(2*BYTBITS)) & BYTMASK)
|
|
||||||
#define B3(c) (((c)>>(3*BYTBITS)) & BYTMASK)
|
|
||||||
#if NBYTS == 1
|
|
||||||
#define GETCOLOR(cm, c) ((cm)->tree->tcolor[B0(c)])
|
|
||||||
#endif
|
|
||||||
/* beware, for NBYTS>1, GETCOLOR() is unsafe -- 2nd arg used repeatedly */
|
|
||||||
#if NBYTS == 2
|
|
||||||
#define GETCOLOR(cm, c) ((cm)->tree->tptr[B1(c)]->tcolor[B0(c)])
|
|
||||||
#endif
|
|
||||||
#if NBYTS == 4
|
|
||||||
#define GETCOLOR(cm, c) ((cm)->tree->tptr[B3(c)]->tptr[B2(c)]->tptr[B1(c)]->tcolor[B0(c)])
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Interface definitions for locale-interface functions in locale.c.
|
|
||||||
* Multi-character collating elements (MCCEs) cause most of the trouble.
|
|
||||||
*/
|
|
||||||
struct cvec {
|
|
||||||
int nchrs; /* number of chrs */
|
|
||||||
int chrspace; /* number of chrs possible */
|
|
||||||
chr *chrs; /* pointer to vector of chrs */
|
|
||||||
int nranges; /* number of ranges (chr pairs) */
|
|
||||||
int rangespace; /* number of chrs possible */
|
|
||||||
chr *ranges; /* pointer to vector of chr pairs */
|
|
||||||
int nmcces; /* number of MCCEs */
|
|
||||||
int mccespace; /* number of MCCEs possible */
|
|
||||||
int nmccechrs; /* number of chrs used for MCCEs */
|
|
||||||
chr *mcces[1]; /* pointers to 0-terminated MCCEs */
|
|
||||||
/* and both batches of chrs are on the end */
|
|
||||||
};
|
|
||||||
|
|
||||||
/* caution: this value cannot be changed easily */
|
|
||||||
#define MAXMCCE 2 /* length of longest MCCE */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* definitions for NFA internal representation
|
|
||||||
*
|
|
||||||
* Having a "from" pointer within each arc may seem redundant, but it
|
|
||||||
* saves a lot of hassle.
|
|
||||||
*/
|
|
||||||
struct state;
|
|
||||||
|
|
||||||
struct arc {
|
|
||||||
int type;
|
|
||||||
# define ARCFREE '\0'
|
|
||||||
color co;
|
|
||||||
struct state *from; /* where it's from (and contained within) */
|
|
||||||
struct state *to; /* where it's to */
|
|
||||||
struct arc *outchain; /* *from's outs chain or free chain */
|
|
||||||
# define freechain outchain
|
|
||||||
struct arc *inchain; /* *to's ins chain */
|
|
||||||
struct arc *colorchain; /* color's arc chain */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct arcbatch { /* for bulk allocation of arcs */
|
|
||||||
struct arcbatch *next;
|
|
||||||
# define ABSIZE 10
|
|
||||||
struct arc a[ABSIZE];
|
|
||||||
};
|
|
||||||
|
|
||||||
struct state {
|
|
||||||
int no;
|
|
||||||
# define FREESTATE (-1)
|
|
||||||
char flag; /* marks special states */
|
|
||||||
int nins; /* number of inarcs */
|
|
||||||
struct arc *ins; /* chain of inarcs */
|
|
||||||
int nouts; /* number of outarcs */
|
|
||||||
struct arc *outs; /* chain of outarcs */
|
|
||||||
struct arc *free; /* chain of free arcs */
|
|
||||||
struct state *tmp; /* temporary for traversal algorithms */
|
|
||||||
struct state *next; /* chain for traversing all */
|
|
||||||
struct state *prev; /* back chain */
|
|
||||||
struct arcbatch oas; /* first arcbatch, avoid malloc in easy case */
|
|
||||||
int noas; /* number of arcs used in first arcbatch */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct nfa {
|
|
||||||
struct state *pre; /* pre-initial state */
|
|
||||||
struct state *init; /* initial state */
|
|
||||||
struct state *final; /* final state */
|
|
||||||
struct state *post; /* post-final state */
|
|
||||||
int nstates; /* for numbering states */
|
|
||||||
struct state *states; /* state-chain header */
|
|
||||||
struct state *slast; /* tail of the chain */
|
|
||||||
struct state *free; /* free list */
|
|
||||||
struct colormap *cm; /* the color map */
|
|
||||||
color bos[2]; /* colors, if any, assigned to BOS and BOL */
|
|
||||||
color eos[2]; /* colors, if any, assigned to EOS and EOL */
|
|
||||||
struct vars *v; /* simplifies compile error reporting */
|
|
||||||
struct nfa *parent; /* parent NFA, if any */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* definitions for compacted NFA
|
|
||||||
*/
|
|
||||||
struct carc {
|
|
||||||
color co; /* COLORLESS is list terminator */
|
|
||||||
int to; /* state number */
|
|
||||||
};
|
|
||||||
|
|
||||||
struct cnfa {
|
|
||||||
int nstates; /* number of states */
|
|
||||||
int ncolors; /* number of colors */
|
|
||||||
int flags;
|
|
||||||
# define HASLACONS 01 /* uses lookahead constraints */
|
|
||||||
int pre; /* setup state number */
|
|
||||||
int post; /* teardown state number */
|
|
||||||
color bos[2]; /* colors, if any, assigned to BOS and BOL */
|
|
||||||
color eos[2]; /* colors, if any, assigned to EOS and EOL */
|
|
||||||
struct carc **states; /* vector of pointers to outarc lists */
|
|
||||||
struct carc *arcs; /* the area for the lists */
|
|
||||||
};
|
|
||||||
#define ZAPCNFA(cnfa) ((cnfa).nstates = 0)
|
|
||||||
#define NULLCNFA(cnfa) ((cnfa).nstates == 0)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* subexpression tree
|
|
||||||
*/
|
|
||||||
struct subre {
|
|
||||||
char op; /* '|', '.' (concat), 'b' (backref), '(', '=' */
|
|
||||||
char flags;
|
|
||||||
# define LONGER 01 /* prefers longer match */
|
|
||||||
# define SHORTER 02 /* prefers shorter match */
|
|
||||||
# define MIXED 04 /* mixed preference below */
|
|
||||||
# define CAP 010 /* capturing parens below */
|
|
||||||
# define BACKR 020 /* back reference below */
|
|
||||||
# define INUSE 0100 /* in use in final tree */
|
|
||||||
# define LOCAL 03 /* bits which may not propagate up */
|
|
||||||
# define LMIX(f) ((f)<<2) /* LONGER -> MIXED */
|
|
||||||
# define SMIX(f) ((f)<<1) /* SHORTER -> MIXED */
|
|
||||||
# define UP(f) (((f)&~LOCAL) | (LMIX(f) & SMIX(f) & MIXED))
|
|
||||||
# define MESSY(f) ((f)&(MIXED|CAP|BACKR))
|
|
||||||
# define PREF(f) ((f)&LOCAL)
|
|
||||||
# define PREF2(f1, f2) ((PREF(f1) != 0) ? PREF(f1) : PREF(f2))
|
|
||||||
# define COMBINE(f1, f2) (UP((f1)|(f2)) | PREF2(f1, f2))
|
|
||||||
short retry; /* index into retry memory */
|
|
||||||
int subno; /* subexpression number (for 'b' and '(') */
|
|
||||||
short min; /* min repetitions, for backref only */
|
|
||||||
short max; /* max repetitions, for backref only */
|
|
||||||
struct subre *left; /* left child, if any (also freelist chain) */
|
|
||||||
struct subre *right; /* right child, if any */
|
|
||||||
struct state *begin; /* outarcs from here... */
|
|
||||||
struct state *end; /* ...ending in inarcs here */
|
|
||||||
struct cnfa cnfa; /* compacted NFA, if any */
|
|
||||||
struct subre *chain; /* for bookkeeping and error cleanup */
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* table of function pointers for generic manipulation functions
|
|
||||||
* A regex_t's re_fns points to one of these.
|
|
||||||
*/
|
|
||||||
struct fns {
|
|
||||||
VOID FUNCPTR(free, (regex_t *));
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the insides of a regex_t, hidden behind a void *
|
|
||||||
*/
|
|
||||||
struct guts {
|
|
||||||
int magic;
|
|
||||||
# define GUTSMAGIC 0xfed9
|
|
||||||
int cflags; /* copy of compile flags */
|
|
||||||
long info; /* copy of re_info */
|
|
||||||
size_t nsub; /* copy of re_nsub */
|
|
||||||
struct subre *tree;
|
|
||||||
struct cnfa search; /* for fast preliminary search */
|
|
||||||
int ntree;
|
|
||||||
struct colormap cmap;
|
|
||||||
int FUNCPTR(compare, (CONST chr *, CONST chr *, size_t));
|
|
||||||
struct subre *lacons; /* lookahead-constraint vector */
|
|
||||||
int nlacons; /* size of lacons */
|
|
||||||
};
|
|
@@ -1,904 +0,0 @@
|
|||||||
/*
|
|
||||||
* tclUniData.c --
|
|
||||||
*
|
|
||||||
* Declarations of Unicode character information tables. This file is
|
|
||||||
* automatically generated by the tools/uniParse.tcl script. Do not
|
|
||||||
* modify this file by hand.
|
|
||||||
*
|
|
||||||
* Copyright (c) 1998 by Scriptics Corporation.
|
|
||||||
* All rights reserved.
|
|
||||||
*
|
|
||||||
* RCS: @(#) $Id$
|
|
||||||
*/
|
|
||||||
|
|
||||||
/*
|
|
||||||
* A 16-bit Unicode character is split into two parts in order to index
|
|
||||||
* into the following tables. The lower OFFSET_BITS comprise an offset
|
|
||||||
* into a page of characters. The upper bits comprise the page number.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define OFFSET_BITS 5
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The pageMap is indexed by page number and returns an alternate page number
|
|
||||||
* that identifies a unique page of characters. Many Unicode characters map
|
|
||||||
* to the same alternate page number.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static unsigned char pageMap[] = {
|
|
||||||
0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 7, 15, 16, 17,
|
|
||||||
18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 7, 32,
|
|
||||||
7, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47,
|
|
||||||
48, 49, 50, 51, 52, 35, 47, 53, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
|
|
||||||
58, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 80, 81,
|
|
||||||
84, 85, 80, 86, 87, 88, 89, 90, 91, 92, 35, 93, 94, 95, 35, 96, 97,
|
|
||||||
98, 99, 100, 101, 102, 35, 47, 103, 104, 35, 35, 105, 106, 107, 47,
|
|
||||||
47, 108, 47, 47, 109, 47, 110, 111, 47, 112, 47, 113, 114, 115, 116,
|
|
||||||
114, 47, 117, 118, 35, 47, 47, 119, 90, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 120, 121, 47, 47, 122,
|
|
||||||
35, 35, 35, 35, 47, 123, 124, 125, 126, 47, 127, 128, 47, 129, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 7, 7, 7, 7, 130, 7, 7, 131, 132, 133, 134,
|
|
||||||
135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148,
|
|
||||||
149, 150, 151, 152, 153, 154, 155, 156, 156, 156, 156, 156, 156, 156,
|
|
||||||
157, 158, 159, 160, 161, 162, 35, 35, 35, 160, 163, 164, 165, 166,
|
|
||||||
167, 168, 169, 160, 160, 160, 160, 170, 171, 172, 173, 174, 160, 160,
|
|
||||||
175, 35, 35, 35, 35, 176, 177, 178, 179, 180, 181, 35, 35, 160, 160,
|
|
||||||
160, 160, 160, 160, 160, 160, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
182, 160, 160, 155, 160, 160, 160, 160, 160, 160, 170, 183, 184, 185,
|
|
||||||
90, 47, 186, 90, 47, 187, 188, 189, 47, 47, 190, 128, 35, 35, 191,
|
|
||||||
192, 193, 194, 192, 195, 196, 197, 160, 160, 160, 198, 160, 160, 199,
|
|
||||||
197, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 200, 35, 35, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 201, 35, 35, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
202, 203, 204, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 205, 35, 35, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
|
|
||||||
206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
|
|
||||||
206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
|
|
||||||
206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206,
|
|
||||||
206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 47, 47, 47, 47, 47, 47, 47, 47, 47, 208, 35, 35, 35, 35,
|
|
||||||
35, 35, 209, 210, 211, 47, 47, 212, 213, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 214, 215, 47, 216, 47, 217, 218, 35, 219, 220, 221, 47,
|
|
||||||
47, 47, 222, 223, 2, 224, 225, 226, 227, 228, 229, 230, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 231, 35, 232, 233,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47,
|
|
||||||
47, 208, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 47, 234, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 235, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
|
|
||||||
207, 207, 207, 236, 207, 207, 207, 207, 207, 207, 207, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35,
|
|
||||||
35, 35, 35, 35, 35
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The groupMap is indexed by combining the alternate page number with
|
|
||||||
* the page offset and returns a group number that identifies a unique
|
|
||||||
* set of character attributes.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static unsigned char groupMap[] = {
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
|
|
||||||
1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 3, 3, 3, 5, 6, 3, 7, 3, 8,
|
|
||||||
3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 7, 7, 7, 3, 3, 10, 10, 10,
|
|
||||||
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
|
|
||||||
10, 10, 10, 10, 10, 10, 5, 3, 6, 11, 12, 11, 13, 13, 13, 13, 13, 13,
|
|
||||||
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
|
||||||
13, 13, 13, 5, 7, 6, 7, 1, 2, 3, 4, 4, 4, 4, 14, 14, 11, 14, 15, 16,
|
|
||||||
7, 8, 14, 11, 14, 7, 17, 17, 11, 18, 14, 3, 11, 17, 15, 19, 17, 17,
|
|
||||||
17, 3, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
|
|
||||||
10, 10, 10, 10, 10, 10, 10, 10, 7, 10, 10, 10, 10, 10, 10, 10, 15,
|
|
||||||
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
|
||||||
13, 13, 13, 13, 13, 13, 7, 13, 13, 13, 13, 13, 13, 13, 20, 21, 22,
|
|
||||||
21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21,
|
|
||||||
22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22,
|
|
||||||
21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 23, 24, 21, 22, 21,
|
|
||||||
22, 21, 22, 15, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21,
|
|
||||||
22, 21, 22, 15, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21,
|
|
||||||
22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22,
|
|
||||||
21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 25,
|
|
||||||
21, 22, 21, 22, 21, 22, 26, 15, 27, 21, 22, 21, 22, 28, 21, 22, 29,
|
|
||||||
29, 21, 22, 15, 30, 31, 32, 21, 22, 29, 33, 34, 35, 36, 21, 22, 15,
|
|
||||||
15, 35, 37, 15, 38, 21, 22, 21, 22, 21, 22, 39, 21, 22, 39, 15, 15,
|
|
||||||
21, 22, 39, 21, 22, 40, 40, 21, 22, 21, 22, 41, 21, 22, 15, 42, 21,
|
|
||||||
22, 15, 43, 42, 42, 42, 42, 44, 45, 46, 44, 45, 46, 44, 45, 46, 21,
|
|
||||||
22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 47, 21,
|
|
||||||
22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22,
|
|
||||||
15, 44, 45, 46, 21, 22, 48, 49, 21, 22, 21, 22, 21, 22, 21, 22, 0,
|
|
||||||
0, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22,
|
|
||||||
21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 50, 51, 15, 52, 52, 15, 53, 15,
|
|
||||||
54, 15, 15, 15, 15, 52, 15, 15, 55, 15, 15, 15, 15, 56, 57, 15, 15,
|
|
||||||
15, 15, 15, 57, 15, 15, 58, 15, 15, 59, 15, 15, 15, 15, 15, 15, 15,
|
|
||||||
15, 15, 15, 60, 15, 15, 60, 15, 15, 15, 15, 60, 15, 61, 61, 15, 15,
|
|
||||||
15, 15, 15, 15, 62, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
||||||
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 63,
|
|
||||||
63, 63, 63, 63, 63, 63, 63, 63, 11, 11, 63, 63, 63, 63, 63, 63, 63,
|
|
||||||
11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 63, 63, 11,
|
|
||||||
11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 63, 63, 63, 63,
|
|
||||||
63, 11, 11, 11, 11, 11, 11, 11, 11, 11, 63, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,
|
|
||||||
64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11,
|
|
||||||
0, 0, 0, 0, 63, 0, 0, 0, 3, 0, 0, 0, 0, 0, 11, 11, 66, 3, 67, 67, 67,
|
|
||||||
0, 68, 0, 69, 69, 15, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
|
|
||||||
10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 70, 71,
|
|
||||||
71, 71, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
|
||||||
13, 13, 13, 72, 13, 13, 13, 13, 13, 13, 13, 13, 13, 73, 74, 74, 0,
|
|
||||||
75, 76, 77, 77, 77, 78, 79, 15, 0, 0, 21, 22, 21, 22, 21, 22, 21, 22,
|
|
||||||
21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 80, 81, 47,
|
|
||||||
15, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 84, 84, 84, 84, 84, 84,
|
|
||||||
84, 84, 84, 84, 84, 84, 84, 84, 84, 10, 10, 10, 10, 10, 10, 10, 10,
|
|
||||||
10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10,
|
|
||||||
10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
|
||||||
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
|
||||||
13, 13, 13, 13, 13, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81,
|
|
||||||
81, 81, 81, 81, 21, 22, 14, 64, 64, 64, 64, 0, 85, 85, 0, 0, 21, 22,
|
|
||||||
21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21,
|
|
||||||
22, 77, 21, 22, 21, 22, 0, 0, 21, 22, 0, 0, 21, 22, 0, 0, 0, 21, 22,
|
|
||||||
21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21,
|
|
||||||
22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22,
|
|
||||||
21, 22, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 86, 86, 86,
|
|
||||||
86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
|
|
||||||
86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86,
|
|
||||||
0, 0, 63, 3, 3, 3, 3, 3, 3, 0, 87, 87, 87, 87, 87, 87, 87, 87, 87,
|
|
||||||
87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87,
|
|
||||||
87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 15, 0, 3, 8, 0, 0,
|
|
||||||
0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, 64, 3, 64, 3, 64,
|
|
||||||
64, 3, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 0, 0, 0, 0, 0, 42, 42, 42, 3, 3, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 0, 0, 0, 0, 0, 63, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 0, 0, 64, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 3, 42, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 85, 85, 64, 64, 64, 64, 64, 64, 63, 63, 64,
|
|
||||||
64, 14, 64, 64, 64, 64, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 42, 42,
|
|
||||||
42, 14, 14, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 88, 42,
|
|
||||||
64, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,
|
|
||||||
64, 89, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 0, 0, 64, 42, 89, 89, 89, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 89, 89, 89, 89, 64, 0, 0, 42, 64, 64, 64, 64, 0, 0, 0, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 64, 64, 3, 3, 9, 9, 9, 9, 9, 9,
|
|
||||||
9, 9, 9, 9, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64,
|
|
||||||
89, 89, 0, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 42, 42, 0, 0, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 0, 42, 0, 0, 0, 42,
|
|
||||||
42, 42, 42, 0, 0, 64, 0, 89, 89, 89, 64, 64, 64, 64, 0, 0, 89, 89,
|
|
||||||
0, 0, 89, 89, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 42, 42,
|
|
||||||
0, 42, 42, 42, 64, 64, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 42, 42,
|
|
||||||
4, 4, 17, 17, 17, 17, 17, 17, 14, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 42,
|
|
||||||
42, 42, 42, 42, 42, 0, 0, 0, 0, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 0, 42, 42, 0, 42, 42, 0, 0,
|
|
||||||
64, 0, 89, 89, 89, 64, 64, 0, 0, 0, 0, 64, 64, 0, 0, 64, 64, 64, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 0, 42, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 64, 64, 42, 42, 42, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 89, 0, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
0, 42, 0, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 0, 42, 42, 0, 42, 42, 42, 42, 42, 0, 0, 64, 42, 89, 89, 89,
|
|
||||||
64, 64, 64, 64, 64, 0, 64, 64, 89, 0, 89, 89, 64, 0, 0, 42, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 9, 9, 9, 9,
|
|
||||||
9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 0, 42,
|
|
||||||
42, 0, 0, 42, 42, 42, 42, 0, 0, 64, 42, 89, 64, 89, 64, 64, 64, 0,
|
|
||||||
0, 0, 89, 89, 0, 0, 89, 89, 64, 0, 0, 0, 0, 0, 0, 0, 0, 64, 89, 0,
|
|
||||||
0, 0, 0, 42, 42, 0, 42, 42, 42, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9,
|
|
||||||
9, 9, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 89,
|
|
||||||
0, 42, 42, 42, 42, 42, 42, 0, 0, 0, 42, 42, 42, 0, 42, 42, 42, 42,
|
|
||||||
0, 0, 0, 42, 42, 0, 42, 0, 42, 42, 0, 0, 0, 42, 42, 0, 0, 0, 42, 42,
|
|
||||||
42, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 0, 0, 0,
|
|
||||||
0, 89, 89, 64, 89, 89, 0, 0, 0, 89, 89, 89, 0, 89, 89, 89, 64, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 89, 89, 89, 0, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42,
|
|
||||||
42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 0, 42, 42, 42, 42, 42, 0, 0, 0, 0, 64, 64, 64, 89, 89,
|
|
||||||
89, 89, 0, 64, 64, 64, 0, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 64,
|
|
||||||
64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9,
|
|
||||||
9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89,
|
|
||||||
89, 0, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 0, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42,
|
|
||||||
42, 42, 0, 0, 0, 0, 89, 64, 89, 89, 89, 89, 89, 0, 64, 89, 89, 0, 89,
|
|
||||||
89, 64, 64, 0, 0, 0, 0, 0, 0, 0, 89, 89, 0, 0, 0, 0, 0, 0, 0, 42, 0,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 89, 89, 89, 64, 64,
|
|
||||||
64, 0, 0, 89, 89, 89, 0, 89, 89, 89, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 89, 0, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 0, 0,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 64, 0, 0, 0, 0, 89, 89, 89, 64,
|
|
||||||
64, 64, 0, 64, 0, 89, 89, 89, 89, 89, 89, 89, 89, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 89, 3, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 64, 42, 42, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 4, 42, 42,
|
|
||||||
42, 42, 42, 42, 63, 64, 64, 64, 64, 64, 64, 64, 64, 3, 9, 9, 9, 9,
|
|
||||||
9, 9, 9, 9, 9, 9, 3, 3, 0, 0, 0, 0, 0, 42, 42, 0, 42, 0, 0, 42, 42,
|
|
||||||
0, 42, 0, 0, 42, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 0, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 0, 42, 42, 42, 0, 42, 0, 42, 0, 0, 42, 42, 0, 42, 42, 42,
|
|
||||||
42, 64, 42, 42, 64, 64, 64, 64, 64, 64, 0, 64, 64, 42, 0, 0, 42, 42,
|
|
||||||
42, 42, 42, 0, 63, 0, 64, 64, 64, 64, 64, 64, 0, 0, 9, 9, 9, 9, 9,
|
|
||||||
9, 9, 9, 9, 9, 0, 0, 42, 42, 0, 0, 42, 14, 14, 14, 3, 3, 3, 3, 3, 3,
|
|
||||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 14, 14, 14, 14, 14, 64, 64, 14, 14, 14,
|
|
||||||
14, 14, 14, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 17, 17, 17, 17, 17, 17,
|
|
||||||
17, 17, 17, 14, 64, 14, 64, 14, 64, 5, 6, 5, 6, 89, 89, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 89, 64, 64, 64, 64, 64, 3, 64, 64, 42,
|
|
||||||
42, 42, 42, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
0, 14, 14, 14, 14, 14, 14, 14, 14, 64, 14, 14, 14, 14, 14, 14, 0, 0,
|
|
||||||
14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 0, 42,
|
|
||||||
42, 42, 42, 42, 0, 42, 42, 0, 89, 64, 64, 64, 64, 89, 64, 0, 0, 0,
|
|
||||||
64, 64, 89, 64, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3,
|
|
||||||
3, 3, 3, 3, 3, 42, 42, 42, 42, 42, 42, 89, 89, 64, 64, 0, 0, 0, 0,
|
|
||||||
0, 0, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
||||||
77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77,
|
|
||||||
77, 77, 77, 77, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
0, 0, 0, 0, 3, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0,
|
|
||||||
0, 0, 0, 0, 42, 42, 42, 42, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 0, 42, 0, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
0, 42, 0, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, 42, 0, 42,
|
|
||||||
0, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 0, 42, 0, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 0, 42, 0, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, 42, 0,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3,
|
|
||||||
3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
||||||
17, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 3, 3, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 5, 6, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
3, 3, 3, 90, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 89, 89, 89, 64, 64, 64, 64, 64, 64, 64, 89, 89, 89, 89, 89,
|
|
||||||
89, 89, 89, 64, 89, 89, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
3, 3, 3, 3, 3, 3, 3, 4, 3, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3,
|
|
||||||
3, 3, 3, 3, 8, 3, 3, 3, 3, 88, 88, 88, 88, 0, 9, 9, 9, 9, 9, 9, 9,
|
|
||||||
9, 9, 9, 0, 0, 0, 0, 0, 0, 42, 42, 42, 63, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 64, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 22, 21, 22, 21, 22, 21,
|
|
||||||
22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 15, 15,
|
|
||||||
15, 15, 15, 91, 0, 0, 0, 0, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22,
|
|
||||||
21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 0,
|
|
||||||
0, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93,
|
|
||||||
93, 93, 93, 92, 92, 92, 92, 92, 92, 0, 0, 93, 93, 93, 93, 93, 93, 0,
|
|
||||||
0, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93,
|
|
||||||
92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 92,
|
|
||||||
92, 92, 92, 92, 92, 0, 0, 93, 93, 93, 93, 93, 93, 0, 0, 15, 92, 15,
|
|
||||||
92, 15, 92, 15, 92, 0, 93, 0, 93, 0, 93, 0, 93, 92, 92, 92, 92, 92,
|
|
||||||
92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 95, 95, 95, 95,
|
|
||||||
96, 96, 97, 97, 98, 98, 99, 99, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92,
|
|
||||||
100, 100, 100, 100, 100, 100, 100, 100, 92, 92, 92, 92, 92, 92, 92,
|
|
||||||
92, 100, 100, 100, 100, 100, 100, 100, 100, 92, 92, 92, 92, 92, 92,
|
|
||||||
92, 92, 100, 100, 100, 100, 100, 100, 100, 100, 92, 92, 15, 101, 15,
|
|
||||||
0, 15, 15, 93, 93, 102, 102, 103, 11, 104, 11, 11, 11, 15, 101, 15,
|
|
||||||
0, 15, 15, 105, 105, 105, 105, 103, 11, 11, 11, 92, 92, 15, 15, 0,
|
|
||||||
0, 15, 15, 93, 93, 106, 106, 0, 11, 11, 11, 92, 92, 15, 15, 15, 107,
|
|
||||||
15, 15, 93, 93, 108, 108, 109, 11, 11, 11, 0, 0, 15, 101, 15, 0, 15,
|
|
||||||
15, 110, 110, 111, 111, 103, 11, 11, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
|
||||||
2, 2, 2, 88, 88, 88, 88, 8, 8, 8, 8, 8, 8, 3, 3, 16, 19, 5, 16, 16,
|
|
||||||
19, 5, 16, 3, 3, 3, 3, 3, 3, 3, 3, 112, 113, 88, 88, 88, 88, 88, 2,
|
|
||||||
3, 3, 3, 3, 3, 3, 3, 3, 3, 16, 19, 3, 3, 3, 3, 12, 12, 3, 3, 3, 7,
|
|
||||||
5, 6, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 88, 88, 88, 88, 88, 17,
|
|
||||||
0, 0, 0, 17, 17, 17, 17, 17, 17, 7, 7, 7, 5, 6, 15, 17, 17, 17, 17,
|
|
||||||
17, 17, 17, 17, 17, 17, 7, 7, 7, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 85, 85, 85, 85, 64, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 77,
|
|
||||||
14, 14, 14, 14, 77, 14, 14, 15, 77, 77, 77, 15, 15, 77, 77, 77, 15,
|
|
||||||
14, 77, 14, 14, 14, 77, 77, 77, 77, 77, 14, 14, 14, 14, 14, 14, 77,
|
|
||||||
14, 114, 14, 77, 14, 115, 116, 77, 77, 14, 15, 77, 77, 14, 77, 15,
|
|
||||||
42, 42, 42, 42, 15, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
||||||
17, 17, 17, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117,
|
|
||||||
117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118,
|
|
||||||
118, 118, 118, 118, 118, 118, 118, 90, 90, 90, 90, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 7, 7, 14, 14,
|
|
||||||
14, 14, 7, 14, 14, 7, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 7, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 14, 14, 7,
|
|
||||||
14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7,
|
|
||||||
7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 7, 7, 14, 14, 14, 14, 14, 14, 14, 5, 6, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
||||||
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
||||||
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
||||||
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
||||||
17, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 119, 119, 119, 119, 119, 119,
|
|
||||||
119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119,
|
|
||||||
119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120,
|
|
||||||
120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120,
|
|
||||||
120, 120, 120, 120, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 7, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14,
|
|
||||||
14, 14, 14, 0, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 0, 14, 0, 14, 14, 14, 14, 0, 0, 0, 14, 0, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
||||||
17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
||||||
17, 17, 17, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0,
|
|
||||||
0, 0, 0, 2, 3, 3, 3, 14, 63, 42, 90, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6,
|
|
||||||
14, 14, 5, 6, 5, 6, 5, 6, 5, 6, 8, 5, 6, 6, 14, 90, 90, 90, 90, 90,
|
|
||||||
90, 90, 90, 90, 64, 64, 64, 64, 64, 64, 8, 63, 63, 63, 63, 63, 14,
|
|
||||||
14, 90, 90, 90, 0, 0, 0, 14, 14, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 64, 64,
|
|
||||||
11, 11, 63, 63, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 12, 63,
|
|
||||||
63, 63, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 14, 14, 17, 17, 17,
|
|
||||||
17, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17,
|
|
||||||
17, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121,
|
|
||||||
121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121,
|
|
||||||
121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122,
|
|
||||||
122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
|
|
||||||
122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
|
|
||||||
122, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15,
|
|
||||||
15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 0,
|
|
||||||
0, 0, 0, 0, 42, 64, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 7, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42,
|
|
||||||
42, 0, 42, 0, 42, 42, 0, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 64, 64, 64, 64,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 8, 12, 12, 5, 6, 5, 6, 5,
|
|
||||||
6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 3, 3, 3, 3, 12, 12, 12,
|
|
||||||
3, 3, 3, 0, 3, 3, 3, 3, 8, 5, 6, 5, 6, 5, 6, 3, 3, 3, 7, 8, 7, 7, 7,
|
|
||||||
0, 3, 4, 3, 3, 0, 0, 0, 0, 42, 42, 42, 0, 42, 0, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
0, 0, 88, 0, 3, 3, 3, 4, 3, 3, 3, 5, 6, 3, 7, 3, 8, 3, 3, 9, 9, 9,
|
|
||||||
9, 9, 9, 9, 9, 9, 9, 3, 3, 7, 7, 7, 3, 11, 13, 13, 13, 13, 13, 13,
|
|
||||||
13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
|
|
||||||
13, 13, 13, 5, 7, 6, 7, 0, 0, 3, 5, 6, 3, 12, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 63, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 63,
|
|
||||||
63, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42,
|
|
||||||
42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0,
|
|
||||||
42, 42, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, 0, 0, 42, 42,
|
|
||||||
42, 42, 42, 42, 0, 0, 42, 42, 42, 0, 0, 0, 4, 4, 7, 11, 14, 4, 4, 0,
|
|
||||||
14, 7, 7, 7, 7, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 88, 88, 14,
|
|
||||||
14, 42, 17, 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 123, 123,
|
|
||||||
126, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
|
|
||||||
14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 89, 64, 14, 14, 14,
|
|
||||||
14, 14, 0, 0, 77, 77, 15, 15, 77, 15, 15, 77, 77, 15, 77, 77, 15, 77,
|
|
||||||
77, 15, 15, 77, 15, 15, 77, 77, 15, 77, 77, 15, 77, 77, 15, 15, 77,
|
|
||||||
15, 15, 77, 77, 15, 77, 77, 15, 77, 77, 15, 15, 77, 77, 15, 15, 77,
|
|
||||||
15, 15, 77, 77, 15, 15, 77, 15, 15, 77, 77, 15, 15, 9, 9, 9, 42, 42,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 88, 0, 88, 88, 88, 88, 88, 88, 0, 0, 0, 0, 0,
|
|
||||||
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122,
|
|
||||||
122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
|
|
||||||
122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122,
|
|
||||||
122
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Each group represents a unique set of character attributes. The attributes
|
|
||||||
* are encoded into a 32-bit value as follows:
|
|
||||||
*
|
|
||||||
* Bits 0-4 Character category: see the constants listed below.
|
|
||||||
*
|
|
||||||
* Bits 5-7 Case delta type: 000 = identity
|
|
||||||
* 010 = add delta for lower
|
|
||||||
* 011 = add delta for lower, add 1 for title
|
|
||||||
* 100 = sutract delta for title/upper
|
|
||||||
* 101 = sub delta for upper, sub 1 for title
|
|
||||||
* 110 = sub delta for upper, add delta for lower
|
|
||||||
*
|
|
||||||
* Bits 8-21 Reserved for future use.
|
|
||||||
*
|
|
||||||
* Bits 22-31 Case delta: delta for case conversions. This should be the
|
|
||||||
* highest field so we can easily sign extend.
|
|
||||||
*/
|
|
||||||
|
|
||||||
static int groups[] = {
|
|
||||||
0, 15, 12, 25, 27, 21, 22, 26, 20, 9, 134217793, 28, 19, 134217858,
|
|
||||||
29, 2, 23, 11, 1178599554, 24, -507510654, 4194369, 4194434, -834666431,
|
|
||||||
973078658, -507510719, 1258291330, 880803905, 864026689, 859832385,
|
|
||||||
331350081, 847249473, 851443777, 868220993, -406847358, 884998209,
|
|
||||||
876609601, 893386817, 897581121, 914358337, 910164033, 918552641,
|
|
||||||
5, -234880894, 8388705, 4194499, 8388770, 331350146, -406847423,
|
|
||||||
-234880959, 880803970, 864026754, 859832450, 847249538, 851443842,
|
|
||||||
868221058, 876609666, 884998274, 893386882, 897581186, 914358402,
|
|
||||||
910164098, 918552706, 4, 6, -352321402, 159383617, 155189313,
|
|
||||||
268435521, 264241217, 159383682, 155189378, 130023554, 268435586,
|
|
||||||
264241282, 260046978, 239075458, 1, 197132418, 226492546, 360710274,
|
|
||||||
335544450, -251658175, 402653314, 335544385, 7, 201326657, 201326722,
|
|
||||||
16, 8, 10, 247464066, -33554302, -33554367, -310378366, -360710014,
|
|
||||||
-419430270, -536870782, -469761918, -528482174, -33554365, -37748606,
|
|
||||||
-310378431, -37748669, 155189378, -360710079, -419430335, -29359998,
|
|
||||||
-469761983, -29360063, -536870847, -528482239, 13, 14, -1463812031,
|
|
||||||
-801111999, -293601215, 67108938, 67109002, 109051997, 109052061,
|
|
||||||
18, 17, 8388673, 12582977, 8388738, 12583042
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following constants are used to determine the category of a
|
|
||||||
* Unicode character.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define UNICODE_CATEGORY_MASK 0X1F
|
|
||||||
|
|
||||||
enum {
|
|
||||||
UNASSIGNED,
|
|
||||||
UPPERCASE_LETTER,
|
|
||||||
LOWERCASE_LETTER,
|
|
||||||
TITLECASE_LETTER,
|
|
||||||
MODIFIER_LETTER,
|
|
||||||
OTHER_LETTER,
|
|
||||||
NON_SPACING_MARK,
|
|
||||||
ENCLOSING_MARK,
|
|
||||||
COMBINING_SPACING_MARK,
|
|
||||||
DECIMAL_DIGIT_NUMBER,
|
|
||||||
LETTER_NUMBER,
|
|
||||||
OTHER_NUMBER,
|
|
||||||
SPACE_SEPARATOR,
|
|
||||||
LINE_SEPARATOR,
|
|
||||||
PARAGRAPH_SEPARATOR,
|
|
||||||
CONTROL,
|
|
||||||
FORMAT,
|
|
||||||
PRIVATE_USE,
|
|
||||||
SURROGATE,
|
|
||||||
CONNECTOR_PUNCTUATION,
|
|
||||||
DASH_PUNCTUATION,
|
|
||||||
OPEN_PUNCTUATION,
|
|
||||||
CLOSE_PUNCTUATION,
|
|
||||||
INITIAL_QUOTE_PUNCTUATION,
|
|
||||||
FINAL_QUOTE_PUNCTUATION,
|
|
||||||
OTHER_PUNCTUATION,
|
|
||||||
MATH_SYMBOL,
|
|
||||||
CURRENCY_SYMBOL,
|
|
||||||
MODIFIER_SYMBOL,
|
|
||||||
OTHER_SYMBOL
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The following macros extract the fields of the character info. The
|
|
||||||
* GetDelta() macro is complicated because we can't rely on the C compiler
|
|
||||||
* to do sign extension on right shifts.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define GetCaseType(info) (((info) & 0xE0) >> 5)
|
|
||||||
#define GetCategory(info) ((info) & 0x1F)
|
|
||||||
#define GetDelta(info) (((info) > 0) ? ((info) >> 22) : (~(~((info)) >> 22)))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This macro extracts the information about a character from the
|
|
||||||
* Unicode character tables.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define GetUniCharInfo(ch) (groups[groupMap[(pageMap[(((int)(ch)) & 0xffff) >> OFFSET_BITS] << OFFSET_BITS) | ((ch) & ((1 << OFFSET_BITS)-1))]])
|
|
||||||
|
|
Reference in New Issue
Block a user