ash: move ifsbreakup() and ifsfree() up
Preparatory patch. Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
parent
b4f51d32d2
commit
455e422814
220
shell/ash.c
220
shell/ash.c
@ -5568,6 +5568,116 @@ cvtnum(arith_t num)
|
|||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Break the argument string into pieces based upon IFS and add the
|
||||||
|
* strings to the argument list. The regions of the string to be
|
||||||
|
* searched for IFS characters have been stored by recordregion.
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
ifsbreakup(char *string, struct arglist *arglist)
|
||||||
|
{
|
||||||
|
struct ifsregion *ifsp;
|
||||||
|
struct strlist *sp;
|
||||||
|
char *start;
|
||||||
|
char *p;
|
||||||
|
char *q;
|
||||||
|
const char *ifs, *realifs;
|
||||||
|
int ifsspc;
|
||||||
|
int nulonly;
|
||||||
|
|
||||||
|
start = string;
|
||||||
|
if (ifslastp != NULL) {
|
||||||
|
ifsspc = 0;
|
||||||
|
nulonly = 0;
|
||||||
|
realifs = ifsset() ? ifsval() : defifs;
|
||||||
|
ifsp = &ifsfirst;
|
||||||
|
do {
|
||||||
|
p = string + ifsp->begoff;
|
||||||
|
nulonly = ifsp->nulonly;
|
||||||
|
ifs = nulonly ? nullstr : realifs;
|
||||||
|
ifsspc = 0;
|
||||||
|
while (p < string + ifsp->endoff) {
|
||||||
|
q = p;
|
||||||
|
if ((unsigned char)*p == CTLESC)
|
||||||
|
p++;
|
||||||
|
if (!strchr(ifs, *p)) {
|
||||||
|
p++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (!nulonly)
|
||||||
|
ifsspc = (strchr(defifs, *p) != NULL);
|
||||||
|
/* Ignore IFS whitespace at start */
|
||||||
|
if (q == start && ifsspc) {
|
||||||
|
p++;
|
||||||
|
start = p;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*q = '\0';
|
||||||
|
sp = stzalloc(sizeof(*sp));
|
||||||
|
sp->text = start;
|
||||||
|
*arglist->lastp = sp;
|
||||||
|
arglist->lastp = &sp->next;
|
||||||
|
p++;
|
||||||
|
if (!nulonly) {
|
||||||
|
for (;;) {
|
||||||
|
if (p >= string + ifsp->endoff) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
q = p;
|
||||||
|
if ((unsigned char)*p == CTLESC)
|
||||||
|
p++;
|
||||||
|
if (strchr(ifs, *p) == NULL) {
|
||||||
|
p = q;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (strchr(defifs, *p) == NULL) {
|
||||||
|
if (ifsspc) {
|
||||||
|
p++;
|
||||||
|
ifsspc = 0;
|
||||||
|
} else {
|
||||||
|
p = q;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
p++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
start = p;
|
||||||
|
} /* while */
|
||||||
|
ifsp = ifsp->next;
|
||||||
|
} while (ifsp != NULL);
|
||||||
|
if (nulonly)
|
||||||
|
goto add;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!*start)
|
||||||
|
return;
|
||||||
|
|
||||||
|
add:
|
||||||
|
sp = stzalloc(sizeof(*sp));
|
||||||
|
sp->text = start;
|
||||||
|
*arglist->lastp = sp;
|
||||||
|
arglist->lastp = &sp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ifsfree(void)
|
||||||
|
{
|
||||||
|
struct ifsregion *p;
|
||||||
|
|
||||||
|
INT_OFF;
|
||||||
|
p = ifsfirst.next;
|
||||||
|
do {
|
||||||
|
struct ifsregion *ifsp;
|
||||||
|
ifsp = p->next;
|
||||||
|
free(p);
|
||||||
|
p = ifsp;
|
||||||
|
} while (p);
|
||||||
|
ifslastp = NULL;
|
||||||
|
ifsfirst.next = NULL;
|
||||||
|
INT_ON;
|
||||||
|
}
|
||||||
|
|
||||||
static size_t
|
static size_t
|
||||||
esclen(const char *start, const char *p)
|
esclen(const char *start, const char *p)
|
||||||
{
|
{
|
||||||
@ -6848,116 +6958,6 @@ evalvar(char *p, int flag, struct strlist *var_str_list)
|
|||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Break the argument string into pieces based upon IFS and add the
|
|
||||||
* strings to the argument list. The regions of the string to be
|
|
||||||
* searched for IFS characters have been stored by recordregion.
|
|
||||||
*/
|
|
||||||
static void
|
|
||||||
ifsbreakup(char *string, struct arglist *arglist)
|
|
||||||
{
|
|
||||||
struct ifsregion *ifsp;
|
|
||||||
struct strlist *sp;
|
|
||||||
char *start;
|
|
||||||
char *p;
|
|
||||||
char *q;
|
|
||||||
const char *ifs, *realifs;
|
|
||||||
int ifsspc;
|
|
||||||
int nulonly;
|
|
||||||
|
|
||||||
start = string;
|
|
||||||
if (ifslastp != NULL) {
|
|
||||||
ifsspc = 0;
|
|
||||||
nulonly = 0;
|
|
||||||
realifs = ifsset() ? ifsval() : defifs;
|
|
||||||
ifsp = &ifsfirst;
|
|
||||||
do {
|
|
||||||
p = string + ifsp->begoff;
|
|
||||||
nulonly = ifsp->nulonly;
|
|
||||||
ifs = nulonly ? nullstr : realifs;
|
|
||||||
ifsspc = 0;
|
|
||||||
while (p < string + ifsp->endoff) {
|
|
||||||
q = p;
|
|
||||||
if ((unsigned char)*p == CTLESC)
|
|
||||||
p++;
|
|
||||||
if (!strchr(ifs, *p)) {
|
|
||||||
p++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
if (!nulonly)
|
|
||||||
ifsspc = (strchr(defifs, *p) != NULL);
|
|
||||||
/* Ignore IFS whitespace at start */
|
|
||||||
if (q == start && ifsspc) {
|
|
||||||
p++;
|
|
||||||
start = p;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
*q = '\0';
|
|
||||||
sp = stzalloc(sizeof(*sp));
|
|
||||||
sp->text = start;
|
|
||||||
*arglist->lastp = sp;
|
|
||||||
arglist->lastp = &sp->next;
|
|
||||||
p++;
|
|
||||||
if (!nulonly) {
|
|
||||||
for (;;) {
|
|
||||||
if (p >= string + ifsp->endoff) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
q = p;
|
|
||||||
if ((unsigned char)*p == CTLESC)
|
|
||||||
p++;
|
|
||||||
if (strchr(ifs, *p) == NULL) {
|
|
||||||
p = q;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (strchr(defifs, *p) == NULL) {
|
|
||||||
if (ifsspc) {
|
|
||||||
p++;
|
|
||||||
ifsspc = 0;
|
|
||||||
} else {
|
|
||||||
p = q;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
} else
|
|
||||||
p++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
start = p;
|
|
||||||
} /* while */
|
|
||||||
ifsp = ifsp->next;
|
|
||||||
} while (ifsp != NULL);
|
|
||||||
if (nulonly)
|
|
||||||
goto add;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!*start)
|
|
||||||
return;
|
|
||||||
|
|
||||||
add:
|
|
||||||
sp = stzalloc(sizeof(*sp));
|
|
||||||
sp->text = start;
|
|
||||||
*arglist->lastp = sp;
|
|
||||||
arglist->lastp = &sp->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
ifsfree(void)
|
|
||||||
{
|
|
||||||
struct ifsregion *p;
|
|
||||||
|
|
||||||
INT_OFF;
|
|
||||||
p = ifsfirst.next;
|
|
||||||
do {
|
|
||||||
struct ifsregion *ifsp;
|
|
||||||
ifsp = p->next;
|
|
||||||
free(p);
|
|
||||||
p = ifsp;
|
|
||||||
} while (p);
|
|
||||||
ifslastp = NULL;
|
|
||||||
ifsfirst.next = NULL;
|
|
||||||
INT_ON;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add a file name to the list.
|
* Add a file name to the list.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user