On Tue, Dec 10, 2019 at 5:53 PM Sean Conner via cctalk <
cctalk at classiccmp.org> wrote:
It was thus said that the Great David Griffith via
cctalk once stated:
I'm trying to convert some C code[1] so it'll compile on TOPS20 with
KCC.
KCC is mostly ANSI compliant, but it needs to use
the TOPS20 linker,
which
has a limit of six case-insentive characters.
Adam Thornton wrote a
Perl
script[2] that successfully does this for Frotz
2.32. The Frotz
codebase
has evolved past what was done there and so 2.50
no longer works with
Adam's script. So I've been expanding that script into something of my
own, which I call "snavig"[3]. It seems to be gradually working more
and
more, but I fear the problem is starting to
rapidly diverge because it
still doesn't yield compilable code even on Unix. Does anyone here have
any knowledge of existing tools or techniques to do what I'm trying to
do?
If you are doing this on Linux, an approach is to compile the code there,
then run 'nm' over the object files, and it will output something like:
[spc]lucy:~/source/boston/src>nm main.o
000000ef t CgiMethod
U CgiNew
00000000 r __PRETTY_FUNCTION__.21
U __assert_fail
U crashreport_core
U crashreport_with
U gd
U gf_debug
00000000 T main
U main_cgi_get
U main_cgi_head
U main_cgi_post
U main_cli
The last column are identifiers; the second column is the type of
identifier, and the first column is the value. What you want to look for
are types 'T' (externally visible function), 'C' (externally visible
constant data) and 'D' (externally visible data). It is these identifiers
that will need to be six unique characters long.
Something like:
[spc]lucy:~/source/boston/src>nm globals.o | grep ' [CDT] '
00000041 T GlobalsInit
00000004 C c_adtag
00000004 C c_class
00000004 D c_conversion
00000004 C c_days
00000004 C c_tzmin
00000000 D c_updatetype
00000004 C c_webdir
00000008 D cf_emailupdate
00000004 C g_L
00000004 C g_blog
00000004 C g_templates
00000020 D gd
00000d09 T set_c_conversion
00000beb T set_c_updatetype
00000dbd T set_c_url
00000cab T set_cf_emailupdate
(but over all object files). I would then generate unique six character
long identifiers for each of these, and slap the output into a header file
like:
#define GlobalsInit id0001
#define c_adtag id0002
#define c_class id0003
#define c_conversion id0004
and then include this file for every compilation unit. I think that would
be the easiest thing to do.
You'd need to exclude libc symbols, though.
In a.out times you could just change the names from old to new and adjust
the string table offset to do this :)
Warner