1*c1c95addSBrooks Davis /* $Id: mdoc_man.c,v 1.138 2023/04/28 19:11:04 schwarze Exp $ */ 261d06d6bSBaptiste Daroussin /* 36d38604fSBaptiste Daroussin * Copyright (c) 2011-2021 Ingo Schwarze <schwarze@openbsd.org> 461d06d6bSBaptiste Daroussin * 561d06d6bSBaptiste Daroussin * Permission to use, copy, modify, and distribute this software for any 661d06d6bSBaptiste Daroussin * purpose with or without fee is hereby granted, provided that the above 761d06d6bSBaptiste Daroussin * copyright notice and this permission notice appear in all copies. 861d06d6bSBaptiste Daroussin * 961d06d6bSBaptiste Daroussin * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1061d06d6bSBaptiste Daroussin * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1161d06d6bSBaptiste Daroussin * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1261d06d6bSBaptiste Daroussin * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1361d06d6bSBaptiste Daroussin * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1461d06d6bSBaptiste Daroussin * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1561d06d6bSBaptiste Daroussin * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1661d06d6bSBaptiste Daroussin */ 1761d06d6bSBaptiste Daroussin #include "config.h" 1861d06d6bSBaptiste Daroussin 1961d06d6bSBaptiste Daroussin #include <sys/types.h> 2061d06d6bSBaptiste Daroussin 2161d06d6bSBaptiste Daroussin #include <assert.h> 2261d06d6bSBaptiste Daroussin #include <stdio.h> 2361d06d6bSBaptiste Daroussin #include <stdlib.h> 2461d06d6bSBaptiste Daroussin #include <string.h> 2561d06d6bSBaptiste Daroussin 2661d06d6bSBaptiste Daroussin #include "mandoc_aux.h" 2761d06d6bSBaptiste Daroussin #include "mandoc.h" 2861d06d6bSBaptiste Daroussin #include "roff.h" 2961d06d6bSBaptiste Daroussin #include "mdoc.h" 3061d06d6bSBaptiste Daroussin #include "man.h" 3161d06d6bSBaptiste Daroussin #include "out.h" 3261d06d6bSBaptiste Daroussin #include "main.h" 3361d06d6bSBaptiste Daroussin 3461d06d6bSBaptiste Daroussin #define DECL_ARGS const struct roff_meta *meta, struct roff_node *n 3561d06d6bSBaptiste Daroussin 3661d06d6bSBaptiste Daroussin typedef int (*int_fp)(DECL_ARGS); 3761d06d6bSBaptiste Daroussin typedef void (*void_fp)(DECL_ARGS); 3861d06d6bSBaptiste Daroussin 397295610fSBaptiste Daroussin struct mdoc_man_act { 4061d06d6bSBaptiste Daroussin int_fp cond; /* DON'T run actions */ 4161d06d6bSBaptiste Daroussin int_fp pre; /* pre-node action */ 4261d06d6bSBaptiste Daroussin void_fp post; /* post-node action */ 4361d06d6bSBaptiste Daroussin const char *prefix; /* pre-node string constant */ 4461d06d6bSBaptiste Daroussin const char *suffix; /* post-node string constant */ 4561d06d6bSBaptiste Daroussin }; 4661d06d6bSBaptiste Daroussin 4761d06d6bSBaptiste Daroussin static int cond_body(DECL_ARGS); 4861d06d6bSBaptiste Daroussin static int cond_head(DECL_ARGS); 4961d06d6bSBaptiste Daroussin static void font_push(char); 5061d06d6bSBaptiste Daroussin static void font_pop(void); 5161d06d6bSBaptiste Daroussin static int man_strlen(const char *); 5261d06d6bSBaptiste Daroussin static void mid_it(void); 5361d06d6bSBaptiste Daroussin static void post__t(DECL_ARGS); 5461d06d6bSBaptiste Daroussin static void post_aq(DECL_ARGS); 5561d06d6bSBaptiste Daroussin static void post_bd(DECL_ARGS); 5661d06d6bSBaptiste Daroussin static void post_bf(DECL_ARGS); 5761d06d6bSBaptiste Daroussin static void post_bk(DECL_ARGS); 5861d06d6bSBaptiste Daroussin static void post_bl(DECL_ARGS); 5961d06d6bSBaptiste Daroussin static void post_dl(DECL_ARGS); 6061d06d6bSBaptiste Daroussin static void post_en(DECL_ARGS); 6161d06d6bSBaptiste Daroussin static void post_enc(DECL_ARGS); 6261d06d6bSBaptiste Daroussin static void post_eo(DECL_ARGS); 6361d06d6bSBaptiste Daroussin static void post_fa(DECL_ARGS); 6461d06d6bSBaptiste Daroussin static void post_fd(DECL_ARGS); 6561d06d6bSBaptiste Daroussin static void post_fl(DECL_ARGS); 6661d06d6bSBaptiste Daroussin static void post_fn(DECL_ARGS); 6761d06d6bSBaptiste Daroussin static void post_fo(DECL_ARGS); 6861d06d6bSBaptiste Daroussin static void post_font(DECL_ARGS); 6961d06d6bSBaptiste Daroussin static void post_in(DECL_ARGS); 7061d06d6bSBaptiste Daroussin static void post_it(DECL_ARGS); 7161d06d6bSBaptiste Daroussin static void post_lb(DECL_ARGS); 7261d06d6bSBaptiste Daroussin static void post_nm(DECL_ARGS); 7361d06d6bSBaptiste Daroussin static void post_percent(DECL_ARGS); 7461d06d6bSBaptiste Daroussin static void post_pf(DECL_ARGS); 7561d06d6bSBaptiste Daroussin static void post_sect(DECL_ARGS); 7661d06d6bSBaptiste Daroussin static void post_vt(DECL_ARGS); 7761d06d6bSBaptiste Daroussin static int pre__t(DECL_ARGS); 787295610fSBaptiste Daroussin static int pre_abort(DECL_ARGS); 7961d06d6bSBaptiste Daroussin static int pre_an(DECL_ARGS); 8061d06d6bSBaptiste Daroussin static int pre_ap(DECL_ARGS); 8161d06d6bSBaptiste Daroussin static int pre_aq(DECL_ARGS); 8261d06d6bSBaptiste Daroussin static int pre_bd(DECL_ARGS); 8361d06d6bSBaptiste Daroussin static int pre_bf(DECL_ARGS); 8461d06d6bSBaptiste Daroussin static int pre_bk(DECL_ARGS); 8561d06d6bSBaptiste Daroussin static int pre_bl(DECL_ARGS); 8661d06d6bSBaptiste Daroussin static void pre_br(DECL_ARGS); 8761d06d6bSBaptiste Daroussin static int pre_dl(DECL_ARGS); 8861d06d6bSBaptiste Daroussin static int pre_en(DECL_ARGS); 8961d06d6bSBaptiste Daroussin static int pre_enc(DECL_ARGS); 9061d06d6bSBaptiste Daroussin static int pre_em(DECL_ARGS); 9161d06d6bSBaptiste Daroussin static int pre_skip(DECL_ARGS); 9261d06d6bSBaptiste Daroussin static int pre_eo(DECL_ARGS); 9361d06d6bSBaptiste Daroussin static int pre_ex(DECL_ARGS); 9461d06d6bSBaptiste Daroussin static int pre_fa(DECL_ARGS); 9561d06d6bSBaptiste Daroussin static int pre_fd(DECL_ARGS); 9661d06d6bSBaptiste Daroussin static int pre_fl(DECL_ARGS); 9761d06d6bSBaptiste Daroussin static int pre_fn(DECL_ARGS); 9861d06d6bSBaptiste Daroussin static int pre_fo(DECL_ARGS); 9961d06d6bSBaptiste Daroussin static void pre_ft(DECL_ARGS); 10061d06d6bSBaptiste Daroussin static int pre_Ft(DECL_ARGS); 10161d06d6bSBaptiste Daroussin static int pre_in(DECL_ARGS); 10261d06d6bSBaptiste Daroussin static int pre_it(DECL_ARGS); 10361d06d6bSBaptiste Daroussin static int pre_lk(DECL_ARGS); 10461d06d6bSBaptiste Daroussin static int pre_li(DECL_ARGS); 10561d06d6bSBaptiste Daroussin static int pre_nm(DECL_ARGS); 10661d06d6bSBaptiste Daroussin static int pre_no(DECL_ARGS); 1077295610fSBaptiste Daroussin static void pre_noarg(DECL_ARGS); 10861d06d6bSBaptiste Daroussin static int pre_ns(DECL_ARGS); 10961d06d6bSBaptiste Daroussin static void pre_onearg(DECL_ARGS); 11061d06d6bSBaptiste Daroussin static int pre_pp(DECL_ARGS); 11161d06d6bSBaptiste Daroussin static int pre_rs(DECL_ARGS); 11261d06d6bSBaptiste Daroussin static int pre_sm(DECL_ARGS); 11361d06d6bSBaptiste Daroussin static void pre_sp(DECL_ARGS); 11461d06d6bSBaptiste Daroussin static int pre_sect(DECL_ARGS); 11561d06d6bSBaptiste Daroussin static int pre_sy(DECL_ARGS); 1166d38604fSBaptiste Daroussin static void pre_syn(struct roff_node *); 11761d06d6bSBaptiste Daroussin static void pre_ta(DECL_ARGS); 11861d06d6bSBaptiste Daroussin static int pre_vt(DECL_ARGS); 11961d06d6bSBaptiste Daroussin static int pre_xr(DECL_ARGS); 12061d06d6bSBaptiste Daroussin static void print_word(const char *); 12161d06d6bSBaptiste Daroussin static void print_line(const char *, int); 12261d06d6bSBaptiste Daroussin static void print_block(const char *, int); 12361d06d6bSBaptiste Daroussin static void print_offs(const char *, int); 12461d06d6bSBaptiste Daroussin static void print_width(const struct mdoc_bl *, 12561d06d6bSBaptiste Daroussin const struct roff_node *); 12661d06d6bSBaptiste Daroussin static void print_count(int *); 12761d06d6bSBaptiste Daroussin static void print_node(DECL_ARGS); 12861d06d6bSBaptiste Daroussin 1297295610fSBaptiste Daroussin static const void_fp roff_man_acts[ROFF_MAX] = { 13061d06d6bSBaptiste Daroussin pre_br, /* br */ 13161d06d6bSBaptiste Daroussin pre_onearg, /* ce */ 1327295610fSBaptiste Daroussin pre_noarg, /* fi */ 13361d06d6bSBaptiste Daroussin pre_ft, /* ft */ 13461d06d6bSBaptiste Daroussin pre_onearg, /* ll */ 13561d06d6bSBaptiste Daroussin pre_onearg, /* mc */ 1367295610fSBaptiste Daroussin pre_noarg, /* nf */ 13761d06d6bSBaptiste Daroussin pre_onearg, /* po */ 13861d06d6bSBaptiste Daroussin pre_onearg, /* rj */ 13961d06d6bSBaptiste Daroussin pre_sp, /* sp */ 14061d06d6bSBaptiste Daroussin pre_ta, /* ta */ 14161d06d6bSBaptiste Daroussin pre_onearg, /* ti */ 14261d06d6bSBaptiste Daroussin }; 14361d06d6bSBaptiste Daroussin 1447295610fSBaptiste Daroussin static const struct mdoc_man_act mdoc_man_acts[MDOC_MAX - MDOC_Dd] = { 14561d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Dd */ 14661d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Dt */ 14761d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Os */ 14861d06d6bSBaptiste Daroussin { NULL, pre_sect, post_sect, ".SH", NULL }, /* Sh */ 14961d06d6bSBaptiste Daroussin { NULL, pre_sect, post_sect, ".SS", NULL }, /* Ss */ 15061d06d6bSBaptiste Daroussin { NULL, pre_pp, NULL, NULL, NULL }, /* Pp */ 15161d06d6bSBaptiste Daroussin { cond_body, pre_dl, post_dl, NULL, NULL }, /* D1 */ 15261d06d6bSBaptiste Daroussin { cond_body, pre_dl, post_dl, NULL, NULL }, /* Dl */ 15361d06d6bSBaptiste Daroussin { cond_body, pre_bd, post_bd, NULL, NULL }, /* Bd */ 15461d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Ed */ 15561d06d6bSBaptiste Daroussin { cond_body, pre_bl, post_bl, NULL, NULL }, /* Bl */ 15661d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* El */ 15761d06d6bSBaptiste Daroussin { NULL, pre_it, post_it, NULL, NULL }, /* It */ 15861d06d6bSBaptiste Daroussin { NULL, pre_em, post_font, NULL, NULL }, /* Ad */ 15961d06d6bSBaptiste Daroussin { NULL, pre_an, NULL, NULL, NULL }, /* An */ 16061d06d6bSBaptiste Daroussin { NULL, pre_ap, NULL, NULL, NULL }, /* Ap */ 16161d06d6bSBaptiste Daroussin { NULL, pre_em, post_font, NULL, NULL }, /* Ar */ 16261d06d6bSBaptiste Daroussin { NULL, pre_sy, post_font, NULL, NULL }, /* Cd */ 16361d06d6bSBaptiste Daroussin { NULL, pre_sy, post_font, NULL, NULL }, /* Cm */ 16461d06d6bSBaptiste Daroussin { NULL, pre_li, post_font, NULL, NULL }, /* Dv */ 16561d06d6bSBaptiste Daroussin { NULL, pre_li, post_font, NULL, NULL }, /* Er */ 16661d06d6bSBaptiste Daroussin { NULL, pre_li, post_font, NULL, NULL }, /* Ev */ 16761d06d6bSBaptiste Daroussin { NULL, pre_ex, NULL, NULL, NULL }, /* Ex */ 16861d06d6bSBaptiste Daroussin { NULL, pre_fa, post_fa, NULL, NULL }, /* Fa */ 16961d06d6bSBaptiste Daroussin { NULL, pre_fd, post_fd, NULL, NULL }, /* Fd */ 17061d06d6bSBaptiste Daroussin { NULL, pre_fl, post_fl, NULL, NULL }, /* Fl */ 17161d06d6bSBaptiste Daroussin { NULL, pre_fn, post_fn, NULL, NULL }, /* Fn */ 17261d06d6bSBaptiste Daroussin { NULL, pre_Ft, post_font, NULL, NULL }, /* Ft */ 17361d06d6bSBaptiste Daroussin { NULL, pre_sy, post_font, NULL, NULL }, /* Ic */ 17461d06d6bSBaptiste Daroussin { NULL, pre_in, post_in, NULL, NULL }, /* In */ 17561d06d6bSBaptiste Daroussin { NULL, pre_li, post_font, NULL, NULL }, /* Li */ 17661d06d6bSBaptiste Daroussin { cond_head, pre_enc, NULL, "\\- ", NULL }, /* Nd */ 17761d06d6bSBaptiste Daroussin { NULL, pre_nm, post_nm, NULL, NULL }, /* Nm */ 17861d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "[", "]" }, /* Op */ 1797295610fSBaptiste Daroussin { NULL, pre_abort, NULL, NULL, NULL }, /* Ot */ 18061d06d6bSBaptiste Daroussin { NULL, pre_em, post_font, NULL, NULL }, /* Pa */ 18161d06d6bSBaptiste Daroussin { NULL, pre_ex, NULL, NULL, NULL }, /* Rv */ 18261d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* St */ 18361d06d6bSBaptiste Daroussin { NULL, pre_em, post_font, NULL, NULL }, /* Va */ 18461d06d6bSBaptiste Daroussin { NULL, pre_vt, post_vt, NULL, NULL }, /* Vt */ 18561d06d6bSBaptiste Daroussin { NULL, pre_xr, NULL, NULL, NULL }, /* Xr */ 18661d06d6bSBaptiste Daroussin { NULL, NULL, post_percent, NULL, NULL }, /* %A */ 18761d06d6bSBaptiste Daroussin { NULL, pre_em, post_percent, NULL, NULL }, /* %B */ 18861d06d6bSBaptiste Daroussin { NULL, NULL, post_percent, NULL, NULL }, /* %D */ 18961d06d6bSBaptiste Daroussin { NULL, pre_em, post_percent, NULL, NULL }, /* %I */ 19061d06d6bSBaptiste Daroussin { NULL, pre_em, post_percent, NULL, NULL }, /* %J */ 19161d06d6bSBaptiste Daroussin { NULL, NULL, post_percent, NULL, NULL }, /* %N */ 19261d06d6bSBaptiste Daroussin { NULL, NULL, post_percent, NULL, NULL }, /* %O */ 19361d06d6bSBaptiste Daroussin { NULL, NULL, post_percent, NULL, NULL }, /* %P */ 19461d06d6bSBaptiste Daroussin { NULL, NULL, post_percent, NULL, NULL }, /* %R */ 19561d06d6bSBaptiste Daroussin { NULL, pre__t, post__t, NULL, NULL }, /* %T */ 19661d06d6bSBaptiste Daroussin { NULL, NULL, post_percent, NULL, NULL }, /* %V */ 19761d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Ac */ 19861d06d6bSBaptiste Daroussin { cond_body, pre_aq, post_aq, NULL, NULL }, /* Ao */ 19961d06d6bSBaptiste Daroussin { cond_body, pre_aq, post_aq, NULL, NULL }, /* Aq */ 20061d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* At */ 20161d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Bc */ 20261d06d6bSBaptiste Daroussin { NULL, pre_bf, post_bf, NULL, NULL }, /* Bf */ 20361d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "[", "]" }, /* Bo */ 20461d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "[", "]" }, /* Bq */ 20561d06d6bSBaptiste Daroussin { NULL, pre_bk, post_bk, NULL, NULL }, /* Bsx */ 20661d06d6bSBaptiste Daroussin { NULL, pre_bk, post_bk, NULL, NULL }, /* Bx */ 20761d06d6bSBaptiste Daroussin { NULL, pre_skip, NULL, NULL, NULL }, /* Db */ 20861d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Dc */ 20961d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "\\(lq", "\\(rq" }, /* Do */ 21061d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "\\(lq", "\\(rq" }, /* Dq */ 21161d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Ec */ 21261d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Ef */ 21361d06d6bSBaptiste Daroussin { NULL, pre_em, post_font, NULL, NULL }, /* Em */ 21461d06d6bSBaptiste Daroussin { cond_body, pre_eo, post_eo, NULL, NULL }, /* Eo */ 21561d06d6bSBaptiste Daroussin { NULL, pre_bk, post_bk, NULL, NULL }, /* Fx */ 21661d06d6bSBaptiste Daroussin { NULL, pre_sy, post_font, NULL, NULL }, /* Ms */ 21761d06d6bSBaptiste Daroussin { NULL, pre_no, NULL, NULL, NULL }, /* No */ 21861d06d6bSBaptiste Daroussin { NULL, pre_ns, NULL, NULL, NULL }, /* Ns */ 21961d06d6bSBaptiste Daroussin { NULL, pre_bk, post_bk, NULL, NULL }, /* Nx */ 22061d06d6bSBaptiste Daroussin { NULL, pre_bk, post_bk, NULL, NULL }, /* Ox */ 22161d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Pc */ 22261d06d6bSBaptiste Daroussin { NULL, NULL, post_pf, NULL, NULL }, /* Pf */ 22361d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "(", ")" }, /* Po */ 22461d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "(", ")" }, /* Pq */ 22561d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Qc */ 22661d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "\\(oq", "\\(cq" }, /* Ql */ 22761d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "\"", "\"" }, /* Qo */ 22861d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "\"", "\"" }, /* Qq */ 22961d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Re */ 23061d06d6bSBaptiste Daroussin { cond_body, pre_rs, NULL, NULL, NULL }, /* Rs */ 23161d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Sc */ 23261d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "\\(oq", "\\(cq" }, /* So */ 23361d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "\\(oq", "\\(cq" }, /* Sq */ 23461d06d6bSBaptiste Daroussin { NULL, pre_sm, NULL, NULL, NULL }, /* Sm */ 23561d06d6bSBaptiste Daroussin { NULL, pre_em, post_font, NULL, NULL }, /* Sx */ 23661d06d6bSBaptiste Daroussin { NULL, pre_sy, post_font, NULL, NULL }, /* Sy */ 23761d06d6bSBaptiste Daroussin { NULL, pre_li, post_font, NULL, NULL }, /* Tn */ 23861d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Ux */ 23961d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Xc */ 24061d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Xo */ 24161d06d6bSBaptiste Daroussin { NULL, pre_fo, post_fo, NULL, NULL }, /* Fo */ 24261d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Fc */ 24361d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "[", "]" }, /* Oo */ 24461d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Oc */ 24561d06d6bSBaptiste Daroussin { NULL, pre_bk, post_bk, NULL, NULL }, /* Bk */ 24661d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Ek */ 24761d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Bt */ 24861d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Hf */ 24961d06d6bSBaptiste Daroussin { NULL, pre_em, post_font, NULL, NULL }, /* Fr */ 25061d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Ud */ 25161d06d6bSBaptiste Daroussin { NULL, NULL, post_lb, NULL, NULL }, /* Lb */ 2527295610fSBaptiste Daroussin { NULL, pre_abort, NULL, NULL, NULL }, /* Lp */ 25361d06d6bSBaptiste Daroussin { NULL, pre_lk, NULL, NULL, NULL }, /* Lk */ 25461d06d6bSBaptiste Daroussin { NULL, pre_em, post_font, NULL, NULL }, /* Mt */ 25561d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "{", "}" }, /* Brq */ 25661d06d6bSBaptiste Daroussin { cond_body, pre_enc, post_enc, "{", "}" }, /* Bro */ 25761d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Brc */ 25861d06d6bSBaptiste Daroussin { NULL, NULL, post_percent, NULL, NULL }, /* %C */ 25961d06d6bSBaptiste Daroussin { NULL, pre_skip, NULL, NULL, NULL }, /* Es */ 26061d06d6bSBaptiste Daroussin { cond_body, pre_en, post_en, NULL, NULL }, /* En */ 26161d06d6bSBaptiste Daroussin { NULL, pre_bk, post_bk, NULL, NULL }, /* Dx */ 26261d06d6bSBaptiste Daroussin { NULL, NULL, post_percent, NULL, NULL }, /* %Q */ 26361d06d6bSBaptiste Daroussin { NULL, NULL, post_percent, NULL, NULL }, /* %U */ 26461d06d6bSBaptiste Daroussin { NULL, NULL, NULL, NULL, NULL }, /* Ta */ 2656d38604fSBaptiste Daroussin { NULL, pre_skip, NULL, NULL, NULL }, /* Tg */ 26661d06d6bSBaptiste Daroussin }; 2677295610fSBaptiste Daroussin static const struct mdoc_man_act *mdoc_man_act(enum roff_tok); 26861d06d6bSBaptiste Daroussin 26961d06d6bSBaptiste Daroussin static int outflags; 27061d06d6bSBaptiste Daroussin #define MMAN_spc (1 << 0) /* blank character before next word */ 27161d06d6bSBaptiste Daroussin #define MMAN_spc_force (1 << 1) /* even before trailing punctuation */ 27261d06d6bSBaptiste Daroussin #define MMAN_nl (1 << 2) /* break man(7) code line */ 27361d06d6bSBaptiste Daroussin #define MMAN_br (1 << 3) /* break output line */ 27461d06d6bSBaptiste Daroussin #define MMAN_sp (1 << 4) /* insert a blank output line */ 27561d06d6bSBaptiste Daroussin #define MMAN_PP (1 << 5) /* reset indentation etc. */ 27661d06d6bSBaptiste Daroussin #define MMAN_Sm (1 << 6) /* horizontal spacing mode */ 27761d06d6bSBaptiste Daroussin #define MMAN_Bk (1 << 7) /* word keep mode */ 27861d06d6bSBaptiste Daroussin #define MMAN_Bk_susp (1 << 8) /* suspend this (after a macro) */ 27961d06d6bSBaptiste Daroussin #define MMAN_An_split (1 << 9) /* author mode is "split" */ 28061d06d6bSBaptiste Daroussin #define MMAN_An_nosplit (1 << 10) /* author mode is "nosplit" */ 28161d06d6bSBaptiste Daroussin #define MMAN_PD (1 << 11) /* inter-paragraph spacing disabled */ 28261d06d6bSBaptiste Daroussin #define MMAN_nbrword (1 << 12) /* do not break the next word */ 28361d06d6bSBaptiste Daroussin 28461d06d6bSBaptiste Daroussin #define BL_STACK_MAX 32 28561d06d6bSBaptiste Daroussin 28661d06d6bSBaptiste Daroussin static int Bl_stack[BL_STACK_MAX]; /* offsets [chars] */ 28761d06d6bSBaptiste Daroussin static int Bl_stack_post[BL_STACK_MAX]; /* add final .RE */ 28861d06d6bSBaptiste Daroussin static int Bl_stack_len; /* number of nested Bl blocks */ 28961d06d6bSBaptiste Daroussin static int TPremain; /* characters before tag is full */ 29061d06d6bSBaptiste Daroussin 29161d06d6bSBaptiste Daroussin static struct { 29261d06d6bSBaptiste Daroussin char *head; 29361d06d6bSBaptiste Daroussin char *tail; 29461d06d6bSBaptiste Daroussin size_t size; 29561d06d6bSBaptiste Daroussin } fontqueue; 29661d06d6bSBaptiste Daroussin 29761d06d6bSBaptiste Daroussin 2987295610fSBaptiste Daroussin static const struct mdoc_man_act * 2997295610fSBaptiste Daroussin mdoc_man_act(enum roff_tok tok) 3007295610fSBaptiste Daroussin { 3017295610fSBaptiste Daroussin assert(tok >= MDOC_Dd && tok <= MDOC_MAX); 3027295610fSBaptiste Daroussin return mdoc_man_acts + (tok - MDOC_Dd); 3037295610fSBaptiste Daroussin } 3047295610fSBaptiste Daroussin 30561d06d6bSBaptiste Daroussin static int 30661d06d6bSBaptiste Daroussin man_strlen(const char *cp) 30761d06d6bSBaptiste Daroussin { 30861d06d6bSBaptiste Daroussin size_t rsz; 30961d06d6bSBaptiste Daroussin int skip, sz; 31061d06d6bSBaptiste Daroussin 31161d06d6bSBaptiste Daroussin sz = 0; 31261d06d6bSBaptiste Daroussin skip = 0; 31361d06d6bSBaptiste Daroussin for (;;) { 31461d06d6bSBaptiste Daroussin rsz = strcspn(cp, "\\"); 31561d06d6bSBaptiste Daroussin if (rsz) { 31661d06d6bSBaptiste Daroussin cp += rsz; 31761d06d6bSBaptiste Daroussin if (skip) { 31861d06d6bSBaptiste Daroussin skip = 0; 31961d06d6bSBaptiste Daroussin rsz--; 32061d06d6bSBaptiste Daroussin } 32161d06d6bSBaptiste Daroussin sz += rsz; 32261d06d6bSBaptiste Daroussin } 32361d06d6bSBaptiste Daroussin if ('\0' == *cp) 32461d06d6bSBaptiste Daroussin break; 32561d06d6bSBaptiste Daroussin cp++; 32661d06d6bSBaptiste Daroussin switch (mandoc_escape(&cp, NULL, NULL)) { 32761d06d6bSBaptiste Daroussin case ESCAPE_ERROR: 32861d06d6bSBaptiste Daroussin return sz; 32961d06d6bSBaptiste Daroussin case ESCAPE_UNICODE: 33061d06d6bSBaptiste Daroussin case ESCAPE_NUMBERED: 33161d06d6bSBaptiste Daroussin case ESCAPE_SPECIAL: 3327295610fSBaptiste Daroussin case ESCAPE_UNDEF: 33361d06d6bSBaptiste Daroussin case ESCAPE_OVERSTRIKE: 33461d06d6bSBaptiste Daroussin if (skip) 33561d06d6bSBaptiste Daroussin skip = 0; 33661d06d6bSBaptiste Daroussin else 33761d06d6bSBaptiste Daroussin sz++; 33861d06d6bSBaptiste Daroussin break; 33961d06d6bSBaptiste Daroussin case ESCAPE_SKIPCHAR: 34061d06d6bSBaptiste Daroussin skip = 1; 34161d06d6bSBaptiste Daroussin break; 34261d06d6bSBaptiste Daroussin default: 34361d06d6bSBaptiste Daroussin break; 34461d06d6bSBaptiste Daroussin } 34561d06d6bSBaptiste Daroussin } 34661d06d6bSBaptiste Daroussin return sz; 34761d06d6bSBaptiste Daroussin } 34861d06d6bSBaptiste Daroussin 34961d06d6bSBaptiste Daroussin static void 35061d06d6bSBaptiste Daroussin font_push(char newfont) 35161d06d6bSBaptiste Daroussin { 35261d06d6bSBaptiste Daroussin 35361d06d6bSBaptiste Daroussin if (fontqueue.head + fontqueue.size <= ++fontqueue.tail) { 35461d06d6bSBaptiste Daroussin fontqueue.size += 8; 35561d06d6bSBaptiste Daroussin fontqueue.head = mandoc_realloc(fontqueue.head, 35661d06d6bSBaptiste Daroussin fontqueue.size); 35761d06d6bSBaptiste Daroussin } 35861d06d6bSBaptiste Daroussin *fontqueue.tail = newfont; 35961d06d6bSBaptiste Daroussin print_word(""); 36061d06d6bSBaptiste Daroussin printf("\\f"); 36161d06d6bSBaptiste Daroussin putchar(newfont); 36261d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 36361d06d6bSBaptiste Daroussin } 36461d06d6bSBaptiste Daroussin 36561d06d6bSBaptiste Daroussin static void 36661d06d6bSBaptiste Daroussin font_pop(void) 36761d06d6bSBaptiste Daroussin { 36861d06d6bSBaptiste Daroussin 36961d06d6bSBaptiste Daroussin if (fontqueue.tail > fontqueue.head) 37061d06d6bSBaptiste Daroussin fontqueue.tail--; 37161d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 37261d06d6bSBaptiste Daroussin print_word(""); 37361d06d6bSBaptiste Daroussin printf("\\f"); 37461d06d6bSBaptiste Daroussin putchar(*fontqueue.tail); 37561d06d6bSBaptiste Daroussin } 37661d06d6bSBaptiste Daroussin 37761d06d6bSBaptiste Daroussin static void 37861d06d6bSBaptiste Daroussin print_word(const char *s) 37961d06d6bSBaptiste Daroussin { 38061d06d6bSBaptiste Daroussin 38161d06d6bSBaptiste Daroussin if ((MMAN_PP | MMAN_sp | MMAN_br | MMAN_nl) & outflags) { 38261d06d6bSBaptiste Daroussin /* 38361d06d6bSBaptiste Daroussin * If we need a newline, print it now and start afresh. 38461d06d6bSBaptiste Daroussin */ 38561d06d6bSBaptiste Daroussin if (MMAN_PP & outflags) { 38661d06d6bSBaptiste Daroussin if (MMAN_sp & outflags) { 38761d06d6bSBaptiste Daroussin if (MMAN_PD & outflags) { 38861d06d6bSBaptiste Daroussin printf("\n.PD"); 38961d06d6bSBaptiste Daroussin outflags &= ~MMAN_PD; 39061d06d6bSBaptiste Daroussin } 39161d06d6bSBaptiste Daroussin } else if ( ! (MMAN_PD & outflags)) { 39261d06d6bSBaptiste Daroussin printf("\n.PD 0"); 39361d06d6bSBaptiste Daroussin outflags |= MMAN_PD; 39461d06d6bSBaptiste Daroussin } 39561d06d6bSBaptiste Daroussin printf("\n.PP\n"); 39661d06d6bSBaptiste Daroussin } else if (MMAN_sp & outflags) 39761d06d6bSBaptiste Daroussin printf("\n.sp\n"); 39861d06d6bSBaptiste Daroussin else if (MMAN_br & outflags) 39961d06d6bSBaptiste Daroussin printf("\n.br\n"); 40061d06d6bSBaptiste Daroussin else if (MMAN_nl & outflags) 40161d06d6bSBaptiste Daroussin putchar('\n'); 40261d06d6bSBaptiste Daroussin outflags &= ~(MMAN_PP|MMAN_sp|MMAN_br|MMAN_nl|MMAN_spc); 40361d06d6bSBaptiste Daroussin if (1 == TPremain) 40461d06d6bSBaptiste Daroussin printf(".br\n"); 40561d06d6bSBaptiste Daroussin TPremain = 0; 40661d06d6bSBaptiste Daroussin } else if (MMAN_spc & outflags) { 40761d06d6bSBaptiste Daroussin /* 40861d06d6bSBaptiste Daroussin * If we need a space, only print it if 40961d06d6bSBaptiste Daroussin * (1) it is forced by `No' or 41061d06d6bSBaptiste Daroussin * (2) what follows is not terminating punctuation or 41161d06d6bSBaptiste Daroussin * (3) what follows is longer than one character. 41261d06d6bSBaptiste Daroussin */ 41361d06d6bSBaptiste Daroussin if (MMAN_spc_force & outflags || '\0' == s[0] || 41461d06d6bSBaptiste Daroussin NULL == strchr(".,:;)]?!", s[0]) || '\0' != s[1]) { 41561d06d6bSBaptiste Daroussin if (MMAN_Bk & outflags && 41661d06d6bSBaptiste Daroussin ! (MMAN_Bk_susp & outflags)) 41761d06d6bSBaptiste Daroussin putchar('\\'); 41861d06d6bSBaptiste Daroussin putchar(' '); 41961d06d6bSBaptiste Daroussin if (TPremain) 42061d06d6bSBaptiste Daroussin TPremain--; 42161d06d6bSBaptiste Daroussin } 42261d06d6bSBaptiste Daroussin } 42361d06d6bSBaptiste Daroussin 42461d06d6bSBaptiste Daroussin /* 42561d06d6bSBaptiste Daroussin * Reassign needing space if we're not following opening 42661d06d6bSBaptiste Daroussin * punctuation. 42761d06d6bSBaptiste Daroussin */ 42861d06d6bSBaptiste Daroussin if (MMAN_Sm & outflags && ('\0' == s[0] || 42961d06d6bSBaptiste Daroussin (('(' != s[0] && '[' != s[0]) || '\0' != s[1]))) 43061d06d6bSBaptiste Daroussin outflags |= MMAN_spc; 43161d06d6bSBaptiste Daroussin else 43261d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 43361d06d6bSBaptiste Daroussin outflags &= ~(MMAN_spc_force | MMAN_Bk_susp); 43461d06d6bSBaptiste Daroussin 43561d06d6bSBaptiste Daroussin for ( ; *s; s++) { 43661d06d6bSBaptiste Daroussin switch (*s) { 43761d06d6bSBaptiste Daroussin case ASCII_NBRSP: 43861d06d6bSBaptiste Daroussin printf("\\ "); 43961d06d6bSBaptiste Daroussin break; 44061d06d6bSBaptiste Daroussin case ASCII_HYPH: 44161d06d6bSBaptiste Daroussin putchar('-'); 44261d06d6bSBaptiste Daroussin break; 44361d06d6bSBaptiste Daroussin case ASCII_BREAK: 44461d06d6bSBaptiste Daroussin printf("\\:"); 44561d06d6bSBaptiste Daroussin break; 44661d06d6bSBaptiste Daroussin case ' ': 44761d06d6bSBaptiste Daroussin if (MMAN_nbrword & outflags) { 44861d06d6bSBaptiste Daroussin printf("\\ "); 44961d06d6bSBaptiste Daroussin break; 45061d06d6bSBaptiste Daroussin } 45161d06d6bSBaptiste Daroussin /* FALLTHROUGH */ 45261d06d6bSBaptiste Daroussin default: 45361d06d6bSBaptiste Daroussin putchar((unsigned char)*s); 45461d06d6bSBaptiste Daroussin break; 45561d06d6bSBaptiste Daroussin } 45661d06d6bSBaptiste Daroussin if (TPremain) 45761d06d6bSBaptiste Daroussin TPremain--; 45861d06d6bSBaptiste Daroussin } 45961d06d6bSBaptiste Daroussin outflags &= ~MMAN_nbrword; 46061d06d6bSBaptiste Daroussin } 46161d06d6bSBaptiste Daroussin 46261d06d6bSBaptiste Daroussin static void 46361d06d6bSBaptiste Daroussin print_line(const char *s, int newflags) 46461d06d6bSBaptiste Daroussin { 46561d06d6bSBaptiste Daroussin 46661d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 46761d06d6bSBaptiste Daroussin print_word(s); 46861d06d6bSBaptiste Daroussin outflags |= newflags; 46961d06d6bSBaptiste Daroussin } 47061d06d6bSBaptiste Daroussin 47161d06d6bSBaptiste Daroussin static void 47261d06d6bSBaptiste Daroussin print_block(const char *s, int newflags) 47361d06d6bSBaptiste Daroussin { 47461d06d6bSBaptiste Daroussin 47561d06d6bSBaptiste Daroussin outflags &= ~MMAN_PP; 47661d06d6bSBaptiste Daroussin if (MMAN_sp & outflags) { 47761d06d6bSBaptiste Daroussin outflags &= ~(MMAN_sp | MMAN_br); 47861d06d6bSBaptiste Daroussin if (MMAN_PD & outflags) { 47961d06d6bSBaptiste Daroussin print_line(".PD", 0); 48061d06d6bSBaptiste Daroussin outflags &= ~MMAN_PD; 48161d06d6bSBaptiste Daroussin } 48261d06d6bSBaptiste Daroussin } else if (! (MMAN_PD & outflags)) 48361d06d6bSBaptiste Daroussin print_line(".PD 0", MMAN_PD); 48461d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 48561d06d6bSBaptiste Daroussin print_word(s); 48661d06d6bSBaptiste Daroussin outflags |= MMAN_Bk_susp | newflags; 48761d06d6bSBaptiste Daroussin } 48861d06d6bSBaptiste Daroussin 48961d06d6bSBaptiste Daroussin static void 49061d06d6bSBaptiste Daroussin print_offs(const char *v, int keywords) 49161d06d6bSBaptiste Daroussin { 49261d06d6bSBaptiste Daroussin char buf[24]; 49361d06d6bSBaptiste Daroussin struct roffsu su; 49461d06d6bSBaptiste Daroussin const char *end; 49561d06d6bSBaptiste Daroussin int sz; 49661d06d6bSBaptiste Daroussin 49761d06d6bSBaptiste Daroussin print_line(".RS", MMAN_Bk_susp); 49861d06d6bSBaptiste Daroussin 49961d06d6bSBaptiste Daroussin /* Convert v into a number (of characters). */ 50061d06d6bSBaptiste Daroussin if (NULL == v || '\0' == *v || (keywords && !strcmp(v, "left"))) 50161d06d6bSBaptiste Daroussin sz = 0; 50261d06d6bSBaptiste Daroussin else if (keywords && !strcmp(v, "indent")) 50361d06d6bSBaptiste Daroussin sz = 6; 50461d06d6bSBaptiste Daroussin else if (keywords && !strcmp(v, "indent-two")) 50561d06d6bSBaptiste Daroussin sz = 12; 50661d06d6bSBaptiste Daroussin else { 50761d06d6bSBaptiste Daroussin end = a2roffsu(v, &su, SCALE_EN); 50861d06d6bSBaptiste Daroussin if (end == NULL || *end != '\0') 50961d06d6bSBaptiste Daroussin sz = man_strlen(v); 51061d06d6bSBaptiste Daroussin else if (SCALE_EN == su.unit) 51161d06d6bSBaptiste Daroussin sz = su.scale; 51261d06d6bSBaptiste Daroussin else { 51361d06d6bSBaptiste Daroussin /* 51461d06d6bSBaptiste Daroussin * XXX 51561d06d6bSBaptiste Daroussin * If we are inside an enclosing list, 51661d06d6bSBaptiste Daroussin * there is no easy way to add the two 51761d06d6bSBaptiste Daroussin * indentations because they are provided 51861d06d6bSBaptiste Daroussin * in terms of different units. 51961d06d6bSBaptiste Daroussin */ 52061d06d6bSBaptiste Daroussin print_word(v); 52161d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 52261d06d6bSBaptiste Daroussin return; 52361d06d6bSBaptiste Daroussin } 52461d06d6bSBaptiste Daroussin } 52561d06d6bSBaptiste Daroussin 52661d06d6bSBaptiste Daroussin /* 52761d06d6bSBaptiste Daroussin * We are inside an enclosing list. 52861d06d6bSBaptiste Daroussin * Add the two indentations. 52961d06d6bSBaptiste Daroussin */ 53061d06d6bSBaptiste Daroussin if (Bl_stack_len) 53161d06d6bSBaptiste Daroussin sz += Bl_stack[Bl_stack_len - 1]; 53261d06d6bSBaptiste Daroussin 53361d06d6bSBaptiste Daroussin (void)snprintf(buf, sizeof(buf), "%dn", sz); 53461d06d6bSBaptiste Daroussin print_word(buf); 53561d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 53661d06d6bSBaptiste Daroussin } 53761d06d6bSBaptiste Daroussin 53861d06d6bSBaptiste Daroussin /* 53961d06d6bSBaptiste Daroussin * Set up the indentation for a list item; used from pre_it(). 54061d06d6bSBaptiste Daroussin */ 54161d06d6bSBaptiste Daroussin static void 54261d06d6bSBaptiste Daroussin print_width(const struct mdoc_bl *bl, const struct roff_node *child) 54361d06d6bSBaptiste Daroussin { 54461d06d6bSBaptiste Daroussin char buf[24]; 54561d06d6bSBaptiste Daroussin struct roffsu su; 54661d06d6bSBaptiste Daroussin const char *end; 54761d06d6bSBaptiste Daroussin int numeric, remain, sz, chsz; 54861d06d6bSBaptiste Daroussin 54961d06d6bSBaptiste Daroussin numeric = 1; 55061d06d6bSBaptiste Daroussin remain = 0; 55161d06d6bSBaptiste Daroussin 55261d06d6bSBaptiste Daroussin /* Convert the width into a number (of characters). */ 55361d06d6bSBaptiste Daroussin if (bl->width == NULL) 55461d06d6bSBaptiste Daroussin sz = (bl->type == LIST_hang) ? 6 : 0; 55561d06d6bSBaptiste Daroussin else { 55661d06d6bSBaptiste Daroussin end = a2roffsu(bl->width, &su, SCALE_MAX); 55761d06d6bSBaptiste Daroussin if (end == NULL || *end != '\0') 55861d06d6bSBaptiste Daroussin sz = man_strlen(bl->width); 55961d06d6bSBaptiste Daroussin else if (SCALE_EN == su.unit) 56061d06d6bSBaptiste Daroussin sz = su.scale; 56161d06d6bSBaptiste Daroussin else { 56261d06d6bSBaptiste Daroussin sz = 0; 56361d06d6bSBaptiste Daroussin numeric = 0; 56461d06d6bSBaptiste Daroussin } 56561d06d6bSBaptiste Daroussin } 56661d06d6bSBaptiste Daroussin 56761d06d6bSBaptiste Daroussin /* XXX Rough estimation, might have multiple parts. */ 56861d06d6bSBaptiste Daroussin if (bl->type == LIST_enum) 56961d06d6bSBaptiste Daroussin chsz = (bl->count > 8) + 1; 57061d06d6bSBaptiste Daroussin else if (child != NULL && child->type == ROFFT_TEXT) 57161d06d6bSBaptiste Daroussin chsz = man_strlen(child->string); 57261d06d6bSBaptiste Daroussin else 57361d06d6bSBaptiste Daroussin chsz = 0; 57461d06d6bSBaptiste Daroussin 57561d06d6bSBaptiste Daroussin /* Maybe we are inside an enclosing list? */ 57661d06d6bSBaptiste Daroussin mid_it(); 57761d06d6bSBaptiste Daroussin 57861d06d6bSBaptiste Daroussin /* 57961d06d6bSBaptiste Daroussin * Save our own indentation, 58061d06d6bSBaptiste Daroussin * such that child lists can use it. 58161d06d6bSBaptiste Daroussin */ 58261d06d6bSBaptiste Daroussin Bl_stack[Bl_stack_len++] = sz + 2; 58361d06d6bSBaptiste Daroussin 58461d06d6bSBaptiste Daroussin /* Set up the current list. */ 58561d06d6bSBaptiste Daroussin if (chsz > sz && bl->type != LIST_tag) 5866d38604fSBaptiste Daroussin print_block(".HP", MMAN_spc); 58761d06d6bSBaptiste Daroussin else { 5886d38604fSBaptiste Daroussin print_block(".TP", MMAN_spc); 58961d06d6bSBaptiste Daroussin remain = sz + 2; 59061d06d6bSBaptiste Daroussin } 59161d06d6bSBaptiste Daroussin if (numeric) { 59261d06d6bSBaptiste Daroussin (void)snprintf(buf, sizeof(buf), "%dn", sz + 2); 59361d06d6bSBaptiste Daroussin print_word(buf); 59461d06d6bSBaptiste Daroussin } else 59561d06d6bSBaptiste Daroussin print_word(bl->width); 59661d06d6bSBaptiste Daroussin TPremain = remain; 59761d06d6bSBaptiste Daroussin } 59861d06d6bSBaptiste Daroussin 59961d06d6bSBaptiste Daroussin static void 60061d06d6bSBaptiste Daroussin print_count(int *count) 60161d06d6bSBaptiste Daroussin { 60261d06d6bSBaptiste Daroussin char buf[24]; 60361d06d6bSBaptiste Daroussin 60461d06d6bSBaptiste Daroussin (void)snprintf(buf, sizeof(buf), "%d.\\&", ++*count); 60561d06d6bSBaptiste Daroussin print_word(buf); 60661d06d6bSBaptiste Daroussin } 60761d06d6bSBaptiste Daroussin 60861d06d6bSBaptiste Daroussin void 6097295610fSBaptiste Daroussin man_mdoc(void *arg, const struct roff_meta *mdoc) 61061d06d6bSBaptiste Daroussin { 61161d06d6bSBaptiste Daroussin struct roff_node *n; 61261d06d6bSBaptiste Daroussin 61361d06d6bSBaptiste Daroussin printf(".\\\" Automatically generated from an mdoc input file." 61461d06d6bSBaptiste Daroussin " Do not edit.\n"); 61561d06d6bSBaptiste Daroussin for (n = mdoc->first->child; n != NULL; n = n->next) { 61661d06d6bSBaptiste Daroussin if (n->type != ROFFT_COMMENT) 61761d06d6bSBaptiste Daroussin break; 61861d06d6bSBaptiste Daroussin printf(".\\\"%s\n", n->string); 61961d06d6bSBaptiste Daroussin } 62061d06d6bSBaptiste Daroussin 62161d06d6bSBaptiste Daroussin printf(".TH \"%s\" \"%s\" \"%s\" \"%s\" \"%s\"\n", 6227295610fSBaptiste Daroussin mdoc->title, (mdoc->msec == NULL ? "" : mdoc->msec), 6237295610fSBaptiste Daroussin mdoc->date, mdoc->os, mdoc->vol); 62461d06d6bSBaptiste Daroussin 62561d06d6bSBaptiste Daroussin /* Disable hyphenation and if nroff, disable justification. */ 62661d06d6bSBaptiste Daroussin printf(".nh\n.if n .ad l"); 62761d06d6bSBaptiste Daroussin 62861d06d6bSBaptiste Daroussin outflags = MMAN_nl | MMAN_Sm; 62961d06d6bSBaptiste Daroussin if (0 == fontqueue.size) { 63061d06d6bSBaptiste Daroussin fontqueue.size = 8; 63161d06d6bSBaptiste Daroussin fontqueue.head = fontqueue.tail = mandoc_malloc(8); 63261d06d6bSBaptiste Daroussin *fontqueue.tail = 'R'; 63361d06d6bSBaptiste Daroussin } 63461d06d6bSBaptiste Daroussin for (; n != NULL; n = n->next) 6357295610fSBaptiste Daroussin print_node(mdoc, n); 63661d06d6bSBaptiste Daroussin putchar('\n'); 63761d06d6bSBaptiste Daroussin } 63861d06d6bSBaptiste Daroussin 63961d06d6bSBaptiste Daroussin static void 64061d06d6bSBaptiste Daroussin print_node(DECL_ARGS) 64161d06d6bSBaptiste Daroussin { 6427295610fSBaptiste Daroussin const struct mdoc_man_act *act; 64361d06d6bSBaptiste Daroussin struct roff_node *sub; 64461d06d6bSBaptiste Daroussin int cond, do_sub; 64561d06d6bSBaptiste Daroussin 64661d06d6bSBaptiste Daroussin if (n->flags & NODE_NOPRT) 64761d06d6bSBaptiste Daroussin return; 64861d06d6bSBaptiste Daroussin 64961d06d6bSBaptiste Daroussin /* 65061d06d6bSBaptiste Daroussin * Break the line if we were parsed subsequent the current node. 65161d06d6bSBaptiste Daroussin * This makes the page structure be more consistent. 65261d06d6bSBaptiste Daroussin */ 6536d38604fSBaptiste Daroussin if (outflags & MMAN_spc && 6546d38604fSBaptiste Daroussin n->flags & NODE_LINE && 6556d38604fSBaptiste Daroussin !roff_node_transparent(n)) 65661d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 65761d06d6bSBaptiste Daroussin 65861d06d6bSBaptiste Daroussin act = NULL; 65961d06d6bSBaptiste Daroussin cond = 0; 66061d06d6bSBaptiste Daroussin do_sub = 1; 66161d06d6bSBaptiste Daroussin n->flags &= ~NODE_ENDED; 66261d06d6bSBaptiste Daroussin 6636d38604fSBaptiste Daroussin switch (n->type) { 6646d38604fSBaptiste Daroussin case ROFFT_EQN: 6656d38604fSBaptiste Daroussin case ROFFT_TBL: 6666d38604fSBaptiste Daroussin mandoc_msg(n->type == ROFFT_EQN ? MANDOCERR_EQN_TMAN : 6676d38604fSBaptiste Daroussin MANDOCERR_TBL_TMAN, n->line, n->pos, NULL); 6686d38604fSBaptiste Daroussin outflags |= MMAN_PP | MMAN_sp | MMAN_nl; 6696d38604fSBaptiste Daroussin print_word("The"); 6706d38604fSBaptiste Daroussin print_line(".B \\-T man", MMAN_nl); 6716d38604fSBaptiste Daroussin print_word("output mode does not support"); 6726d38604fSBaptiste Daroussin print_word(n->type == ROFFT_EQN ? "eqn(7)" : "tbl(7)"); 6736d38604fSBaptiste Daroussin print_word("input."); 6746d38604fSBaptiste Daroussin outflags |= MMAN_PP | MMAN_sp | MMAN_nl; 6756d38604fSBaptiste Daroussin return; 6766d38604fSBaptiste Daroussin case ROFFT_TEXT: 67761d06d6bSBaptiste Daroussin /* 67861d06d6bSBaptiste Daroussin * Make sure that we don't happen to start with a 67961d06d6bSBaptiste Daroussin * control character at the start of a line. 68061d06d6bSBaptiste Daroussin */ 68161d06d6bSBaptiste Daroussin if (MMAN_nl & outflags && 68261d06d6bSBaptiste Daroussin ('.' == *n->string || '\'' == *n->string)) { 68361d06d6bSBaptiste Daroussin print_word(""); 68461d06d6bSBaptiste Daroussin printf("\\&"); 68561d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 68661d06d6bSBaptiste Daroussin } 68761d06d6bSBaptiste Daroussin if (n->flags & NODE_DELIMC) 68861d06d6bSBaptiste Daroussin outflags &= ~(MMAN_spc | MMAN_spc_force); 68961d06d6bSBaptiste Daroussin else if (outflags & MMAN_Sm) 69061d06d6bSBaptiste Daroussin outflags |= MMAN_spc_force; 69161d06d6bSBaptiste Daroussin print_word(n->string); 69261d06d6bSBaptiste Daroussin if (n->flags & NODE_DELIMO) 69361d06d6bSBaptiste Daroussin outflags &= ~(MMAN_spc | MMAN_spc_force); 69461d06d6bSBaptiste Daroussin else if (outflags & MMAN_Sm) 69561d06d6bSBaptiste Daroussin outflags |= MMAN_spc; 6966d38604fSBaptiste Daroussin break; 6976d38604fSBaptiste Daroussin default: 6986d38604fSBaptiste Daroussin if (n->tok < ROFF_MAX) { 6997295610fSBaptiste Daroussin (*roff_man_acts[n->tok])(meta, n); 70061d06d6bSBaptiste Daroussin return; 7016d38604fSBaptiste Daroussin } 7027295610fSBaptiste Daroussin act = mdoc_man_act(n->tok); 70361d06d6bSBaptiste Daroussin cond = act->cond == NULL || (*act->cond)(meta, n); 70461d06d6bSBaptiste Daroussin if (cond && act->pre != NULL && 70561d06d6bSBaptiste Daroussin (n->end == ENDBODY_NOT || n->child != NULL)) 70661d06d6bSBaptiste Daroussin do_sub = (*act->pre)(meta, n); 7076d38604fSBaptiste Daroussin break; 70861d06d6bSBaptiste Daroussin } 70961d06d6bSBaptiste Daroussin 71061d06d6bSBaptiste Daroussin /* 71161d06d6bSBaptiste Daroussin * Conditionally run all child nodes. 71261d06d6bSBaptiste Daroussin * Note that this iterates over children instead of using 71361d06d6bSBaptiste Daroussin * recursion. This prevents unnecessary depth in the stack. 71461d06d6bSBaptiste Daroussin */ 71561d06d6bSBaptiste Daroussin if (do_sub) 71661d06d6bSBaptiste Daroussin for (sub = n->child; sub; sub = sub->next) 71761d06d6bSBaptiste Daroussin print_node(meta, sub); 71861d06d6bSBaptiste Daroussin 71961d06d6bSBaptiste Daroussin /* 72061d06d6bSBaptiste Daroussin * Lastly, conditionally run the post-node handler. 72161d06d6bSBaptiste Daroussin */ 72261d06d6bSBaptiste Daroussin if (NODE_ENDED & n->flags) 72361d06d6bSBaptiste Daroussin return; 72461d06d6bSBaptiste Daroussin 72561d06d6bSBaptiste Daroussin if (cond && act->post) 72661d06d6bSBaptiste Daroussin (*act->post)(meta, n); 72761d06d6bSBaptiste Daroussin 72861d06d6bSBaptiste Daroussin if (ENDBODY_NOT != n->end) 72961d06d6bSBaptiste Daroussin n->body->flags |= NODE_ENDED; 73061d06d6bSBaptiste Daroussin } 73161d06d6bSBaptiste Daroussin 73261d06d6bSBaptiste Daroussin static int 73361d06d6bSBaptiste Daroussin cond_head(DECL_ARGS) 73461d06d6bSBaptiste Daroussin { 73561d06d6bSBaptiste Daroussin 73661d06d6bSBaptiste Daroussin return n->type == ROFFT_HEAD; 73761d06d6bSBaptiste Daroussin } 73861d06d6bSBaptiste Daroussin 73961d06d6bSBaptiste Daroussin static int 74061d06d6bSBaptiste Daroussin cond_body(DECL_ARGS) 74161d06d6bSBaptiste Daroussin { 74261d06d6bSBaptiste Daroussin 74361d06d6bSBaptiste Daroussin return n->type == ROFFT_BODY; 74461d06d6bSBaptiste Daroussin } 74561d06d6bSBaptiste Daroussin 74661d06d6bSBaptiste Daroussin static int 7477295610fSBaptiste Daroussin pre_abort(DECL_ARGS) 7487295610fSBaptiste Daroussin { 7497295610fSBaptiste Daroussin abort(); 7507295610fSBaptiste Daroussin } 7517295610fSBaptiste Daroussin 7527295610fSBaptiste Daroussin static int 75361d06d6bSBaptiste Daroussin pre_enc(DECL_ARGS) 75461d06d6bSBaptiste Daroussin { 75561d06d6bSBaptiste Daroussin const char *prefix; 75661d06d6bSBaptiste Daroussin 7577295610fSBaptiste Daroussin prefix = mdoc_man_act(n->tok)->prefix; 75861d06d6bSBaptiste Daroussin if (NULL == prefix) 75961d06d6bSBaptiste Daroussin return 1; 76061d06d6bSBaptiste Daroussin print_word(prefix); 76161d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 76261d06d6bSBaptiste Daroussin return 1; 76361d06d6bSBaptiste Daroussin } 76461d06d6bSBaptiste Daroussin 76561d06d6bSBaptiste Daroussin static void 76661d06d6bSBaptiste Daroussin post_enc(DECL_ARGS) 76761d06d6bSBaptiste Daroussin { 76861d06d6bSBaptiste Daroussin const char *suffix; 76961d06d6bSBaptiste Daroussin 7707295610fSBaptiste Daroussin suffix = mdoc_man_act(n->tok)->suffix; 77161d06d6bSBaptiste Daroussin if (NULL == suffix) 77261d06d6bSBaptiste Daroussin return; 77361d06d6bSBaptiste Daroussin outflags &= ~(MMAN_spc | MMAN_nl); 77461d06d6bSBaptiste Daroussin print_word(suffix); 77561d06d6bSBaptiste Daroussin } 77661d06d6bSBaptiste Daroussin 77761d06d6bSBaptiste Daroussin static int 77861d06d6bSBaptiste Daroussin pre_ex(DECL_ARGS) 77961d06d6bSBaptiste Daroussin { 78061d06d6bSBaptiste Daroussin outflags |= MMAN_br | MMAN_nl; 78161d06d6bSBaptiste Daroussin return 1; 78261d06d6bSBaptiste Daroussin } 78361d06d6bSBaptiste Daroussin 78461d06d6bSBaptiste Daroussin static void 78561d06d6bSBaptiste Daroussin post_font(DECL_ARGS) 78661d06d6bSBaptiste Daroussin { 78761d06d6bSBaptiste Daroussin 78861d06d6bSBaptiste Daroussin font_pop(); 78961d06d6bSBaptiste Daroussin } 79061d06d6bSBaptiste Daroussin 79161d06d6bSBaptiste Daroussin static void 79261d06d6bSBaptiste Daroussin post_percent(DECL_ARGS) 79361d06d6bSBaptiste Daroussin { 7946d38604fSBaptiste Daroussin struct roff_node *np, *nn, *nnn; 79561d06d6bSBaptiste Daroussin 7967295610fSBaptiste Daroussin if (mdoc_man_act(n->tok)->pre == pre_em) 79761d06d6bSBaptiste Daroussin font_pop(); 7986d38604fSBaptiste Daroussin 7996d38604fSBaptiste Daroussin if ((nn = roff_node_next(n)) != NULL) { 8006d38604fSBaptiste Daroussin np = roff_node_prev(n); 8016d38604fSBaptiste Daroussin nnn = nn == NULL ? NULL : roff_node_next(nn); 8026d38604fSBaptiste Daroussin if (nn->tok != n->tok || 8036d38604fSBaptiste Daroussin (np != NULL && np->tok == n->tok) || 8046d38604fSBaptiste Daroussin (nnn != NULL && nnn->tok == n->tok)) 80561d06d6bSBaptiste Daroussin print_word(","); 8066d38604fSBaptiste Daroussin if (nn->tok == n->tok && 8076d38604fSBaptiste Daroussin (nnn == NULL || nnn->tok != n->tok)) 80861d06d6bSBaptiste Daroussin print_word("and"); 80961d06d6bSBaptiste Daroussin } else { 81061d06d6bSBaptiste Daroussin print_word("."); 81161d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 81261d06d6bSBaptiste Daroussin } 81361d06d6bSBaptiste Daroussin } 81461d06d6bSBaptiste Daroussin 81561d06d6bSBaptiste Daroussin static int 81661d06d6bSBaptiste Daroussin pre__t(DECL_ARGS) 81761d06d6bSBaptiste Daroussin { 81861d06d6bSBaptiste Daroussin 81961d06d6bSBaptiste Daroussin if (n->parent->tok == MDOC_Rs && n->parent->norm->Rs.quote_T) { 82061d06d6bSBaptiste Daroussin print_word("\\(lq"); 82161d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 82261d06d6bSBaptiste Daroussin } else 82361d06d6bSBaptiste Daroussin font_push('I'); 82461d06d6bSBaptiste Daroussin return 1; 82561d06d6bSBaptiste Daroussin } 82661d06d6bSBaptiste Daroussin 82761d06d6bSBaptiste Daroussin static void 82861d06d6bSBaptiste Daroussin post__t(DECL_ARGS) 82961d06d6bSBaptiste Daroussin { 83061d06d6bSBaptiste Daroussin 83161d06d6bSBaptiste Daroussin if (n->parent->tok == MDOC_Rs && n->parent->norm->Rs.quote_T) { 83261d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 83361d06d6bSBaptiste Daroussin print_word("\\(rq"); 83461d06d6bSBaptiste Daroussin } else 83561d06d6bSBaptiste Daroussin font_pop(); 83661d06d6bSBaptiste Daroussin post_percent(meta, n); 83761d06d6bSBaptiste Daroussin } 83861d06d6bSBaptiste Daroussin 83961d06d6bSBaptiste Daroussin /* 84061d06d6bSBaptiste Daroussin * Print before a section header. 84161d06d6bSBaptiste Daroussin */ 84261d06d6bSBaptiste Daroussin static int 84361d06d6bSBaptiste Daroussin pre_sect(DECL_ARGS) 84461d06d6bSBaptiste Daroussin { 84561d06d6bSBaptiste Daroussin 84661d06d6bSBaptiste Daroussin if (n->type == ROFFT_HEAD) { 84761d06d6bSBaptiste Daroussin outflags |= MMAN_sp; 8487295610fSBaptiste Daroussin print_block(mdoc_man_act(n->tok)->prefix, 0); 84961d06d6bSBaptiste Daroussin print_word(""); 85061d06d6bSBaptiste Daroussin putchar('\"'); 85161d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 85261d06d6bSBaptiste Daroussin } 85361d06d6bSBaptiste Daroussin return 1; 85461d06d6bSBaptiste Daroussin } 85561d06d6bSBaptiste Daroussin 85661d06d6bSBaptiste Daroussin /* 85761d06d6bSBaptiste Daroussin * Print subsequent a section header. 85861d06d6bSBaptiste Daroussin */ 85961d06d6bSBaptiste Daroussin static void 86061d06d6bSBaptiste Daroussin post_sect(DECL_ARGS) 86161d06d6bSBaptiste Daroussin { 86261d06d6bSBaptiste Daroussin 86361d06d6bSBaptiste Daroussin if (n->type != ROFFT_HEAD) 86461d06d6bSBaptiste Daroussin return; 86561d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 86661d06d6bSBaptiste Daroussin print_word(""); 86761d06d6bSBaptiste Daroussin putchar('\"'); 86861d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 86961d06d6bSBaptiste Daroussin if (MDOC_Sh == n->tok && SEC_AUTHORS == n->sec) 87061d06d6bSBaptiste Daroussin outflags &= ~(MMAN_An_split | MMAN_An_nosplit); 87161d06d6bSBaptiste Daroussin } 87261d06d6bSBaptiste Daroussin 87361d06d6bSBaptiste Daroussin /* See mdoc_term.c, synopsis_pre() for comments. */ 87461d06d6bSBaptiste Daroussin static void 8756d38604fSBaptiste Daroussin pre_syn(struct roff_node *n) 87661d06d6bSBaptiste Daroussin { 8776d38604fSBaptiste Daroussin struct roff_node *np; 87861d06d6bSBaptiste Daroussin 8796d38604fSBaptiste Daroussin if ((n->flags & NODE_SYNPRETTY) == 0 || 8806d38604fSBaptiste Daroussin (np = roff_node_prev(n)) == NULL) 88161d06d6bSBaptiste Daroussin return; 88261d06d6bSBaptiste Daroussin 8836d38604fSBaptiste Daroussin if (np->tok == n->tok && 88461d06d6bSBaptiste Daroussin MDOC_Ft != n->tok && 88561d06d6bSBaptiste Daroussin MDOC_Fo != n->tok && 88661d06d6bSBaptiste Daroussin MDOC_Fn != n->tok) { 88761d06d6bSBaptiste Daroussin outflags |= MMAN_br; 88861d06d6bSBaptiste Daroussin return; 88961d06d6bSBaptiste Daroussin } 89061d06d6bSBaptiste Daroussin 8916d38604fSBaptiste Daroussin switch (np->tok) { 89261d06d6bSBaptiste Daroussin case MDOC_Fd: 89361d06d6bSBaptiste Daroussin case MDOC_Fn: 89461d06d6bSBaptiste Daroussin case MDOC_Fo: 89561d06d6bSBaptiste Daroussin case MDOC_In: 89661d06d6bSBaptiste Daroussin case MDOC_Vt: 89761d06d6bSBaptiste Daroussin outflags |= MMAN_sp; 89861d06d6bSBaptiste Daroussin break; 89961d06d6bSBaptiste Daroussin case MDOC_Ft: 90061d06d6bSBaptiste Daroussin if (MDOC_Fn != n->tok && MDOC_Fo != n->tok) { 90161d06d6bSBaptiste Daroussin outflags |= MMAN_sp; 90261d06d6bSBaptiste Daroussin break; 90361d06d6bSBaptiste Daroussin } 90461d06d6bSBaptiste Daroussin /* FALLTHROUGH */ 90561d06d6bSBaptiste Daroussin default: 90661d06d6bSBaptiste Daroussin outflags |= MMAN_br; 90761d06d6bSBaptiste Daroussin break; 90861d06d6bSBaptiste Daroussin } 90961d06d6bSBaptiste Daroussin } 91061d06d6bSBaptiste Daroussin 91161d06d6bSBaptiste Daroussin static int 91261d06d6bSBaptiste Daroussin pre_an(DECL_ARGS) 91361d06d6bSBaptiste Daroussin { 91461d06d6bSBaptiste Daroussin 91561d06d6bSBaptiste Daroussin switch (n->norm->An.auth) { 91661d06d6bSBaptiste Daroussin case AUTH_split: 91761d06d6bSBaptiste Daroussin outflags &= ~MMAN_An_nosplit; 91861d06d6bSBaptiste Daroussin outflags |= MMAN_An_split; 91961d06d6bSBaptiste Daroussin return 0; 92061d06d6bSBaptiste Daroussin case AUTH_nosplit: 92161d06d6bSBaptiste Daroussin outflags &= ~MMAN_An_split; 92261d06d6bSBaptiste Daroussin outflags |= MMAN_An_nosplit; 92361d06d6bSBaptiste Daroussin return 0; 92461d06d6bSBaptiste Daroussin default: 92561d06d6bSBaptiste Daroussin if (MMAN_An_split & outflags) 92661d06d6bSBaptiste Daroussin outflags |= MMAN_br; 92761d06d6bSBaptiste Daroussin else if (SEC_AUTHORS == n->sec && 92861d06d6bSBaptiste Daroussin ! (MMAN_An_nosplit & outflags)) 92961d06d6bSBaptiste Daroussin outflags |= MMAN_An_split; 93061d06d6bSBaptiste Daroussin return 1; 93161d06d6bSBaptiste Daroussin } 93261d06d6bSBaptiste Daroussin } 93361d06d6bSBaptiste Daroussin 93461d06d6bSBaptiste Daroussin static int 93561d06d6bSBaptiste Daroussin pre_ap(DECL_ARGS) 93661d06d6bSBaptiste Daroussin { 93761d06d6bSBaptiste Daroussin 93861d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 93961d06d6bSBaptiste Daroussin print_word("'"); 94061d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 94161d06d6bSBaptiste Daroussin return 0; 94261d06d6bSBaptiste Daroussin } 94361d06d6bSBaptiste Daroussin 94461d06d6bSBaptiste Daroussin static int 94561d06d6bSBaptiste Daroussin pre_aq(DECL_ARGS) 94661d06d6bSBaptiste Daroussin { 94761d06d6bSBaptiste Daroussin 94861d06d6bSBaptiste Daroussin print_word(n->child != NULL && n->child->next == NULL && 94961d06d6bSBaptiste Daroussin n->child->tok == MDOC_Mt ? "<" : "\\(la"); 95061d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 95161d06d6bSBaptiste Daroussin return 1; 95261d06d6bSBaptiste Daroussin } 95361d06d6bSBaptiste Daroussin 95461d06d6bSBaptiste Daroussin static void 95561d06d6bSBaptiste Daroussin post_aq(DECL_ARGS) 95661d06d6bSBaptiste Daroussin { 95761d06d6bSBaptiste Daroussin 95861d06d6bSBaptiste Daroussin outflags &= ~(MMAN_spc | MMAN_nl); 95961d06d6bSBaptiste Daroussin print_word(n->child != NULL && n->child->next == NULL && 96061d06d6bSBaptiste Daroussin n->child->tok == MDOC_Mt ? ">" : "\\(ra"); 96161d06d6bSBaptiste Daroussin } 96261d06d6bSBaptiste Daroussin 96361d06d6bSBaptiste Daroussin static int 96461d06d6bSBaptiste Daroussin pre_bd(DECL_ARGS) 96561d06d6bSBaptiste Daroussin { 96661d06d6bSBaptiste Daroussin outflags &= ~(MMAN_PP | MMAN_sp | MMAN_br); 9676d38604fSBaptiste Daroussin if (n->norm->Bd.type == DISP_unfilled || 9686d38604fSBaptiste Daroussin n->norm->Bd.type == DISP_literal) 96961d06d6bSBaptiste Daroussin print_line(".nf", 0); 9706d38604fSBaptiste Daroussin if (n->norm->Bd.comp == 0 && roff_node_prev(n->parent) != NULL) 97161d06d6bSBaptiste Daroussin outflags |= MMAN_sp; 97261d06d6bSBaptiste Daroussin print_offs(n->norm->Bd.offs, 1); 97361d06d6bSBaptiste Daroussin return 1; 97461d06d6bSBaptiste Daroussin } 97561d06d6bSBaptiste Daroussin 97661d06d6bSBaptiste Daroussin static void 97761d06d6bSBaptiste Daroussin post_bd(DECL_ARGS) 97861d06d6bSBaptiste Daroussin { 9797295610fSBaptiste Daroussin enum roff_tok bef, now; 98061d06d6bSBaptiste Daroussin 98161d06d6bSBaptiste Daroussin /* Close out this display. */ 98261d06d6bSBaptiste Daroussin print_line(".RE", MMAN_nl); 9837295610fSBaptiste Daroussin bef = n->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi; 9847295610fSBaptiste Daroussin if (n->last == NULL) 9857295610fSBaptiste Daroussin now = n->norm->Bd.type == DISP_unfilled || 9867295610fSBaptiste Daroussin n->norm->Bd.type == DISP_literal ? ROFF_nf : ROFF_fi; 9877295610fSBaptiste Daroussin else if (n->last->tok == ROFF_nf) 9887295610fSBaptiste Daroussin now = ROFF_nf; 9897295610fSBaptiste Daroussin else if (n->last->tok == ROFF_fi) 9907295610fSBaptiste Daroussin now = ROFF_fi; 9917295610fSBaptiste Daroussin else 9927295610fSBaptiste Daroussin now = n->last->flags & NODE_NOFILL ? ROFF_nf : ROFF_fi; 9937295610fSBaptiste Daroussin if (bef != now) { 9947295610fSBaptiste Daroussin outflags |= MMAN_nl; 9957295610fSBaptiste Daroussin print_word("."); 9967295610fSBaptiste Daroussin outflags &= ~MMAN_spc; 9977295610fSBaptiste Daroussin print_word(roff_name[bef]); 9987295610fSBaptiste Daroussin outflags |= MMAN_nl; 9997295610fSBaptiste Daroussin } 100061d06d6bSBaptiste Daroussin 100161d06d6bSBaptiste Daroussin /* Maybe we are inside an enclosing list? */ 10026d38604fSBaptiste Daroussin if (roff_node_next(n->parent) != NULL) 100361d06d6bSBaptiste Daroussin mid_it(); 100461d06d6bSBaptiste Daroussin } 100561d06d6bSBaptiste Daroussin 100661d06d6bSBaptiste Daroussin static int 100761d06d6bSBaptiste Daroussin pre_bf(DECL_ARGS) 100861d06d6bSBaptiste Daroussin { 100961d06d6bSBaptiste Daroussin 101061d06d6bSBaptiste Daroussin switch (n->type) { 101161d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 101261d06d6bSBaptiste Daroussin return 1; 101361d06d6bSBaptiste Daroussin case ROFFT_BODY: 101461d06d6bSBaptiste Daroussin break; 101561d06d6bSBaptiste Daroussin default: 101661d06d6bSBaptiste Daroussin return 0; 101761d06d6bSBaptiste Daroussin } 101861d06d6bSBaptiste Daroussin switch (n->norm->Bf.font) { 101961d06d6bSBaptiste Daroussin case FONT_Em: 102061d06d6bSBaptiste Daroussin font_push('I'); 102161d06d6bSBaptiste Daroussin break; 102261d06d6bSBaptiste Daroussin case FONT_Sy: 102361d06d6bSBaptiste Daroussin font_push('B'); 102461d06d6bSBaptiste Daroussin break; 102561d06d6bSBaptiste Daroussin default: 102661d06d6bSBaptiste Daroussin font_push('R'); 102761d06d6bSBaptiste Daroussin break; 102861d06d6bSBaptiste Daroussin } 102961d06d6bSBaptiste Daroussin return 1; 103061d06d6bSBaptiste Daroussin } 103161d06d6bSBaptiste Daroussin 103261d06d6bSBaptiste Daroussin static void 103361d06d6bSBaptiste Daroussin post_bf(DECL_ARGS) 103461d06d6bSBaptiste Daroussin { 103561d06d6bSBaptiste Daroussin 103661d06d6bSBaptiste Daroussin if (n->type == ROFFT_BODY) 103761d06d6bSBaptiste Daroussin font_pop(); 103861d06d6bSBaptiste Daroussin } 103961d06d6bSBaptiste Daroussin 104061d06d6bSBaptiste Daroussin static int 104161d06d6bSBaptiste Daroussin pre_bk(DECL_ARGS) 104261d06d6bSBaptiste Daroussin { 104361d06d6bSBaptiste Daroussin switch (n->type) { 104461d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 104561d06d6bSBaptiste Daroussin return 1; 104661d06d6bSBaptiste Daroussin case ROFFT_BODY: 104761d06d6bSBaptiste Daroussin case ROFFT_ELEM: 104861d06d6bSBaptiste Daroussin outflags |= MMAN_Bk; 104961d06d6bSBaptiste Daroussin return 1; 105061d06d6bSBaptiste Daroussin default: 105161d06d6bSBaptiste Daroussin return 0; 105261d06d6bSBaptiste Daroussin } 105361d06d6bSBaptiste Daroussin } 105461d06d6bSBaptiste Daroussin 105561d06d6bSBaptiste Daroussin static void 105661d06d6bSBaptiste Daroussin post_bk(DECL_ARGS) 105761d06d6bSBaptiste Daroussin { 105861d06d6bSBaptiste Daroussin switch (n->type) { 105961d06d6bSBaptiste Daroussin case ROFFT_ELEM: 106061d06d6bSBaptiste Daroussin while ((n = n->parent) != NULL) 106161d06d6bSBaptiste Daroussin if (n->tok == MDOC_Bk) 106261d06d6bSBaptiste Daroussin return; 106361d06d6bSBaptiste Daroussin /* FALLTHROUGH */ 106461d06d6bSBaptiste Daroussin case ROFFT_BODY: 106561d06d6bSBaptiste Daroussin outflags &= ~MMAN_Bk; 106661d06d6bSBaptiste Daroussin break; 106761d06d6bSBaptiste Daroussin default: 106861d06d6bSBaptiste Daroussin break; 106961d06d6bSBaptiste Daroussin } 107061d06d6bSBaptiste Daroussin } 107161d06d6bSBaptiste Daroussin 107261d06d6bSBaptiste Daroussin static int 107361d06d6bSBaptiste Daroussin pre_bl(DECL_ARGS) 107461d06d6bSBaptiste Daroussin { 107561d06d6bSBaptiste Daroussin size_t icol; 107661d06d6bSBaptiste Daroussin 107761d06d6bSBaptiste Daroussin /* 107861d06d6bSBaptiste Daroussin * print_offs() will increase the -offset to account for 107961d06d6bSBaptiste Daroussin * a possible enclosing .It, but any enclosed .It blocks 108061d06d6bSBaptiste Daroussin * just nest and do not add up their indentation. 108161d06d6bSBaptiste Daroussin */ 108261d06d6bSBaptiste Daroussin if (n->norm->Bl.offs) { 108361d06d6bSBaptiste Daroussin print_offs(n->norm->Bl.offs, 0); 108461d06d6bSBaptiste Daroussin Bl_stack[Bl_stack_len++] = 0; 108561d06d6bSBaptiste Daroussin } 108661d06d6bSBaptiste Daroussin 108761d06d6bSBaptiste Daroussin switch (n->norm->Bl.type) { 108861d06d6bSBaptiste Daroussin case LIST_enum: 108961d06d6bSBaptiste Daroussin n->norm->Bl.count = 0; 109061d06d6bSBaptiste Daroussin return 1; 109161d06d6bSBaptiste Daroussin case LIST_column: 109261d06d6bSBaptiste Daroussin break; 109361d06d6bSBaptiste Daroussin default: 109461d06d6bSBaptiste Daroussin return 1; 109561d06d6bSBaptiste Daroussin } 109661d06d6bSBaptiste Daroussin 109761d06d6bSBaptiste Daroussin if (n->child != NULL) { 109861d06d6bSBaptiste Daroussin print_line(".TS", MMAN_nl); 109961d06d6bSBaptiste Daroussin for (icol = 0; icol < n->norm->Bl.ncols; icol++) 110061d06d6bSBaptiste Daroussin print_word("l"); 110161d06d6bSBaptiste Daroussin print_word("."); 110261d06d6bSBaptiste Daroussin } 110361d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 110461d06d6bSBaptiste Daroussin return 1; 110561d06d6bSBaptiste Daroussin } 110661d06d6bSBaptiste Daroussin 110761d06d6bSBaptiste Daroussin static void 110861d06d6bSBaptiste Daroussin post_bl(DECL_ARGS) 110961d06d6bSBaptiste Daroussin { 111061d06d6bSBaptiste Daroussin 111161d06d6bSBaptiste Daroussin switch (n->norm->Bl.type) { 111261d06d6bSBaptiste Daroussin case LIST_column: 111361d06d6bSBaptiste Daroussin if (n->child != NULL) 111461d06d6bSBaptiste Daroussin print_line(".TE", 0); 111561d06d6bSBaptiste Daroussin break; 111661d06d6bSBaptiste Daroussin case LIST_enum: 111761d06d6bSBaptiste Daroussin n->norm->Bl.count = 0; 111861d06d6bSBaptiste Daroussin break; 111961d06d6bSBaptiste Daroussin default: 112061d06d6bSBaptiste Daroussin break; 112161d06d6bSBaptiste Daroussin } 112261d06d6bSBaptiste Daroussin 112361d06d6bSBaptiste Daroussin if (n->norm->Bl.offs) { 112461d06d6bSBaptiste Daroussin print_line(".RE", MMAN_nl); 112561d06d6bSBaptiste Daroussin assert(Bl_stack_len); 112661d06d6bSBaptiste Daroussin Bl_stack_len--; 11276d38604fSBaptiste Daroussin assert(Bl_stack[Bl_stack_len] == 0); 112861d06d6bSBaptiste Daroussin } else { 112961d06d6bSBaptiste Daroussin outflags |= MMAN_PP | MMAN_nl; 113061d06d6bSBaptiste Daroussin outflags &= ~(MMAN_sp | MMAN_br); 113161d06d6bSBaptiste Daroussin } 113261d06d6bSBaptiste Daroussin 113361d06d6bSBaptiste Daroussin /* Maybe we are inside an enclosing list? */ 11346d38604fSBaptiste Daroussin if (roff_node_next(n->parent) != NULL) 113561d06d6bSBaptiste Daroussin mid_it(); 113661d06d6bSBaptiste Daroussin } 113761d06d6bSBaptiste Daroussin 113861d06d6bSBaptiste Daroussin static void 113961d06d6bSBaptiste Daroussin pre_br(DECL_ARGS) 114061d06d6bSBaptiste Daroussin { 114161d06d6bSBaptiste Daroussin outflags |= MMAN_br; 114261d06d6bSBaptiste Daroussin } 114361d06d6bSBaptiste Daroussin 114461d06d6bSBaptiste Daroussin static int 114561d06d6bSBaptiste Daroussin pre_dl(DECL_ARGS) 114661d06d6bSBaptiste Daroussin { 114761d06d6bSBaptiste Daroussin print_offs("6n", 0); 114861d06d6bSBaptiste Daroussin return 1; 114961d06d6bSBaptiste Daroussin } 115061d06d6bSBaptiste Daroussin 115161d06d6bSBaptiste Daroussin static void 115261d06d6bSBaptiste Daroussin post_dl(DECL_ARGS) 115361d06d6bSBaptiste Daroussin { 115461d06d6bSBaptiste Daroussin print_line(".RE", MMAN_nl); 115561d06d6bSBaptiste Daroussin 115661d06d6bSBaptiste Daroussin /* Maybe we are inside an enclosing list? */ 11576d38604fSBaptiste Daroussin if (roff_node_next(n->parent) != NULL) 115861d06d6bSBaptiste Daroussin mid_it(); 115961d06d6bSBaptiste Daroussin } 116061d06d6bSBaptiste Daroussin 116161d06d6bSBaptiste Daroussin static int 116261d06d6bSBaptiste Daroussin pre_em(DECL_ARGS) 116361d06d6bSBaptiste Daroussin { 116461d06d6bSBaptiste Daroussin 116561d06d6bSBaptiste Daroussin font_push('I'); 116661d06d6bSBaptiste Daroussin return 1; 116761d06d6bSBaptiste Daroussin } 116861d06d6bSBaptiste Daroussin 116961d06d6bSBaptiste Daroussin static int 117061d06d6bSBaptiste Daroussin pre_en(DECL_ARGS) 117161d06d6bSBaptiste Daroussin { 117261d06d6bSBaptiste Daroussin 117361d06d6bSBaptiste Daroussin if (NULL == n->norm->Es || 117461d06d6bSBaptiste Daroussin NULL == n->norm->Es->child) 117561d06d6bSBaptiste Daroussin return 1; 117661d06d6bSBaptiste Daroussin 117761d06d6bSBaptiste Daroussin print_word(n->norm->Es->child->string); 117861d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 117961d06d6bSBaptiste Daroussin return 1; 118061d06d6bSBaptiste Daroussin } 118161d06d6bSBaptiste Daroussin 118261d06d6bSBaptiste Daroussin static void 118361d06d6bSBaptiste Daroussin post_en(DECL_ARGS) 118461d06d6bSBaptiste Daroussin { 118561d06d6bSBaptiste Daroussin 118661d06d6bSBaptiste Daroussin if (NULL == n->norm->Es || 118761d06d6bSBaptiste Daroussin NULL == n->norm->Es->child || 118861d06d6bSBaptiste Daroussin NULL == n->norm->Es->child->next) 118961d06d6bSBaptiste Daroussin return; 119061d06d6bSBaptiste Daroussin 119161d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 119261d06d6bSBaptiste Daroussin print_word(n->norm->Es->child->next->string); 119361d06d6bSBaptiste Daroussin return; 119461d06d6bSBaptiste Daroussin } 119561d06d6bSBaptiste Daroussin 119661d06d6bSBaptiste Daroussin static int 119761d06d6bSBaptiste Daroussin pre_eo(DECL_ARGS) 119861d06d6bSBaptiste Daroussin { 119961d06d6bSBaptiste Daroussin 120061d06d6bSBaptiste Daroussin if (n->end == ENDBODY_NOT && 120161d06d6bSBaptiste Daroussin n->parent->head->child == NULL && 120261d06d6bSBaptiste Daroussin n->child != NULL && 120361d06d6bSBaptiste Daroussin n->child->end != ENDBODY_NOT) 120461d06d6bSBaptiste Daroussin print_word("\\&"); 120561d06d6bSBaptiste Daroussin else if (n->end != ENDBODY_NOT ? n->child != NULL : 120661d06d6bSBaptiste Daroussin n->parent->head->child != NULL && (n->child != NULL || 120761d06d6bSBaptiste Daroussin (n->parent->tail != NULL && n->parent->tail->child != NULL))) 120861d06d6bSBaptiste Daroussin outflags &= ~(MMAN_spc | MMAN_nl); 120961d06d6bSBaptiste Daroussin return 1; 121061d06d6bSBaptiste Daroussin } 121161d06d6bSBaptiste Daroussin 121261d06d6bSBaptiste Daroussin static void 121361d06d6bSBaptiste Daroussin post_eo(DECL_ARGS) 121461d06d6bSBaptiste Daroussin { 121561d06d6bSBaptiste Daroussin int body, tail; 121661d06d6bSBaptiste Daroussin 121761d06d6bSBaptiste Daroussin if (n->end != ENDBODY_NOT) { 121861d06d6bSBaptiste Daroussin outflags |= MMAN_spc; 121961d06d6bSBaptiste Daroussin return; 122061d06d6bSBaptiste Daroussin } 122161d06d6bSBaptiste Daroussin 122261d06d6bSBaptiste Daroussin body = n->child != NULL || n->parent->head->child != NULL; 122361d06d6bSBaptiste Daroussin tail = n->parent->tail != NULL && n->parent->tail->child != NULL; 122461d06d6bSBaptiste Daroussin 122561d06d6bSBaptiste Daroussin if (body && tail) 122661d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 122761d06d6bSBaptiste Daroussin else if ( ! (body || tail)) 122861d06d6bSBaptiste Daroussin print_word("\\&"); 122961d06d6bSBaptiste Daroussin else if ( ! tail) 123061d06d6bSBaptiste Daroussin outflags |= MMAN_spc; 123161d06d6bSBaptiste Daroussin } 123261d06d6bSBaptiste Daroussin 123361d06d6bSBaptiste Daroussin static int 123461d06d6bSBaptiste Daroussin pre_fa(DECL_ARGS) 123561d06d6bSBaptiste Daroussin { 123661d06d6bSBaptiste Daroussin int am_Fa; 123761d06d6bSBaptiste Daroussin 123861d06d6bSBaptiste Daroussin am_Fa = MDOC_Fa == n->tok; 123961d06d6bSBaptiste Daroussin 124061d06d6bSBaptiste Daroussin if (am_Fa) 124161d06d6bSBaptiste Daroussin n = n->child; 124261d06d6bSBaptiste Daroussin 124361d06d6bSBaptiste Daroussin while (NULL != n) { 124461d06d6bSBaptiste Daroussin font_push('I'); 124561d06d6bSBaptiste Daroussin if (am_Fa || NODE_SYNPRETTY & n->flags) 124661d06d6bSBaptiste Daroussin outflags |= MMAN_nbrword; 124761d06d6bSBaptiste Daroussin print_node(meta, n); 124861d06d6bSBaptiste Daroussin font_pop(); 124961d06d6bSBaptiste Daroussin if (NULL != (n = n->next)) 125061d06d6bSBaptiste Daroussin print_word(","); 125161d06d6bSBaptiste Daroussin } 125261d06d6bSBaptiste Daroussin return 0; 125361d06d6bSBaptiste Daroussin } 125461d06d6bSBaptiste Daroussin 125561d06d6bSBaptiste Daroussin static void 125661d06d6bSBaptiste Daroussin post_fa(DECL_ARGS) 125761d06d6bSBaptiste Daroussin { 12586d38604fSBaptiste Daroussin struct roff_node *nn; 125961d06d6bSBaptiste Daroussin 12606d38604fSBaptiste Daroussin if ((nn = roff_node_next(n)) != NULL && nn->tok == MDOC_Fa) 126161d06d6bSBaptiste Daroussin print_word(","); 126261d06d6bSBaptiste Daroussin } 126361d06d6bSBaptiste Daroussin 126461d06d6bSBaptiste Daroussin static int 126561d06d6bSBaptiste Daroussin pre_fd(DECL_ARGS) 126661d06d6bSBaptiste Daroussin { 126761d06d6bSBaptiste Daroussin pre_syn(n); 126861d06d6bSBaptiste Daroussin font_push('B'); 126961d06d6bSBaptiste Daroussin return 1; 127061d06d6bSBaptiste Daroussin } 127161d06d6bSBaptiste Daroussin 127261d06d6bSBaptiste Daroussin static void 127361d06d6bSBaptiste Daroussin post_fd(DECL_ARGS) 127461d06d6bSBaptiste Daroussin { 127561d06d6bSBaptiste Daroussin font_pop(); 127661d06d6bSBaptiste Daroussin outflags |= MMAN_br; 127761d06d6bSBaptiste Daroussin } 127861d06d6bSBaptiste Daroussin 127961d06d6bSBaptiste Daroussin static int 128061d06d6bSBaptiste Daroussin pre_fl(DECL_ARGS) 128161d06d6bSBaptiste Daroussin { 128261d06d6bSBaptiste Daroussin font_push('B'); 128361d06d6bSBaptiste Daroussin print_word("\\-"); 128461d06d6bSBaptiste Daroussin if (n->child != NULL) 128561d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 128661d06d6bSBaptiste Daroussin return 1; 128761d06d6bSBaptiste Daroussin } 128861d06d6bSBaptiste Daroussin 128961d06d6bSBaptiste Daroussin static void 129061d06d6bSBaptiste Daroussin post_fl(DECL_ARGS) 129161d06d6bSBaptiste Daroussin { 12926d38604fSBaptiste Daroussin struct roff_node *nn; 129361d06d6bSBaptiste Daroussin 129461d06d6bSBaptiste Daroussin font_pop(); 12956d38604fSBaptiste Daroussin if (n->child == NULL && 12966d38604fSBaptiste Daroussin ((nn = roff_node_next(n)) != NULL && 12976d38604fSBaptiste Daroussin nn->type != ROFFT_TEXT && 12986d38604fSBaptiste Daroussin (nn->flags & NODE_LINE) == 0)) 129961d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 130061d06d6bSBaptiste Daroussin } 130161d06d6bSBaptiste Daroussin 130261d06d6bSBaptiste Daroussin static int 130361d06d6bSBaptiste Daroussin pre_fn(DECL_ARGS) 130461d06d6bSBaptiste Daroussin { 130561d06d6bSBaptiste Daroussin 130661d06d6bSBaptiste Daroussin pre_syn(n); 130761d06d6bSBaptiste Daroussin 130861d06d6bSBaptiste Daroussin n = n->child; 130961d06d6bSBaptiste Daroussin if (NULL == n) 131061d06d6bSBaptiste Daroussin return 0; 131161d06d6bSBaptiste Daroussin 131261d06d6bSBaptiste Daroussin if (NODE_SYNPRETTY & n->flags) 131361d06d6bSBaptiste Daroussin print_block(".HP 4n", MMAN_nl); 131461d06d6bSBaptiste Daroussin 131561d06d6bSBaptiste Daroussin font_push('B'); 131661d06d6bSBaptiste Daroussin print_node(meta, n); 131761d06d6bSBaptiste Daroussin font_pop(); 131861d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 131961d06d6bSBaptiste Daroussin print_word("("); 132061d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 132161d06d6bSBaptiste Daroussin 132261d06d6bSBaptiste Daroussin n = n->next; 132361d06d6bSBaptiste Daroussin if (NULL != n) 132461d06d6bSBaptiste Daroussin pre_fa(meta, n); 132561d06d6bSBaptiste Daroussin return 0; 132661d06d6bSBaptiste Daroussin } 132761d06d6bSBaptiste Daroussin 132861d06d6bSBaptiste Daroussin static void 132961d06d6bSBaptiste Daroussin post_fn(DECL_ARGS) 133061d06d6bSBaptiste Daroussin { 133161d06d6bSBaptiste Daroussin 133261d06d6bSBaptiste Daroussin print_word(")"); 133361d06d6bSBaptiste Daroussin if (NODE_SYNPRETTY & n->flags) { 133461d06d6bSBaptiste Daroussin print_word(";"); 133561d06d6bSBaptiste Daroussin outflags |= MMAN_PP; 133661d06d6bSBaptiste Daroussin } 133761d06d6bSBaptiste Daroussin } 133861d06d6bSBaptiste Daroussin 133961d06d6bSBaptiste Daroussin static int 134061d06d6bSBaptiste Daroussin pre_fo(DECL_ARGS) 134161d06d6bSBaptiste Daroussin { 134261d06d6bSBaptiste Daroussin 134361d06d6bSBaptiste Daroussin switch (n->type) { 134461d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 134561d06d6bSBaptiste Daroussin pre_syn(n); 134661d06d6bSBaptiste Daroussin break; 134761d06d6bSBaptiste Daroussin case ROFFT_HEAD: 134861d06d6bSBaptiste Daroussin if (n->child == NULL) 134961d06d6bSBaptiste Daroussin return 0; 135061d06d6bSBaptiste Daroussin if (NODE_SYNPRETTY & n->flags) 135161d06d6bSBaptiste Daroussin print_block(".HP 4n", MMAN_nl); 135261d06d6bSBaptiste Daroussin font_push('B'); 135361d06d6bSBaptiste Daroussin break; 135461d06d6bSBaptiste Daroussin case ROFFT_BODY: 135561d06d6bSBaptiste Daroussin outflags &= ~(MMAN_spc | MMAN_nl); 135661d06d6bSBaptiste Daroussin print_word("("); 135761d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 135861d06d6bSBaptiste Daroussin break; 135961d06d6bSBaptiste Daroussin default: 136061d06d6bSBaptiste Daroussin break; 136161d06d6bSBaptiste Daroussin } 136261d06d6bSBaptiste Daroussin return 1; 136361d06d6bSBaptiste Daroussin } 136461d06d6bSBaptiste Daroussin 136561d06d6bSBaptiste Daroussin static void 136661d06d6bSBaptiste Daroussin post_fo(DECL_ARGS) 136761d06d6bSBaptiste Daroussin { 136861d06d6bSBaptiste Daroussin 136961d06d6bSBaptiste Daroussin switch (n->type) { 137061d06d6bSBaptiste Daroussin case ROFFT_HEAD: 137161d06d6bSBaptiste Daroussin if (n->child != NULL) 137261d06d6bSBaptiste Daroussin font_pop(); 137361d06d6bSBaptiste Daroussin break; 137461d06d6bSBaptiste Daroussin case ROFFT_BODY: 137561d06d6bSBaptiste Daroussin post_fn(meta, n); 137661d06d6bSBaptiste Daroussin break; 137761d06d6bSBaptiste Daroussin default: 137861d06d6bSBaptiste Daroussin break; 137961d06d6bSBaptiste Daroussin } 138061d06d6bSBaptiste Daroussin } 138161d06d6bSBaptiste Daroussin 138261d06d6bSBaptiste Daroussin static int 138361d06d6bSBaptiste Daroussin pre_Ft(DECL_ARGS) 138461d06d6bSBaptiste Daroussin { 138561d06d6bSBaptiste Daroussin 138661d06d6bSBaptiste Daroussin pre_syn(n); 138761d06d6bSBaptiste Daroussin font_push('I'); 138861d06d6bSBaptiste Daroussin return 1; 138961d06d6bSBaptiste Daroussin } 139061d06d6bSBaptiste Daroussin 139161d06d6bSBaptiste Daroussin static void 139261d06d6bSBaptiste Daroussin pre_ft(DECL_ARGS) 139361d06d6bSBaptiste Daroussin { 139461d06d6bSBaptiste Daroussin print_line(".ft", 0); 139561d06d6bSBaptiste Daroussin print_word(n->child->string); 139661d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 139761d06d6bSBaptiste Daroussin } 139861d06d6bSBaptiste Daroussin 139961d06d6bSBaptiste Daroussin static int 140061d06d6bSBaptiste Daroussin pre_in(DECL_ARGS) 140161d06d6bSBaptiste Daroussin { 140261d06d6bSBaptiste Daroussin 140361d06d6bSBaptiste Daroussin if (NODE_SYNPRETTY & n->flags) { 140461d06d6bSBaptiste Daroussin pre_syn(n); 140561d06d6bSBaptiste Daroussin font_push('B'); 140661d06d6bSBaptiste Daroussin print_word("#include <"); 140761d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 140861d06d6bSBaptiste Daroussin } else { 140961d06d6bSBaptiste Daroussin print_word("<"); 141061d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 141161d06d6bSBaptiste Daroussin font_push('I'); 141261d06d6bSBaptiste Daroussin } 141361d06d6bSBaptiste Daroussin return 1; 141461d06d6bSBaptiste Daroussin } 141561d06d6bSBaptiste Daroussin 141661d06d6bSBaptiste Daroussin static void 141761d06d6bSBaptiste Daroussin post_in(DECL_ARGS) 141861d06d6bSBaptiste Daroussin { 141961d06d6bSBaptiste Daroussin 142061d06d6bSBaptiste Daroussin if (NODE_SYNPRETTY & n->flags) { 142161d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 142261d06d6bSBaptiste Daroussin print_word(">"); 142361d06d6bSBaptiste Daroussin font_pop(); 142461d06d6bSBaptiste Daroussin outflags |= MMAN_br; 142561d06d6bSBaptiste Daroussin } else { 142661d06d6bSBaptiste Daroussin font_pop(); 142761d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 142861d06d6bSBaptiste Daroussin print_word(">"); 142961d06d6bSBaptiste Daroussin } 143061d06d6bSBaptiste Daroussin } 143161d06d6bSBaptiste Daroussin 143261d06d6bSBaptiste Daroussin static int 143361d06d6bSBaptiste Daroussin pre_it(DECL_ARGS) 143461d06d6bSBaptiste Daroussin { 143561d06d6bSBaptiste Daroussin const struct roff_node *bln; 143661d06d6bSBaptiste Daroussin 143761d06d6bSBaptiste Daroussin switch (n->type) { 143861d06d6bSBaptiste Daroussin case ROFFT_HEAD: 143961d06d6bSBaptiste Daroussin outflags |= MMAN_PP | MMAN_nl; 144061d06d6bSBaptiste Daroussin bln = n->parent->parent; 14416d38604fSBaptiste Daroussin if (bln->norm->Bl.comp == 0 || 14426d38604fSBaptiste Daroussin (n->parent->prev == NULL && 14436d38604fSBaptiste Daroussin roff_node_prev(bln->parent) == NULL)) 144461d06d6bSBaptiste Daroussin outflags |= MMAN_sp; 144561d06d6bSBaptiste Daroussin outflags &= ~MMAN_br; 144661d06d6bSBaptiste Daroussin switch (bln->norm->Bl.type) { 144761d06d6bSBaptiste Daroussin case LIST_item: 144861d06d6bSBaptiste Daroussin return 0; 144961d06d6bSBaptiste Daroussin case LIST_inset: 145061d06d6bSBaptiste Daroussin case LIST_diag: 145161d06d6bSBaptiste Daroussin case LIST_ohang: 145261d06d6bSBaptiste Daroussin if (bln->norm->Bl.type == LIST_diag) 145361d06d6bSBaptiste Daroussin print_line(".B \"", 0); 145461d06d6bSBaptiste Daroussin else 145561d06d6bSBaptiste Daroussin print_line(".BR \\& \"", 0); 145661d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 145761d06d6bSBaptiste Daroussin return 1; 145861d06d6bSBaptiste Daroussin case LIST_bullet: 145961d06d6bSBaptiste Daroussin case LIST_dash: 146061d06d6bSBaptiste Daroussin case LIST_hyphen: 146161d06d6bSBaptiste Daroussin print_width(&bln->norm->Bl, NULL); 146261d06d6bSBaptiste Daroussin TPremain = 0; 146361d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 146461d06d6bSBaptiste Daroussin font_push('B'); 146561d06d6bSBaptiste Daroussin if (LIST_bullet == bln->norm->Bl.type) 146661d06d6bSBaptiste Daroussin print_word("\\(bu"); 146761d06d6bSBaptiste Daroussin else 146861d06d6bSBaptiste Daroussin print_word("-"); 146961d06d6bSBaptiste Daroussin font_pop(); 147061d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 147161d06d6bSBaptiste Daroussin return 0; 147261d06d6bSBaptiste Daroussin case LIST_enum: 147361d06d6bSBaptiste Daroussin print_width(&bln->norm->Bl, NULL); 147461d06d6bSBaptiste Daroussin TPremain = 0; 147561d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 147661d06d6bSBaptiste Daroussin print_count(&bln->norm->Bl.count); 147761d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 147861d06d6bSBaptiste Daroussin return 0; 147961d06d6bSBaptiste Daroussin case LIST_hang: 148061d06d6bSBaptiste Daroussin print_width(&bln->norm->Bl, n->child); 148161d06d6bSBaptiste Daroussin TPremain = 0; 148261d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 148361d06d6bSBaptiste Daroussin return 1; 148461d06d6bSBaptiste Daroussin case LIST_tag: 148561d06d6bSBaptiste Daroussin print_width(&bln->norm->Bl, n->child); 148661d06d6bSBaptiste Daroussin putchar('\n'); 148761d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 148861d06d6bSBaptiste Daroussin return 1; 148961d06d6bSBaptiste Daroussin default: 149061d06d6bSBaptiste Daroussin return 1; 149161d06d6bSBaptiste Daroussin } 149261d06d6bSBaptiste Daroussin default: 149361d06d6bSBaptiste Daroussin break; 149461d06d6bSBaptiste Daroussin } 149561d06d6bSBaptiste Daroussin return 1; 149661d06d6bSBaptiste Daroussin } 149761d06d6bSBaptiste Daroussin 149861d06d6bSBaptiste Daroussin /* 149961d06d6bSBaptiste Daroussin * This function is called after closing out an indented block. 150061d06d6bSBaptiste Daroussin * If we are inside an enclosing list, restore its indentation. 150161d06d6bSBaptiste Daroussin */ 150261d06d6bSBaptiste Daroussin static void 150361d06d6bSBaptiste Daroussin mid_it(void) 150461d06d6bSBaptiste Daroussin { 150561d06d6bSBaptiste Daroussin char buf[24]; 150661d06d6bSBaptiste Daroussin 150761d06d6bSBaptiste Daroussin /* Nothing to do outside a list. */ 150861d06d6bSBaptiste Daroussin if (0 == Bl_stack_len || 0 == Bl_stack[Bl_stack_len - 1]) 150961d06d6bSBaptiste Daroussin return; 151061d06d6bSBaptiste Daroussin 151161d06d6bSBaptiste Daroussin /* The indentation has already been set up. */ 151261d06d6bSBaptiste Daroussin if (Bl_stack_post[Bl_stack_len - 1]) 151361d06d6bSBaptiste Daroussin return; 151461d06d6bSBaptiste Daroussin 151561d06d6bSBaptiste Daroussin /* Restore the indentation of the enclosing list. */ 151661d06d6bSBaptiste Daroussin print_line(".RS", MMAN_Bk_susp); 151761d06d6bSBaptiste Daroussin (void)snprintf(buf, sizeof(buf), "%dn", 151861d06d6bSBaptiste Daroussin Bl_stack[Bl_stack_len - 1]); 151961d06d6bSBaptiste Daroussin print_word(buf); 152061d06d6bSBaptiste Daroussin 1521*c1c95addSBrooks Davis /* Remember to close out this .RS block later. */ 152261d06d6bSBaptiste Daroussin Bl_stack_post[Bl_stack_len - 1] = 1; 152361d06d6bSBaptiste Daroussin } 152461d06d6bSBaptiste Daroussin 152561d06d6bSBaptiste Daroussin static void 152661d06d6bSBaptiste Daroussin post_it(DECL_ARGS) 152761d06d6bSBaptiste Daroussin { 152861d06d6bSBaptiste Daroussin const struct roff_node *bln; 152961d06d6bSBaptiste Daroussin 153061d06d6bSBaptiste Daroussin bln = n->parent->parent; 153161d06d6bSBaptiste Daroussin 153261d06d6bSBaptiste Daroussin switch (n->type) { 153361d06d6bSBaptiste Daroussin case ROFFT_HEAD: 153461d06d6bSBaptiste Daroussin switch (bln->norm->Bl.type) { 153561d06d6bSBaptiste Daroussin case LIST_diag: 153661d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 153761d06d6bSBaptiste Daroussin print_word("\\ "); 153861d06d6bSBaptiste Daroussin break; 153961d06d6bSBaptiste Daroussin case LIST_ohang: 154061d06d6bSBaptiste Daroussin outflags |= MMAN_br; 154161d06d6bSBaptiste Daroussin break; 154261d06d6bSBaptiste Daroussin default: 154361d06d6bSBaptiste Daroussin break; 154461d06d6bSBaptiste Daroussin } 154561d06d6bSBaptiste Daroussin break; 154661d06d6bSBaptiste Daroussin case ROFFT_BODY: 154761d06d6bSBaptiste Daroussin switch (bln->norm->Bl.type) { 154861d06d6bSBaptiste Daroussin case LIST_bullet: 154961d06d6bSBaptiste Daroussin case LIST_dash: 155061d06d6bSBaptiste Daroussin case LIST_hyphen: 155161d06d6bSBaptiste Daroussin case LIST_enum: 155261d06d6bSBaptiste Daroussin case LIST_hang: 155361d06d6bSBaptiste Daroussin case LIST_tag: 155461d06d6bSBaptiste Daroussin assert(Bl_stack_len); 155561d06d6bSBaptiste Daroussin Bl_stack[--Bl_stack_len] = 0; 155661d06d6bSBaptiste Daroussin 155761d06d6bSBaptiste Daroussin /* 155861d06d6bSBaptiste Daroussin * Our indentation had to be restored 155961d06d6bSBaptiste Daroussin * after a child display or child list. 156061d06d6bSBaptiste Daroussin * Close out that indentation block now. 156161d06d6bSBaptiste Daroussin */ 156261d06d6bSBaptiste Daroussin if (Bl_stack_post[Bl_stack_len]) { 156361d06d6bSBaptiste Daroussin print_line(".RE", MMAN_nl); 156461d06d6bSBaptiste Daroussin Bl_stack_post[Bl_stack_len] = 0; 156561d06d6bSBaptiste Daroussin } 156661d06d6bSBaptiste Daroussin break; 156761d06d6bSBaptiste Daroussin case LIST_column: 156861d06d6bSBaptiste Daroussin if (NULL != n->next) { 156961d06d6bSBaptiste Daroussin putchar('\t'); 157061d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 157161d06d6bSBaptiste Daroussin } 157261d06d6bSBaptiste Daroussin break; 157361d06d6bSBaptiste Daroussin default: 157461d06d6bSBaptiste Daroussin break; 157561d06d6bSBaptiste Daroussin } 157661d06d6bSBaptiste Daroussin break; 157761d06d6bSBaptiste Daroussin default: 157861d06d6bSBaptiste Daroussin break; 157961d06d6bSBaptiste Daroussin } 158061d06d6bSBaptiste Daroussin } 158161d06d6bSBaptiste Daroussin 158261d06d6bSBaptiste Daroussin static void 158361d06d6bSBaptiste Daroussin post_lb(DECL_ARGS) 158461d06d6bSBaptiste Daroussin { 158561d06d6bSBaptiste Daroussin 158661d06d6bSBaptiste Daroussin if (SEC_LIBRARY == n->sec) 158761d06d6bSBaptiste Daroussin outflags |= MMAN_br; 158861d06d6bSBaptiste Daroussin } 158961d06d6bSBaptiste Daroussin 159061d06d6bSBaptiste Daroussin static int 159161d06d6bSBaptiste Daroussin pre_lk(DECL_ARGS) 159261d06d6bSBaptiste Daroussin { 159361d06d6bSBaptiste Daroussin const struct roff_node *link, *descr, *punct; 159461d06d6bSBaptiste Daroussin 159561d06d6bSBaptiste Daroussin if ((link = n->child) == NULL) 159661d06d6bSBaptiste Daroussin return 0; 159761d06d6bSBaptiste Daroussin 159861d06d6bSBaptiste Daroussin /* Find beginning of trailing punctuation. */ 159961d06d6bSBaptiste Daroussin punct = n->last; 160061d06d6bSBaptiste Daroussin while (punct != link && punct->flags & NODE_DELIMC) 160161d06d6bSBaptiste Daroussin punct = punct->prev; 160261d06d6bSBaptiste Daroussin punct = punct->next; 160361d06d6bSBaptiste Daroussin 160461d06d6bSBaptiste Daroussin /* Link text. */ 160561d06d6bSBaptiste Daroussin if ((descr = link->next) != NULL && descr != punct) { 160661d06d6bSBaptiste Daroussin font_push('I'); 160761d06d6bSBaptiste Daroussin while (descr != punct) { 160861d06d6bSBaptiste Daroussin print_word(descr->string); 160961d06d6bSBaptiste Daroussin descr = descr->next; 161061d06d6bSBaptiste Daroussin } 161161d06d6bSBaptiste Daroussin font_pop(); 161261d06d6bSBaptiste Daroussin print_word(":"); 161361d06d6bSBaptiste Daroussin } 161461d06d6bSBaptiste Daroussin 161561d06d6bSBaptiste Daroussin /* Link target. */ 161661d06d6bSBaptiste Daroussin font_push('B'); 161761d06d6bSBaptiste Daroussin print_word(link->string); 161861d06d6bSBaptiste Daroussin font_pop(); 161961d06d6bSBaptiste Daroussin 162061d06d6bSBaptiste Daroussin /* Trailing punctuation. */ 162161d06d6bSBaptiste Daroussin while (punct != NULL) { 162261d06d6bSBaptiste Daroussin print_word(punct->string); 162361d06d6bSBaptiste Daroussin punct = punct->next; 162461d06d6bSBaptiste Daroussin } 162561d06d6bSBaptiste Daroussin return 0; 162661d06d6bSBaptiste Daroussin } 162761d06d6bSBaptiste Daroussin 162861d06d6bSBaptiste Daroussin static void 162961d06d6bSBaptiste Daroussin pre_onearg(DECL_ARGS) 163061d06d6bSBaptiste Daroussin { 163161d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 163261d06d6bSBaptiste Daroussin print_word("."); 163361d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 163461d06d6bSBaptiste Daroussin print_word(roff_name[n->tok]); 163561d06d6bSBaptiste Daroussin if (n->child != NULL) 163661d06d6bSBaptiste Daroussin print_word(n->child->string); 163761d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 163861d06d6bSBaptiste Daroussin if (n->tok == ROFF_ce) 163961d06d6bSBaptiste Daroussin for (n = n->child->next; n != NULL; n = n->next) 164061d06d6bSBaptiste Daroussin print_node(meta, n); 164161d06d6bSBaptiste Daroussin } 164261d06d6bSBaptiste Daroussin 164361d06d6bSBaptiste Daroussin static int 164461d06d6bSBaptiste Daroussin pre_li(DECL_ARGS) 164561d06d6bSBaptiste Daroussin { 164661d06d6bSBaptiste Daroussin font_push('R'); 164761d06d6bSBaptiste Daroussin return 1; 164861d06d6bSBaptiste Daroussin } 164961d06d6bSBaptiste Daroussin 165061d06d6bSBaptiste Daroussin static int 165161d06d6bSBaptiste Daroussin pre_nm(DECL_ARGS) 165261d06d6bSBaptiste Daroussin { 165361d06d6bSBaptiste Daroussin char *name; 165461d06d6bSBaptiste Daroussin 16556d38604fSBaptiste Daroussin switch (n->type) { 16566d38604fSBaptiste Daroussin case ROFFT_BLOCK: 165761d06d6bSBaptiste Daroussin outflags |= MMAN_Bk; 165861d06d6bSBaptiste Daroussin pre_syn(n); 165961d06d6bSBaptiste Daroussin return 1; 16606d38604fSBaptiste Daroussin case ROFFT_HEAD: 16616d38604fSBaptiste Daroussin case ROFFT_ELEM: 16626d38604fSBaptiste Daroussin break; 16636d38604fSBaptiste Daroussin default: 16646d38604fSBaptiste Daroussin return 1; 16656d38604fSBaptiste Daroussin } 166661d06d6bSBaptiste Daroussin name = n->child == NULL ? NULL : n->child->string; 16676d38604fSBaptiste Daroussin if (name == NULL) 166861d06d6bSBaptiste Daroussin return 0; 166961d06d6bSBaptiste Daroussin if (n->type == ROFFT_HEAD) { 16706d38604fSBaptiste Daroussin if (roff_node_prev(n->parent) == NULL) 167161d06d6bSBaptiste Daroussin outflags |= MMAN_sp; 167261d06d6bSBaptiste Daroussin print_block(".HP", 0); 167361d06d6bSBaptiste Daroussin printf(" %dn", man_strlen(name) + 1); 167461d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 167561d06d6bSBaptiste Daroussin } 167661d06d6bSBaptiste Daroussin font_push('B'); 167761d06d6bSBaptiste Daroussin return 1; 167861d06d6bSBaptiste Daroussin } 167961d06d6bSBaptiste Daroussin 168061d06d6bSBaptiste Daroussin static void 168161d06d6bSBaptiste Daroussin post_nm(DECL_ARGS) 168261d06d6bSBaptiste Daroussin { 168361d06d6bSBaptiste Daroussin switch (n->type) { 168461d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 168561d06d6bSBaptiste Daroussin outflags &= ~MMAN_Bk; 168661d06d6bSBaptiste Daroussin break; 168761d06d6bSBaptiste Daroussin case ROFFT_HEAD: 168861d06d6bSBaptiste Daroussin case ROFFT_ELEM: 168961d06d6bSBaptiste Daroussin if (n->child != NULL && n->child->string != NULL) 169061d06d6bSBaptiste Daroussin font_pop(); 169161d06d6bSBaptiste Daroussin break; 169261d06d6bSBaptiste Daroussin default: 169361d06d6bSBaptiste Daroussin break; 169461d06d6bSBaptiste Daroussin } 169561d06d6bSBaptiste Daroussin } 169661d06d6bSBaptiste Daroussin 169761d06d6bSBaptiste Daroussin static int 169861d06d6bSBaptiste Daroussin pre_no(DECL_ARGS) 169961d06d6bSBaptiste Daroussin { 170061d06d6bSBaptiste Daroussin outflags |= MMAN_spc_force; 170161d06d6bSBaptiste Daroussin return 1; 170261d06d6bSBaptiste Daroussin } 170361d06d6bSBaptiste Daroussin 17047295610fSBaptiste Daroussin static void 17057295610fSBaptiste Daroussin pre_noarg(DECL_ARGS) 17067295610fSBaptiste Daroussin { 17077295610fSBaptiste Daroussin outflags |= MMAN_nl; 17087295610fSBaptiste Daroussin print_word("."); 17097295610fSBaptiste Daroussin outflags &= ~MMAN_spc; 17107295610fSBaptiste Daroussin print_word(roff_name[n->tok]); 17117295610fSBaptiste Daroussin outflags |= MMAN_nl; 17127295610fSBaptiste Daroussin } 17137295610fSBaptiste Daroussin 171461d06d6bSBaptiste Daroussin static int 171561d06d6bSBaptiste Daroussin pre_ns(DECL_ARGS) 171661d06d6bSBaptiste Daroussin { 171761d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 171861d06d6bSBaptiste Daroussin return 0; 171961d06d6bSBaptiste Daroussin } 172061d06d6bSBaptiste Daroussin 172161d06d6bSBaptiste Daroussin static void 172261d06d6bSBaptiste Daroussin post_pf(DECL_ARGS) 172361d06d6bSBaptiste Daroussin { 172461d06d6bSBaptiste Daroussin 172561d06d6bSBaptiste Daroussin if ( ! (n->next == NULL || n->next->flags & NODE_LINE)) 172661d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 172761d06d6bSBaptiste Daroussin } 172861d06d6bSBaptiste Daroussin 172961d06d6bSBaptiste Daroussin static int 173061d06d6bSBaptiste Daroussin pre_pp(DECL_ARGS) 173161d06d6bSBaptiste Daroussin { 173261d06d6bSBaptiste Daroussin 173361d06d6bSBaptiste Daroussin if (MDOC_It != n->parent->tok) 173461d06d6bSBaptiste Daroussin outflags |= MMAN_PP; 173561d06d6bSBaptiste Daroussin outflags |= MMAN_sp | MMAN_nl; 173661d06d6bSBaptiste Daroussin outflags &= ~MMAN_br; 173761d06d6bSBaptiste Daroussin return 0; 173861d06d6bSBaptiste Daroussin } 173961d06d6bSBaptiste Daroussin 174061d06d6bSBaptiste Daroussin static int 174161d06d6bSBaptiste Daroussin pre_rs(DECL_ARGS) 174261d06d6bSBaptiste Daroussin { 174361d06d6bSBaptiste Daroussin 174461d06d6bSBaptiste Daroussin if (SEC_SEE_ALSO == n->sec) { 174561d06d6bSBaptiste Daroussin outflags |= MMAN_PP | MMAN_sp | MMAN_nl; 174661d06d6bSBaptiste Daroussin outflags &= ~MMAN_br; 174761d06d6bSBaptiste Daroussin } 174861d06d6bSBaptiste Daroussin return 1; 174961d06d6bSBaptiste Daroussin } 175061d06d6bSBaptiste Daroussin 175161d06d6bSBaptiste Daroussin static int 175261d06d6bSBaptiste Daroussin pre_skip(DECL_ARGS) 175361d06d6bSBaptiste Daroussin { 175461d06d6bSBaptiste Daroussin 175561d06d6bSBaptiste Daroussin return 0; 175661d06d6bSBaptiste Daroussin } 175761d06d6bSBaptiste Daroussin 175861d06d6bSBaptiste Daroussin static int 175961d06d6bSBaptiste Daroussin pre_sm(DECL_ARGS) 176061d06d6bSBaptiste Daroussin { 176161d06d6bSBaptiste Daroussin 176261d06d6bSBaptiste Daroussin if (NULL == n->child) 176361d06d6bSBaptiste Daroussin outflags ^= MMAN_Sm; 176461d06d6bSBaptiste Daroussin else if (0 == strcmp("on", n->child->string)) 176561d06d6bSBaptiste Daroussin outflags |= MMAN_Sm; 176661d06d6bSBaptiste Daroussin else 176761d06d6bSBaptiste Daroussin outflags &= ~MMAN_Sm; 176861d06d6bSBaptiste Daroussin 176961d06d6bSBaptiste Daroussin if (MMAN_Sm & outflags) 177061d06d6bSBaptiste Daroussin outflags |= MMAN_spc; 177161d06d6bSBaptiste Daroussin 177261d06d6bSBaptiste Daroussin return 0; 177361d06d6bSBaptiste Daroussin } 177461d06d6bSBaptiste Daroussin 177561d06d6bSBaptiste Daroussin static void 177661d06d6bSBaptiste Daroussin pre_sp(DECL_ARGS) 177761d06d6bSBaptiste Daroussin { 177861d06d6bSBaptiste Daroussin if (outflags & MMAN_PP) { 177961d06d6bSBaptiste Daroussin outflags &= ~MMAN_PP; 178061d06d6bSBaptiste Daroussin print_line(".PP", 0); 178161d06d6bSBaptiste Daroussin } else { 178261d06d6bSBaptiste Daroussin print_line(".sp", 0); 178361d06d6bSBaptiste Daroussin if (n->child != NULL) 178461d06d6bSBaptiste Daroussin print_word(n->child->string); 178561d06d6bSBaptiste Daroussin } 178661d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 178761d06d6bSBaptiste Daroussin } 178861d06d6bSBaptiste Daroussin 178961d06d6bSBaptiste Daroussin static int 179061d06d6bSBaptiste Daroussin pre_sy(DECL_ARGS) 179161d06d6bSBaptiste Daroussin { 179261d06d6bSBaptiste Daroussin 179361d06d6bSBaptiste Daroussin font_push('B'); 179461d06d6bSBaptiste Daroussin return 1; 179561d06d6bSBaptiste Daroussin } 179661d06d6bSBaptiste Daroussin 179761d06d6bSBaptiste Daroussin static void 179861d06d6bSBaptiste Daroussin pre_ta(DECL_ARGS) 179961d06d6bSBaptiste Daroussin { 180061d06d6bSBaptiste Daroussin print_line(".ta", 0); 180161d06d6bSBaptiste Daroussin for (n = n->child; n != NULL; n = n->next) 180261d06d6bSBaptiste Daroussin print_word(n->string); 180361d06d6bSBaptiste Daroussin outflags |= MMAN_nl; 180461d06d6bSBaptiste Daroussin } 180561d06d6bSBaptiste Daroussin 180661d06d6bSBaptiste Daroussin static int 180761d06d6bSBaptiste Daroussin pre_vt(DECL_ARGS) 180861d06d6bSBaptiste Daroussin { 180961d06d6bSBaptiste Daroussin 181061d06d6bSBaptiste Daroussin if (NODE_SYNPRETTY & n->flags) { 181161d06d6bSBaptiste Daroussin switch (n->type) { 181261d06d6bSBaptiste Daroussin case ROFFT_BLOCK: 181361d06d6bSBaptiste Daroussin pre_syn(n); 181461d06d6bSBaptiste Daroussin return 1; 181561d06d6bSBaptiste Daroussin case ROFFT_BODY: 181661d06d6bSBaptiste Daroussin break; 181761d06d6bSBaptiste Daroussin default: 181861d06d6bSBaptiste Daroussin return 0; 181961d06d6bSBaptiste Daroussin } 182061d06d6bSBaptiste Daroussin } 182161d06d6bSBaptiste Daroussin font_push('I'); 182261d06d6bSBaptiste Daroussin return 1; 182361d06d6bSBaptiste Daroussin } 182461d06d6bSBaptiste Daroussin 182561d06d6bSBaptiste Daroussin static void 182661d06d6bSBaptiste Daroussin post_vt(DECL_ARGS) 182761d06d6bSBaptiste Daroussin { 182861d06d6bSBaptiste Daroussin 182961d06d6bSBaptiste Daroussin if (n->flags & NODE_SYNPRETTY && n->type != ROFFT_BODY) 183061d06d6bSBaptiste Daroussin return; 183161d06d6bSBaptiste Daroussin font_pop(); 183261d06d6bSBaptiste Daroussin } 183361d06d6bSBaptiste Daroussin 183461d06d6bSBaptiste Daroussin static int 183561d06d6bSBaptiste Daroussin pre_xr(DECL_ARGS) 183661d06d6bSBaptiste Daroussin { 183761d06d6bSBaptiste Daroussin 183861d06d6bSBaptiste Daroussin n = n->child; 183961d06d6bSBaptiste Daroussin if (NULL == n) 184061d06d6bSBaptiste Daroussin return 0; 184161d06d6bSBaptiste Daroussin print_node(meta, n); 184261d06d6bSBaptiste Daroussin n = n->next; 184361d06d6bSBaptiste Daroussin if (NULL == n) 184461d06d6bSBaptiste Daroussin return 0; 184561d06d6bSBaptiste Daroussin outflags &= ~MMAN_spc; 184661d06d6bSBaptiste Daroussin print_word("("); 184761d06d6bSBaptiste Daroussin print_node(meta, n); 184861d06d6bSBaptiste Daroussin print_word(")"); 184961d06d6bSBaptiste Daroussin return 0; 185061d06d6bSBaptiste Daroussin } 1851