grandi@noao.edu (Steve Grandi) (07/21/89)
Has anyone ported the AT&T Typesetter-independent Troff package (also known as Device Independent Troff or DWB) to a Sun-4? I have both DWB-1 and DWB-2 (properly licensed!) but compiling them on the Sun-4 results in an immediate segmentation violation. When Kernighan rewrote Troff into Typesetter-independent Troff, he utilized a pair of routines fdprintf and sprintf as scaled down versions of the library routines. Unfortunately, these two use variable numbers of arguments accessed through a stack pointer which is a no-no on the SPARC. So, before I go in with my machete and hack and slash this stuff into shape with varargs(3) (or switch back to the library routines), has someone already done the work? I haven't even got to any possible alignment problems yet! Steve Grandi, National Optical Astronomy Observatories, Tucson AZ, 602-325-9228 Internet: grandi@noao.edu SPAN/HEPNET: NOAO::GRANDI (NOAO=5355)
hedrick@geneva.rutgers.edu (Charles Hedrick) (07/31/89)
Here are my changes to ditroff to make it work on the Sun 4. (Also changes default to Postscript.) *** ni.c.ORIG Tue May 2 22:43:58 1989 --- ni.c Sat Jun 24 21:16:41 1989 *************** *** 12,18 **** char termtab[NS] = "/usr/lib/font"; /* rest added in ptinit() */ char fontfile[NS] = "/usr/lib/font"; /* rest added in casefp() */ ! char devname[20] = "202"; /* default typesetter */ #endif --- 12,18 ---- char termtab[NS] = "/usr/lib/font"; /* rest added in ptinit() */ char fontfile[NS] = "/usr/lib/font"; /* rest added in casefp() */ ! char devname[20] = "psc"; /* default typesetter */ #endif *** n1.c.ORIG Tue May 2 22:43:54 1989 --- n1.c Sat Jun 24 23:09:48 1989 *************** *** 11,16 **** --- 11,17 ---- #include <sys/stat.h> #include <setjmp.h> #include <sgtty.h> + #include <varargs.h> #include "tdef.h" #include "ext.h" *************** *** 352,369 **** int stderr = 2; /* NOT stdio value */ /* VARARGS2 */ ! fdprintf(fd, fmt, x1) int fd; register char *fmt; ! unsigned x1; ! { register c; - register unsigned int *adx; char *s; register i; pfbp = pfbuf; ! adx = &x1; loop: while ((c = *fmt++) != '%') { if (c == '\0') { --- 353,374 ---- int stderr = 2; /* NOT stdio value */ /* VARARGS2 */ ! fdprintf(va_alist) ! va_dcl ! { ! va_list x1; int fd; register char *fmt; ! register c; char *s; register i; pfbp = pfbuf; ! va_start(x1); ! fd = va_arg(x1, int); ! fmt = va_arg(x1, char *); ! loop: while ((c = *fmt++) != '%') { if (c == '\0') { *************** *** 378,383 **** --- 383,389 ---- flusho(); } } + va_end(x1); return; } putchar(c); *************** *** 384,390 **** } c = *fmt++; if (c == 'd') { ! i = *adx; if (i < 0) { putchar('-'); i = -i; --- 390,396 ---- } c = *fmt++; if (c == 'd') { ! i = va_arg(x1, int); if (i < 0) { putchar('-'); i = -i; *************** *** 391,414 **** } printn((long)i, 10); } else if (c == 'u' || c == 'o' || c == 'x') ! printn((long)*adx, c == 'o' ? 8 : (c == 'x' ? 16 : 10)); else if (c == 'c') { ! c = *adx & 0377; if (c > 0177 || c < 040) putchar('\\'); ! putchar(*adx & 0177); } else if (c == 's') { ! s = (char *) * adx; while (c = *s++) putchar(c); } else if (c == 'D') { ! printn(*(long *)adx, 10); ! adx += (sizeof(long) / sizeof(int)) - 1; } else if (c == 'O') { ! printn(*(long *)adx, 8); ! adx += (sizeof(long) / sizeof(int)) - 1; } - adx++; goto loop; } --- 397,417 ---- } printn((long)i, 10); } else if (c == 'u' || c == 'o' || c == 'x') ! printn(va_arg(x1, long), c == 'o' ? 8 : (c == 'x' ? 16 : 10)); else if (c == 'c') { ! c = va_arg(x1, int) & 0377; if (c > 0177 || c < 040) putchar('\\'); ! putchar(c & 0177); } else if (c == 's') { ! s = va_arg(x1, char *); while (c = *s++) putchar(c); } else if (c == 'D') { ! printn(va_arg(x1, long), 10); } else if (c == 'O') { ! printn(va_arg(x1, long), 8); } goto loop; } *************** *** 435,445 **** /* returns pointer to \0 that ends the string */ /* VARARGS2 */ ! char *sprintf(str, fmt, x1) char *str; char *fmt; ! unsigned x1; ! { register c; char *sprintn(); register unsigned int *adx; --- 438,450 ---- /* returns pointer to \0 that ends the string */ /* VARARGS2 */ ! char *sprintf(va_alist) ! va_dcl ! { ! va_list x1; char *str; char *fmt; ! register c; char *sprintn(); register unsigned int *adx; *************** *** 446,456 **** char *s; register i; ! adx = &x1; loop: while ((c = *fmt++) != '%') { if (c == '\0') { *str = 0; return str; } *str++ = c; --- 451,464 ---- char *s; register i; ! va_start(x1); ! str = va_arg(x1, char *); ! fmt = va_arg(x1, char *); loop: while ((c = *fmt++) != '%') { if (c == '\0') { *str = 0; + va_end(x1); return str; } *str++ = c; *************** *** 457,463 **** } c = *fmt++; if (c == 'd') { ! i = *adx; if (i < 0) { *str++ = '-'; i = -i; --- 465,471 ---- } c = *fmt++; if (c == 'd') { ! i = va_arg(x1, int); if (i < 0) { *str++ = '-'; i = -i; *************** *** 464,487 **** } str = sprintn(str, (long)i, 10); } else if (c == 'u' || c == 'o' || c == 'x') ! str = sprintn(str, (long)*adx, c == 'o' ? 8 : (c == 'x' ? 16 : 10)); else if (c == 'c') { ! c = *adx & 0377; if (c > 0177 || c < 040) *str++ = '\\'; ! *str++ = *adx & 0177; } else if (c == 's') { ! s = (char *) * adx; while (c = *s++) *str++ = c; } else if (c == 'D') { ! str = sprintn(str, *(long *)adx, 10); ! adx += (sizeof(long) / sizeof(int)) - 1; } else if (c == 'O') { ! str = sprintn(str, *(long *)adx, 8); ! adx += (sizeof(long) / sizeof(int)) - 1; } - adx++; goto loop; } --- 472,492 ---- } str = sprintn(str, (long)i, 10); } else if (c == 'u' || c == 'o' || c == 'x') ! str = sprintn(str, va_arg(x1, long), c == 'o' ? 8 : (c == 'x' ? 16 : 10)); else if (c == 'c') { ! c = va_arg(x1, int) & 0377; if (c > 0177 || c < 040) *str++ = '\\'; ! *str++ = c & 0177; } else if (c == 's') { ! s = va_arg(x1, char *); while (c = *s++) *str++ = c; } else if (c == 'D') { ! str = sprintn(str, va_arg(x1, long), 10); } else if (c == 'O') { ! str = sprintn(str, va_arg(x1, long), 8); } goto loop; }