[BACK]Return to xml.c CVS log [TXT][DIR] Up to [cvsweb.bsd.lv] / mandoc

Annotation of mandoc/xml.c, Revision 1.15

1.15    ! kristaps    1: /* $Id: xml.c,v 1.14 2008/12/04 23:10:51 kristaps Exp $ */
1.1       kristaps    2: /*
                      3:  * Copyright (c) 2008 Kristaps Dzonsons <kristaps@kth.se>
                      4:  *
                      5:  * Permission to use, copy, modify, and distribute this software for any
                      6:  * purpose with or without fee is hereby granted, provided that the
                      7:  * above copyright notice and this permission notice appear in all
                      8:  * copies.
                      9:  *
                     10:  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
                     11:  * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
                     12:  * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
                     13:  * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
                     14:  * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
                     15:  * PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
                     16:  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
                     17:  * PERFORMANCE OF THIS SOFTWARE.
                     18:  */
                     19: #include <stdlib.h>
                     20: #include <string.h>
                     21:
                     22: #include "libmdocml.h"
                     23: #include "private.h"
1.10      kristaps   24: #include "ml.h"
1.9       kristaps   25:
1.6       kristaps   26:
1.15    ! kristaps   27: static ssize_t         xml_endtag(struct md_mbuf *, void *,
1.10      kristaps   28:                                const struct md_args *,
                     29:                                enum md_ns, int);
1.15    ! kristaps   30: static ssize_t         xml_begintag(struct md_mbuf *, void *,
1.10      kristaps   31:                                const struct md_args *,
                     32:                                enum md_ns, int,
                     33:                                const int *, const char **);
1.13      kristaps   34: static int             xml_begin(struct md_mbuf *,
                     35:                                const struct md_args *,
                     36:                                const struct tm *,
                     37:                                const char *, const char *,
                     38:                                const char *, const char *);
1.11      kristaps   39: static int             xml_end(struct md_mbuf *,
                     40:                                const struct md_args *);
                     41:
                     42:
1.12      kristaps   43: /* ARGSUSED */
1.11      kristaps   44: static int
1.13      kristaps   45: xml_begin(struct md_mbuf *mbuf, const struct md_args *args,
                     46:                const struct tm *tm, const char *os,
                     47:                const char *title, const char *section,
                     48:                const char *vol)
1.11      kristaps   49: {
                     50:        size_t           res;
                     51:
                     52:        if ( ! ml_puts(mbuf, "<?xml version=\"1.0\" "
                     53:                                "encoding=\"UTF-8\"?>\n", &res))
                     54:                return(0);
                     55:        if ( ! ml_puts(mbuf, "<mdoc xmlns:block=\"block\" "
                     56:                                "xmlns:special=\"special\" "
                     57:                                "xmlns:inline=\"inline\">", &res))
                     58:                return(0);
                     59:
                     60:        return(1);
                     61: }
                     62:
                     63:
1.12      kristaps   64: /* ARGSUSED */
1.11      kristaps   65: static int
                     66: xml_end(struct md_mbuf *mbuf, const struct md_args *args)
                     67: {
                     68:        size_t           res;
                     69:
                     70:        res = 0;
                     71:        if ( ! ml_puts(mbuf, "</mdoc>", &res))
                     72:                return(0);
                     73:
                     74:        return(1);
                     75: }
                     76:
1.10      kristaps   77:
1.12      kristaps   78: /* ARGSUSED */
1.10      kristaps   79: static ssize_t
1.15    ! kristaps   80: xml_begintag(struct md_mbuf *mbuf, void *data,
        !            81:                const struct md_args *args, enum md_ns ns,
        !            82:                int tok, const int *argc, const char **argv)
