On Sun, Apr 18, 2021 at 12:04 PM Martijn van Duren <
[email protected]> wrote:
> On Sun, 2021-04-18 at 11:17 -0900, Philip Guenther wrote:
> >
> > I'll just throw in a note that the current POSIX spec does not include
> support for \x in the printf(1) format or in the argument to the %b format
> specifier. At least for \x in the format string it
> > appears to require that it _not_ be interpreted, such that
> > printf '\x61\n'
> > must output
> > \x61
> > and not
> > a
>
> Could you point out where it states that an escape-sequence not
> specified must output the original text? The way I read it[0][1]:
>
> In addition to the escape sequences shown in XBD File Format Notation (
> '\\', '\a', '\b', '\f', '\n', '\r', '\t', '\v' ), "\ddd", where ddd is a
> one, two, or three-digit octal number, shall be written as a byte with
> the numeric value specified by the octal number.
>
> and
>
> Escape Sequences and Associated Actions lists escape sequences and
> associated actions on display devices capable of the action.
>
Before that statement in XBD 5 is this:
-----
The format is a character string that contains three types of objects
defined below:
1. Characters that are not "escape sequences" or "conversion
specifications", as described
below, shall be copied to the output.
2. Escape Sequences represent non-graphic characters and the escape
character (<backslash>).
3. Conversion Specifications specify the output format of each argument;
see below.
-----
So, per (1) above, if it's not an escape sequence or conversion
specification, it SHALL be copied to the output. Unfortunately, the list
of escape sequences is just a table, and while the printf(1) specification
has the clause you cited that adds \ddd to the list, there's nothing to
state that, for formats, <backslash> followed by anything else results in
unspecified behavior. Ergo \x isn't an escape sequence under (2) and,
since it's not a converspecification, it must follow (1) and be copied to
the output.
Anyway, POSIX wording will probably change, it's just a place to note in
the manual that handling \xXX is an extension to the POSIX standard and
that compliant (or portable) applications must use \ddd instead.
Philip Guenther