BSD 4_3_Net_2 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Tue, 30 Apr 1991 08:59:20 +0000 (00:59 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Tue, 30 Apr 1991 08:59:20 +0000 (00:59 -0800)
Work on file usr/src/usr.bin/groff/etc/Makefile.gnu
Work on file usr/src/usr.bin/groff/etc/addftinfo.c
Work on file usr/src/usr.bin/groff/etc/grog.sh
Work on file usr/src/usr.bin/groff/etc/guess.c
Work on file usr/src/usr.bin/groff/etc/guess.h
Work on file usr/src/usr.bin/groff/etc/soelim.c

Synthesized-from: CSRG/cd2/net.2

usr/src/usr.bin/groff/etc/Makefile.gnu [new file with mode: 0644]
usr/src/usr.bin/groff/etc/addftinfo.c [new file with mode: 0644]
usr/src/usr.bin/groff/etc/grog.sh [new file with mode: 0644]
usr/src/usr.bin/groff/etc/guess.c [new file with mode: 0644]
usr/src/usr.bin/groff/etc/guess.h [new file with mode: 0644]
usr/src/usr.bin/groff/etc/soelim.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/groff/etc/Makefile.gnu b/usr/src/usr.bin/groff/etc/Makefile.gnu
new file mode 100644 (file)
index 0000000..1c45978
--- /dev/null
@@ -0,0 +1,70 @@
+#Copyright (C) 1989, 1990 Free Software Foundation, Inc.
+#     Written by James Clark (jjc@jclark.uucp)
+#
+#This file is part of groff.
+#
+#groff is free software; you can redistribute it and/or modify it under
+#the terms of the GNU General Public License as published by the Free
+#Software Foundation; either version 1, or (at your option) any later
+#version.
+#
+#groff is distributed in the hope that it will be useful, but WITHOUT ANY
+#WARRANTY; without even the implied warranty of MERCHANTABILITY or
+#FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+#for more details.
+#
+#You should have received a copy of the GNU General Public License along
+#with groff; see the file LICENSE.  If not, write to the Free Software
+#Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+
+BINDIR=/usr/local/bin
+CC=g++
+CFLAGS=-g -Wall
+INCLUDES=-I../lib
+DEFINES=
+SOURCES=addftinfo.c guess.c guess.h
+OBJECTS=addftinfo.o guess.o
+ETAGS=etags
+ETAGSFLAGS=-p
+
+.c.o:
+       $(CC) -c $(INCLUDES) $(CFLAGS) $(DEFINES) $<
+
+all: addftinfo soelim
+
+addftinfo: $(OBJECTS) ../lib/libgroff.a
+         $(CC) $(LDFLAGS) -o $@ $(OBJECTS) ../lib/libgroff.a $(LIBS)
+
+addftinfo.o: guess.h ../lib/lib.h ../lib/errarg.h ../lib/error.h \
+       ../lib/stringclass.h
+
+guess.o: guess.h
+
+soelim: soelim.o ../lib/libgroff.a
+       $(CC) $(LDFLAGS) -o $@ soelim.o ../lib/libgroff.a $(LIBS)
+
+soelim.o: ../lib/lib.h ../lib/errarg.h ../lib/error.h \
+       ../lib/stringclass.h
+
+TAGS: $(SOURCES)
+       $(ETAGS) $(ETAGSFLAGS) $(SOURCES)
+
+clean:
+       -rm -f *.o soelim addftinfo core
+
+distclean: clean
+       -rm -f TAGS
+
+realclean: distclean
+
+install.bin: all
+       -[ -d $(BINDIR) ] || mkdir $(BINDIR)
+       cp addftinfo $(BINDIR)/addftinfo
+       cp soelim $(BINDIR)/gsoelim
+
+install.nobin:
+       -[ -d $(BINDIR) ] || mkdir $(BINDIR)
+       cp grog.sh $(BINDIR)/grog
+       chmod +x $(BINDIR)/grog
+
+install: install.bin install.nobin
diff --git a/usr/src/usr.bin/groff/etc/addftinfo.c b/usr/src/usr.bin/groff/etc/addftinfo.c
new file mode 100644 (file)
index 0000000..3abd81c
--- /dev/null
@@ -0,0 +1,192 @@
+// -*- C++ -*-
+/* Copyright (C) 1989, 1990 Free Software Foundation, Inc.
+     Written by James Clark (jjc@jclark.uucp)
+
+This file is part of groff.
+
+groff is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 1, or (at your option) any later
+version.
+
+groff is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License along
+with groff; see the file LICENSE.  If not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+#include <stdlib.h>
+#include "lib.h"
+#include "errarg.h"
+#include "error.h"
+#include "stringclass.h"
+#include "cset.h"
+#include "guess.h"
+
+static void usage();
+static void convert_font(const font_params &, FILE *, FILE *);
+
+typedef font_params::*param_t;
+
+static struct {
+  const char *name;
+  param_t par;
+} param_table[] = {
+  "x-height", &font_params::x_height,
+  "fig-height", &font_params::fig_height,
+  "asc-height", &font_params::asc_height,
+  "body-height", &font_params::body_height,
+  "cap-height", &font_params::cap_height,
+  "comma-depth", &font_params::comma_depth,
+  "desc-depth", &font_params::desc_depth,
+  "body-depth", &font_params::body_depth,
+};
+
+// These are all in thousandths of an em.
+// These values are correct for PostScript Times Roman.
+
+#define DEFAULT_X_HEIGHT 448
+#define DEFAULT_FIG_HEIGHT 676
+#define DEFAULT_ASC_HEIGHT 682
+#define DEFAULT_BODY_HEIGHT 676
+#define DEFAULT_CAP_HEIGHT 662
+#define DEFAULT_COMMA_DEPTH 143
+#define DEFAULT_DESC_DEPTH 217
+#define DEFAULT_BODY_DEPTH 177
+
+int main(int argc, char **argv)
+{
+  program_name = argv[0];
+  if (argc < 4)
+    usage();
+  int resolution;
+  if (sscanf(argv[argc-3], "%d", &resolution) != 1)
+    usage();
+  if (resolution <= 0)
+    fatal("resolution must be > 0");
+  int unitwidth;
+  if (sscanf(argv[argc-2], "%d", &unitwidth) != 1)
+    usage();
+  if (unitwidth <= 0)
+    fatal("unitwidth must be > 0");
+  font_params param;
+  const char *font = argv[argc-1];
+  param.italic = (font[0] != '\0' && strchr(font, '\0')[-1] == 'I');
+  param.em = (resolution*unitwidth)/72;
+  param.x_height = DEFAULT_X_HEIGHT;
+  param.fig_height = DEFAULT_FIG_HEIGHT;
+  param.asc_height = DEFAULT_ASC_HEIGHT;
+  param.body_height = DEFAULT_BODY_HEIGHT;
+  param.cap_height = DEFAULT_CAP_HEIGHT;
+  param.comma_depth = DEFAULT_COMMA_DEPTH;
+  param.desc_depth = DEFAULT_DESC_DEPTH;
+  param.body_depth = DEFAULT_BODY_DEPTH;
+  for (int i = 1; i < argc && argv[i][0] == '-'; i++) {
+    if (argv[i][1] == '-' && argv[i][2] == '\0') {
+      i++;
+      break;
+    }
+    if (i + 1 >= argc)
+      usage();
+    for (int j = 0;; j++) {
+      if (j >= sizeof(param_table)/sizeof(param_table[0]))
+       fatal("parameter `%1' not recognized", argv[i] + 1);
+      if (strcmp(param_table[j].name, argv[i] + 1) == 0)
+       break;
+    }
+    if (sscanf(argv[i+1], "%d", &(param.*(param_table[j].par))) != 1)
+      fatal("invalid argument `%1'", argv[i+1]);
+    i++;
+  }    
+  if (argc - i != 3)
+    usage();
+  FILE *infp = fopen(font, "r");
+  if (infp == 0)
+    fatal("can't open `%1': %2", font, strerror(errno));
+  convert_font(param, infp, stdout);
+  exit(0);
+}
+
+static void usage()
+{
+  fprintf(stderr, "usage: %s [-param value] ... resolution unitwidth font\n",
+         program_name);
+  exit(1);
+}
+
+static int get_line(FILE *fp, string *p)
+{
+  int c;
+  p->clear();
+  while ((c = getc(fp)) != EOF) {
+    *p += char(c);
+    if (c == '\n')
+      break;
+  }
+  return p->length() > 0;
+}
+  
+static void convert_font(const font_params &param, FILE *infp, FILE *outfp)
+{
+  string s;
+  while (get_line(infp, &s)) {
+    put_string(s, outfp);
+    if (s.length() >= 8
+       && strncmp(&s[0], "charset", 7))
+      break;
+  }
+  while (get_line(infp, &s)) {
+    s += '\0';
+    string name;
+    const char *p = s.contents();
+    while (csspace(*p))
+      p++;
+    while (*p != '\0' && !csspace(*p))
+      name += *p++;
+    while (csspace(*p))
+      p++;
+    for (const char *q = s.contents(); q < p; q++)
+      putc(*q, outfp);
+    char *next;
+    char_metric metric;
+    metric.width = (int)strtol(p, &next, 10);
+    if (next != p) {
+      printf("%d", metric.width);
+      p = next;
+      metric.type = (int)strtol(p, &next, 10);
+      if (next != p) {
+       name += '\0';
+       guess(name.contents(), param, &metric);
+       if (metric.sk == 0) {
+         if (metric.left_ic == 0) {
+           if (metric.ic == 0) {
+             if (metric.depth == 0) {
+               if (metric.height != 0)
+                 printf(",%d", metric.height);
+             }
+             else
+               printf(",%d,%d", metric.height, metric.depth);
+           }
+           else
+             printf(",%d,%d,%d", metric.height, metric.depth, metric.ic);
+         }
+         else
+           printf(",%d,%d,%d,%d", metric.height, metric.depth, metric.ic,
+                  metric.left_ic);
+       }
+       else
+         printf(",%d,%d,%d,%d,%d", metric.height, metric.depth, metric.ic,
+                metric.left_ic, metric.sk);
+      }
+    }
+    fputs(p, outfp);
+  }
+}
+
diff --git a/usr/src/usr.bin/groff/etc/grog.sh b/usr/src/usr.bin/groff/etc/grog.sh
new file mode 100644 (file)
index 0000000..be8da30
--- /dev/null
@@ -0,0 +1,65 @@
+#!/bin/sh
+# grog -- guess options for groff command
+# Like doctype in Kernighan & Pike, Unix Programming Environment, pp 306-8.
+
+soelim=gsoelim
+
+opts=
+
+for arg
+do
+       case "$arg" in
+       --)
+               shift; break;;
+       -)
+               break;;
+       -*)
+               opts="$opts $arg"; shift;;
+       *)
+               break;;
+       esac
+done
+
+egrep -h '^\.(P|[LI]P|[pnil]p|TS|EQ|TH|SH|so)' $* \
+| sed -e '/^\.so/s/^.*$/.SO_START\
+&\
+.SO_END/' \
+| $soelim \
+| egrep '^\.(P|[LI]P|[pnil]p|TS|EQ|TH|SH|SO_START|SO_END)' \
+| awk '
+/^\.SO_START$/ { so = 1 }
+/^\.SO_END$/ { so = 0 }
+/^\.TS/ { tbl++; if (so > 0) soelim++ }
+/^\.PS/ { pic++; if (so > 0) soelim++ }
+/^\.EQ/ { eqn++; if (so > 0) soelim++ }
+/^\.TH/ { TH++ }
+/^\.[PLI]P/ { PP++ }
+/^\.P$/ { P++ }
+/^\.SH/ { SH++ }
+/^\.[pnil]p/ { me++ }
+
+END {
+       if (files ~ /^-/)
+               files = "-- " files
+       printf "groff"
+       if (pic > 0 || tbl > 0 || eqn > 0) {
+               printf " -"
+               if (soelim > 0) printf "s"
+               if (pic > 0) printf "p"
+               if (tbl > 0) printf "t"
+               if (eqn > 0) printf "e"
+       }
+       if (me > 0)
+               printf " -me"
+       else if (SH > 0 && TH > 0)
+               printf " -man"
+       else if (PP > 0)
+               printf " -ms"
+       else if (P > 0)
+               printf " -mm"
+       if (opts != "")
+               printf "%s", opts
+       if (files != "")
+               printf " %s", files
+       print
+}' "opts=$opts" "files=$*" -
diff --git a/usr/src/usr.bin/groff/etc/guess.c b/usr/src/usr.bin/groff/etc/guess.c
new file mode 100644 (file)
index 0000000..c97a768
--- /dev/null
@@ -0,0 +1,490 @@
+// -*- C++ -*-
+/* Copyright (C) 1989, 1990 Free Software Foundation, Inc.
+     Written by James Clark (jjc@jclark.uucp)
+
+This file is part of groff.
+
+groff is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 1, or (at your option) any later
+version.
+
+groff is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License along
+with groff; see the file LICENSE.  If not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include "guess.h"
+
+void guess(const char *s, const font_params &param, char_metric *metric)
+{
+  int &height = metric->height;
+  int &depth = metric->depth;
+
+  metric->ic = 0;
+  metric->left_ic = 0;
+  metric->sk = 0;
+  height = 0;
+  depth = 0;
+  if (s[0] == '\0' || (s[1] != '\0' && s[2] != '\0'))
+    goto do_default;
+#define HASH(c1, c2) (((unsigned char)(c1) << 8) | (unsigned char)(c2))
+  switch (HASH(s[0], s[1])) {
+  default:
+  do_default:
+    if (metric->type & 01)
+      depth = param.desc_depth;
+    if (metric->type & 02)
+      height = param.asc_height;
+    else
+      height = param.x_height;
+    break;
+  case HASH('\\', '|'):
+  case HASH('\\', '^'):
+  case HASH('\\', '&'):
+    // these have zero height and depth
+    break;
+  case HASH('f', 0):
+    height = param.asc_height;
+    if (param.italic)
+      depth = param.desc_depth;
+    break;
+  case HASH('a', 0):
+  case HASH('c', 0):
+  case HASH('e', 0):
+  case HASH('m', 0):
+  case HASH('n', 0):
+  case HASH('o', 0):
+  case HASH('r', 0):
+  case HASH('s', 0):
+  case HASH('u', 0):
+  case HASH('v', 0):
+  case HASH('w', 0):
+  case HASH('x', 0):
+  case HASH('z', 0):
+    height = param.x_height;
+    break;
+  case HASH('i', 0):
+    height = param.x_height;
+    break;
+  case HASH('b', 0):
+  case HASH('d', 0):
+  case HASH('h', 0):
+  case HASH('k', 0):
+  case HASH('l', 0):
+  case HASH('F', 'i'):
+  case HASH('F', 'l'):
+  case HASH('f', 'f'):
+  case HASH('f', 'i'):
+  case HASH('f', 'l'):
+    height = param.asc_height;
+    break;
+  case HASH('t', 0):
+    height = param.asc_height;
+    break;
+  case HASH('g', 0):
+  case HASH('p', 0):
+  case HASH('q', 0):
+  case HASH('y', 0):
+    height = param.x_height;
+    depth = param.desc_depth;
+    break;
+  case HASH('j', 0):
+    height = param.x_height;
+    depth = param.desc_depth;
+    break;
+  case HASH('A', 0):
+  case HASH('B', 0):
+  case HASH('C', 0):
+  case HASH('D', 0):
+  case HASH('E', 0):
+  case HASH('F', 0):
+  case HASH('G', 0):
+  case HASH('H', 0):
+  case HASH('I', 0):
+  case HASH('J', 0):
+  case HASH('K', 0):
+  case HASH('L', 0):
+  case HASH('M', 0):
+  case HASH('N', 0):
+  case HASH('O', 0):
+  case HASH('P', 0):
+  case HASH('Q', 0):
+  case HASH('R', 0):
+  case HASH('S', 0):
+  case HASH('T', 0):
+  case HASH('U', 0):
+  case HASH('V', 0):
+  case HASH('W', 0):
+  case HASH('X', 0):
+  case HASH('Y', 0):
+  case HASH('Z', 0):
+    height = param.cap_height;
+    break;
+  case HASH('*', 'A'):
+  case HASH('*', 'B'):
+  case HASH('*', 'C'):
+  case HASH('*', 'D'):
+  case HASH('*', 'E'):
+  case HASH('*', 'F'):
+  case HASH('*', 'G'):
+  case HASH('*', 'H'):
+  case HASH('*', 'I'):
+  case HASH('*', 'K'):
+  case HASH('*', 'L'):
+  case HASH('*', 'M'):
+  case HASH('*', 'N'):
+  case HASH('*', 'O'):
+  case HASH('*', 'P'):
+  case HASH('*', 'Q'):
+  case HASH('*', 'R'):
+  case HASH('*', 'S'):
+  case HASH('*', 'T'):
+  case HASH('*', 'U'):
+  case HASH('*', 'W'):
+  case HASH('*', 'X'):
+  case HASH('*', 'Y'):
+  case HASH('*', 'Z'):
+    height = param.cap_height;
+    break;
+  case HASH('0', 0):
+  case HASH('1', 0):
+  case HASH('2', 0):
+  case HASH('3', 0):
+  case HASH('4', 0):
+  case HASH('5', 0):
+  case HASH('6', 0):
+  case HASH('7', 0):
+  case HASH('8', 0):
+  case HASH('9', 0):
+  case HASH('1', '2'):
+  case HASH('1', '4'):
+  case HASH('3', '4'):
+    height = param.fig_height;
+    break;
+  case HASH('(', 0):
+  case HASH(')', 0):
+  case HASH('[', 0):
+  case HASH(']', 0):
+  case HASH('{', 0):
+  case HASH('}', 0):
+    height = param.body_height;
+    depth = param.body_depth;
+    break;
+  case HASH('i', 's'):
+    height = (param.em*3)/4;
+    depth = param.em/4;
+    break;
+  case HASH('*', 'a'):
+  case HASH('*', 'e'):
+  case HASH('*', 'i'):
+  case HASH('*', 'k'):
+  case HASH('*', 'n'):
+  case HASH('*', 'o'):
+  case HASH('*', 'p'):
+  case HASH('*', 's'):
+  case HASH('*', 't'):
+  case HASH('*', 'u'):
+  case HASH('*', 'w'):
+    height = param.x_height;
+    break;
+  case HASH('*', 'd'):
+  case HASH('*', 'l'):
+    height = param.asc_height;
+    break;
+  case HASH('*', 'g'):
+  case HASH('*', 'h'):
+  case HASH('*', 'm'):
+  case HASH('*', 'r'):
+  case HASH('*', 'x'):
+  case HASH('*', 'y'):
+    height = param.x_height;
+    depth = param.desc_depth;
+    break;
+  case HASH('*', 'b'):
+  case HASH('*', 'c'):
+  case HASH('*', 'f'):
+  case HASH('*', 'q'):
+  case HASH('*', 'z'):
+    height = param.asc_height;
+    depth = param.desc_depth;
+    break;
+  case HASH('t', 's'):
+    height = param.x_height;
+    depth = param.desc_depth;
+    break;
+  case HASH('!', 0):
+  case HASH('?', 0):
+  case HASH('"', 0):
+  case HASH('#', 0):
+  case HASH('$', 0):
+  case HASH('%', 0):
+  case HASH('&', 0):
+  case HASH('*', 0):
+  case HASH('+', 0):
+    height = param.asc_height;
+    break;
+  case HASH('`', 0):
+  case HASH('\'', 0):
+    height = param.asc_height;
+    break;
+  case HASH('~', 0):
+  case HASH('^', 0):
+  case HASH('a', 'a'):
+  case HASH('g', 'a'):
+    height = param.asc_height;
+    break;
+  case HASH('r', 'u'):
+  case HASH('.', 0):
+    break;
+  case HASH(',', 0):
+    depth = param.comma_depth;
+    break;
+  case HASH('m', 'i'):
+  case HASH('-', 0):
+  case HASH('h', 'y'):
+  case HASH('e', 'm'):
+    height = param.x_height;
+    break;
+  case HASH(':', 0):
+    height = param.x_height;
+    break;
+  case HASH(';', 0):
+    height = param.x_height;
+    depth = param.comma_depth;
+    break;
+  case HASH('=', 0):
+  case HASH('e', 'q'):
+    height = param.x_height;
+    break;
+  case HASH('<', 0):
+  case HASH('>', 0):
+  case HASH('>', '='):
+  case HASH('<', '='):
+  case HASH('@', 0):
+  case HASH('/', 0):
+  case HASH('|', 0):
+  case HASH('\\', 0):
+    height = param.asc_height;
+    break;
+  case HASH('_', 0):
+  case HASH('u', 'l'):
+  case HASH('\\', '_'):
+    depth = param.em/4;
+    break;
+  case HASH('r', 'n'):
+    height = (param.em*3)/4;
+    break;
+  case HASH('s', 'r'):
+    height = (param.em*3)/4;
+    depth = param.em/4;
+    break;
+  case HASH('b', 'u'):
+  case HASH('s', 'q'):
+  case HASH('d', 'e'):
+  case HASH('d', 'g'):
+  case HASH('f', 'm'):
+  case HASH('c', 't'):
+  case HASH('r', 'g'):
+  case HASH('c', 'o'):
+  case HASH('p', 'l'):
+  case HASH('*', '*'):
+  case HASH('s', 'c'):
+  case HASH('s', 'l'):
+  case HASH('=', '='):
+  case HASH('~', '='):
+  case HASH('a', 'p'):
+  case HASH('!', '='):
+  case HASH('-', '>'):
+  case HASH('<', '-'):
+  case HASH('u', 'a'):
+  case HASH('d', 'a'):
+  case HASH('m', 'u'):
+  case HASH('d', 'i'):
+  case HASH('+', '-'):
+  case HASH('c', 'u'):
+  case HASH('c', 'a'):
+  case HASH('s', 'b'):
+  case HASH('s', 'p'):
+  case HASH('i', 'b'):
+  case HASH('i', 'p'):
+  case HASH('i', 'f'):
+  case HASH('p', 'd'):
+  case HASH('g', 'r'):
+  case HASH('n', 'o'):
+  case HASH('p', 't'):
+  case HASH('e', 's'):
+  case HASH('m', 'o'):
+  case HASH('b', 'r'):
+  case HASH('d', 'd'):
+  case HASH('r', 'h'):
+  case HASH('l', 'h'):
+  case HASH('o', 'r'):
+  case HASH('c', 'i'):
+    height = param.asc_height;
+    break;
+  case HASH('l', 't'):
+  case HASH('l', 'b'):
+  case HASH('r', 't'):
+  case HASH('r', 'b'):
+  case HASH('l', 'k'):
+  case HASH('r', 'k'):
+  case HASH('b', 'v'):
+  case HASH('l', 'f'):
+  case HASH('r', 'f'):
+  case HASH('l', 'c'):
+  case HASH('r', 'c'):
+    height = (param.em*3)/4;
+    depth = param.em/4;
+    break;
+#if 0
+  case HASH('%', '0'):
+  case HASH('-', '+'):
+  case HASH('-', 'D'):
+  case HASH('-', 'd'):
+  case HASH('-', 'd'):
+  case HASH('-', 'h'):
+  case HASH('.', 'i'):
+  case HASH('.', 'j'):
+  case HASH('/', 'L'):
+  case HASH('/', 'O'):
+  case HASH('/', 'l'):
+  case HASH('/', 'o'):
+  case HASH('=', '~'):
+  case HASH('A', 'E'):
+  case HASH('A', 'h'):
+  case HASH('A', 'N'):
+  case HASH('C', 's'):
+  case HASH('D', 'o'):
+  case HASH('F', 'c'):
+  case HASH('F', 'o'):
+  case HASH('I', 'J'):
+  case HASH('I', 'm'):
+  case HASH('O', 'E'):
+  case HASH('O', 'f'):
+  case HASH('O', 'K'):
+  case HASH('O', 'm'):
+  case HASH('O', 'R'):
+  case HASH('P', 'o'):
+  case HASH('R', 'e'):
+  case HASH('S', '1'):
+  case HASH('S', '2'):
+  case HASH('S', '3'):
+  case HASH('T', 'P'):
+  case HASH('T', 'p'):
+  case HASH('Y', 'e'):
+  case HASH('\\', '-'):
+  case HASH('a', '"'):
+  case HASH('a', '-'):
+  case HASH('a', '.'):
+  case HASH('a', '^'):
+  case HASH('a', 'b'):
+  case HASH('a', 'c'):
+  case HASH('a', 'd'):
+  case HASH('a', 'e'):
+  case HASH('a', 'h'):
+  case HASH('a', 'o'):
+  case HASH('a', 't'):
+  case HASH('a', '~'):
+  case HASH('b', 'a'):
+  case HASH('b', 'b'):
+  case HASH('b', 's'):
+  case HASH('c', '*'):
+  case HASH('c', '+'):
+  case HASH('f', '/'):
+  case HASH('f', 'a'):
+  case HASH('f', 'c'):
+  case HASH('f', 'o'):
+  case HASH('h', 'a'):
+  case HASH('h', 'o'):
+  case HASH('i', 'j'):
+  case HASH('l', 'A'):
+  case HASH('l', 'B'):
+  case HASH('l', 'C'):
+  case HASH('m', 'd'):
+  case HASH('n', 'c'):
+  case HASH('n', 'e'):
+  case HASH('n', 'm'):
+  case HASH('o', 'A'):
+  case HASH('o', 'a'):
+  case HASH('o', 'e'):
+  case HASH('o', 'q'):
+  case HASH('p', 'l'):
+  case HASH('p', 'p'):
+  case HASH('p', 's'):
+  case HASH('r', '!'):
+  case HASH('r', '?'):
+  case HASH('r', 'A'):
+  case HASH('r', 'B'):
+  case HASH('r', 'C'):
+  case HASH('r', 's'):
+  case HASH('s', 'h'):
+  case HASH('s', 's'):
+  case HASH('t', 'e'):
+  case HASH('t', 'f'):
+  case HASH('t', 'i'):
+  case HASH('t', 'm'):
+  case HASH('~', '~'):
+  case HASH('v', 'S'):
+  case HASH('v', 'Z'):
+  case HASH('v', 's'):
+  case HASH('v', 'z'):
+  case HASH('^', 'A'):
+  case HASH('^', 'E'):
+  case HASH('^', 'I'):
+  case HASH('^', 'O'):
+  case HASH('^', 'U'):
+  case HASH('^', 'a'):
+  case HASH('^', 'e'):
+  case HASH('^', 'i'):
+  case HASH('^', 'o'):
+  case HASH('^', 'u'):
+  case HASH('`', 'A'):
+  case HASH('`', 'E'):
+  case HASH('`', 'I'):
+  case HASH('`', 'O'):
+  case HASH('`', 'U'):
+  case HASH('`', 'a'):
+  case HASH('`', 'e'):
+  case HASH('`', 'i'):
+  case HASH('`', 'o'):
+  case HASH('`', 'u'):
+  case HASH('~', 'A'):
+  case HASH('~', 'N'):
+  case HASH('~', 'O'):
+  case HASH('~', 'a'):
+  case HASH('~', 'n'):
+  case HASH('~', 'o'):
+  case HASH('\'', 'A'):
+  case HASH('\'', 'C'):
+  case HASH('\'', 'E'):
+  case HASH('\'', 'I'):
+  case HASH('\'', 'O'):
+  case HASH('\'', 'U'):
+  case HASH('\'', 'a'):
+  case HASH('\'', 'c'):
+  case HASH('\'', 'e'):
+  case HASH('\'', 'i'):
+  case HASH('\'', 'o'):
+  case HASH('\'', 'u')
+  case HASH(':', 'A'):
+  case HASH(':', 'E'):
+  case HASH(':', 'I'):
+  case HASH(':', 'O'):
+  case HASH(':', 'U'):
+  case HASH(':', 'Y'):
+  case HASH(':', 'a'):
+  case HASH(':', 'e'):
+  case HASH(':', 'i'):
+  case HASH(':', 'o'):
+  case HASH(':', 'u'):
+  case HASH(':', 'y'):
+  case HASH(',', 'C'):
+  case HASH(',', 'c'):
+#endif
+  }
+}
diff --git a/usr/src/usr.bin/groff/etc/guess.h b/usr/src/usr.bin/groff/etc/guess.h
new file mode 100644 (file)
index 0000000..a3b097b
--- /dev/null
@@ -0,0 +1,44 @@
+// -*- C++ -*-
+/* Copyright (C) 1989, 1990 Free Software Foundation, Inc.
+     Written by James Clark (jjc@jclark.uucp)
+
+This file is part of groff.
+
+groff is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 1, or (at your option) any later
+version.
+
+groff is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License along
+with groff; see the file LICENSE.  If not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+struct font_params {
+  int italic;
+  int em;
+  int x_height;
+  int fig_height;
+  int cap_height;
+  int asc_height;
+  int body_height;
+  int comma_depth;
+  int desc_depth;
+  int body_depth;
+};
+
+struct char_metric {
+  int width;
+  int type;
+  int height;
+  int depth;
+  int ic;
+  int left_ic;
+  int sk;
+};
+  
+void guess(const char *s, const font_params &param, char_metric *metric);
diff --git a/usr/src/usr.bin/groff/etc/soelim.c b/usr/src/usr.bin/groff/etc/soelim.c
new file mode 100644 (file)
index 0000000..3e7dfd1
--- /dev/null
@@ -0,0 +1,277 @@
+// -*- C++ -*-
+/* Copyright (C) 1989, 1990, 1991 Free Software Foundation, Inc.
+     Written by James Clark (jjc@jclark.uucp)
+
+This file is part of groff.
+
+groff is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free
+Software Foundation; either version 1, or (at your option) any later
+version.
+
+groff is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License along
+with groff; see the file LICENSE.  If not, write to the Free Software
+Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
+
+#include <stdio.h>
+#include <ctype.h>
+#include <string.h>
+#include <assert.h>
+#include <stdlib.h>
+#include "lib.h"
+#include "errarg.h"
+#include "error.h"
+#include "stringclass.h"
+
+int compatible_flag = 0;
+
+extern int interpret_lf_args(const char *);
+
+int do_file(const char *filename);
+
+void usage()
+{
+  fprintf(stderr, "usage: %s [ -vC ] [ files ]\n", program_name);
+  exit(1);
+}
+
+int main(int argc, char **argv)
+{
+  program_name = argv[0];
+  int opt;
+  while ((opt = getopt(argc, argv, "vC")) != EOF)
+    switch (opt) {
+    case 'v':
+      {
+       extern const char *version_string;
+       fprintf(stderr, "GNU soelim version %s\n", version_string);
+       fflush(stderr);
+       break;
+      }
+    case 'C':
+      compatible_flag = 1;
+      break;
+    case '?':
+      usage();
+      break;
+    default:
+      assert(0);
+    }
+  int nbad = 0;
+  if (optind >= argc)
+    nbad += !do_file("-");
+  else
+    for (int i = optind; i < argc; i++)
+      nbad += !do_file(argv[i]);
+  if (ferror(stdout) || fflush(stdout) < 0)
+    fatal("output error");
+  exit(nbad != 0);
+}
+
+void set_location()
+{
+  printf(".lf %d %s\n", current_lineno, current_filename);
+}
+
+void do_so(const char *line)
+{
+  const char *p = line;
+  while (*p == ' ')
+    p++;
+  string filename;
+  int success = 1;
+  for (const char *q = p;
+       success && *q != '\0' && *q != '\n' && *q != ' ';
+       q++)
+    if (*q == '\\') {
+      switch (*++q) {
+      case 'e':
+      case '\\':
+       filename += '\\';
+       break;
+      case ' ':
+       filename += ' ';
+       break;
+      default:
+       success = 0;
+       break;
+      }
+    }
+    else
+      filename += char(*q);
+  if (success && filename.length() > 0) {
+    filename += '\0';
+    const char *fn = current_filename;
+    int ln = current_lineno;
+    current_lineno--;
+    if (do_file(filename.contents())) {
+      current_filename = fn;
+      current_lineno = ln;
+      set_location();
+      return;
+    }
+    current_lineno++;
+  }
+  fputs(".so", stdout);
+  fputs(line, stdout);
+}
+
+int do_file(const char *filename)
+{
+  FILE *fp;
+  if (strcmp(filename, "-") == 0)
+    fp = stdin;
+  else {
+    errno = 0;
+    fp = fopen(filename, "r");
+    if (fp == 0) {
+      error("can't open `%1': %2", filename, strerror(errno));
+      return 0;
+    }
+  }
+  current_filename = filename;
+  current_lineno = 1;
+  set_location();
+  enum { START, MIDDLE, HAD_DOT, HAD_s, HAD_so, HAD_l, HAD_lf } state = START;
+  for (;;) {
+    int c = getc(fp);
+    if (c == EOF)
+      break;
+    switch (state) {
+    case START:
+      if (c == '.')
+       state = HAD_DOT;
+      else {
+       putchar(c);
+       if (c == '\n') {
+         current_lineno++;
+         state = START;
+       }
+       else
+         state = MIDDLE;
+      }
+      break;
+    case MIDDLE:
+      putchar(c);
+      if (c == '\n') {
+       current_lineno++;
+       state = START;
+      }
+      break;
+    case HAD_DOT:
+      if (c == 's')
+       state = HAD_s;
+      else if (c == 'l')
+       state = HAD_l;
+      else {
+       putchar('.');
+       putchar(c);
+       if (c == '\n') {
+         current_lineno++;
+         state = START;
+       }
+       else
+         state = MIDDLE;
+      }
+      break;
+    case HAD_s:
+      if (c == 'o')
+       state = HAD_so;
+      else  {
+       putchar('.');
+       putchar('s');
+       putchar(c);
+       if (c == '\n') {
+         current_lineno++;
+         state = START;
+       }
+       else
+         state = MIDDLE;
+      }
+      break;
+    case HAD_so:
+      if (c == ' ' || c == '\n' || compatible_flag) {
+       string line;
+       for (; c != EOF && c != '\n'; c = getc(fp))
+         line += c;
+       current_lineno++;
+       line += '\n';
+       line += '\0';
+       do_so(line.contents());
+       state = START;
+      }
+      else {
+       fputs(".so", stdout);
+       putchar(c);
+       state = MIDDLE;
+      }
+      break;
+    case HAD_l:
+      if (c == 'f')
+       state = HAD_lf;
+      else {
+       putchar('.');
+       putchar('l');
+       putchar(c);
+       if (c == '\n') {
+         current_lineno++;
+         state = START;
+       }
+       else
+         state = MIDDLE;
+      }
+      break;
+    case HAD_lf:
+      if (c == ' ' || c == '\n' || compatible_flag) {
+       string line;
+       for (; c != EOF && c != '\n'; c = getc(fp))
+         line += c;
+       current_lineno++;
+       line += '\n';
+       line += '\0';
+       interpret_lf_args(line.contents());
+       printf(".lf%s", line.contents());
+       state = START;
+      }
+      else {
+       fputs(".lf", stdout);
+       putchar(c);
+       state = MIDDLE;
+      }
+      break;
+    default:
+      assert(0);
+    }
+  }
+  switch (state) {
+  case HAD_DOT:
+    fputs(".\n", stdout);
+    break;
+  case HAD_l:
+    fputs(".l\n", stdout);
+    break;
+  case HAD_s:
+    fputs(".s\n", stdout);
+    break;
+  case HAD_lf:
+    fputs(".lf\n", stdout);
+    break;
+  case HAD_so:
+    fputs(".so\n", stdout);
+    break;
+  case MIDDLE:
+    putc('\n', stdout);
+    break;
+  case START:
+    break;
+  }
+  if (fp != stdin)
+    fclose(fp);
+  current_filename = 0;
+  return 1;
+}