1 | ---
|
2 | in_progress: yes
|
3 | ---
|
4 |
|
5 | Solutions to the Framing Problem
|
6 | ================================
|
7 |
|
8 | YSH is a shell that lets you write correct programs. Programs often parse
|
9 | multiple records or strings sent over a pipe, i.e. the "framing problem".
|
10 | (This terminology is borrowed from network engineering.)
|
11 |
|
12 | YSH provides a few solutions for that, and each solution is useful in certain
|
13 | contexts.
|
14 |
|
15 | <div id="toc">
|
16 | </div>
|
17 |
|
18 | ## Delimiter Based Solutions
|
19 |
|
20 | ### Newline as Delimiter
|
21 |
|
22 | The traditional Unix solution. It doesn't work when the payload contains
|
23 | newlines.
|
24 |
|
25 | Note that Unix filenames, `argv` entries, and `environ` entries can all
|
26 | contain newlines, but not `NUL` (`\0`).
|
27 |
|
28 | ### NUL as delimiter: `read -0`
|
29 |
|
30 | So naturally we also support the format that `find -print0` emits, and
|
31 | `xargs -0` consumes.
|
32 |
|
33 | ## Solutions That Can Express Arbitrary Bytes
|
34 |
|
35 | ### Quoting / Escaping Special characters: [QSN][]
|
36 |
|
37 | QSN uses backslash escapes like `\n`, `\x00`, and `\u{3bc}` to express
|
38 | arbitrary bytes (and characters).
|
39 |
|
40 | ### Length-Prefixed: Netstrings
|
41 |
|
42 | TODO: Implement this.
|
43 |
|
44 | Like [QSN][], this format is "8-bit clean", but:
|
45 |
|
46 | - A netstring encoder is easier to write than a QSN encoder. This may be
|
47 | useful if you don't have a library handy.
|
48 | - It's more efficient to decode, in theory.
|
49 |
|
50 | However, the encoded output may contain binary data, which is hard to view in a
|
51 | terminal.
|
52 |
|
53 | [QSN]: qsn.html
|
54 |
|