diff options
author | April Chin <April.Chin@Sun.COM> | 2008-12-27 14:59:38 -0800 |
---|---|---|
committer | April Chin <April.Chin@Sun.COM> | 2008-12-27 14:59:38 -0800 |
commit | 7c2fbfb345896881c631598ee3852ce9ce33fb07 (patch) | |
tree | 4b173b5657508562dfc0aa05f7d056d1e9add505 /usr/src/lib/libshell/common/sh/string.c | |
parent | 6071ac1de68fed78e1e10052045bbb5f1732a263 (diff) | |
download | illumos-gate-7c2fbfb345896881c631598ee3852ce9ce33fb07.tar.gz |
PSARC/2008/094 ksh93 Update 1
PSARC/2008/344 ksh93 Integration Update 1 Amendments 1
PSARC/2008/589 Remove /usr/bin/printf from PSARC case 2008 094
6619428 *ksh93* RFE: Update ksh93 in Solaris to ast-ksh.2008-11-04
6788659 RFE: Update libpp in Solaris to ast-open.2008-07-25
6561901 RFE: Add "shcomp" (shell script compiler) + kernel module to exec binary sh code
6599668 RFE: Move consumers of alias.sh over to ksh93
6595183 *ksh93* RFE: Update ksh93-integration demo code
6775901 *ksh93* no C message catalogs are generated for ksh93
6451262 *sleep* RFE: /usr/bin/sleep should support floating-point values
6687139 *ksh93* command substitution, exec, and stdout redirection cause allocation loop
6703761 *ksh93* crashes in script containing uncommon output redirections
6715496 *ksh93* SEGVs on array reinitialization
6713682 *ksh93* Creating a compound variable in a subshell "bleeds through" to the calling subshell
6672350 *ksh93* causes parent shell to die when child shell is suspended
6745015 *ksh93* VARIABLE=`command substitution` assignment is not reliable on OpenSolaris
6710205 *ksh93* problem with command substitution (within back quotes) containing \$'
6737600 *ksh93* exits debugger when user presses ctrl-c
6748645 *ksh93* fc -l -e - is mis-parsed, outputs wrong error message "-e - requires single argument"
6754020 *ksh93* does weird '[' expansion
6753538 *ksh93* umask modification leaks out of a ksh93 subshell
6766246 *ksh93* bug in pattern matching
6763594 *ksh93* executes command after "command" builtin twice on failure
6762665 *ksh93* Difficult-to-reproduce SIGSEGV in ksh93
Diffstat (limited to 'usr/src/lib/libshell/common/sh/string.c')
-rw-r--r-- | usr/src/lib/libshell/common/sh/string.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/usr/src/lib/libshell/common/sh/string.c b/usr/src/lib/libshell/common/sh/string.c index 2d5fcaaac3..b7c9c7d63c 100644 --- a/usr/src/lib/libshell/common/sh/string.c +++ b/usr/src/lib/libshell/common/sh/string.c @@ -1,10 +1,10 @@ /*********************************************************************** * * * This software is part of the ast package * -* Copyright (c) 1982-2007 AT&T Knowledge Ventures * +* Copyright (c) 1982-2008 AT&T Intellectual Property * * and is licensed under the * * Common Public License, Version 1.0 * -* by AT&T Knowledge Ventures * +* by AT&T Intellectual Property * * * * A copy of the License is available at * * http://www.opensource.org/licenses/cpl1.0.txt * @@ -256,6 +256,7 @@ void sh_trim(register char *sp) int len; if(mbwide() && (len=mbsize(sp))>1) { + memmove(dp, sp, len); dp += len; sp += len; continue; @@ -300,7 +301,7 @@ void sh_utol(register char const *str1,register char *str2) */ char *sh_fmtq(const char *string) { - register const char *cp = string; + register const char *cp = string, *op; register int c, state; int offset; if(!cp) @@ -343,14 +344,12 @@ char *sh_fmtq(const char *string) #endif { #if SHOPT_MULTIBYTE - if(c>=0x200) - continue; if(c=='\'' || !iswprint(c)) #else if(c=='\'' || !isprint(c)) #endif /* SHOPT_MULTIBYTE */ state = 2; - else if(c==']' || (c!=':' && (c=sh_lexstates[ST_NORM][c]) && c!=S_EPAT)) + else if(c==']' || (c!=':' && c<=0xff && (c=sh_lexstates[ST_NORM][c]) && c!=S_EPAT)) state |=1; } if(state<2) @@ -367,9 +366,9 @@ char *sh_fmtq(const char *string) stakwrite("$'",2); cp = string; #if SHOPT_MULTIBYTE - while(c= mbchar(cp)) + while(op = cp, c= mbchar(cp)) #else - while(c= *(unsigned char*)cp++) + while(op = cp, c= *(unsigned char*)cp++) #endif { state=1; @@ -401,19 +400,28 @@ char *sh_fmtq(const char *string) default: #if SHOPT_MULTIBYTE if(!iswprint(c)) + { + while(op<cp) + sfprintf(staksp,"\\%.3o",*(unsigned char*)op++); + continue; + } #else if(!isprint(c)) -#endif { sfprintf(staksp,"\\%.3o",c); continue; } +#endif state=0; break; } if(state) + { stakputc('\\'); - stakputc(c); + stakputc(c); + } + else + stakwrite(op, cp-op); } stakputc('\''); } |