move magic constants into definitions
This commit is contained in:
parent
4c5d033f75
commit
c4bcfd944e
126
eval.c
126
eval.c
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include "sh.h"
|
#include "sh.h"
|
||||||
|
|
||||||
__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.210 2017/05/03 14:51:25 tg Exp $");
|
__RCSID("$MirOS: src/bin/mksh/eval.c,v 1.211 2017/05/03 15:33:16 tg Exp $");
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* string expansion
|
* string expansion
|
||||||
@ -65,6 +65,12 @@ typedef struct {
|
|||||||
#define IFS_IWS 3 /* beginning of word, ignore IFS WS */
|
#define IFS_IWS 3 /* beginning of word, ignore IFS WS */
|
||||||
#define IFS_QUOTE 4 /* beg.w/quote, become IFS_WORD unless "$@" */
|
#define IFS_QUOTE 4 /* beg.w/quote, become IFS_WORD unless "$@" */
|
||||||
|
|
||||||
|
#define STYPE_CHAR 0x7F
|
||||||
|
#define STYPE_DBL 0x80
|
||||||
|
#define STYPE_AT 0x100
|
||||||
|
#define STYPE_SINGLE 0x17F
|
||||||
|
#define STYPE_MASK 0x180
|
||||||
|
|
||||||
static int varsub(Expand *, const char *, const char *, int *, int *);
|
static int varsub(Expand *, const char *, const char *, int *, int *);
|
||||||
static int comsub(Expand *, const char *, int);
|
static int comsub(Expand *, const char *, int);
|
||||||
static char *valsub(struct op *, Area *);
|
static char *valsub(struct op *, Area *);
|
||||||
@ -429,12 +435,12 @@ expand(
|
|||||||
/* skip qualifier(s) */
|
/* skip qualifier(s) */
|
||||||
if (stype)
|
if (stype)
|
||||||
sp += slen;
|
sp += slen;
|
||||||
switch (stype & 0x17F) {
|
switch (stype & STYPE_SINGLE) {
|
||||||
case 0x100 | '#':
|
case ord('#') | STYPE_AT:
|
||||||
x.str = shf_smprintf("%08X",
|
x.str = shf_smprintf("%08X",
|
||||||
(unsigned int)hash(str_val(st->var)));
|
(unsigned int)hash(str_val(st->var)));
|
||||||
break;
|
break;
|
||||||
case 0x100 | 'Q': {
|
case ord('Q') | STYPE_AT: {
|
||||||
struct shf shf;
|
struct shf shf;
|
||||||
|
|
||||||
shf_sopen(NULL, 0, SHF_WR|SHF_DYNAMIC, &shf);
|
shf_sopen(NULL, 0, SHF_WR|SHF_DYNAMIC, &shf);
|
||||||
@ -442,7 +448,7 @@ expand(
|
|||||||
x.str = shf_sclose(&shf);
|
x.str = shf_sclose(&shf);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case '0': {
|
case ord('0'): {
|
||||||
char *beg, *mid, *end, *stg;
|
char *beg, *mid, *end, *stg;
|
||||||
mksh_ari_t from = 0, num = -1, flen, finc = 0;
|
mksh_ari_t from = 0, num = -1, flen, finc = 0;
|
||||||
|
|
||||||
@ -450,13 +456,13 @@ expand(
|
|||||||
mid = beg + (wdscan(sp, ADELIM) - sp);
|
mid = beg + (wdscan(sp, ADELIM) - sp);
|
||||||
stg = beg + (wdscan(sp, CSUBST) - sp);
|
stg = beg + (wdscan(sp, CSUBST) - sp);
|
||||||
mid[-2] = EOS;
|
mid[-2] = EOS;
|
||||||
if (mid[-1] == /*{*/'}') {
|
if (ord(mid[-1]) == ord(/*{*/'}')) {
|
||||||
sp += mid - beg - 1;
|
sp += mid - beg - 1;
|
||||||
end = NULL;
|
end = NULL;
|
||||||
} else {
|
} else {
|
||||||
end = mid +
|
end = mid +
|
||||||
(wdscan(mid, ADELIM) - mid);
|
(wdscan(mid, ADELIM) - mid);
|
||||||
if (end[-1] != /*{*/ '}')
|
if (ord(end[-1]) != ord(/*{*/'}'))
|
||||||
/* more than max delimiters */
|
/* more than max delimiters */
|
||||||
goto unwind_substsyn;
|
goto unwind_substsyn;
|
||||||
end[-2] = EOS;
|
end[-2] = EOS;
|
||||||
@ -489,8 +495,8 @@ expand(
|
|||||||
strndupx(x.str, beg, num, ATEMP);
|
strndupx(x.str, beg, num, ATEMP);
|
||||||
goto do_CSUBST;
|
goto do_CSUBST;
|
||||||
}
|
}
|
||||||
case 0x100 | '/':
|
case ord('/') | STYPE_AT:
|
||||||
case '/': {
|
case ord('/'): {
|
||||||
char *s, *p, *d, *sbeg, *end;
|
char *s, *p, *d, *sbeg, *end;
|
||||||
char *pat = NULL, *rrep = null;
|
char *pat = NULL, *rrep = null;
|
||||||
char fpat = 0, *tpat1, *tpat2;
|
char fpat = 0, *tpat1, *tpat2;
|
||||||
@ -500,18 +506,18 @@ expand(
|
|||||||
p = s + (wdscan(sp, ADELIM) - sp);
|
p = s + (wdscan(sp, ADELIM) - sp);
|
||||||
d = s + (wdscan(sp, CSUBST) - sp);
|
d = s + (wdscan(sp, CSUBST) - sp);
|
||||||
p[-2] = EOS;
|
p[-2] = EOS;
|
||||||
if (p[-1] == /*{*/'}')
|
if (ord(p[-1]) == ord(/*{*/'}'))
|
||||||
d = NULL;
|
d = NULL;
|
||||||
else
|
else
|
||||||
d[-2] = EOS;
|
d[-2] = EOS;
|
||||||
sp += (d ? d : p) - s - 1;
|
sp += (d ? d : p) - s - 1;
|
||||||
if (!(stype & 0x180) &&
|
if (!(stype & STYPE_MASK) &&
|
||||||
s[0] == CHAR &&
|
s[0] == CHAR &&
|
||||||
ctype(s[1], C_SUB2))
|
ctype(s[1], C_SUB2))
|
||||||
fpat = s[1];
|
fpat = s[1];
|
||||||
wpat = s + (fpat ? 2 : 0);
|
wpat = s + (fpat ? 2 : 0);
|
||||||
wrep = d ? p : NULL;
|
wrep = d ? p : NULL;
|
||||||
if (!(stype & 0x100)) {
|
if (!(stype & STYPE_AT)) {
|
||||||
rrep = wrep ? evalstr(wrep,
|
rrep = wrep ? evalstr(wrep,
|
||||||
DOTILDE | DOSCALAR) :
|
DOTILDE | DOSCALAR) :
|
||||||
null;
|
null;
|
||||||
@ -531,21 +537,21 @@ expand(
|
|||||||
*/
|
*/
|
||||||
goto no_repl;
|
goto no_repl;
|
||||||
}
|
}
|
||||||
if ((stype & 0x180) &&
|
if ((stype & STYPE_MASK) &&
|
||||||
gmatchx(null, pat, false)) {
|
gmatchx(null, pat, false)) {
|
||||||
/*
|
/*
|
||||||
* pattern matches empty
|
* pattern matches empty
|
||||||
* string => don't loop
|
* string => don't loop
|
||||||
*/
|
*/
|
||||||
stype &= ~0x180;
|
stype &= ~STYPE_MASK;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* first see if we have any match at all */
|
/* first see if we have any match at all */
|
||||||
if (fpat == '#') {
|
if (ord(fpat) == ord('#')) {
|
||||||
/* anchor at the beginning */
|
/* anchor at the beginning */
|
||||||
tpat1 = shf_smprintf("%s%c*", pat, MAGIC);
|
tpat1 = shf_smprintf("%s%c*", pat, MAGIC);
|
||||||
tpat2 = tpat1;
|
tpat2 = tpat1;
|
||||||
} else if (fpat == '%') {
|
} else if (ord(fpat) == ord('%')) {
|
||||||
/* anchor at the end */
|
/* anchor at the end */
|
||||||
tpat1 = shf_smprintf("%c*%s", MAGIC, pat);
|
tpat1 = shf_smprintf("%c*%s", MAGIC, pat);
|
||||||
tpat2 = pat;
|
tpat2 = pat;
|
||||||
@ -563,7 +569,7 @@ expand(
|
|||||||
goto end_repl;
|
goto end_repl;
|
||||||
end = strnul(s);
|
end = strnul(s);
|
||||||
/* now anchor the beginning of the match */
|
/* now anchor the beginning of the match */
|
||||||
if (fpat != '#')
|
if (ord(fpat) != ord('#'))
|
||||||
while (sbeg <= end) {
|
while (sbeg <= end) {
|
||||||
if (gmatchx(sbeg, tpat2, false))
|
if (gmatchx(sbeg, tpat2, false))
|
||||||
break;
|
break;
|
||||||
@ -572,7 +578,7 @@ expand(
|
|||||||
}
|
}
|
||||||
/* now anchor the end of the match */
|
/* now anchor the end of the match */
|
||||||
p = end;
|
p = end;
|
||||||
if (fpat != '%')
|
if (ord(fpat) != ord('%'))
|
||||||
while (p >= sbeg) {
|
while (p >= sbeg) {
|
||||||
bool gotmatch;
|
bool gotmatch;
|
||||||
|
|
||||||
@ -587,7 +593,7 @@ expand(
|
|||||||
strndupx(end, sbeg, p - sbeg, ATEMP);
|
strndupx(end, sbeg, p - sbeg, ATEMP);
|
||||||
record_match(end);
|
record_match(end);
|
||||||
afree(end, ATEMP);
|
afree(end, ATEMP);
|
||||||
if (stype & 0x100) {
|
if (stype & STYPE_AT) {
|
||||||
if (rrep != null)
|
if (rrep != null)
|
||||||
afree(rrep, ATEMP);
|
afree(rrep, ATEMP);
|
||||||
rrep = wrep ? evalstr(wrep,
|
rrep = wrep ? evalstr(wrep,
|
||||||
@ -600,11 +606,11 @@ expand(
|
|||||||
sbeg = d + (sbeg - s) + strlen(rrep);
|
sbeg = d + (sbeg - s) + strlen(rrep);
|
||||||
afree(s, ATEMP);
|
afree(s, ATEMP);
|
||||||
s = d;
|
s = d;
|
||||||
if (stype & 0x100) {
|
if (stype & STYPE_AT) {
|
||||||
afree(tpat1, ATEMP);
|
afree(tpat1, ATEMP);
|
||||||
afree(pat, ATEMP);
|
afree(pat, ATEMP);
|
||||||
goto again_search;
|
goto again_search;
|
||||||
} else if (stype & 0x80)
|
} else if (stype & STYPE_DBL)
|
||||||
goto again_repl;
|
goto again_repl;
|
||||||
end_repl:
|
end_repl:
|
||||||
afree(tpat1, ATEMP);
|
afree(tpat1, ATEMP);
|
||||||
@ -616,8 +622,8 @@ expand(
|
|||||||
afree(ws, ATEMP);
|
afree(ws, ATEMP);
|
||||||
goto do_CSUBST;
|
goto do_CSUBST;
|
||||||
}
|
}
|
||||||
case '#':
|
case ord('#'):
|
||||||
case '%':
|
case ord('%'):
|
||||||
/* ! DOBLANK,DOBRACE */
|
/* ! DOBLANK,DOBRACE */
|
||||||
f = (f & DONTRUNCOMMAND) |
|
f = (f & DONTRUNCOMMAND) |
|
||||||
DOPAT | DOTILDE |
|
DOPAT | DOTILDE |
|
||||||
@ -634,7 +640,7 @@ expand(
|
|||||||
*dp++ = 0x80 | '@';
|
*dp++ = 0x80 | '@';
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '=':
|
case ord('='):
|
||||||
/*
|
/*
|
||||||
* Tilde expansion for string
|
* Tilde expansion for string
|
||||||
* variables in POSIX mode is
|
* variables in POSIX mode is
|
||||||
@ -658,7 +664,7 @@ expand(
|
|||||||
f &= ~(DOBLANK|DOGLOB|DOBRACE);
|
f &= ~(DOBLANK|DOGLOB|DOBRACE);
|
||||||
tilde_ok = 1;
|
tilde_ok = 1;
|
||||||
break;
|
break;
|
||||||
case '?':
|
case ord('?'):
|
||||||
if (*sp == CSUBST)
|
if (*sp == CSUBST)
|
||||||
errorf("%s: parameter null or not set",
|
errorf("%s: parameter null or not set",
|
||||||
st->var->name);
|
st->var->name);
|
||||||
@ -692,9 +698,9 @@ expand(
|
|||||||
f = st->f;
|
f = st->f;
|
||||||
if (f & DOBLANK)
|
if (f & DOBLANK)
|
||||||
doblank--;
|
doblank--;
|
||||||
switch (st->stype & 0x17F) {
|
switch (st->stype & STYPE_SINGLE) {
|
||||||
case '#':
|
case ord('#'):
|
||||||
case '%':
|
case ord('%'):
|
||||||
if (!Flag(FSH)) {
|
if (!Flag(FSH)) {
|
||||||
/* Append end-pattern */
|
/* Append end-pattern */
|
||||||
*dp++ = MAGIC;
|
*dp++ = MAGIC;
|
||||||
@ -724,7 +730,7 @@ expand(
|
|||||||
doblank++;
|
doblank++;
|
||||||
st = st->prev;
|
st = st->prev;
|
||||||
continue;
|
continue;
|
||||||
case '=':
|
case ord('='):
|
||||||
/*
|
/*
|
||||||
* Restore our position and substitute
|
* Restore our position and substitute
|
||||||
* the value of st->var (may not be
|
* the value of st->var (may not be
|
||||||
@ -757,17 +763,17 @@ expand(
|
|||||||
st = st->prev;
|
st = st->prev;
|
||||||
word = quote || (!*x.str && (f & DOSCALAR)) ? IFS_WORD : IFS_IWS;
|
word = quote || (!*x.str && (f & DOSCALAR)) ? IFS_WORD : IFS_IWS;
|
||||||
continue;
|
continue;
|
||||||
case '?':
|
case ord('?'):
|
||||||
dp = Xrestpos(ds, dp, st->base);
|
dp = Xrestpos(ds, dp, st->base);
|
||||||
|
|
||||||
errorf(Tf_sD_s, st->var->name,
|
errorf(Tf_sD_s, st->var->name,
|
||||||
debunk(dp, dp, strlen(dp) + 1));
|
debunk(dp, dp, strlen(dp) + 1));
|
||||||
break;
|
break;
|
||||||
case '0':
|
case ord('0'):
|
||||||
case 0x100 | '/':
|
case ord('/') | STYPE_AT:
|
||||||
case '/':
|
case ord('/'):
|
||||||
case 0x100 | '#':
|
case ord('#') | STYPE_AT:
|
||||||
case 0x100 | 'Q':
|
case ord('Q') | STYPE_AT:
|
||||||
dp = Xrestpos(ds, dp, st->base);
|
dp = Xrestpos(ds, dp, st->base);
|
||||||
type = XSUB;
|
type = XSUB;
|
||||||
word = quote || (!*x.str && (f & DOSCALAR)) ? IFS_WORD : IFS_IWS;
|
word = quote || (!*x.str && (f & DOSCALAR)) ? IFS_WORD : IFS_IWS;
|
||||||
@ -1209,7 +1215,7 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
c = word[slen + 0] == CHAR ? ord(word[slen + 1]) : 0;
|
c = word[slen + 0] == CHAR ? ord(word[slen + 1]) : 0;
|
||||||
if (c == ord(':')) {
|
if (c == ord(':')) {
|
||||||
slen += 2;
|
slen += 2;
|
||||||
stype = 0x80;
|
stype = STYPE_DBL;
|
||||||
c = word[slen + 0] == CHAR ? ord(word[slen + 1]) : 0;
|
c = word[slen + 0] == CHAR ? ord(word[slen + 1]) : 0;
|
||||||
}
|
}
|
||||||
if (!stype && c == ord('/')) {
|
if (!stype && c == ord('/')) {
|
||||||
@ -1218,10 +1224,10 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
if (word[slen] == ADELIM &&
|
if (word[slen] == ADELIM &&
|
||||||
ord(word[slen + 1]) == (unsigned int)c) {
|
ord(word[slen + 1]) == (unsigned int)c) {
|
||||||
slen += 2;
|
slen += 2;
|
||||||
stype |= 0x80;
|
stype |= STYPE_DBL;
|
||||||
}
|
}
|
||||||
} else if (stype == 0x80 && (c == ord(' ') || c == ord('0'))) {
|
} else if (stype == STYPE_DBL && (c == ord(' ') || c == ord('0'))) {
|
||||||
stype |= ord('0'); /*XXX EBCDIC */
|
stype |= ord('0');
|
||||||
} else if (ctype(c, C_SUB1)) {
|
} else if (ctype(c, C_SUB1)) {
|
||||||
slen += 2;
|
slen += 2;
|
||||||
stype |= c;
|
stype |= c;
|
||||||
@ -1231,7 +1237,7 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
stype = c;
|
stype = c;
|
||||||
if (word[slen + 0] == CHAR &&
|
if (word[slen + 0] == CHAR &&
|
||||||
ord(word[slen + 1]) == (unsigned int)c) {
|
ord(word[slen + 1]) == (unsigned int)c) {
|
||||||
stype |= 0x80;
|
stype |= STYPE_DBL;
|
||||||
slen += 2;
|
slen += 2;
|
||||||
}
|
}
|
||||||
} else if (c == ord('@')) {
|
} else if (c == ord('@')) {
|
||||||
@ -1245,7 +1251,7 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
default:
|
default:
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
stype |= 0x100 | c;
|
stype |= STYPE_AT | c;
|
||||||
slen += 4;
|
slen += 4;
|
||||||
} else if (stype)
|
} else if (stype)
|
||||||
/* : is not ok */
|
/* : is not ok */
|
||||||
@ -1255,7 +1261,7 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
|
|
||||||
c = ord(sp[0]);
|
c = ord(sp[0]);
|
||||||
if (c == ord('*') || c == ord('@')) {
|
if (c == ord('*') || c == ord('@')) {
|
||||||
switch (stype & 0x17F) {
|
switch (stype & STYPE_SINGLE) {
|
||||||
/* can't assign to a vector */
|
/* can't assign to a vector */
|
||||||
case ord('='):
|
case ord('='):
|
||||||
/* can't trim a vector (yet) */
|
/* can't trim a vector (yet) */
|
||||||
@ -1263,10 +1269,10 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
case ord('#'):
|
case ord('#'):
|
||||||
case ord('?'):
|
case ord('?'):
|
||||||
case ord('0'):
|
case ord('0'):
|
||||||
case 0x100 | ord('/'):
|
case ord('/') | STYPE_AT:
|
||||||
case ord('/'):
|
case ord('/'):
|
||||||
case 0x100 | ord('#'):
|
case ord('#') | STYPE_AT:
|
||||||
case 0x100 | ord('Q'):
|
case ord('Q') | STYPE_AT:
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
if (e->loc->argc == 0) {
|
if (e->loc->argc == 0) {
|
||||||
@ -1286,7 +1292,7 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
ord(p[1]) == ord('@')) && ord(p[2]) == ord(']')) {
|
ord(p[1]) == ord('@')) && ord(p[2]) == ord(']')) {
|
||||||
XPtrV wv;
|
XPtrV wv;
|
||||||
|
|
||||||
switch (stype & 0x17F) {
|
switch (stype & STYPE_SINGLE) {
|
||||||
/* can't assign to a vector */
|
/* can't assign to a vector */
|
||||||
case ord('='):
|
case ord('='):
|
||||||
/* can't trim a vector (yet) */
|
/* can't trim a vector (yet) */
|
||||||
@ -1294,10 +1300,10 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
case ord('#'):
|
case ord('#'):
|
||||||
case ord('?'):
|
case ord('?'):
|
||||||
case ord('0'):
|
case ord('0'):
|
||||||
case 0x100 | ord('/'):
|
case ord('/') | STYPE_AT:
|
||||||
case ord('/'):
|
case ord('/'):
|
||||||
case 0x100 | ord('#'):
|
case ord('#') | STYPE_AT:
|
||||||
case 0x100 | ord('Q'):
|
case ord('Q') | STYPE_AT:
|
||||||
return (-1);
|
return (-1);
|
||||||
}
|
}
|
||||||
c = 0;
|
c = 0;
|
||||||
@ -1327,21 +1333,21 @@ varsub(Expand *xp, const char *sp, const char *word,
|
|||||||
xp->var = global(sp);
|
xp->var = global(sp);
|
||||||
xp->str = str_val(xp->var);
|
xp->str = str_val(xp->var);
|
||||||
/* can't assign things like $! or $1 */
|
/* can't assign things like $! or $1 */
|
||||||
if ((stype & 0x17F) == ord('=') && !*xp->str &&
|
if ((stype & STYPE_SINGLE) == ord('=') && !*xp->str &&
|
||||||
ctype(*sp, C_VAR1 | C_DIGIT))
|
ctype(*sp, C_VAR1 | C_DIGIT))
|
||||||
return (-1);
|
return (-1);
|
||||||
state = XSUB;
|
state = XSUB;
|
||||||
}
|
}
|
||||||
|
|
||||||
c = stype & 0x7F;
|
c = stype & STYPE_CHAR;
|
||||||
/* test the compiler's code generator */
|
/* test the compiler's code generator */
|
||||||
if (((stype < 0x100) && (ctype(c, C_SUB2) ||
|
if ((!(stype & STYPE_AT) && (ctype(c, C_SUB2) ||
|
||||||
(((stype & 0x80) ? *xp->str == '\0' : xp->str == null) &&
|
(((stype & STYPE_DBL) ? *xp->str == '\0' : xp->str == null) &&
|
||||||
(state != XARG || (ifs0 || xp->split ?
|
(state != XARG || (ifs0 || xp->split ?
|
||||||
(xp->u.strv[0] == NULL) : !hasnonempty(xp->u.strv))) ?
|
(xp->u.strv[0] == NULL) : !hasnonempty(xp->u.strv))) ?
|
||||||
ctype(c, C_EQUAL | C_MINUS | C_QUEST) : c == ord('+')))) ||
|
ctype(c, C_EQUAL | C_MINUS | C_QUEST) : c == ord('+')))) ||
|
||||||
stype == (0x80 | ord('0')) || stype == (0x100 | ord('#')) ||
|
stype == (ord('0') | STYPE_DBL) || stype == (ord('#') | STYPE_AT) ||
|
||||||
stype == (0x100 | ord('Q')) || (stype & 0x7F) == ord('/'))
|
stype == (ord('Q') | STYPE_AT) || (stype & STYPE_CHAR) == ord('/'))
|
||||||
/* expand word instead of variable value */
|
/* expand word instead of variable value */
|
||||||
state = XBASE;
|
state = XBASE;
|
||||||
if (Flag(FNOUNSET) && xp->str == null && !zero_ok &&
|
if (Flag(FNOUNSET) && xp->str == null && !zero_ok &&
|
||||||
@ -1483,8 +1489,8 @@ trimsub(char *str, char *pat, int how)
|
|||||||
char *end = strnul(str);
|
char *end = strnul(str);
|
||||||
char *p, c;
|
char *p, c;
|
||||||
|
|
||||||
switch (how & 0xFF) {
|
switch (how & (STYPE_CHAR | STYPE_DBL)) {
|
||||||
case '#':
|
case ord('#'):
|
||||||
/* shortest match at beginning */
|
/* shortest match at beginning */
|
||||||
for (p = str; p <= end; p += utf_ptradj(p)) {
|
for (p = str; p <= end; p += utf_ptradj(p)) {
|
||||||
c = *p; *p = '\0';
|
c = *p; *p = '\0';
|
||||||
@ -1496,7 +1502,7 @@ trimsub(char *str, char *pat, int how)
|
|||||||
*p = c;
|
*p = c;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '#'|0x80:
|
case ord('#') | STYPE_DBL:
|
||||||
/* longest match at beginning */
|
/* longest match at beginning */
|
||||||
for (p = end; p >= str; p--) {
|
for (p = end; p >= str; p--) {
|
||||||
c = *p; *p = '\0';
|
c = *p; *p = '\0';
|
||||||
@ -1508,7 +1514,7 @@ trimsub(char *str, char *pat, int how)
|
|||||||
*p = c;
|
*p = c;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '%':
|
case ord('%'):
|
||||||
/* shortest match at end */
|
/* shortest match at end */
|
||||||
p = end;
|
p = end;
|
||||||
while (p >= str) {
|
while (p >= str) {
|
||||||
@ -1524,7 +1530,7 @@ trimsub(char *str, char *pat, int how)
|
|||||||
--p;
|
--p;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case '%'|0x80:
|
case ord('%') | STYPE_DBL:
|
||||||
/* longest match at end */
|
/* longest match at end */
|
||||||
for (p = str; p <= end; p++)
|
for (p = str; p <= end; p++)
|
||||||
if (gmatchx(p, pat, false)) {
|
if (gmatchx(p, pat, false)) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user