From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from krisdoz.my.domain (kristaps@localhost [127.0.0.1]) by krisdoz.my.domain (8.14.5/8.14.5) with ESMTP id q5CKL5K1006445 for ; Tue, 12 Jun 2012 16:21:05 -0400 (EDT) Received: (from kristaps@localhost) by krisdoz.my.domain (8.14.5/8.14.3/Submit) id q5CKL4bJ021546; Tue, 12 Jun 2012 16:21:04 -0400 (EDT) Date: Tue, 12 Jun 2012 16:21:04 -0400 (EDT) Message-Id: <201206122021.q5CKL4bJ021546@krisdoz.my.domain> X-Mailinglist: mdocml-source Reply-To: source@mdocml.bsd.lv MIME-Version: 1.0 From: kristaps@mdocml.bsd.lv To: source@mdocml.bsd.lv Subject: mdocml: Add `cc' support. X-Mailer: activitymail 1.26, http://search.cpan.org/dist/activitymail/ Content-Type: text/plain; charset=utf-8 Log Message: ----------- Add `cc' support. This was reported by espie@ and in the TODO. Caveat: `cc' has buggy behaviour when invoked in groff(1) and followed by a line-breaking control character macro, e.g., in a -man doc, .cc | .B foo 'B foo |cc 'B foo will cause groff(1) to behave properly for `.B' but inline the macro definition for `B' when invoked with the line-breaking macro. Modified Files: -------------- mdocml: TODO libmandoc.h man.c mandoc.c mdoc.c roff.7 roff.c Revision Data ------------- Index: mandoc.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mandoc.c,v retrieving revision 1.65 retrieving revision 1.66 diff -Lmandoc.c -Lmandoc.c -u -p -r1.65 -r1.66 --- mandoc.c +++ mandoc.c @@ -604,32 +604,6 @@ mandoc_eos(const char *p, size_t sz, int } /* - * Find out whether a line is a macro line or not. If it is, adjust the - * current position and return one; if it isn't, return zero and don't - * change the current position. - */ -int -mandoc_getcontrol(const char *cp, int *ppos) -{ - int pos; - - pos = *ppos; - - if ('\\' == cp[pos] && '.' == cp[pos + 1]) - pos += 2; - else if ('.' == cp[pos] || '\'' == cp[pos]) - pos++; - else - return(0); - - while (' ' == cp[pos] || '\t' == cp[pos]) - pos++; - - *ppos = pos; - return(1); -} - -/* * Convert a string to a long that may not be <0. * If the string is invalid, or is less than 0, return -1. */ Index: roff.7 =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/roff.7,v retrieving revision 1.38 retrieving revision 1.39 diff -Lroff.7 -Lroff.7 -u -p -r1.38 -r1.39 --- roff.7 +++ roff.7 @@ -417,6 +417,18 @@ The syntax of this request is the same a It is currently ignored by .Xr mandoc 1 , as are its children. +.Ss \&cc +Changes the control character. +Its syntax is as follows: +.Bd -literal -offset indent +.Pf . Cm \&cc Op Ar c +.Ed +.Pp +If +.Ar c +is not specified, the control character is reset to +.Sq \&. . +Trailing characters are ignored. .Ss \&de Define a .Nm Index: TODO =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/TODO,v retrieving revision 1.135 retrieving revision 1.136 diff -LTODO -LTODO -u -p -r1.135 -r1.136 --- TODO +++ TODO @@ -23,9 +23,6 @@ .ad -- re-enable adjustment without changing the mode Adjustment mode is ignored while in no-fill mode (.nf). -- .cc (change control character) occurs in sqlite3(1) - reported by espie@ Sat, 14 Apr 2012 15:35:38 +0200 - - .it (line traps) occur in mysql(1), yasm_arch(7) generated by DocBook XSL Stylesheets v1.71.1 reported by brad@ Sat, 15 Jan 2011 15:48:18 -0500 Index: man.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/man.c,v retrieving revision 1.116 retrieving revision 1.117 diff -Lman.c -Lman.c -u -p -r1.116 -r1.117 --- man.c +++ man.c @@ -131,7 +131,7 @@ man_parseln(struct man *m, int ln, char assert( ! (MAN_HALT & m->flags)); - return (mandoc_getcontrol(buf, &offs) ? + return (roff_getcontrol(m->roff, buf, &offs) ? man_pmacro(m, ln, buf, offs) : man_ptext(m, ln, buf, offs)); } Index: mdoc.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/mdoc.c,v retrieving revision 1.197 retrieving revision 1.198 diff -Lmdoc.c -Lmdoc.c -u -p -r1.197 -r1.198 --- mdoc.c +++ mdoc.c @@ -302,7 +302,7 @@ mdoc_parseln(struct mdoc *m, int ln, cha m->flags &= ~MDOC_SYNOPSIS; } - return(mandoc_getcontrol(buf, &offs) ? + return(roff_getcontrol(m->roff, buf, &offs) ? mdoc_pmacro(m, ln, buf, offs) : mdoc_ptext(m, ln, buf, offs)); } Index: roff.c =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/roff.c,v retrieving revision 1.173 retrieving revision 1.174 diff -Lroff.c -Lroff.c -u -p -r1.173 -r1.174 --- roff.c +++ roff.c @@ -39,6 +39,7 @@ enum rofft { ROFF_am, ROFF_ami, ROFF_am1, + ROFF_cc, ROFF_de, ROFF_dei, ROFF_de1, @@ -105,6 +106,7 @@ struct roff { struct mparse *parse; /* parse point */ struct roffnode *last; /* leaf of stack */ enum roffrule rstack[RSTACK_MAX]; /* stack of !`ie' rules */ + char control; /* control character */ int rstackpos; /* position in rstack */ struct reg regs[REG__MAX]; struct roffkv *strtab; /* user-defined strings & macros */ @@ -169,6 +171,7 @@ static enum rofferr roff_block(ROFF_ARG static enum rofferr roff_block_text(ROFF_ARGS); static enum rofferr roff_block_sub(ROFF_ARGS); static enum rofferr roff_cblock(ROFF_ARGS); +static enum rofferr roff_cc(ROFF_ARGS); static enum rofferr roff_ccond(ROFF_ARGS); static enum rofferr roff_cond(ROFF_ARGS); static enum rofferr roff_cond_text(ROFF_ARGS); @@ -215,6 +218,7 @@ static struct roffmac roffs[ROFF_MAX] = { "am", roff_block, roff_block_text, roff_block_sub, 0, NULL }, { "ami", roff_block, roff_block_text, roff_block_sub, 0, NULL }, { "am1", roff_block, roff_block_text, roff_block_sub, 0, NULL }, + { "cc", roff_cc, NULL, NULL, 0, NULL }, { "de", roff_block, roff_block_text, roff_block_sub, 0, NULL }, { "dei", roff_block, roff_block_text, roff_block_sub, 0, NULL }, { "de1", roff_block, roff_block_text, roff_block_sub, 0, NULL }, @@ -392,6 +396,7 @@ roff_reset(struct roff *r) roff_free1(r); + r->control = 0; memset(&r->regs, 0, sizeof(struct reg) * REG__MAX); for (i = 0; i < PREDEFS_MAX; i++) @@ -611,7 +616,7 @@ roff_parseln(struct roff *r, int ln, cha assert(ROFF_CONT == e); ppos = pos; - ctl = mandoc_getcontrol(*bufp, &pos); + ctl = roff_getcontrol(r, *bufp, &pos); /* * First, if a scope is open and we're not a macro, pass the @@ -1363,6 +1368,23 @@ roff_TS(ROFF_ARGS) /* ARGSUSED */ static enum rofferr +roff_cc(ROFF_ARGS) +{ + const char *p; + + p = *bufp + pos; + + if ('\0' == *p || '.' == (r->control = *p++)) + r->control = 0; + + if ('\0' != *p) + mandoc_msg(MANDOCERR_ARGCOUNT, r->parse, ln, ppos, NULL); + + return(ROFF_IGN); +} + +/* ARGSUSED */ +static enum rofferr roff_tr(ROFF_ARGS) { const char *p, *first, *second; @@ -1756,4 +1778,39 @@ roff_strdup(const struct roff *r, const res[(int)ssz] = '\0'; return(res); +} + +/* + * Find out whether a line is a macro line or not. + * If it is, adjust the current position and return one; if it isn't, + * return zero and don't change the current position. + * If the control character has been set with `.cc', then let that grain + * precedence. + * This is slighly contrary to groff, where using the non-breaking + * control character when `cc' has been invoked will cause the + * non-breaking macro contents to be printed verbatim. + */ +int +roff_getcontrol(const struct roff *r, const char *cp, int *ppos) +{ + int pos; + + pos = *ppos; + + if (0 != r->control && cp[pos] == r->control) + pos++; + else if (0 != r->control) + return(0); + else if ('\\' == cp[pos] && '.' == cp[pos + 1]) + pos += 2; + else if ('.' == cp[pos] || '\'' == cp[pos]) + pos++; + else + return(0); + + while (' ' == cp[pos] || '\t' == cp[pos]) + pos++; + + *ppos = pos; + return(1); } Index: libmandoc.h =================================================================== RCS file: /usr/vhosts/mdocml.bsd.lv/cvs/mdocml/libmandoc.h,v retrieving revision 1.30 retrieving revision 1.31 diff -Llibmandoc.h -Llibmandoc.h -u -p -r1.30 -r1.31 --- libmandoc.h +++ libmandoc.h @@ -47,7 +47,6 @@ void mandoc_vmsg(enum mandocerr, struc char *mandoc_getarg(struct mparse *, char **, int, int *); char *mandoc_normdate(struct mparse *, char *, int, int); int mandoc_eos(const char *, size_t, int); -int mandoc_getcontrol(const char *, int *); int mandoc_strntoi(const char *, size_t, int); const char *mandoc_a2msec(const char*); @@ -77,6 +76,8 @@ int roff_regisset(const struct roff *, unsigned int roff_regget(const struct roff *, enum regs); void roff_regunset(struct roff *, enum regs); char *roff_strdup(const struct roff *, const char *); +int roff_getcontrol(const struct roff *, + const char *, int *); #if 0 char roff_eqndelim(const struct roff *); void roff_openeqn(struct roff *, const char *, -- To unsubscribe send an email to source+unsubscribe@mdocml.bsd.lv