Deleted Added
full compact
expand.c (213811) expand.c (214512)
1/*-
2 * Copyright (c) 1991, 1993
3 * The Regents of the University of California. All rights reserved.
4 * Copyright (c) 1997-2005
5 * Herbert Xu <herbert@gondor.apana.org.au>. All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Kenneth Almquist.

--- 24 unchanged lines hidden (view full) ---

33 */
34
35#ifndef lint
36#if 0
37static char sccsid[] = "@(#)expand.c 8.5 (Berkeley) 5/15/95";
38#endif
39#endif /* not lint */
40#include <sys/cdefs.h>
1/*-
2 * Copyright (c) 1991, 1993
3 * The Regents of the University of California. All rights reserved.
4 * Copyright (c) 1997-2005
5 * Herbert Xu <herbert@gondor.apana.org.au>. All rights reserved.
6 *
7 * This code is derived from software contributed to Berkeley by
8 * Kenneth Almquist.

--- 24 unchanged lines hidden (view full) ---

33 */
34
35#ifndef lint
36#if 0
37static char sccsid[] = "@(#)expand.c 8.5 (Berkeley) 5/15/95";
38#endif
39#endif /* not lint */
40#include <sys/cdefs.h>
41__FBSDID("$FreeBSD: head/bin/sh/expand.c 213811 2010-10-13 22:18:03Z obrien $");
41__FBSDID("$FreeBSD: head/bin/sh/expand.c 214512 2010-10-29 13:42:18Z jilles $");
42
43#include <sys/types.h>
44#include <sys/time.h>
45#include <sys/stat.h>
46#include <dirent.h>
47#include <errno.h>
48#include <inttypes.h>
49#include <limits.h>

--- 161 unchanged lines hidden (view full) ---

