On Sat, Mar 02, 2013 at 03:08:44PM -0800, Philip Guenther wrote:
> On Sat, 2 Mar 2013, Andres Perera wrote:
> > On Sat, Mar 2, 2013 at 5:13 PM, Philip Guenther <[email protected]>
> > wrote:
> ...
> > > Hmm, this is actually changing two things: it's both fixing the problem
> > > that the code is not subtracting '0' from each character before doing the
> > > octal place conversion and it's also changing it to support octal
> > > sequences of fewer than 3 digits. The latter seems unnecessary and isn't
> > > documented, do we really need/want to add it?
> >
> > the behaviour is consistent with bash, which is the shell ksh took it from
> >
> > in addition to that, it's consistent with c string literals and printf(1)
> >
> > ksh having an doing things differently is a bigger bug than
> > precedence... ps1 isn't exactly crucial in scripts
>
> Yet it wasn't important enough to mention or document. Huh. I'm not
> interested without a manpage update to match.
new patch below
like before
* fix the bug with PS1 octal conversion
* add 1 .. 3 octal number feature as seen in bash, printf(1), etc.
aditionally
* document the new behaviour in ksh(1)
* change `c' to int; match other routines
Index: lex.c
===================================================================
RCS file: /cvs/src/bin/ksh/lex.c,v
retrieving revision 1.46
diff -p -u -r1.46 lex.c
--- lex.c 20 Jan 2013 14:47:46 -0000 1.46
+++ lex.c 2 Mar 2013 23:07:19 -0000
@@ -1349,17 +1349,17 @@ dopprompt(const char *sp, int ntruncate,
case '4':
case '5':
case '6':
- case '7':
- if ((cp[1] > '7' || cp[1] < '0') ||
- (cp[2] > '7' || cp[2] < '0')) {
- snprintf(strbuf, sizeof strbuf,
- "\\%c", *cp);
- break;
- }
- n = cp[0] * 8 * 8 + cp[1] * 8 + cp[2];
- snprintf(strbuf, sizeof strbuf, "%c", n);
- cp += 2;
+ case '7': {
+ int c = 0, i = 3;
+
+ do
+ c = c * 8 + *cp - '0';
+ while (--i && *++cp >= '0' && *cp <= '7');
+ cp -= !!i;
+ strbuf[0] = c;
+ strbuf[1] = '\0';
break;
+ }
case '\\': /* '\' '\' */
strbuf[0] = '\\';
strbuf[1] = '\0';
Index: ksh.1
===================================================================
RCS file: /cvs/src/bin/ksh/ksh.1,v
retrieving revision 1.145
diff -p -u -r1.145 ksh.1
--- ksh.1 17 Jan 2013 21:20:25 -0000 1.145
+++ ksh.1 2 Mar 2013 23:07:21 -0000
@@ -1662,7 +1662,7 @@ as a special character within double quo
it is safer in this case to escape the backslash
than to try quoting it.
.It Li \e Ns Ar nnn
-The octal character
+The character whose octal value is the 1 to 3 (inclusive) digit number
.Ar nnn .
.It Li \e\e
Insert a single backslash character.