* * * * *
So how do you determine undefined behavior in a language you are reverse
engineering?
I generated a list of all possible commands in INRAC. That was easy enough to
do as everything is pretty much separated by spaces. I also resorted to
writing my own INRAC programs to play around with some of the odder parts of
the language. By doing those things, I'm able to see what various constructs
do in order to reverse engineer this bizarre language.
For instance, *6.2&N. That's a call to section 6, lines that have two letter
labels where the second letter is “N”. So, any of the following lines:
> AN boredom 8 bored 7 bore 7 gloom 8 gloomy 8 empty 8 hollow
> BN stupidity 8 stupid 7 idiot 7 folly 8 silly 7 fool 7 jerk
> CN feeling 12 feel 7 emotion 7 passion 8 passionate 8 hysterical
> DN craziness 8 crazy 8 bananas 8 random 8 strange 8 weird
> DN humor 7 joke 7 jokes
> EN doubt
> GN junk 12 stinks 8 cruel 8 useless 8 lousy 8 bad 7 garbage
> HN idleness 8 lazy 7 loafer 8 easy
> JN art 8 creative 7 artist 7 life 8 alive
> ...
> MP pray 8 holy
> ...
>
Assuming it picks “EN”, *6.2&N will return “doubt”. But if you change it to
*6.4&N, and it still picks line “EN” you'll get “doubting”. Change the second
number and you'll get “doubted”, “doubter” and even “doubtingness”. In
looking at the section header, this has a (what I'm calling) “parsing value”
of 2, which I think means “this is a list of verbs, conjugate depending upon
second number.”
In the above code snippet, the numbers apply to the word following and inform
INRAC of what to return for that part of speech (say for irregular verbs).
There also appears to be synonyms thrown in. For instance, I wrote:
> X *6MP *6.1MP *6.2MP *6.3MP *6.4MP *6.5MP *6.6MP *6.7MP *6.8MP *6.0MP
>
And got the following output:
> prayes prayes pray prayed praying prayed prayer holiness holy pray
>
So it appears that the word defined for “.8” also affects the word defined
for “.7”. Interesting.
I'm not sure what >31*6.2()47 fully does (examples from yesterday [1]). It
does set variable 31 to a random conjugated verb in section 6 but I can't
determine what else it does. The parenthesis don't seem to do anything, nor
does the extra number at the end.
I also figured out what !2*11&npr does. It sets variable 2 to the output of
calling section 11, lines labeled with a term endig in “npr”. But it also
outputs the section; >2*11&npr would just do an assignment with no output.
This bit of weirdness: !2'3'4*11&npr, does the same as !2*11&npr but clears
variables 3 and 4. Go figure.
[1]
gopher://gopher.conman.org/0Phlog:2015/12/29.1
Email author at
[email protected]