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 --- |