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) 02/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 } 113