211 * If EXP_FULL is set, also preserve CTLQUOTEMARK characters.
212 */
213static void
214argstr(char *p, int flag)
215{
216 char c;
217 int quotes = flag & (EXP_FULL | EXP_CASE | EXP_REDIR); /* do CTLESC */
218 int firsteq = 1;
42
43#include <sys/types.h>
44#include <sys/time.h>
45#include <sys/stat.h>
46#include <dirent.h>
47#include <errno.h>
48#include <inttypes.h>
49#include <limits.h>

--- 161 unchanged lines hidden (view full) ---

211 * If EXP_FULL is set, also preserve CTLQUOTEMARK characters.
212 */
213static void
214argstr(char *p, int flag)
215{
216 char c;
217 int quotes = flag & (EXP_FULL | EXP_CASE | EXP_REDIR); /* do CTLESC */
218 int firsteq = 1;
219 int split_lit;
220 int lit_quoted;
219
221
222 split_lit = flag & EXP_SPLIT_LIT;
223 lit_quoted = flag & EXP_LIT_QUOTED;
224 flag &= ~(EXP_SPLIT_LIT | EXP_LIT_QUOTED);
220 if (*p == '~' && (flag & (EXP_TILDE | EXP_VARTILDE)))
221 p = exptilde(p, flag);
222 for (;;) {
223 switch (c = *p++) {
224 case '\0':
225 case CTLENDVAR:
226 goto breakloop;
227 case CTLQUOTEMARK:
225 if (*p == '~' && (flag & (EXP_TILDE | EXP_VARTILDE)))
226 p = exptilde(p, flag);
227 for (;;) {
228 switch (c = *p++) {
229 case '\0':
230 case CTLENDVAR:
231 goto breakloop;
232 case CTLQUOTEMARK:
233 lit_quoted = 1;
228 /* "$@" syntax adherence hack */
229 if (p[0] == CTLVAR && p[2] == '@' && p[3] == '=')
230 break;
231 if ((flag & EXP_FULL) != 0)
232 STPUTC(c, expdest);
233 break;
234 /* "$@" syntax adherence hack */
235 if (p[0] == CTLVAR && p[2] == '@' && p[3] == '=')
236 break;
237 if ((flag & EXP_FULL) != 0)
238 STPUTC(c, expdest);
239 break;
240 case CTLQUOTEEND:
241 lit_quoted = 0;
242 break;
234 case CTLESC:
235 if (quotes)
236 STPUTC(c, expdest);
237 c = *p++;
238 STPUTC(c, expdest);
243 case CTLESC:
244 if (quotes)
245 STPUTC(c, expdest);
246 c = *p++;
247 STPUTC(c, expdest);
248 if (split_lit && !lit_quoted)
249 recordregion(expdest - stackblock() -
250 (quotes ? 2 : 1),
251 expdest - stackblock(), 0);
239 break;
240 case CTLVAR:
241 p = evalvar(p, flag);
242 break;
243 case CTLBACKQ:
244 case CTLBACKQ|CTLQUOTE:
245 expbackq(argbackq->n, c & CTLQUOTE, flag);
246 argbackq = argbackq->next;
247 break;
248 case CTLENDARI:
249 expari(flag);
250 break;
251 case ':':
252 case '=':
253 /*
254 * sort of a hack - expand tildes in variable
255 * assignments (after the first '=' and after ':'s).
256 */
257 STPUTC(c, expdest);
252 break;
253 case CTLVAR:
254 p = evalvar(p, flag);
255 break;
256 case CTLBACKQ:
257 case CTLBACKQ|CTLQUOTE:
258 expbackq(argbackq->n, c & CTLQUOTE, flag);
259 argbackq = argbackq->next;
260 break;
261 case CTLENDARI:
262 expari(flag);
263 break;
264 case ':':
265 case '=':
266 /*
267 * sort of a hack - expand tildes in variable
268 * assignments (after the first '=' and after ':'s).
269 */
270 STPUTC(c, expdest);
258 if (flag & EXP_VARTILDE && *p == '~') {
259 if (c == '=') {
260 if (firsteq)
261 firsteq = 0;
262 else
263 break;
264 }
271 if (split_lit && !lit_quoted)
272 recordregion(expdest - stackblock() - 1,
273 expdest - stackblock(), 0);
274 if (flag & EXP_VARTILDE && *p == '~' &&
275 (c != '=' || firsteq)) {
276 if (c == '=')
277 firsteq = 0;
265 p = exptilde(p, flag);
266 }
267 break;
268 default:
269 STPUTC(c, expdest);
278 p = exptilde(p, flag);
279 }
280 break;
281 default:
282 STPUTC(c, expdest);
283 if (split_lit && !lit_quoted)
284 recordregion(expdest - stackblock() - 1,
285 expdest - stackblock(), 0);
270 }
271 }
272breakloop:;
273}
274
275/*
276 * Perform tilde expansion, placing the result in the stack string and
277 * returning the next position in the input string to process.

--- 459 unchanged lines hidden (view full) ---

737record:
738 recordregion(startloc, expdest - stackblock(),
739 varflags & VSQUOTE);
740 break;
741
742 case VSPLUS:
743 case VSMINUS:
744 if (!set) {
286 }
287 }
288breakloop:;
289}
290
291/*
292 * Perform tilde expansion, placing the result in the stack string and
293 * returning the next position in the input string to process.

--- 459 unchanged lines hidden (view full) ---

753record:
754 recordregion(startloc, expdest - stackblock(),
755 varflags & VSQUOTE);
756 break;
757
758 case VSPLUS:
759 case VSMINUS:
760 if (!set) {
745 argstr(p, flag);
761 argstr(p, flag | (flag & EXP_FULL ? EXP_SPLIT_LIT : 0) |
762 (varflags & VSQUOTE ? EXP_LIT_QUOTED : 0));
746 break;
747 }
748 if (easy)
749 goto record;
750 break;
751
752 case VSTRIMLEFT:
753 case VSTRIMLEFTMAX:

--- 736 unchanged lines hidden (view full) ---

1490 */
1491
1492void
1493rmescapes(char *str)
1494{
1495 char *p, *q;
1496
1497 p = str;
763 break;
764 }
765 if (easy)
766 goto record;
767 break;
768
769 case VSTRIMLEFT:
770 case VSTRIMLEFTMAX:

--- 736 unchanged lines hidden (view full) ---

1507 */
1508
1509void
1510rmescapes(char *str)
1511{
1512 char *p, *q;
1513
1514 p = str;
1498 while (*p != CTLESC && *p != CTLQUOTEMARK) {
1515 while (*p != CTLESC && *p != CTLQUOTEMARK && *p != CTLQUOTEEND) {
1499 if (*p++ == '\0')
1500 return;
1501 }
1502 q = p;
1503 while (*p) {
1516 if (*p++ == '\0')
1517 return;
1518 }
1519 q = p;
1520 while (*p) {
1504 if (*p == CTLQUOTEMARK) {
1521 if (*p == CTLQUOTEMARK || *p == CTLQUOTEEND) {
1505 p++;
1506 continue;
1507 }
1508 if (*p == CTLESC)
1509 p++;
1510 *q++ = *p++;
1511 }
1512 *q = '\0';

--- 72 unchanged lines hidden ---
1522 p++;
1523 continue;
1524 }
1525 if (*p == CTLESC)
1526 p++;
1527 *q++ = *p++;
1528 }
1529 *q = '\0';

--- 72 unchanged lines hidden ---