version 1.5, 2008/12/01 16:01:28 |
version 1.6, 2008/12/02 00:10:37 |
|
|
#include "private.h" |
#include "private.h" |
|
|
#define MAXINDENT 8 |
#define MAXINDENT 8 |
#define COLUMNS 60 |
#define COLUMNS 72 |
|
|
#ifdef __linux__ /* FIXME */ |
#ifdef __linux__ /* FIXME */ |
#define strlcat strncat |
#define strlcat strncat |
#endif |
#endif |
|
|
|
enum md_ns { |
|
MD_NS_BLOCK, |
|
MD_NS_INLINE, |
|
MD_NS_DEFAULT |
|
}; |
|
|
enum md_tok { |
enum md_tok { |
MD_BLKIN, |
MD_BLKIN, |
MD_BLKOUT, |
MD_BLKOUT, |
Line 78 static int mbuf_nputstring(struct md_xml *, |
|
Line 84 static int mbuf_nputstring(struct md_xml *, |
|
static int mbuf_puts(struct md_xml *, const char *); |
static int mbuf_puts(struct md_xml *, const char *); |
static int mbuf_nputs(struct md_xml *, |
static int mbuf_nputs(struct md_xml *, |
const char *, size_t); |
const char *, size_t); |
|
static int mbuf_begintag(struct md_xml *, const char *, |
|
enum md_ns, int *, char **); |
|
static int mbuf_endtag(struct md_xml *, |
|
const char *, enum md_ns); |
|
|
|
|
static int |
static int |
|
mbuf_begintag(struct md_xml *p, const char *name, enum md_ns ns, |
|
int *argc, char **argv) |
|
{ |
|
int i; |
|
|
|
if ( ! mbuf_nputs(p, "<", 1)) |
|
return(0); |
|
|
|
switch (ns) { |
|
case (MD_NS_BLOCK): |
|
if ( ! mbuf_nputs(p, "block:", 6)) |
|
return(0); |
|
break; |
|
case (MD_NS_INLINE): |
|
if ( ! mbuf_nputs(p, "inline:", 7)) |
|
return(0); |
|
break; |
|
default: |
|
break; |
|
} |
|
|
|
if ( ! mbuf_puts(p, name)) |
|
return(0); |
|
|
|
for (i = 0; ROFF_ARGMAX != argc[i]; i++) { |
|
if ( ! mbuf_nputs(p, " ", 1)) |
|
return(0); |
|
if ( ! mbuf_puts(p, tokargnames[argc[i]])) |
|
return(0); |
|
if ( ! mbuf_nputs(p, "=\"", 2)) |
|
return(0); |
|
if ( ! mbuf_putstring(p, argv[i] ? argv[i] : "true")) |
|
return(0); |
|
if ( ! mbuf_nputs(p, "\"", 1)) |
|
return(0); |
|
} |
|
return(mbuf_nputs(p, ">", 1)); |
|
} |
|
|
|
|
|
static int |
|
mbuf_endtag(struct md_xml *p, const char *tag, enum md_ns ns) |
|
{ |
|
if ( ! mbuf_nputs(p, "</", 2)) |
|
return(0); |
|
|
|
switch (ns) { |
|
case (MD_NS_BLOCK): |
|
if ( ! mbuf_nputs(p, "block:", 6)) |
|
return(0); |
|
break; |
|
case (MD_NS_INLINE): |
|
if ( ! mbuf_nputs(p, "inline:", 7)) |
|
return(0); |
|
break; |
|
default: |
|
break; |
|
} |
|
|
|
if ( ! mbuf_puts(p, tag)) |
|
return(0); |
|
return(mbuf_nputs(p, ">", 1)); |
|
} |
|
|
|
|
|
static int |
mbuf_putstring(struct md_xml *p, const char *buf) |
mbuf_putstring(struct md_xml *p, const char *buf) |
{ |
{ |
|
|
Line 105 mbuf_nputstring(struct md_xml *p, const char *buf, siz |
|
Line 181 mbuf_nputstring(struct md_xml *p, const char *buf, siz |
|
return(0); |
return(0); |
p->pos += 6; |
p->pos += 6; |
break; |
break; |
|
case ('<'): |
|
if ( ! md_buf_puts(p->mbuf, "<", 4)) |
|
return(0); |
|
p->pos += 4; |
|
break; |
|
case ('>'): |
|
if ( ! md_buf_puts(p->mbuf, ">", 4)) |
|
return(0); |
|
p->pos += 4; |
|
break; |
default: |
default: |
if ( ! md_buf_putchar(p->mbuf, buf[i])) |
if ( ! md_buf_putchar(p->mbuf, buf[i])) |
return(0); |
return(0); |
Line 318 rofftail(void *arg) |
|
Line 404 rofftail(void *arg) |
|
if (0 != p->pos && ! mbuf_newline(p)) |
if (0 != p->pos && ! mbuf_newline(p)) |
return(0); |
return(0); |
|
|
if ( ! mbuf_puts(p, "</mdoc>")) |
p->last = MD_BLKOUT; |
|
if ( ! mbuf_endtag(p, "mdoc", MD_NS_DEFAULT)) |
return(0); |
return(0); |
|
|
p->last = MD_BLKOUT; |
|
return(mbuf_newline(p)); |
return(mbuf_newline(p)); |
} |
} |
|
|
|
|
/* ARGSUSED */ |
|
static int |
static int |
roffspecial(void *arg, int tok) |
roffspecial(void *arg, int tok) |
{ |
{ |
Line 335 roffspecial(void *arg, int tok) |
|
Line 420 roffspecial(void *arg, int tok) |
|
assert(arg); |
assert(arg); |
p = (struct md_xml *)arg; |
p = (struct md_xml *)arg; |
|
|
|
/* FIXME: this is completely ad hoc. */ |
|
|
switch (tok) { |
switch (tok) { |
case (ROFF_Ns): |
case (ROFF_Ns): |
p->last = MD_OVERRIDE; |
p->last = MD_OVERRIDE; |
|
|
roffblkin(void *arg, int tok, int *argc, char **argv) |
roffblkin(void *arg, int tok, int *argc, char **argv) |
{ |
{ |
struct md_xml *p; |
struct md_xml *p; |
int i; |
|
|
|
assert(arg); |
assert(arg); |
p = (struct md_xml *)arg; |
p = (struct md_xml *)arg; |
Line 364 roffblkin(void *arg, int tok, int *argc, char **argv) |
|
Line 450 roffblkin(void *arg, int tok, int *argc, char **argv) |
|
} else if ( ! mbuf_indent(p)) |
} else if ( ! mbuf_indent(p)) |
return(0); |
return(0); |
|
|
if ( ! mbuf_nputs(p, "<", 1)) |
|
return(0); |
|
if ( ! mbuf_nputs(p, "block:", 6)) |
|
return(0); |
|
if ( ! mbuf_puts(p, toknames[tok])) |
|
return(0); |
|
|
|
/* FIXME: xml won't like standards args (e.g., p1003.1-90). */ |
/* FIXME: xml won't like standards args (e.g., p1003.1-90). */ |
|
|
for (i = 0; ROFF_ARGMAX != argc[i]; i++) { |
|
if ( ! mbuf_nputs(p, " ", 1)) |
|
return(0); |
|
if ( ! mbuf_puts(p, tokargnames[argc[i]])) |
|
return(0); |
|
if ( ! mbuf_nputs(p, "=\"", 2)) |
|
return(0); |
|
if ( ! mbuf_putstring(p, argv[i] ? argv[i] : "true")) |
|
return(0); |
|
if ( ! mbuf_nputs(p, "\"", 1)) |
|
return(0); |
|
} |
|
|
|
if ( ! mbuf_nputs(p, ">", 1)) |
|
return(0); |
|
|
|
p->last = MD_BLKIN; |
p->last = MD_BLKIN; |
p->indent++; |
p->indent++; |
|
|
|
if ( ! mbuf_begintag(p, toknames[tok], MD_NS_BLOCK, |
|
argc, argv)) |
|
return(0); |
return(mbuf_newline(p)); |
return(mbuf_newline(p)); |
} |
} |
|
|
Line 413 roffblkout(void *arg, int tok) |
|
Line 480 roffblkout(void *arg, int tok) |
|
} else if ( ! mbuf_indent(p)) |
} else if ( ! mbuf_indent(p)) |
return(0); |
return(0); |
|
|
if ( ! mbuf_nputs(p, "</", 2)) |
|
return(0); |
|
if ( ! mbuf_nputs(p, "block:", 6)) |
|
return(0); |
|
if ( ! mbuf_puts(p, toknames[tok])) |
|
return(0); |
|
if ( ! mbuf_nputs(p, ">", 1)) |
|
return(0); |
|
|
|
p->last = MD_BLKOUT; |
p->last = MD_BLKOUT; |
|
|
|
if ( ! mbuf_endtag(p, toknames[tok], MD_NS_BLOCK)) |
|
return(0); |
return(mbuf_newline(p)); |
return(mbuf_newline(p)); |
} |
} |
|
|
|
|
roffin(void *arg, int tok, int *argc, char **argv) |
roffin(void *arg, int tok, int *argc, char **argv) |
{ |
{ |
struct md_xml *p; |
struct md_xml *p; |
int i; |
|
|
|
assert(arg); |
assert(arg); |
p = (struct md_xml *)arg; |
p = (struct md_xml *)arg; |
Line 461 roffin(void *arg, int tok, int *argc, char **argv) |
|
Line 521 roffin(void *arg, int tok, int *argc, char **argv) |
|
return(0); |
return(0); |
|
|
p->last = MD_IN; |
p->last = MD_IN; |
|
return(mbuf_begintag(p, toknames[tok], |
if ( ! mbuf_nputs(p, "<", 1)) |
MD_NS_INLINE, argc, argv)); |
return(0); |
|
if ( ! mbuf_nputs(p, "inline:", 7)) |
|
return(0); |
|
if ( ! mbuf_puts(p, toknames[tok])) |
|
return(0); |
|
|
|
for (i = 0; ROFF_ARGMAX != argc[i]; i++) { |
|
if ( ! mbuf_nputs(p, " ", 1)) |
|
return(0); |
|
if ( ! mbuf_puts(p, tokargnames[argc[i]])) |
|
return(0); |
|
if ( ! mbuf_nputs(p, "=\"", 2)) |
|
return(0); |
|
if ( ! mbuf_putstring(p, argv[i] ? argv[i] : "true")) |
|
return(0); |
|
if ( ! mbuf_nputs(p, "\"", 1)) |
|
return(0); |
|
} |
|
return(mbuf_nputs(p, ">", 1)); |
|
} |
} |
|
|
|
|
Line 493 roffout(void *arg, int tok) |
|
Line 534 roffout(void *arg, int tok) |
|
assert(arg); |
assert(arg); |
p = (struct md_xml *)arg; |
p = (struct md_xml *)arg; |
|
|
/* Continue with a regular out token. */ |
|
|
|
if (0 == p->pos && ! mbuf_indent(p)) |
if (0 == p->pos && ! mbuf_indent(p)) |
return(0); |
return(0); |
|
|
p->last = MD_OUT; |
p->last = MD_OUT; |
|
return(mbuf_endtag(p, toknames[tok], MD_NS_INLINE)); |
if ( ! mbuf_nputs(p, "</", 2)) |
|
return(0); |
|
if ( ! mbuf_nputs(p, "inline:", 7)) |
|
return(0); |
|
if ( ! mbuf_puts(p, toknames[tok])) |
|
return(0); |
|
return(mbuf_nputs(p, ">", 1)); |
|
} |
} |
|
|
|
|