summaryrefslogtreecommitdiff
path: root/usr/src/lib/libshell/common/sh/string.c
diff options
context:
space:
mode:
authorApril Chin <April.Chin@Sun.COM>2008-12-27 14:59:38 -0800
committerApril Chin <April.Chin@Sun.COM>2008-12-27 14:59:38 -0800
commit7c2fbfb345896881c631598ee3852ce9ce33fb07 (patch)
tree4b173b5657508562dfc0aa05f7d056d1e9add505 /usr/src/lib/libshell/common/sh/string.c
parent6071ac1de68fed78e1e10052045bbb5f1732a263 (diff)
downloadillumos-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.c28
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('\'');
}