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

Annotation of mandoc/xml.c, Revision 1.25

1.25    ! kristaps    1: /* $Id: xml.c,v 1.24 2008/12/10 12:05:33 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:  */
1.16      kristaps   19: #include <assert.h>
1.1       kristaps   20: #include <stdlib.h>
                     21: #include <string.h>
                     22:
                     23: #include "private.h"
1.10      kristaps   24: #include "ml.h"
1.9       kristaps   25:
1.6       kristaps   26:
1.16      kristaps   27: static int             xml_alloc(void **);
                     28: static void            xml_free(void *);
1.25    ! kristaps   29: static ssize_t         xml_beginstring(struct ml_args *,
1.18      kristaps   30:                                const char *, size_t);
1.25    ! kristaps   31: static ssize_t         xml_endstring(struct ml_args *,
1.18      kristaps   32:                                const char *, size_t);
1.25    ! kristaps   33: static int             xml_begin(struct ml_args *, const struct tm *,
1.13      kristaps   34:                                const char *, const char *,
1.23      kristaps   35:                                enum roffmsec, enum roffvol);
1.25    ! kristaps   36: static int             xml_end(struct ml_args *, const struct tm *,
1.24      kristaps   37:                                const char *, const char *,
                     38:                                enum roffmsec, enum roffvol);
1.25    ! kristaps   39: static ssize_t         xml_printtagname(struct ml_args *,
1.16      kristaps   40:                                enum md_ns, int);
1.25    ! kristaps   41: static ssize_t         xml_printtagargs(struct ml_args *,
        !            42:                                const int *, const char **);
        !            43: static ssize_t         xml_endtag(struct ml_args *, enum md_ns, int);
        !            44: static ssize_t         xml_begintag(struct ml_args *, enum md_ns, int,
1.16      kristaps   45:                                const int *, const char **);
1.11      kristaps   46:
                     47:
1.16      kristaps   48: static ssize_t
1.25    ! kristaps   49: xml_printtagargs(struct ml_args *p, const int *argc, const char **argv)
1.11      kristaps   50: {
1.16      kristaps   51:        int              i, c;
1.11      kristaps   52:        size_t           res;
                     53:
1.16      kristaps   54:        if (NULL == argc || NULL == argv)
1.11      kristaps   55:                return(0);
1.16      kristaps   56:        assert(argc && argv);
1.11      kristaps   57:
1.17      kristaps   58:        /* LINTED */
1.16      kristaps   59:        for (res = 0, i = 0; ROFF_ARGMAX != (c = argc[i]); i++) {
1.25    ! kristaps   60:                if ( ! ml_nputs(p->mbuf, " ", 1, &res))
1.16      kristaps   61:                        return(-1);
1.11      kristaps   62:
1.22      kristaps   63:                /* FIXME: should puke on some, no? */
                     64:
1.25    ! kristaps   65:                if ( ! ml_puts(p->mbuf, tokargnames[c], &res))
1.16      kristaps   66:                        return(-1);
1.25    ! kristaps   67:                if ( ! ml_nputs(p->mbuf, "=\"", 2, &res))
1.16      kristaps   68:                        return(-1);
                     69:                if (argv[i]) {
1.25    ! kristaps   70:                        if ( ! ml_putstring(p->mbuf, argv[i], &res))
1.16      kristaps   71:                                return(-1);
1.25    ! kristaps   72:                } else if ( ! ml_nputs(p->mbuf, "true", 4, &res))
1.16      kristaps   73:                        return(-1);
1.25    ! kristaps   74:                if ( ! ml_nputs(p->mbuf, "\"", 1, &res))
1.16      kristaps   75:                        return(-1);
                     76:        }
1.11      kristaps   77:
1.16      kristaps   78:        return((ssize_t)res);
1.11      kristaps   79: }
                     80:
1.10      kristaps   81:
                     82: static ssize_t
1.25    ! kristaps   83: xml_printtagname(struct ml_args *p, enum md_ns ns, int tok)
1.8       kristaps   84: {
1.10      kristaps   85:        size_t           res;
1.8       kristaps   86:
1.10      kristaps   87:        res = 0;
1.6       kristaps   88:        switch (ns) {
1.9       kristaps   89:        case (MD_NS_BLOCK):
1.25    ! kristaps   90:                if ( ! ml_nputs(p->mbuf, "block:", 6, &res))
1.10      kristaps   91:                        return(-1);
1.9       kristaps   92:                break;
1.16      kristaps   93:        case (MD_NS_INLINE):
1.25    ! kristaps   94:                if ( ! ml_nputs(p->mbuf, "inline:", 7, &res))
1.16      kristaps   95:                        return(-1);
                     96:                break;
1.11      kristaps   97:        case (MD_NS_BODY):
1.25    ! kristaps   98:                if ( ! ml_nputs(p->mbuf, "body:", 5, &res))
1.11      kristaps   99:                        return(-1);
                    100:                break;
                    101:        case (MD_NS_HEAD):
1.25    ! kristaps  102:                if ( ! ml_nputs(p->mbuf, "head:", 5, &res))
1.11      kristaps  103:                        return(-1);
                    104:                break;
1.9       kristaps  105:        default:
1.11      kristaps  106:                break;
1.6       kristaps  107:        }
                    108:
1.25    ! kristaps  109:        if ( ! ml_puts(p->mbuf, toknames[tok], &res))
1.10      kristaps  110:                return(-1);
1.16      kristaps  111:        return((ssize_t)res);
                    112: }
                    113:
                    114:
                    115: /* ARGSUSED */
                    116: static int
