version 1.7, 2008/12/02 00:15:41 |
version 1.8, 2008/12/02 13:20:24 |
|
|
#define MAXINDENT 8 |
#define MAXINDENT 8 |
#define COLUMNS 72 |
#define COLUMNS 72 |
|
|
#ifdef __linux__ /* FIXME */ |
|
#define strlcat strncat |
|
#endif |
|
|
|
enum md_ns { |
enum md_ns { |
MD_NS_BLOCK, |
MD_NS_BLOCK, |
MD_NS_INLINE, |
MD_NS_INLINE, |
|
|
}; |
}; |
|
|
enum md_tok { |
enum md_tok { |
MD_BLKIN, |
MD_BLKIN, /* Controls spacing. */ |
MD_BLKOUT, |
MD_BLKOUT, |
MD_IN, |
MD_IN, |
MD_OUT, |
MD_OUT, |
MD_TEXT, |
MD_TEXT |
MD_OVERRIDE |
|
}; |
}; |
|
|
struct md_xml { |
struct md_xml { |
|
|
size_t pos; |
size_t pos; |
enum md_tok last; |
enum md_tok last; |
int flags; |
int flags; |
#define MD_LITERAL (1 << 0) /* FIXME */ |
#define MD_LITERAL (1 << 0) /* TODO */ |
|
#define MD_OVERRIDE_ONE (1 << 1) |
|
#define MD_OVERRIDE_ALL (1 << 2) |
}; |
}; |
|
|
static void roffmsg(void *arg, enum roffmsg, |
static void roffmsg(void *arg, enum roffmsg, |
Line 72 static int roffdata(void *, int, char *); |
|
Line 69 static int roffdata(void *, int, char *); |
|
static int roffout(void *, int); |
static int roffout(void *, int); |
static int roffblkin(void *, int, int *, char **); |
static int roffblkin(void *, int, int *, char **); |
static int roffblkout(void *, int); |
static int roffblkout(void *, int); |
static int roffspecial(void *, int); |
static int roffspecial(void *, int, int *, char **, char **); |
|
|
|
static void mbuf_mode(struct md_xml *, enum md_ns); |
static int mbuf_newline(struct md_xml *); |
static int mbuf_newline(struct md_xml *); |
static int mbuf_indent(struct md_xml *); |
static int mbuf_indent(struct md_xml *); |
static int mbuf_data(struct md_xml *, int, char *); |
static int mbuf_data(struct md_xml *, int, char *); |
Line 90 static int mbuf_endtag(struct md_xml *, |
|
Line 88 static int mbuf_endtag(struct md_xml *, |
|
const char *, enum md_ns); |
const char *, enum md_ns); |
|
|
|
|
|
static void |
|
mbuf_mode(struct md_xml *p, enum md_ns ns) |
|
{ |
|
p->flags &= ~MD_OVERRIDE_ONE; |
|
p->last = ns; |
|
} |
|
|
|
|
static int |
static int |
mbuf_begintag(struct md_xml *p, const char *name, enum md_ns ns, |
mbuf_begintag(struct md_xml *p, const char *name, enum md_ns ns, |
int *argc, char **argv) |
int *argc, char **argv) |
Line 257 mbuf_data(struct md_xml *p, int space, char *buf) |
|
Line 263 mbuf_data(struct md_xml *p, int space, char *buf) |
|
assert(p->mbuf); |
assert(p->mbuf); |
assert(0 != p->indent); |
assert(0 != p->indent); |
|
|
|
if (MD_OVERRIDE_ONE & p->flags || MD_OVERRIDE_ALL & p->flags) |
|
space = 0; |
|
|
if (MD_LITERAL & p->flags) |
if (MD_LITERAL & p->flags) |
return(mbuf_putstring(p, buf)); |
return(mbuf_putstring(p, buf)); |
|
|
Line 281 mbuf_data(struct md_xml *p, int space, char *buf) |
|
Line 290 mbuf_data(struct md_xml *p, int space, char *buf) |
|
return(0); |
return(0); |
if ( ! mbuf_nputstring(p, bufp, sz)) |
if ( ! mbuf_nputstring(p, bufp, sz)) |
return(0); |
return(0); |
if (p->indent * MAXINDENT + sz >= COLUMNS) { |
if (p->indent * MAXINDENT + sz >= COLUMNS) |
if ( ! mbuf_newline(p)) |
if ( ! mbuf_newline(p)) |
return(0); |
return(0); |
continue; |
if ( ! (MD_OVERRIDE_ALL & p->flags)) |
} |
space = 1; |
continue; |
continue; |
} |
} |
|
|
Line 302 mbuf_data(struct md_xml *p, int space, char *buf) |
|
Line 311 mbuf_data(struct md_xml *p, int space, char *buf) |
|
if ( ! mbuf_nputstring(p, bufp, sz)) |
if ( ! mbuf_nputstring(p, bufp, sz)) |
return(0); |
return(0); |
|
|
if ( ! space && p->pos >= COLUMNS) |
if ( ! (MD_OVERRIDE_ALL & p->flags)) |
if ( ! mbuf_newline(p)) |
space = 1; |
return(0); |
|
} |
} |
|
|
return(1); |
return(1); |
Line 388 roffhead(void *arg) |
|
Line 396 roffhead(void *arg) |
|
return(0); |
return(0); |
|
|
p->indent++; |
p->indent++; |
p->last = MD_BLKIN; |
mbuf_mode(p, MD_BLKIN); |
return(mbuf_newline(p)); |
return(mbuf_newline(p)); |
} |
} |
|
|
Line 404 rofftail(void *arg) |
|
Line 412 rofftail(void *arg) |
|
if (0 != p->pos && ! mbuf_newline(p)) |
if (0 != p->pos && ! mbuf_newline(p)) |
return(0); |
return(0); |
|
|
p->last = MD_BLKOUT; |
mbuf_mode(p, MD_BLKOUT); |
if ( ! mbuf_endtag(p, "mdoc", MD_NS_DEFAULT)) |
if ( ! mbuf_endtag(p, "mdoc", MD_NS_DEFAULT)) |
return(0); |
return(0); |
|
|
return(mbuf_newline(p)); |
return(mbuf_newline(p)); |
} |
} |
|
|
|
|
|
/* ARGSUSED */ |
static int |
static int |
roffspecial(void *arg, int tok) |
roffspecial(void *arg, int tok, int *argc, char **argv, char **more) |
{ |
{ |
struct md_xml *p; |
struct md_xml *p; |
|
|
Line 424 roffspecial(void *arg, int tok) |
|
Line 432 roffspecial(void *arg, int tok) |
|
|
|
switch (tok) { |
switch (tok) { |
case (ROFF_Ns): |
case (ROFF_Ns): |
p->last = MD_OVERRIDE; |
p->flags |= MD_OVERRIDE_ONE; |
break; |
break; |
|
case (ROFF_Sm): |
|
assert(*more); |
|
if (0 == strcmp(*more, "on")) |
|
p->flags |= MD_OVERRIDE_ALL; |
|
else |
|
p->flags &= ~MD_OVERRIDE_ALL; |
|
break; |
default: |
default: |
break; |
break; |
} |
} |
Line 452 roffblkin(void *arg, int tok, int *argc, char **argv) |
|
Line 467 roffblkin(void *arg, int tok, int *argc, char **argv) |
|
|
|
/* FIXME: xml won't like standards args (e.g., p1003.1-90). */ |
/* FIXME: xml won't like standards args (e.g., p1003.1-90). */ |
|
|
p->last = MD_BLKIN; |
|
p->indent++; |
p->indent++; |
|
mbuf_mode(p, MD_BLKIN); |
|
|
if ( ! mbuf_begintag(p, toknames[tok], MD_NS_BLOCK, |
if ( ! mbuf_begintag(p, toknames[tok], MD_NS_BLOCK, |
argc, argv)) |
argc, argv)) |
Line 480 roffblkout(void *arg, int tok) |
|
Line 495 roffblkout(void *arg, int tok) |
|
} else if ( ! mbuf_indent(p)) |
} else if ( ! mbuf_indent(p)) |
return(0); |
return(0); |
|
|
p->last = MD_BLKOUT; |
mbuf_mode(p, MD_BLKOUT); |
|
|
if ( ! mbuf_endtag(p, toknames[tok], MD_NS_BLOCK)) |
if ( ! mbuf_endtag(p, toknames[tok], MD_NS_BLOCK)) |
return(0); |
return(0); |
return(mbuf_newline(p)); |
return(mbuf_newline(p)); |
Line 496 roffin(void *arg, int tok, int *argc, char **argv) |
|
Line 510 roffin(void *arg, int tok, int *argc, char **argv) |
|
assert(arg); |
assert(arg); |
p = (struct md_xml *)arg; |
p = (struct md_xml *)arg; |
|
|
/* |
if ( ! (MD_OVERRIDE_ONE & p->flags) && |
* FIXME: put all of this in a buffer, then check the buffer |
! (MD_OVERRIDE_ALL & p->flags) && |
* length versus the column width for nicer output. This is a |
p->pos + 11 > COLUMNS) |
* bit hacky. |
|
*/ |
|
|
|
if (p->pos + 11 > COLUMNS) |
|
if ( ! mbuf_newline(p)) |
if ( ! mbuf_newline(p)) |
return(0); |
return(0); |
|
|
if (0 != p->pos) { |
if (0 != p->pos && (MD_TEXT == p->last || MD_OUT == p->last) |
switch (p->last) { |
&& ! (MD_OVERRIDE_ONE & p->flags) |
case (MD_TEXT): |
&& ! (MD_OVERRIDE_ALL & p->flags)) |
/* FALLTHROUGH */ |
if ( ! mbuf_nputs(p, " ", 1)) |
case (MD_OUT): |
return(0); |
if ( ! mbuf_nputs(p, " ", 1)) |
|
return(0); |
if (0 == p->pos && ! mbuf_indent(p)) |
break; |
|
default: |
|
break; |
|
} |
|
} else if ( ! mbuf_indent(p)) |
|
return(0); |
return(0); |
|
|
p->last = MD_IN; |
mbuf_mode(p, MD_IN); |
return(mbuf_begintag(p, toknames[tok], |
return(mbuf_begintag(p, toknames[tok], |
MD_NS_INLINE, argc, argv)); |
MD_NS_INLINE, argc, argv)); |
} |
} |
Line 537 roffout(void *arg, int tok) |
|
Line 542 roffout(void *arg, int tok) |
|
if (0 == p->pos && ! mbuf_indent(p)) |
if (0 == p->pos && ! mbuf_indent(p)) |
return(0); |
return(0); |
|
|
p->last = MD_OUT; |
mbuf_mode(p, MD_OUT); |
return(mbuf_endtag(p, toknames[tok], MD_NS_INLINE)); |
return(mbuf_endtag(p, toknames[tok], MD_NS_INLINE)); |
} |
} |
|
|
Line 586 roffdata(void *arg, int space, char *buf) |
|
Line 591 roffdata(void *arg, int space, char *buf) |
|
if ( ! mbuf_data(p, space, buf)) |
if ( ! mbuf_data(p, space, buf)) |
return(0); |
return(0); |
|
|
p->last = MD_TEXT; |
mbuf_mode(p, MD_TEXT); |
return(1); |
return(1); |
} |
} |
|
|