Add table generator to 1984/mullender from author
This included adding the 'a.out.h' as not all systems have it and also I wanted it as close to the original as possible so I got a copy (https://raw.githubusercontent.com/dspinellis/unix-history-repo/Research-Release/usr/include/a.out.h) from the fabulous Unix History repo (https://github.com/dspinellis/unix-history-repo) which I highly recommend anyone interested in the evolution of Unix to check out! ... and yes: the repo is under the account of Diomidis Spinellis who is a previous IOCCC winner! To generate the tool run `make gentab'. Note that keeping the short ints short generates a lot of negative numbers but this might or might not be a problem: the original mullender.c has a negative number for instance. Updated .gitignore and README.md files.
This commit is contained in:
1 parent
809cbe0ac3
commit
00e0bcc105
5 files changed
+119
-2
No files matched your search
@@ -1,2 +1,3 @@
|
|||||||
mullender
|
mullender
|
||||||
mullender.alt
|
mullender.alt
|
||||||
|
gentab
|
||||||
@@ -131,6 +131,10 @@ ${PROG}: ${PROG}.c
|
|||||||
@echo "than a Vax-11 or pdp-11."
|
@echo "than a Vax-11 or pdp-11."
|
||||||
${CC} ${CFLAGS} $< -o $@ ${LIBS}
|
${CC} ${CFLAGS} $< -o $@ ${LIBS}
|
||||||
|
|
||||||
|
gentab: gentab.c
|
||||||
|
${CC} ${CFLAGS} $< -o $@ ${LIBS}
|
||||||
|
|
||||||
|
|
||||||
# alternative executable
|
# alternative executable
|
||||||
#
|
#
|
||||||
alt: data ${ALT_TARGET}
|
alt: data ${ALT_TARGET}
|
||||||
@@ -164,6 +168,7 @@ clean:
|
|||||||
clobber: clean
|
clobber: clean
|
||||||
${RM} -f ${TARGET} ${ALT_TARGET}
|
${RM} -f ${TARGET} ${ALT_TARGET}
|
||||||
${RM} -f core
|
${RM} -f core
|
||||||
|
${RM} -f gentab
|
||||||
@-if [ -e sandwich ]; then \
|
@-if [ -e sandwich ]; then \
|
||||||
${RM} -f sandwich; \
|
${RM} -f sandwich; \
|
||||||
echo 'ate sandwich'; \
|
echo 'ate sandwich'; \
|
||||||
|
|||||||
@@ -17,11 +17,11 @@ make all
|
|||||||
./mullender
|
./mullender
|
||||||
```
|
```
|
||||||
|
|
||||||
> NOTE: If your machine is not a Vax-11 or pdp-11, this program will
|
> NOTE: If your machine is not a VAX-11 or PDP-11, this program will
|
||||||
> not execute correctly. In later years, machine dependent
|
> not execute correctly. In later years, machine dependent
|
||||||
> code was discouraged.
|
> code was discouraged.
|
||||||
|
|
||||||
### Alternative code:
|
### Alternate code:
|
||||||
|
|
||||||
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) added the alternative
|
[Cody Boone Ferguson](/winners.html#Cody_Boone_Ferguson) added the alternative
|
||||||
code which lets you run this on other systems. He notes though that this was
|
code which lets you run this on other systems. He notes though that this was
|
||||||
@@ -95,6 +95,30 @@ couldn't! :-)
|
|||||||
|
|
||||||
BTW: this remains my (Landon Curt Noll's) all time favorite entries!
|
BTW: this remains my (Landon Curt Noll's) all time favorite entries!
|
||||||
|
|
||||||
|
Cody found the remarks from [Sjoerd Mullender](/winners.html#Sjoerd_Mullender)
|
||||||
|
and added the program that was used by the authors to generate the array that he
|
||||||
|
referred to. Because [a.out.h](a.out.h) is not available in all systems (like macOS) and
|
||||||
|
more importantly because he wanted it to be as close to as the original as
|
||||||
|
possible he used a copy of
|
||||||
|
<https://raw.githubusercontent.com/dspinellis/unix-history-repo/Research-Release/usr/include/a.out.h>
|
||||||
|
in the *fabulous* [Unix History
|
||||||
|
Repo](https://github.com/dspinellis/unix-history-repo/tree/Research-Release).
|
||||||
|
|
||||||
|
This tool can be built by running:
|
||||||
|
|
||||||
|
|
||||||
|
```sh
|
||||||
|
make gentab
|
||||||
|
```
|
||||||
|
|
||||||
|
Cody notes that it does not appear to work in modern systems (unbalanced braces)
|
||||||
|
or something else is wrong but given that this was done a long time ago on a now
|
||||||
|
archaic system maybe that is why. He also noted that if the `short`s are not
|
||||||
|
changed to just `int` it prints out a lot of negative numbers but since
|
||||||
|
[mullender.c](mullender.c) has a negative number he kept it as is.
|
||||||
|
|
||||||
|
Thank you Cody!
|
||||||
|
|
||||||
## Author's remarks:
|
## Author's remarks:
|
||||||
|
|
||||||
These remarks, found at
|
These remarks, found at
|
||||||
|
|||||||
@@ -0,0 +1,33 @@
|
|||||||
|
struct exec { /* a.out header */
|
||||||
|
int a_magic; /* magic number */
|
||||||
|
unsigned a_text; /* size of text segment */
|
||||||
|
unsigned a_data; /* size of initialized data */
|
||||||
|
unsigned a_bss; /* size of unitialized data */
|
||||||
|
unsigned a_syms; /* size of symbol table */
|
||||||
|
unsigned a_entry; /* entry point */
|
||||||
|
unsigned a_unused; /* not used */
|
||||||
|
unsigned a_flag; /* relocation info stripped */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define A_MAGIC1 0407 /* normal */
|
||||||
|
#define A_MAGIC2 0410 /* read-only text */
|
||||||
|
#define A_MAGIC3 0411 /* separated I&D */
|
||||||
|
#define A_MAGIC4 0405 /* overlay */
|
||||||
|
|
||||||
|
struct nlist { /* symbol table entry */
|
||||||
|
char n_name[8]; /* symbol name */
|
||||||
|
int n_type; /* type flag */
|
||||||
|
unsigned n_value; /* value */
|
||||||
|
};
|
||||||
|
|
||||||
|
/* values for type flag */
|
||||||
|
#define N_UNDF 0 /* undefined */
|
||||||
|
#define N_ABS 01 /* absolute */
|
||||||
|
#define N_TEXT 02 /* text symbol */
|
||||||
|
#define N_DATA 03 /* data symbol */
|
||||||
|
#define N_BSS 04 /* bss symbol */
|
||||||
|
#define N_TYPE 037
|
||||||
|
#define N_REG 024 /* register name */
|
||||||
|
#define N_FN 037 /* file name symbol */
|
||||||
|
#define N_EXT 040 /* external bit, or'ed in */
|
||||||
|
#define FORMAT "%06o" /* to print a value */
|
||||||
@@ -0,0 +1,54 @@
|
|||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "a.out.h"
|
||||||
|
|
||||||
|
main(argc, argv) char **argv;
|
||||||
|
{
|
||||||
|
register FILE *fp;
|
||||||
|
register short pos = 0, c, n;
|
||||||
|
register char *fmt = "";
|
||||||
|
if (argc != 2) {
|
||||||
|
fprintf (stderr, "Usage: %s file\n", argv[0]);
|
||||||
|
exit (1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((fp = fopen(argv[1], "r")) == NULL) {
|
||||||
|
fprintf(stderr, "%s: can't open %s\n", argv[0], argv[1]);
|
||||||
|
exit(2);
|
||||||
|
}
|
||||||
|
|
||||||
|
fseek (fp, (long) sizeof (struct exec), 0);
|
||||||
|
printf("/* portable between VAX and PDP11 */\n\n");
|
||||||
|
printf ("short main[] = {\n");
|
||||||
|
for (;;) {
|
||||||
|
if (pos == 0)
|
||||||
|
printf("\t");
|
||||||
|
|
||||||
|
c=getc(fp) & 0377;
|
||||||
|
if (feof(fp)) break;
|
||||||
|
n = getc(fp) << 8|c;
|
||||||
|
|
||||||
|
switch (rand() % 5) {
|
||||||
|
case 0:
|
||||||
|
case 1:
|
||||||
|
fmt = "%d"; break;
|
||||||
|
case 2:
|
||||||
|
fmt = "%u"; break;
|
||||||
|
case 3:
|
||||||
|
fmt = "0%o"; break;
|
||||||
|
case 4:
|
||||||
|
fmt = "0x%x"; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (32 <= n && n < 127 && (rand() % 4)) fmt = "'%c'";
|
||||||
|
printf(n < 8 ? "%d" : fmt, n);
|
||||||
|
printf(",");
|
||||||
|
if (pos++ == 8) {
|
||||||
|
printf("\n");
|
||||||
|
pos = 0;
|
||||||
|
}
|
||||||
|
else printf(" ");
|
||||||
|
|
||||||
|
printf("};\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user