1.25    ! kristaps  117: xml_begin(struct ml_args *p, const struct tm *tm, const char *os,
1.23      kristaps  118:                const char *title, enum roffmsec sec, enum roffvol vol)
1.16      kristaps  119: {
1.6       kristaps  120:
1.25    ! kristaps  121:        if ( ! ml_puts(p->mbuf, "<?xml version=\"1.0\" "
1.16      kristaps  122:                                "encoding=\"UTF-8\"?>\n", NULL))
                    123:                return(0);
1.25    ! kristaps  124:        return(ml_puts(p->mbuf, "<mdoc xmlns:block=\"block\" "
1.19      kristaps  125:                                "xmlns:body=\"body\" "
                    126:                                "xmlns:head=\"head\" "
1.16      kristaps  127:                                "xmlns:inline=\"inline\">", NULL));
                    128: }
                    129:
                    130:
                    131: /* ARGSUSED */
                    132: static int
1.25    ! kristaps  133: xml_end(struct ml_args *p, const struct tm *tm, const char *os,
1.24      kristaps  134:                const char *title, enum roffmsec sec, enum roffvol vol)
1.16      kristaps  135: {
                    136:
1.25    ! kristaps  137:        return(ml_puts(p->mbuf, "</mdoc>", NULL));
1.16      kristaps  138: }
                    139:
                    140:
                    141: /* ARGSUSED */
                    142: static ssize_t
1.25    ! kristaps  143: xml_beginstring(struct ml_args *p, const char *buf, size_t sz)
1.18      kristaps  144: {
                    145:
                    146:        return(0);
                    147: }
                    148:
                    149:
                    150: /* ARGSUSED */
                    151: static ssize_t
1.25    ! kristaps  152: xml_endstring(struct ml_args *p, const char *buf, size_t sz)
1.18      kristaps  153: {
                    154:
                    155:        return(0);
                    156: }
                    157:
                    158:
                    159: /* ARGSUSED */
                    160: static ssize_t
1.25    ! kristaps  161: xml_begintag(struct ml_args *p, enum md_ns ns,
1.16      kristaps  162:                int tok, const int *argc, const char **argv)
                    163: {
                    164:        ssize_t          res, sz;
                    165:
1.25    ! kristaps  166:        if (-1 == (res = xml_printtagname(p, ns, tok)))
1.16      kristaps  167:                return(-1);
1.25    ! kristaps  168:        if (-1 == (sz = xml_printtagargs(p, argc, argv)))
1.16      kristaps  169:                return(-1);
                    170:        return(res + sz);
1.6       kristaps  171: }
                    172:
                    173:
1.12      kristaps  174: /* ARGSUSED */
1.10      kristaps  175: static ssize_t
1.25    ! kristaps  176: xml_endtag(struct ml_args *p, enum md_ns ns, int tok)
1.6       kristaps  177: {
                    178:
1.25    ! kristaps  179:        return(xml_printtagname(p, ns, tok));
1.16      kristaps  180: }
                    181:
                    182:
                    183: /* ARGSUSED */
                    184: int
                    185: xml_alloc(void **p)
                    186: {
                    187:
1.20      kristaps  188:        *p = NULL;
1.16      kristaps  189:        return(1);
                    190: }
1.10      kristaps  191:
1.6       kristaps  192:
1.16      kristaps  193: /* ARGSUSED */
                    194: void
                    195: xml_free(void *p)
                    196: {
1.1       kristaps  197:
1.16      kristaps  198:        /* Do nothing. */
1.1       kristaps  199: }
                    200:
                    201:
                    202: int
1.10      kristaps  203: md_line_xml(void *data, char *buf)
1.1       kristaps  204: {
                    205:
1.10      kristaps  206:        return(mlg_line((struct md_mlg *)data, buf));
1.1       kristaps  207: }
                    208:
                    209:
                    210: int
                    211: md_exit_xml(void *data, int flush)
                    212: {
                    213:
1.10      kristaps  214:        return(mlg_exit((struct md_mlg *)data, flush));
1.1       kristaps  215: }
                    216:
                    217:
                    218: void *
                    219: md_init_xml(const struct md_args *args,
                    220:                struct md_mbuf *mbuf, const struct md_rbuf *rbuf)
                    221: {
1.16      kristaps  222:        struct ml_cbs    cbs;
                    223:
                    224:        cbs.ml_alloc = xml_alloc;
                    225:        cbs.ml_free = xml_free;
                    226:        cbs.ml_begintag = xml_begintag;
                    227:        cbs.ml_endtag = xml_endtag;
                    228:        cbs.ml_begin = xml_begin;
                    229:        cbs.ml_end = xml_end;
1.18      kristaps  230:        cbs.ml_beginstring = xml_beginstring;
                    231:        cbs.ml_endstring = xml_endstring;
1.9       kristaps  232:
1.16      kristaps  233:        return(mlg_alloc(args, rbuf, mbuf, &cbs));
1.9       kristaps  234: }
                    235:

CVSweb