I'm playing games with relative or absolute positioning?!? Have you seen ig's reply? I haven't even begun to understand what's going on there, although to be fair, I haven't really had time yet to study it: I don't know the significance of the 'W' specifier, and the '@1W@0Wx/x/a' bit looks interesting, and the whole thing is enclosed in a '(...)' group to which no quantification seems to be applied... Hmmm, interesting...
| [reply] [d/l] [select] |
| [reply] |
ig's reply was quite instructive, I had some trouble understanding it, but it was worth the trouble.
The (..) could be omitted, but since @ is a position "counted from the start of the innermost ()-group", by putting them there you can reuse this template as is in a bigger structure. (see pack)
W is "An unsigned char value " so 'W W' takes the two first chars and adds them to the output list : (5,6). '@0Wx' goes back to the beginning of the structure, reads one byte as a number (5), and skips one. So we're now at the Beginning of "Hello" and the output list should be (5,6,5). '/a' takes the last element in the output list as a length (5), and reads that many characters: we get (5,6,"Hello").
Now for the best part. With '@1W@0Wx' we go back to pos 1, read "\006", go back to 0, read "\005" and skip one. We are at the beginning of "Hello" again, and the ouput list is (5,6,"Hello",6,5). '/x' takes the last value in the output list and skips as many bytes, so we end up just before " World" with ouput list: (5,6,"Hello",6). Another '/a' takes the last value in the output list, and reads a 6 bytes long string. We end up with (5,6,"Hello", " World").
What I learned with this exemple is that the '/' template is not necessarily lenth/type, but that /type pops the last value read, so that you may stack more than one, and then make as many /type readings. And well, that's not too much of a surprise, it was in pack's documentation all along :).
I do agree with ig though, you should avoid that solution if possible, it's hard to read, and it would be difficult to expand it for a string of three parts or more.
| [reply] [d/l] [select] |