diff options
author | Ingo Schwarze <schwarze@openbsd.org> | 2011-01-30 16:05:37 +0000 |
---|---|---|
committer | Ingo Schwarze <schwarze@openbsd.org> | 2011-01-30 16:05:37 +0000 |
commit | b60f8021eeb3855308829414f20eca4897096fa7 (patch) | |
tree | fde633a186759120328c6e6ae9c0e5f2bd8fbe5a /out.c | |
parent | 739c1eaf9cb6f5ff01a9c080620dfb1542000215 (diff) | |
download | mandoc-b60f8021eeb3855308829414f20eca4897096fa7.tar.gz mandoc-b60f8021eeb3855308829414f20eca4897096fa7.tar.zst mandoc-b60f8021eeb3855308829414f20eca4897096fa7.zip |
Implement the \N'number' (numbered character) roff escape sequence.
Don't use it in new manuals, it is inherently non-portable, but we
need it for backward-compatibility with existing manuals, for example
in Xenocara driver pages.
ok kristaps@ jmc@ and tested by Matthieu Herrb (matthieu at openbsd dot org)
Diffstat (limited to 'out.c')
-rw-r--r-- | out.c | 46 |
1 files changed, 45 insertions, 1 deletions
@@ -1,6 +1,7 @@ -/* $Id: out.c,v 1.36 2011/01/25 12:07:30 schwarze Exp $ */ +/* $Id: out.c,v 1.37 2011/01/30 16:05:37 schwarze Exp $ */ /* * Copyright (c) 2009, 2010, 2011 Kristaps Dzonsons <kristaps@bsd.lv> + * Copyright (c) 2011 Ingo Schwarze <schwarze@openbsd.org> * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -251,6 +252,49 @@ a2roffdeco(enum roffdeco *d, const char **word, size_t *sz) break; } break; + + case ('N'): + + /* + * Sequence of characters: backslash, 'N' (i = 0), + * starting delimiter (i = 1), character number (i = 2). + */ + + *word = wp + 2; + *sz = 0; + + /* + * Cannot use a digit as a starting delimiter; + * but skip the digit anyway. + */ + + if (isdigit((int)wp[1])) + return(2); + + /* + * Any non-digit terminates the character number. + * That is, the terminating delimiter need not + * match the starting delimiter. + */ + + for (i = 2; isdigit((int)wp[i]); i++) + (*sz)++; + + /* + * This is only a numbered character + * if the character number has at least one digit. + */ + + if (*sz) + *d = DECO_NUMBERED; + + /* + * Skip the terminating delimiter, even if it does not + * match, and even if there is no character number. + */ + + return(++i); + case ('h'): /* FALLTHROUGH */ case ('v'): |