|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1989 Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * Redistribution and use in source and binary forms are permitted ! 6: * provided that the above copyright notice and this paragraph are ! 7: * duplicated in all such forms and that any documentation, ! 8: * advertising materials, and other materials related to such ! 9: * distribution and use acknowledge that the software was developed ! 10: * by the University of California, Berkeley. The name of the ! 11: * University may not be used to endorse or promote products derived ! 12: * from this software without specific prior written permission. ! 13: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 14: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 15: * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 16: */ ! 17: ! 18: #ifndef lint ! 19: char copyright[] = ! 20: "@(#) Copyright (c) 1989 Regents of the University of California.\n\ ! 21: All rights reserved.\n"; ! 22: #endif /* not lint */ ! 23: ! 24: #ifndef lint ! 25: static char sccsid[] = "@(#)mktab.c 5.1 (Berkeley) 2/28/89"; ! 26: #endif /* not lint */ ! 27: ! 28: /* ! 29: * mktab.c ! 30: * ! 31: * Function: Build nroff terminal tables in a compiler-independent way. ! 32: * Usage: cc -Itroff mktab.c tabnnn.c -o mktab; mktab > tabnnn ! 33: * Date: Sat Feb 25 00:10:06 MST 1989 ! 34: * Author: Donn Seeley ! 35: * Remarks: ! 36: * Traditional nroff terminal table construction works by compiling ! 37: * a C file into a binary that is read directly into nroff as it runs. ! 38: * If your C compiler or your relocation format differ from what nroff ! 39: * expects, you lose. This program, when linked with a terminal table ! 40: * object file, fakes up an 'object' file that looks enough like the ! 41: * traditional one to fool nroff. ! 42: */ ! 43: ! 44: #include <stdio.h> ! 45: #include "tw.h" ! 46: ! 47: main() ! 48: { ! 49: static struct fake_exec { ! 50: int bogus[8]; /* bogus[2] == a_data */ ! 51: } fe; ! 52: register int *bip; ! 53: register char **tip; ! 54: register int offset = sizeof t; ! 55: int buf[sizeof t / sizeof (int)]; ! 56: char *malloc(); ! 57: int twbase = (int *) &t.twinit - &t.bset; ! 58: ! 59: /* ! 60: * Copy the integers at the start of the table. ! 61: */ ! 62: bcopy((char *) &t, (char *) buf, twbase * sizeof (int)); ! 63: ! 64: /* ! 65: * Replace the character pointers in the copy with integer offsets. ! 66: * This duplicates the effect of relocation offsets. ! 67: * Take care to count the possibly null control bytes in the codetab ! 68: * section. ! 69: */ ! 70: for (bip = &buf[twbase], tip = &t.twinit; ! 71: tip < &t.codetab[0]; ! 72: ++bip, ++tip) ! 73: if (*tip) { ! 74: *bip = offset; ! 75: offset += strlen(*tip) + 1; ! 76: } else ! 77: *bip = 0; ! 78: for (; tip < &t.zzz; ++bip, ++tip) ! 79: if (*tip) { ! 80: *bip = offset; ! 81: offset += strlen(*tip + 1) + 2; ! 82: } else ! 83: *bip = 0; ! 84: ! 85: /* ! 86: * Patch in a fake data segment size field. ! 87: */ ! 88: fe.bogus[2] = offset; ! 89: ! 90: /* ! 91: * Dump the header and the table. ! 92: */ ! 93: (void) fwrite((char *) &fe, sizeof fe, 1, stdout); ! 94: (void) fwrite((char *) buf, sizeof t, 1, stdout); ! 95: ! 96: /* ! 97: * Dump the strings. ! 98: */ ! 99: for (tip = &t.twinit; tip < &t.codetab[0]; ++tip) ! 100: if (*tip) { ! 101: fputs(*tip, stdout); ! 102: putchar('\0'); ! 103: } ! 104: for (tip = &t.codetab[0]; tip < &t.zzz; ++tip) ! 105: if (*tip) { ! 106: putchar(**tip); ! 107: fputs(*tip + 1, stdout); ! 108: putchar('\0'); ! 109: } ! 110: ! 111: return 0; ! 112: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.