From owner-svn-soc-all@FreeBSD.ORG Tue Jun 12 05:39:38 2012 Return-Path: Delivered-To: svn-soc-all@FreeBSD.org Received: from socsvn.FreeBSD.org (unknown [IPv6:2001:4f8:fff6::2f]) by hub.freebsd.org (Postfix) with SMTP id F3D36106567C for ; Tue, 12 Jun 2012 05:39:35 +0000 (UTC) (envelope-from jhagewood@FreeBSD.org) Received: by socsvn.FreeBSD.org (sSMTP sendmail emulation); Tue, 12 Jun 2012 05:39:35 +0000 Date: Tue, 12 Jun 2012 05:39:35 +0000 From: jhagewood@FreeBSD.org To: svn-soc-all@FreeBSD.org MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Message-Id: <20120612053935.F3D36106567C@hub.freebsd.org> Cc: Subject: socsvn commit: r237531 - in soc2012/jhagewood: diff diff/diff mdocml mdocml/mdocml-1.12.1 X-BeenThere: svn-soc-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: SVN commit messages for the entire Summer of Code repository List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Jun 2012 05:39:38 -0000 Author: jhagewood Date: Tue Jun 12 05:39:35 2012 New Revision: 237531 URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=237531 Log: Modified: soc2012/jhagewood/diff/diff/diff.c soc2012/jhagewood/diff/diff/diff.h soc2012/jhagewood/diff/diff/diffreg.c soc2012/jhagewood/diff/hagewood-diff.patch soc2012/jhagewood/mdocml/hagewood-mdocml-ns.patch soc2012/jhagewood/mdocml/mdocml-1.12.1/man.h soc2012/jhagewood/mdocml/mdocml-1.12.1/man_term.c soc2012/jhagewood/mdocml/mdocml-1.12.1/mdoc.c soc2012/jhagewood/mdocml/mdocml-1.12.1/mdoc.h soc2012/jhagewood/mdocml/mdocml-1.12.1/mdoc_argv.c soc2012/jhagewood/mdocml/mdocml-1.12.1/mdoc_macro.c soc2012/jhagewood/mdocml/mdocml-1.12.1/mdoc_term.c Modified: soc2012/jhagewood/diff/diff/diff.c ============================================================================== --- soc2012/jhagewood/diff/diff/diff.c Tue Jun 12 04:58:52 2012 (r237530) +++ soc2012/jhagewood/diff/diff/diff.c Tue Jun 12 05:39:35 2012 (r237531) @@ -45,7 +45,7 @@ #include "diff.h" #include "pathnames.h" -int aflag, bflag, dflag, iflag, lflag, Nflag, Pflag, pflag, rflag; +int aflag, bflag, cflag, dflag, iflag, lflag, Nflag, Pflag, pflag, rflag; int sflag, tflag, Tflag, wflag; int Bflag, yflag; int strip_cr, tabsize=8; @@ -196,6 +196,7 @@ break; case 'C': case 'c': + cflag = 1; format = D_CONTEXT; if (optarg != NULL) { l = strtol(optarg, &ep, 10); Modified: soc2012/jhagewood/diff/diff/diff.h ============================================================================== --- soc2012/jhagewood/diff/diff/diff.h Tue Jun 12 04:58:52 2012 (r237530) +++ soc2012/jhagewood/diff/diff/diff.h Tue Jun 12 05:39:35 2012 (r237531) @@ -75,7 +75,7 @@ struct excludes *next; }; -extern int aflag, bflag, dflag, iflag, lflag, Nflag, Pflag, pflag, rflag, +extern int aflag, bflag, cflag, dflag, iflag, lflag, Nflag, Pflag, pflag, rflag, sflag, tflag, Tflag, wflag; extern int Bflag, strip_cr, tabsize; extern int format, context, status; Modified: soc2012/jhagewood/diff/diff/diffreg.c ============================================================================== --- soc2012/jhagewood/diff/diff/diffreg.c Tue Jun 12 04:58:52 2012 (r237530) +++ soc2012/jhagewood/diff/diff/diffreg.c Tue Jun 12 05:39:35 2012 (r237531) @@ -1551,29 +1551,33 @@ static void print_header(const char *file1, const char *file2) { - const char *time_format; -#ifdef ST_MTIM_NSEC - time_format = "%Y-%m-%d %H:%M:%S.%N %z"; -#else - time_format = "%Y-%m-%d %H:%M:%S %z"; -#endif + const char *time_format; struct tm *tm_ptr1, *tm_ptr2; char buf1[256]; char buf2[256]; +#ifdef ST_MTIM_NSEC + time_format = "%Y-%m-%d %H:%M:%S.%N %z"; +#else + time_format = "%Y-%m-%d %H:%M:%S %z"; +#endif + + if (cflag) + time_format = "%c"; tm_ptr1 = localtime(&stb1.st_mtime); tm_ptr2 = localtime(&stb2.st_mtime); strftime(buf1, 256, time_format, tm_ptr1); strftime(buf2, 256, time_format, tm_ptr2); + if (label[0] != NULL) printf("%s %s\n", format == D_CONTEXT ? "***" : "---", - label[0]); + label[0]); else printf("%s %s\t%s\n", format == D_CONTEXT ? "***" : "---", - file1, buf1); + file1, buf1); if (label[1] != NULL) printf("%s %s\n", format == D_CONTEXT ? "---" : "+++", - label[1]); + label[1]); else printf("%s %s\t%s\n", format == D_CONTEXT ? "---" : "+++", - file2, buf2); + file2, buf2); } Modified: soc2012/jhagewood/diff/hagewood-diff.patch ============================================================================== --- soc2012/jhagewood/diff/hagewood-diff.patch Tue Jun 12 04:58:52 2012 (r237530) +++ soc2012/jhagewood/diff/hagewood-diff.patch Tue Jun 12 05:39:35 2012 (r237531) @@ -1,6 +1,15 @@ diff -rupN jhagewood/diff/diff-orig/diff.c jhagewood/diff/diff/diff.c --- jhagewood/diff/diff-orig/diff.c 2012-06-10 03:31:05.000000000 -0400 -+++ jhagewood/diff/diff/diff.c 2012-06-11 02:32:48.000000000 -0400 ++++ jhagewood/diff/diff/diff.c 2012-06-12 05:35:45.000000000 -0400 +@@ -45,7 +45,7 @@ __FBSDID("$FreeBSD$"); + #include "diff.h" + #include "pathnames.h" + +-int aflag, bflag, dflag, iflag, lflag, Nflag, Pflag, pflag, rflag; ++int aflag, bflag, cflag, dflag, iflag, lflag, Nflag, Pflag, pflag, rflag; + int sflag, tflag, Tflag, wflag; + int Bflag, yflag; + int strip_cr, tabsize=8; @@ -129,7 +129,6 @@ static struct option longopts[] = { { "report-identical-files", no_argument, NULL, 's' }, { "initial-tab", no_argument, NULL, 'T' }, @@ -9,7 +18,15 @@ { "unified", optional_argument, NULL, 'U' }, { "version", no_argument, NULL, 'v' }, /* XXX: UNIMPLEMENTED -@@ -548,7 +547,7 @@ print_status(int val, char *path1, char +@@ -197,6 +196,7 @@ main(int argc, char **argv) + break; + case 'C': + case 'c': ++ cflag = 1; + format = D_CONTEXT; + if (optarg != NULL) { + l = strtol(optarg, &ep, 10); +@@ -548,7 +548,7 @@ print_status(int val, char *path1, char path1, entry ? entry : "", path2, entry ? entry : ""); break; case D_BINARY: @@ -18,40 +35,58 @@ path1, entry ? entry : "", path2, entry ? entry : ""); break; case D_DIFFER: +diff -rupN jhagewood/diff/diff-orig/diff.h jhagewood/diff/diff/diff.h +--- jhagewood/diff/diff-orig/diff.h 2012-06-10 03:31:05.000000000 -0400 ++++ jhagewood/diff/diff/diff.h 2012-06-12 05:34:04.000000000 -0400 +@@ -75,7 +75,7 @@ struct excludes { + struct excludes *next; + }; + +-extern int aflag, bflag, dflag, iflag, lflag, Nflag, Pflag, pflag, rflag, ++extern int aflag, bflag, cflag, dflag, iflag, lflag, Nflag, Pflag, pflag, rflag, + sflag, tflag, Tflag, wflag; + extern int Bflag, strip_cr, tabsize; + extern int format, context, status; diff -rupN jhagewood/diff/diff-orig/diffreg.c jhagewood/diff/diff/diffreg.c --- jhagewood/diff/diff-orig/diffreg.c 2012-06-10 03:31:05.000000000 -0400 -+++ jhagewood/diff/diff/diffreg.c 2012-06-11 00:49:41.000000000 -0400 -@@ -1551,16 +1551,29 @@ dump_unified_vec(FILE *f1, FILE *f2) ++++ jhagewood/diff/diff/diffreg.c 2012-06-12 05:38:29.000000000 -0400 +@@ -1551,16 +1551,33 @@ dump_unified_vec(FILE *f1, FILE *f2) static void print_header(const char *file1, const char *file2) { -+ const char *time_format; -+#ifdef ST_MTIM_NSEC -+ time_format = "%Y-%m-%d %H:%M:%S.%N %z"; -+#else -+ time_format = "%Y-%m-%d %H:%M:%S %z"; -+#endif ++ const char *time_format; + struct tm *tm_ptr1, *tm_ptr2; + char buf1[256]; + char buf2[256]; ++#ifdef ST_MTIM_NSEC ++ time_format = "%Y-%m-%d %H:%M:%S.%N %z"; ++#else ++ time_format = "%Y-%m-%d %H:%M:%S %z"; ++#endif ++ ++ if (cflag) ++ time_format = "%c"; + tm_ptr1 = localtime(&stb1.st_mtime); + tm_ptr2 = localtime(&stb2.st_mtime); + strftime(buf1, 256, time_format, tm_ptr1); + strftime(buf2, 256, time_format, tm_ptr2); ++ if (label[0] != NULL) printf("%s %s\n", format == D_CONTEXT ? "***" : "---", - label[0]); +- label[0]); ++ label[0]); else - printf("%s %s\t%s", format == D_CONTEXT ? "***" : "---", - file1, ctime(&stb1.st_mtime)); + printf("%s %s\t%s\n", format == D_CONTEXT ? "***" : "---", -+ file1, buf1); ++ file1, buf1); if (label[1] != NULL) printf("%s %s\n", format == D_CONTEXT ? "---" : "+++", - label[1]); +- label[1]); ++ label[1]); else - printf("%s %s\t%s", format == D_CONTEXT ? "---" : "+++", - file2, ctime(&stb2.st_mtime)); + printf("%s %s\t%s\n", format == D_CONTEXT ? "---" : "+++", -+ file2, buf2); ++ file2, buf2); } Modified: soc2012/jhagewood/mdocml/hagewood-mdocml-ns.patch ============================================================================== --- soc2012/jhagewood/mdocml/hagewood-mdocml-ns.patch Tue Jun 12 04:58:52 2012 (r237530) +++ soc2012/jhagewood/mdocml/hagewood-mdocml-ns.patch Tue Jun 12 05:39:35 2012 (r237531) @@ -1,6 +1,6 @@ diff -rupN jhagewood/mdocml/mdocml-1.12.1-orig/man.h jhagewood/mdocml/mdocml-1.12.1/man.h ---- jhagewood/mdocml/mdocml-1.12.1-orig/man.h 2012-06-04 23:30:13.000000000 -0400 -+++ jhagewood/mdocml/mdocml-1.12.1/man.h 2012-06-04 23:30:15.000000000 -0400 +--- jhagewood/mdocml/mdocml-1.12.1-orig/man.h 2012-06-10 03:31:06.000000000 -0400 ++++ jhagewood/mdocml/mdocml-1.12.1/man.h 2012-06-12 04:34:37.000000000 -0400 @@ -43,6 +43,8 @@ enum mant { MAN_sp, MAN_nf, @@ -10,9 +10,126 @@ MAN_RE, MAN_RS, MAN_DT, +diff -rupN jhagewood/mdocml/mdocml-1.12.1-orig/man.h.orig jhagewood/mdocml/mdocml-1.12.1/man.h.orig +--- jhagewood/mdocml/mdocml-1.12.1-orig/man.h.orig 1969-12-31 19:00:00.000000000 -0500 ++++ jhagewood/mdocml/mdocml-1.12.1/man.h.orig 2012-06-10 03:31:06.000000000 -0400 +@@ -0,0 +1,113 @@ ++/* $Id: man.h,v 1.60 2012/01/03 15:16:24 kristaps Exp $ */ ++/* ++ * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++#ifndef MAN_H ++#define MAN_H ++ ++enum mant { ++ MAN_br = 0, ++ MAN_TH, ++ MAN_SH, ++ MAN_SS, ++ MAN_TP, ++ MAN_LP, ++ MAN_PP, ++ MAN_P, ++ MAN_IP, ++ MAN_HP, ++ MAN_SM, ++ MAN_SB, ++ MAN_BI, ++ MAN_IB, ++ MAN_BR, ++ MAN_RB, ++ MAN_R, ++ MAN_B, ++ MAN_I, ++ MAN_IR, ++ MAN_RI, ++ MAN_na, ++ MAN_sp, ++ MAN_nf, ++ MAN_fi, ++ MAN_RE, ++ MAN_RS, ++ MAN_DT, ++ MAN_UC, ++ MAN_PD, ++ MAN_AT, ++ MAN_in, ++ MAN_ft, ++ MAN_OP, ++ MAN_MAX ++}; ++ ++enum man_type { ++ MAN_TEXT, ++ MAN_ELEM, ++ MAN_ROOT, ++ MAN_BLOCK, ++ MAN_HEAD, ++ MAN_BODY, ++ MAN_TAIL, ++ MAN_TBL, ++ MAN_EQN ++}; ++ ++struct man_meta { ++ char *msec; /* `TH' section (1, 3p, etc.) */ ++ char *date; /* `TH' normalised date */ ++ char *vol; /* `TH' volume */ ++ char *title; /* `TH' title (e.g., FOO) */ ++ char *source; /* `TH' source (e.g., GNU) */ ++}; ++ ++struct man_node { ++ struct man_node *parent; /* parent AST node */ ++ struct man_node *child; /* first child AST node */ ++ struct man_node *next; /* sibling AST node */ ++ struct man_node *prev; /* prior sibling AST node */ ++ int nchild; /* number children */ ++ int line; ++ int pos; ++ enum mant tok; /* tok or MAN__MAX if none */ ++ int flags; ++#define MAN_VALID (1 << 0) /* has been validated */ ++#define MAN_EOS (1 << 2) /* at sentence boundary */ ++#define MAN_LINE (1 << 3) /* first macro/text on line */ ++ enum man_type type; /* AST node type */ ++ char *string; /* TEXT node argument */ ++ struct man_node *head; /* BLOCK node HEAD ptr */ ++ struct man_node *tail; /* BLOCK node TAIL ptr */ ++ struct man_node *body; /* BLOCK node BODY ptr */ ++ const struct tbl_span *span; /* TBL */ ++ const struct eqn *eqn; /* EQN */ ++}; ++ ++/* Names of macros. Index is enum mant. */ ++extern const char *const *man_macronames; ++ ++__BEGIN_DECLS ++ ++struct man; ++ ++const struct man_node *man_node(const struct man *); ++const struct man_meta *man_meta(const struct man *); ++const struct mparse *man_mparse(const struct man *); ++ ++__END_DECLS ++ ++#endif /*!MAN_H*/ diff -rupN jhagewood/mdocml/mdocml-1.12.1-orig/man_term.c jhagewood/mdocml/mdocml-1.12.1/man_term.c ---- jhagewood/mdocml/mdocml-1.12.1-orig/man_term.c 2012-06-04 23:30:13.000000000 -0400 -+++ jhagewood/mdocml/mdocml-1.12.1/man_term.c 2012-06-04 23:30:15.000000000 -0400 +--- jhagewood/mdocml/mdocml-1.12.1-orig/man_term.c 2012-06-10 03:31:06.000000000 -0400 ++++ jhagewood/mdocml/mdocml-1.12.1/man_term.c 2012-06-12 04:36:15.000000000 -0400 @@ -82,6 +82,8 @@ static int pre_alternate(DECL_ARGS); static int pre_ft(DECL_ARGS); static int pre_ign(DECL_ARGS); @@ -31,7 +148,7 @@ { pre_ft, NULL, MAN_NOTEXT }, /* ft */ { pre_OP, NULL, 0 }, /* OP */ }; -@@ -433,6 +437,27 @@ pre_in(DECL_ARGS) +@@ -433,6 +437,22 @@ pre_in(DECL_ARGS) return(0); } @@ -40,8 +157,7 @@ +pre_ns(DECL_ARGS) +{ + -+ if ( ! (MAN_LINE & n->flags)) -+ p->flags |= TERMP_NOSPACE; ++ p->flags &= TERMP_NOSPACE; + return(1); +} + @@ -49,13 +165,1130 @@ +static int +pre_rs(DECL_ARGS) +{ -+ /* -+ if (SEC_SEE_ALSO != n->sec) -+ return(1); -+ if (MAN_BLOCK == n->type && n->prev) -+ term_vspace(p); */ ++ p->flags |= TERMP_NOSPACE; + return(1); +} /* ARGSUSED */ static int +diff -rupN jhagewood/mdocml/mdocml-1.12.1-orig/man_term.c.orig jhagewood/mdocml/mdocml-1.12.1/man_term.c.orig +--- jhagewood/mdocml/mdocml-1.12.1-orig/man_term.c.orig 1969-12-31 19:00:00.000000000 -0500 ++++ jhagewood/mdocml/mdocml-1.12.1/man_term.c.orig 2012-06-10 03:31:06.000000000 -0400 +@@ -0,0 +1,1117 @@ ++/* $Id: man_term.c,v 1.127 2012/01/03 15:16:24 kristaps Exp $ */ ++/* ++ * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons ++ * Copyright (c) 2010, 2011 Ingo Schwarze ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ++ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ++ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ++ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ++ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ++ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ++ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ++ */ ++#ifdef HAVE_CONFIG_H ++#include "config.h" ++#endif ++ ++#include ++ ++#include ++#include ++#include ++#include ++#include ++ ++#include "mandoc.h" ++#include "out.h" ++#include "man.h" ++#include "term.h" ++#include "main.h" ++ ++#define MAXMARGINS 64 /* maximum number of indented scopes */ ++ ++/* FIXME: have PD set the default vspace width. */ ++ ++struct mtermp { ++ int fl; ++#define MANT_LITERAL (1 << 0) ++ size_t lmargin[MAXMARGINS]; /* margins (incl. visible page) */ ++ int lmargincur; /* index of current margin */ ++ int lmarginsz; /* actual number of nested margins */ ++ size_t offset; /* default offset to visible page */ ++}; ++ ++#define DECL_ARGS struct termp *p, \ ++ struct mtermp *mt, \ ++ const struct man_node *n, \ ++ const struct man_meta *m ++ ++struct termact { ++ int (*pre)(DECL_ARGS); ++ void (*post)(DECL_ARGS); ++ int flags; ++#define MAN_NOTEXT (1 << 0) /* Never has text children. */ ++}; ++ ++static int a2width(const struct termp *, const char *); ++static size_t a2height(const struct termp *, const char *); ++ ++static void print_man_nodelist(DECL_ARGS); ++static void print_man_node(DECL_ARGS); ++static void print_man_head(struct termp *, const void *); ++static void print_man_foot(struct termp *, const void *); ++static void print_bvspace(struct termp *, ++ const struct man_node *); ++ ++static int pre_B(DECL_ARGS); ++static int pre_HP(DECL_ARGS); ++static int pre_I(DECL_ARGS); ++static int pre_IP(DECL_ARGS); ++static int pre_OP(DECL_ARGS); ++static int pre_PP(DECL_ARGS); ++static int pre_RS(DECL_ARGS); ++static int pre_SH(DECL_ARGS); ++static int pre_SS(DECL_ARGS); ++static int pre_TP(DECL_ARGS); ++static int pre_alternate(DECL_ARGS); ++static int pre_ft(DECL_ARGS); ++static int pre_ign(DECL_ARGS); ++static int pre_in(DECL_ARGS); ++static int pre_literal(DECL_ARGS); ++static int pre_sp(DECL_ARGS); ++ ++static void post_IP(DECL_ARGS); ++static void post_HP(DECL_ARGS); ++static void post_RS(DECL_ARGS); ++static void post_SH(DECL_ARGS); ++static void post_SS(DECL_ARGS); ++static void post_TP(DECL_ARGS); ++ ++static const struct termact termacts[MAN_MAX] = { ++ { pre_sp, NULL, MAN_NOTEXT }, /* br */ ++ { NULL, NULL, 0 }, /* TH */ ++ { pre_SH, post_SH, 0 }, /* SH */ ++ { pre_SS, post_SS, 0 }, /* SS */ ++ { pre_TP, post_TP, 0 }, /* TP */ ++ { pre_PP, NULL, 0 }, /* LP */ ++ { pre_PP, NULL, 0 }, /* PP */ ++ { pre_PP, NULL, 0 }, /* P */ ++ { pre_IP, post_IP, 0 }, /* IP */ ++ { pre_HP, post_HP, 0 }, /* HP */ ++ { NULL, NULL, 0 }, /* SM */ ++ { pre_B, NULL, 0 }, /* SB */ ++ { pre_alternate, NULL, 0 }, /* BI */ ++ { pre_alternate, NULL, 0 }, /* IB */ ++ { pre_alternate, NULL, 0 }, /* BR */ ++ { pre_alternate, NULL, 0 }, /* RB */ ++ { NULL, NULL, 0 }, /* R */ ++ { pre_B, NULL, 0 }, /* B */ ++ { pre_I, NULL, 0 }, /* I */ ++ { pre_alternate, NULL, 0 }, /* IR */ ++ { pre_alternate, NULL, 0 }, /* RI */ ++ { pre_ign, NULL, MAN_NOTEXT }, /* na */ ++ { pre_sp, NULL, MAN_NOTEXT }, /* sp */ ++ { pre_literal, NULL, 0 }, /* nf */ ++ { pre_literal, NULL, 0 }, /* fi */ ++ { NULL, NULL, 0 }, /* RE */ ++ { pre_RS, post_RS, 0 }, /* RS */ ++ { pre_ign, NULL, 0 }, /* DT */ ++ { pre_ign, NULL, 0 }, /* UC */ ++ { pre_ign, NULL, 0 }, /* PD */ ++ { pre_ign, NULL, 0 }, /* AT */ ++ { pre_in, NULL, MAN_NOTEXT }, /* in */ ++ { pre_ft, NULL, MAN_NOTEXT }, /* ft */ ++ { pre_OP, NULL, 0 }, /* OP */ ++}; ++ ++ ++ ++void ++terminal_man(void *arg, const struct man *man) ++{ ++ struct termp *p; ++ const struct man_node *n; ++ const struct man_meta *m; ++ struct mtermp mt; ++ ++ p = (struct termp *)arg; ++ ++ if (0 == p->defindent) ++ p->defindent = 7; ++ ++ p->overstep = 0; ++ p->maxrmargin = p->defrmargin; ++ p->tabwidth = term_len(p, 5); ++ ++ if (NULL == p->symtab) ++ p->symtab = mchars_alloc(); ++ ++ n = man_node(man); ++ m = man_meta(man); ++ ++ term_begin(p, print_man_head, print_man_foot, m); ++ p->flags |= TERMP_NOSPACE; ++ ++ memset(&mt, 0, sizeof(struct mtermp)); ++ ++ mt.lmargin[mt.lmargincur] = term_len(p, p->defindent); ++ mt.offset = term_len(p, p->defindent); ++ ++ if (n->child) ++ print_man_nodelist(p, &mt, n->child, m); ++ ++ term_end(p); ++} ++ ++ ++static size_t ++a2height(const struct termp *p, const char *cp) ++{ ++ struct roffsu su; ++ ++ if ( ! a2roffsu(cp, &su, SCALE_VS)) ++ SCALE_VS_INIT(&su, atoi(cp)); ++ ++ return(term_vspan(p, &su)); ++} ++ ++ ++static int ++a2width(const struct termp *p, const char *cp) ++{ ++ struct roffsu su; ++ ++ if ( ! a2roffsu(cp, &su, SCALE_BU)) ++ return(-1); ++ ++ return((int)term_hspan(p, &su)); ++} ++ ++/* ++ * Printing leading vertical space before a block. ++ * This is used for the paragraph macros. ++ * The rules are pretty simple, since there's very little nesting going ++ * on here. Basically, if we're the first within another block (SS/SH), ++ * then don't emit vertical space. If we are (RS), then do. If not the ++ * first, print it. ++ */ ++static void ++print_bvspace(struct termp *p, const struct man_node *n) ++{ ++ ++ term_newln(p); ++ ++ if (n->body && n->body->child) ++ if (MAN_TBL == n->body->child->type) ++ return; ++ ++ if (MAN_ROOT == n->parent->type || MAN_RS != n->parent->tok) ++ if (NULL == n->prev) ++ return; ++ ++ term_vspace(p); ++} ++ ++/* ARGSUSED */ ++static int ++pre_ign(DECL_ARGS) ++{ ++ ++ return(0); ++} ++ ++ ++/* ARGSUSED */ ++static int ++pre_I(DECL_ARGS) ++{ ++ ++ term_fontrepl(p, TERMFONT_UNDER); ++ return(1); ++} ++ ++ ++/* ARGSUSED */ ++static int ++pre_literal(DECL_ARGS) ++{ ++ ++ term_newln(p); ++ ++ if (MAN_nf == n->tok) ++ mt->fl |= MANT_LITERAL; ++ else ++ mt->fl &= ~MANT_LITERAL; ++ ++ /* ++ * Unlike .IP and .TP, .HP does not have a HEAD. ++ * So in case a second call to term_flushln() is needed, ++ * indentation has to be set up explicitly. ++ */ ++ if (MAN_HP == n->parent->tok && p->rmargin < p->maxrmargin) { ++ p->offset = p->rmargin; ++ p->rmargin = p->maxrmargin; ++ p->flags &= ~(TERMP_NOBREAK | TERMP_TWOSPACE); ++ p->flags |= TERMP_NOSPACE; ++ } ++ ++ return(0); ++} ++ ++/* ARGSUSED */ ++static int ++pre_alternate(DECL_ARGS) ++{ ++ enum termfont font[2]; ++ const struct man_node *nn; ++ int savelit, i; ++ ++ switch (n->tok) { ++ case (MAN_RB): ++ font[0] = TERMFONT_NONE; ++ font[1] = TERMFONT_BOLD; ++ break; ++ case (MAN_RI): ++ font[0] = TERMFONT_NONE; ++ font[1] = TERMFONT_UNDER; ++ break; ++ case (MAN_BR): ++ font[0] = TERMFONT_BOLD; ++ font[1] = TERMFONT_NONE; ++ break; ++ case (MAN_BI): ++ font[0] = TERMFONT_BOLD; ++ font[1] = TERMFONT_UNDER; ++ break; ++ case (MAN_IR): ++ font[0] = TERMFONT_UNDER; ++ font[1] = TERMFONT_NONE; ++ break; ++ case (MAN_IB): ++ font[0] = TERMFONT_UNDER; ++ font[1] = TERMFONT_BOLD; ++ break; ++ default: ++ abort(); ++ } ++ ++ savelit = MANT_LITERAL & mt->fl; ++ mt->fl &= ~MANT_LITERAL; ++ ++ for (i = 0, nn = n->child; nn; nn = nn->next, i = 1 - i) { ++ term_fontrepl(p, font[i]); ++ if (savelit && NULL == nn->next) ++ mt->fl |= MANT_LITERAL; ++ print_man_node(p, mt, nn, m); ++ if (nn->next) ++ p->flags |= TERMP_NOSPACE; ++ } ++ ++ return(0); ++} ++ ++/* ARGSUSED */ ++static int ++pre_B(DECL_ARGS) ++{ ++ ++ term_fontrepl(p, TERMFONT_BOLD); ++ return(1); ++} ++ ++/* ARGSUSED */ ++static int ++pre_OP(DECL_ARGS) ++{ ++ ++ term_word(p, "["); ++ p->flags |= TERMP_NOSPACE; ++ ++ if (NULL != (n = n->child)) { ++ term_fontrepl(p, TERMFONT_BOLD); ++ term_word(p, n->string); ++ } ++ if (NULL != n && NULL != n->next) { ++ term_fontrepl(p, TERMFONT_UNDER); ++ term_word(p, n->next->string); ++ } ++ ++ term_fontrepl(p, TERMFONT_NONE); ++ p->flags |= TERMP_NOSPACE; ++ term_word(p, "]"); ++ return(0); ++} ++ ++/* ARGSUSED */ ++static int ++pre_ft(DECL_ARGS) ++{ ++ const char *cp; ++ ++ if (NULL == n->child) { ++ term_fontlast(p); ++ return(0); ++ } ++ ++ cp = n->child->string; ++ switch (*cp) { ++ case ('4'): ++ /* FALLTHROUGH */ ++ case ('3'): ++ /* FALLTHROUGH */ ++ case ('B'): ++ term_fontrepl(p, TERMFONT_BOLD); ++ break; ++ case ('2'): ++ /* FALLTHROUGH */ ++ case ('I'): ++ term_fontrepl(p, TERMFONT_UNDER); ++ break; ++ case ('P'): ++ term_fontlast(p); ++ break; ++ case ('1'): ++ /* FALLTHROUGH */ ++ case ('C'): ++ /* FALLTHROUGH */ ++ case ('R'): ++ term_fontrepl(p, TERMFONT_NONE); ++ break; ++ default: ++ break; ++ } ++ return(0); ++} ++ ++/* ARGSUSED */ ++static int ++pre_in(DECL_ARGS) ++{ ++ int len, less; ++ size_t v; ++ const char *cp; ++ ++ term_newln(p); ++ ++ if (NULL == n->child) { ++ p->offset = mt->offset; ++ return(0); ++ } ++ ++ cp = n->child->string; ++ less = 0; ++ ++ if ('-' == *cp) ++ less = -1; ++ else if ('+' == *cp) ++ less = 1; ++ else ++ cp--; ++ ++ if ((len = a2width(p, ++cp)) < 0) ++ return(0); ++ ++ v = (size_t)len; ++ ++ if (less < 0) ++ p->offset -= p->offset > v ? v : p->offset; ++ else if (less > 0) ++ p->offset += v; ++ else ++ p->offset = v; ++ ++ /* Don't let this creep beyond the right margin. */ ++ ++ if (p->offset > p->rmargin) ++ p->offset = p->rmargin; ++ ++ return(0); ++} ++ ++ ++/* ARGSUSED */ ++static int ++pre_sp(DECL_ARGS) ++{ ++ size_t i, len; ++ ++ if ((NULL == n->prev && n->parent)) { ++ if (MAN_SS == n->parent->tok) ++ return(0); ++ if (MAN_SH == n->parent->tok) ++ return(0); ++ } ++ ++ switch (n->tok) { ++ case (MAN_br): ++ len = 0; ++ break; ++ default: ++ len = n->child ? a2height(p, n->child->string) : 1; ++ break; ++ } ++ ++ if (0 == len) ++ term_newln(p); ++ for (i = 0; i < len; i++) ++ term_vspace(p); ++ ++ return(0); ++} ++ ++ ++/* ARGSUSED */ ++static int ++pre_HP(DECL_ARGS) ++{ ++ size_t len, one; ++ int ival; ++ const struct man_node *nn; ++ ++ switch (n->type) { ++ case (MAN_BLOCK): ++ print_bvspace(p, n); ++ return(1); ++ case (MAN_BODY): ++ p->flags |= TERMP_NOBREAK; ++ p->flags |= TERMP_TWOSPACE; ++ break; ++ default: ++ return(0); ++ } ++ ++ len = mt->lmargin[mt->lmargincur]; ++ ival = -1; ++ ++ /* Calculate offset. */ ++ ++ if (NULL != (nn = n->parent->head->child)) ++ if ((ival = a2width(p, nn->string)) >= 0) ++ len = (size_t)ival; ++ ++ one = term_len(p, 1); ++ if (len < one) ++ len = one; ++ ++ p->offset = mt->offset; ++ p->rmargin = mt->offset + len; ++ ++ if (ival >= 0) ++ mt->lmargin[mt->lmargincur] = (size_t)ival; ++ ++ return(1); ++} ++ ++ ++/* ARGSUSED */ ++static void ++post_HP(DECL_ARGS) ++{ ++ ++ switch (n->type) { ++ case (MAN_BLOCK): ++ term_flushln(p); ++ break; ++ case (MAN_BODY): ++ term_flushln(p); ++ p->flags &= ~TERMP_NOBREAK; ++ p->flags &= ~TERMP_TWOSPACE; ++ p->offset = mt->offset; ++ p->rmargin = p->maxrmargin; ++ break; ++ default: ++ break; ++ } ++} ++ ++ ++/* ARGSUSED */ ++static int ++pre_PP(DECL_ARGS) ++{ ++ ++ switch (n->type) { ++ case (MAN_BLOCK): ++ mt->lmargin[mt->lmargincur] = term_len(p, p->defindent); ++ print_bvspace(p, n); ++ break; ++ default: ++ p->offset = mt->offset; ++ break; ++ } ++ ++ return(MAN_HEAD != n->type); ++} ++ ++ ++/* ARGSUSED */ ++static int ++pre_IP(DECL_ARGS) ++{ ++ const struct man_node *nn; ++ size_t len; ++ int savelit, ival; ++ ++ switch (n->type) { ++ case (MAN_BODY): ++ p->flags |= TERMP_NOSPACE; ++ break; ++ case (MAN_HEAD): ++ p->flags |= TERMP_NOBREAK; ++ break; ++ case (MAN_BLOCK): ++ print_bvspace(p, n); ++ /* FALLTHROUGH */ ++ default: ++ return(1); ++ } ++ ++ len = mt->lmargin[mt->lmargincur]; ++ ival = -1; ++ ++ /* Calculate the offset from the optional second argument. */ ++ if (NULL != (nn = n->parent->head->child)) ++ if (NULL != (nn = nn->next)) ++ if ((ival = a2width(p, nn->string)) >= 0) ++ len = (size_t)ival; ++ ++ switch (n->type) { ++ case (MAN_HEAD): ++ /* Handle zero-width lengths. */ ++ if (0 == len) ++ len = term_len(p, 1); ++ ++ p->offset = mt->offset; ++ p->rmargin = mt->offset + len; ++ if (ival < 0) ++ break; ++ ++ /* Set the saved left-margin. */ ++ mt->lmargin[mt->lmargincur] = (size_t)ival; ++ ++ savelit = MANT_LITERAL & mt->fl; ++ mt->fl &= ~MANT_LITERAL; ++ ++ if (n->child) ++ print_man_node(p, mt, n->child, m); ++ ++ if (savelit) ++ mt->fl |= MANT_LITERAL; ++ ++ return(0); ++ case (MAN_BODY): ++ p->offset = mt->offset + len; ++ p->rmargin = p->maxrmargin; ++ break; ++ default: ++ break; ++ } ++ ++ return(1); ++} ++ ++ ++/* ARGSUSED */ ++static void ++post_IP(DECL_ARGS) ++{ ++ ++ switch (n->type) { ++ case (MAN_HEAD): ++ term_flushln(p); ++ p->flags &= ~TERMP_NOBREAK; ++ p->rmargin = p->maxrmargin; ++ break; ++ case (MAN_BODY): ++ term_newln(p); ++ break; ++ default: ++ break; ++ } ++} ++ ++ ++/* ARGSUSED */ *** DIFF OUTPUT TRUNCATED AT 1000 LINES ***