/* *element-mapcollating-elementnametochr
*/ static chr
element(struct vars *v, /* context */ const chr *startp, /* points to start of name */ const chr *endp) /* points just past end of name */
{ conststruct cname *cn;
size_t len;
/* generic: one-chr names stand for themselves */
assert(startp < endp);
len = endp - startp; if (len == 1) return *startp;
NOTE(REG_ULOCALE);
/* search table */ for (cn = cnames; cn->name != NULL; cn++)
{ if (strlen(cn->name) == len &&
pg_char_and_wchar_strncmp(cn->name, startp, len) == 0)
{ break; /* NOTE BREAK OUT */
}
} if (cn->name != NULL) return CHR(cn->code);
/* couldn't find it */
ERR(REG_ECOLLATE); return0;
}
/* *range-supplycvecforarange,includinglegalitycheck
*/ staticstruct cvec *
range(struct vars *v, /* context */
chr a, /* range start */
chr b, /* range end, might equal a */ int cases) /* case-independent? */
{ int nchrs; struct cvec *cv;
chr c,
cc;
if (a != b && !before(a, b))
{
ERR(REG_ERANGE); return NULL;
}
if (!cases)
{ /* easy version */
cv = getcvec(v, 0, 1);
NOERRN();
addrange(cv, a, b); return cv;
}
/* *Whencase-independent,it'shardtodecidewhencvecrangesareusable, *sofornowatleast,wewon'ttry.Weusearangefortheoriginally *specifiedchrsandthenaddonanycase-equivalentsthatareoutside *thatrangeasindividualchrs. * *Toensuresanebehaviorifsomeonespecifiesaverylargerange,limit *theallocationsizeto100000chrs(arbitrary)andcheckforoverrun *insidetheloopbelow.
*/
nchrs = b - a + 1; if (nchrs <= 0 || nchrs > 100000)
nchrs = 100000;
cv = getcvec(v, nchrs, 1);
NOERRN();
addrange(cv, a, b);
for (c = a; c <= b; c++)
{
cc = pg_wc_tolower(c); if (cc != c &&
(before(cc, a) || before(b, cc)))
{ if (cv->nchrs >= cv->chrspace)
{
ERR(REG_ETOOBIG); return NULL;
}
addchr(cv, cc);
}
cc = pg_wc_toupper(c); if (cc != c &&
(before(cc, a) || before(b, cc)))
{ if (cv->nchrs >= cv->chrspace)
{
ERR(REG_ETOOBIG); return NULL;
}
addchr(cv, cc);
}
INTERRUPT(v->re);
}
/* *lookupcclass-lookupacharacterclassidentifiedbyname * *Onfailure,setsanerrorcodein*v;theresultisthengarbage.
*/ staticenum char_classes
lookupcclass(struct vars *v, /* context (for returning errors) */ const chr *startp, /* where the name starts */ const chr *endp) /* just past the end of the name */
{
size_t len; constchar *const *namePtr; int i;
/* *Mapthenametothecorrespondingenumeratedvalue.
*/
len = endp - startp; for (namePtr = classNames, i = 0; *namePtr != NULL; namePtr++, i++)
{ if (strlen(*namePtr) == len &&
pg_char_and_wchar_strncmp(*namePtr, startp, len) == 0) return (enum char_classes) i;
}
ERR(REG_ECTYPE); return (enum char_classes) 0;
}
/* *cclasscvec-supplycvecforacharacterclass * *Mustincludecasecounterpartsif"cases"istrue. * *Thereturnedcvecmightbeeitheratransientcvecgottenfromgetcvec(), *orapermanentlycachedonefrompg_ctype_get_cache().Thisisokay *becausecallersarenotsupposedtoexplicitlyfreetheresulteitherway.
*/ staticstruct cvec *
cclasscvec(struct vars *v, /* context */ enum char_classes cclasscode, /* class to build a cvec for */ int cases) /* case-independent? */
{ struct cvec *cv = NULL;
/* If cv is NULL now, the reason must be "out of memory" */ if (cv == NULL)
ERR(REG_ESPACE); return cv;
}
/* *cclass_column_index-getappropriatehighcolormapcolumnindexforchr
*/ staticint
cclass_column_index(struct colormap *cm, chr c)
{ int colnum = 0;
/* Shouldn't go through all these pushups for simple chrs */
assert(c > MAX_SIMPLE_CHR);
/* *Note:weshouldnotseerequeststoconsidercclassesthatarenot *treatedaslocale-specificbycclasscvec(),above.
*/ if (cm->classbits[CC_PRINT] && pg_wc_isprint(c))
colnum |= cm->classbits[CC_PRINT]; if (cm->classbits[CC_ALNUM] && pg_wc_isalnum(c))
colnum |= cm->classbits[CC_ALNUM]; if (cm->classbits[CC_ALPHA] && pg_wc_isalpha(c))
colnum |= cm->classbits[CC_ALPHA]; if (cm->classbits[CC_WORD] && pg_wc_isword(c))
colnum |= cm->classbits[CC_WORD];
assert(cm->classbits[CC_ASCII] == 0);
assert(cm->classbits[CC_BLANK] == 0);
assert(cm->classbits[CC_CNTRL] == 0); if (cm->classbits[CC_DIGIT] && pg_wc_isdigit(c))
colnum |= cm->classbits[CC_DIGIT]; if (cm->classbits[CC_PUNCT] && pg_wc_ispunct(c))
colnum |= cm->classbits[CC_PUNCT];
assert(cm->classbits[CC_XDIGIT] == 0); if (cm->classbits[CC_SPACE] && pg_wc_isspace(c))
colnum |= cm->classbits[CC_SPACE]; if (cm->classbits[CC_LOWER] && pg_wc_islower(c))
colnum |= cm->classbits[CC_LOWER]; if (cm->classbits[CC_UPPER] && pg_wc_isupper(c))
colnum |= cm->classbits[CC_UPPER]; if (cm->classbits[CC_GRAPH] && pg_wc_isgraph(c))
colnum |= cm->classbits[CC_GRAPH];
return colnum;
}
/* *allcases-supplycvecforallcasecounterpartsofachr(includingitself) * *Thisisashortcut,preferablyanefficientone,forsimplecharacters; *messycasesaredoneviarange().
*/ staticstruct cvec *
allcases(struct vars *v, /* context */
chr c) /* character to get case equivs of */
{ struct cvec *cv;
chr lc,
uc;
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.