1.8       kristaps   83: {
1.10      kristaps   84:        size_t           res;
1.8       kristaps   85:
1.14      kristaps   86:        /* FIXME: doesn't print arguments! */
                     87:
1.10      kristaps   88:        res = 0;
1.6       kristaps   89:
                     90:        switch (ns) {
1.9       kristaps   91:        case (MD_NS_BLOCK):
1.10      kristaps   92:                if ( ! ml_nputs(mbuf, "block:", 6, &res))
                     93:                        return(-1);
1.9       kristaps   94:                break;
1.11      kristaps   95:        case (MD_NS_BODY):
                     96:                if ( ! ml_nputs(mbuf, "body:", 5, &res))
                     97:                        return(-1);
                     98:                break;
                     99:        case (MD_NS_HEAD):
                    100:                if ( ! ml_nputs(mbuf, "head:", 5, &res))
                    101:                        return(-1);
                    102:                break;
1.9       kristaps  103:        case (MD_NS_INLINE):
1.10      kristaps  104:                if ( ! ml_nputs(mbuf, "inline:", 7, &res))
                    105:                        return(-1);
1.9       kristaps  106:                break;
                    107:        default:
1.11      kristaps  108:                break;
1.6       kristaps  109:        }
                    110:
1.12      kristaps  111:        if ( ! ml_puts(mbuf, toknames[tok], &res))
1.10      kristaps  112:                return(-1);
1.6       kristaps  113:
1.10      kristaps  114:        return((ssize_t)res);
1.6       kristaps  115: }
                    116:
                    117:
1.12      kristaps  118: /* ARGSUSED */
1.10      kristaps  119: static ssize_t
1.15    ! kristaps  120: xml_endtag(struct md_mbuf *mbuf, void *data,
        !           121:                const struct md_args *args, enum md_ns ns, int tok)
1.6       kristaps  122: {
1.9       kristaps  123:        size_t           res;
1.6       kristaps  124:
1.10      kristaps  125:        res = 0;
                    126:
1.6       kristaps  127:        switch (ns) {
1.9       kristaps  128:        case (MD_NS_BLOCK):
1.10      kristaps  129:                if ( ! ml_nputs(mbuf, "block:", 6, &res))
                    130:                        return(-1);
1.9       kristaps  131:                break;
                    132:        case (MD_NS_INLINE):
1.10      kristaps  133:                if ( ! ml_nputs(mbuf, "inline:", 7, &res))
                    134:                        return(-1);
1.9       kristaps  135:                break;
1.11      kristaps  136:        case (MD_NS_BODY):
                    137:                if ( ! ml_nputs(mbuf, "body:", 5, &res))
                    138:                        return(-1);
                    139:                break;
                    140:        case (MD_NS_HEAD):
                    141:                if ( ! ml_nputs(mbuf, "head:", 5, &res))
                    142:                        return(-1);
                    143:                break;
1.9       kristaps  144:        default:
1.11      kristaps  145:                break;
1.6       kristaps  146:        }
                    147:
1.12      kristaps  148:        if ( ! ml_puts(mbuf, toknames[tok], &res))
1.10      kristaps  149:                return(-1);
1.1       kristaps  150:
1.10      kristaps  151:        return((ssize_t)res);
1.1       kristaps  152: }
                    153:
                    154:
                    155: int
1.10      kristaps  156: md_line_xml(void *data, char *buf)
1.1       kristaps  157: {
                    158:
1.10      kristaps  159:        return(mlg_line((struct md_mlg *)data, buf));
1.1       kristaps  160: }
                    161:
                    162:
                    163: int
                    164: md_exit_xml(void *data, int flush)
                    165: {
                    166:
1.10      kristaps  167:        return(mlg_exit((struct md_mlg *)data, flush));
1.1       kristaps  168: }
                    169:
                    170:
                    171: void *
                    172: md_init_xml(const struct md_args *args,
                    173:                struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
                    174: {
1.9       kristaps  175:
1.15    ! kristaps  176:        return(mlg_alloc(args, NULL, rbuf, mbuf, xml_begintag,
1.11      kristaps  177:                                xml_endtag, xml_begin, xml_end));
1.9       kristaps  178: }
                    179:

CVSweb