make all
echo foo bar | ./dg
./try.sh
Some C preprocessors got confused about single quotes in certain cases. In particular, the following source line:
(ase(bco(acp(bi(acp(bcp(acp(bpl(aqu(bqu(A)))))))))))))))))))))))))))))) b12
sometimes has to be changed to:
(ase(bco(acp(bi(acp(bcp(acp(bpl('A')))))))))))))))))))))))))))) b12
particularly if the C preprocessor botches single quotes in cpp expansions, which we have done for the wider audience.
If my preprocessor could hack it, I could write this as one single line rather than 4, but when I do that I get a complaint “defines nested too deeply”.
This is another rot13 job (believe it or not) - the #defines
are a
novel way of adding tokens: #define b12(x) 12 x
means that at
some point in the source a 12
is followed by the compressed nested
#define
s. The b12
gets the previous compression as an argument, and
prepends the 12
, thus making another step in the recreation of the
source. The axx()
#define
s do the same, but add tokens after.
As for the rot13 algorithm, it relies on index(3)
to find if the
character is in the set A-Za-z
. l[]
is an array that gets filled
with:
"nopqrstuvwxyzzzzabcdefghijklmmmmNOPQRSTUVWXYZZZZABCDEFGHIJKLMMMM"
If index(3)
says the char is in the alphabet, then XOR the offset
with 16
to translate, and output, otherwise pass it unchanged.