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

Annotation of mandoc/ml.c, Revision 1.5

1.5     ! kristaps    1: /* $Id: ml.c,v 1.4 2008/12/04 16:19:52 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.5     ! kristaps   19: #include <assert.h>
1.1       kristaps   20: #include <stdlib.h>
                     21: #include <string.h>
                     22:
                     23: #include "libmdocml.h"
                     24: #include "private.h"
1.2       kristaps   25: #include "ml.h"
1.1       kristaps   26:
1.2       kristaps   27: #ifdef __linux__
                     28: extern size_t            strlcat(char *, const char *, size_t);
                     29: extern size_t            strlcpy(char *, const char *, size_t);
                     30: #endif
1.1       kristaps   31:
                     32:
1.2       kristaps   33: int
                     34: ml_nputstring(struct md_mbuf *p,
                     35:                const char *buf, size_t sz, size_t *pos)
1.1       kristaps   36: {
1.5     ! kristaps   37:        int              i, v;
1.4       kristaps   38:        const char      *seq;
                     39:        size_t           ssz;
1.1       kristaps   40:
1.2       kristaps   41:        for (i = 0; i < (int)sz; i++) {
1.1       kristaps   42:                switch (buf[i]) {
1.4       kristaps   43:
1.5     ! kristaps   44:                /* Escaped value. */
        !            45:                case ('\\'):
        !            46:                        if (-1 == (v = rofftok_scan(buf, &i))) {
        !            47:                                /* TODO: error. */
        !            48:                                return(0);
        !            49:                        }
        !            50:
        !            51:                        switch (v) {
        !            52:                        case (ROFFTok_Sp_A):
        !            53:                                seq = "\\a";
        !            54:                                ssz = 2;
        !            55:                                break;
        !            56:                        case (ROFFTok_Sp_B):
        !            57:                                seq = "\\b";
        !            58:                                ssz = 2;
        !            59:                                break;
        !            60:                        case (ROFFTok_Sp_F):
        !            61:                                seq = "\\f";
        !            62:                                ssz = 2;
        !            63:                                break;
        !            64:                        case (ROFFTok_Sp_N):
        !            65:                                seq = "\\n";
        !            66:                                ssz = 2;
        !            67:                                break;
        !            68:                        case (ROFFTok_Sp_R):
        !            69:                                seq = "\\r";
        !            70:                                ssz = 2;
        !            71:                                break;
        !            72:                        case (ROFFTok_Sp_T):
        !            73:                                seq = "\\t";
        !            74:                                ssz = 2;
        !            75:                                break;
        !            76:                        case (ROFFTok_Sp_V):
        !            77:                                seq = "\\v";
        !            78:                                ssz = 2;
        !            79:                                break;
        !            80:                        case (ROFFTok_Sp_0):
        !            81:                                seq = "\\0";
        !            82:                                ssz = 2;
        !            83:                                break;
        !            84:                        case (ROFFTok_Space):
        !            85:                                seq = "&nbsp;";
        !            86:                                ssz = 6;
        !            87:                                break;
        !            88:                        case (ROFFTok_Hyphen):
        !            89:                                seq = "&#8208;";
        !            90:                                ssz = 7;
        !            91:                                break;
        !            92:                        case (ROFFTok_Em):
        !            93:                                seq = "&#8212;";
        !            94:                                ssz = 7;
        !            95:                                break;
        !            96:                        case (ROFFTok_En):
        !            97:                                seq = "&#8211;";
        !            98:                                ssz = 7;
        !            99:                                break;
        !           100:                        case (ROFFTok_Ge):
        !           101:                                seq = "&#8805;";
        !           102:                                ssz = 7;
        !           103:                                break;
        !           104:                        case (ROFFTok_Le):
        !           105:                                seq = "&#8804;";
        !           106:                                ssz = 7;
        !           107:                                break;
        !           108:                        case (ROFFTok_Rquote):
        !           109:                                seq = "&#8221;";
        !           110:                                ssz = 7;
        !           111:                                break;
        !           112:                        case (ROFFTok_Lquote):
        !           113:                                seq = "&#8220;";
        !           114:                                ssz = 7;
        !           115:                                break;
        !           116:                        case (ROFFTok_Uparrow):
        !           117:                                seq = "&#8593;";
        !           118:                                ssz = 7;
        !           119:                                break;
        !           120:                        case (ROFFTok_Acute):
        !           121:                                seq = "&#180;";
        !           122:                                ssz = 6;
        !           123:                                break;
        !           124:                        case (ROFFTok_Grave):
        !           125:                                seq = "&#96;";
        !           126:                                ssz = 5;
        !           127:                                break;
        !           128:                        case (ROFFTok_Pi):
        !           129:                                seq = "&#960;";
        !           130:                                ssz = 6;
        !           131:                                break;
        !           132:                        case (ROFFTok_Ne):
        !           133:                                seq = "&#8800;";
        !           134:                                ssz = 7;
        !           135:                                break;
        !           136:                        case (ROFFTok_Lt):
        !           137:                                seq = "&lt;";
        !           138:                                ssz = 4;
        !           139:                                break;
        !           140:                        case (ROFFTok_Gt):
        !           141:                                seq = "&gt;";
        !           142:                                ssz = 4;
        !           143:                                break;
        !           144:                        case (ROFFTok_Plusmin):
        !           145:                                seq = "&#177;";
        !           146:                                ssz = 6;
        !           147:                                break;
        !           148:                        case (ROFFTok_Infty):
        !           149:                                seq = "&#8734;";
        !           150:                                ssz = 7;
        !           151:                                break;
        !           152:                        case (ROFFTok_Bar):
        !           153:                                seq = "&#124;";
        !           154:                                ssz = 6;
        !           155:                                break;
        !           156:                        case (ROFFTok_Nan):
        !           157:                                seq = "Nan";
        !           158:                                ssz = 3;
        !           159:                                break;
        !           160:                        case (ROFFTok_Quote):
        !           161:                                seq = "&quot;";
        !           162:                                ssz = 6;
        !           163:                                break;
        !           164:                        case (ROFFTok_Slash):
        !           165:                                seq = "\\";
        !           166:                                ssz = 1;
        !           167:                                break;
        !           168:                        case (ROFFTok_Null):
        !           169:                                seq = "";
        !           170:                                ssz = 0;
        !           171:                                break;
        !           172:                        default:
        !           173:                                /* TODO: print error. */
        !           174:                                return(-1);
        !           175:                        }
        !           176:                        break;
        !           177:
1.4       kristaps  178:                /* Ampersand ml-escape. */
1.1       kristaps  179:                case ('&'):
1.4       kristaps  180:                        seq = "&amp;";
                    181:                        ssz = 5;
1.1       kristaps  182:                        break;
1.4       kristaps  183:
                    184:                /* Quotation ml-escape. */
1.1       kristaps  185:                case ('"'):
1.4       kristaps  186:                        seq = "&quot;";
                    187:                        ssz = 6;
1.1       kristaps  188:                        break;
1.4       kristaps  189:
                    190:                /* Lt ml-escape. */
1.1       kristaps  191:                case ('<'):
1.4       kristaps  192:                        seq = "&lt;";
                    193:                        ssz = 4;
1.1       kristaps  194:                        break;
1.4       kristaps  195:
                    196:                /* Gt ml-escape. */
1.1       kristaps  197:                case ('>'):
1.4       kristaps  198:                        seq = "&gt;";
                    199:                        ssz = 4;
1.1       kristaps  200:                        break;
1.4       kristaps  201:
1.1       kristaps  202:                default:
1.4       kristaps  203:                        seq = &buf[i];
                    204:                        ssz = 1;
1.1       kristaps  205:                        break;
                    206:                }
1.4       kristaps  207:
1.5     ! kristaps  208:                if (ssz > 0 && ! ml_nputs(p, seq, ssz, pos))
1.4       kristaps  209:                        return(-1);
1.1       kristaps  210:        }
1.2       kristaps  211:        return(1);
1.1       kristaps  212: }
                    213:
                    214:
1.2       kristaps  215: int
                    216: ml_nputs(struct md_mbuf *p, const char *buf, size_t sz, size_t *pos)
1.1       kristaps  217: {
                    218:
1.4       kristaps  219:        if (0 == sz)
                    220:                return(1);
                    221:
1.2       kristaps  222:        if ( ! md_buf_puts(p, buf, sz))
                    223:                return(0);
                    224:
                    225:        *pos += sz;
                    226:        return(1);
1.1       kristaps  227: }
                    228:
                    229:
1.2       kristaps  230: int
1.3       kristaps  231: ml_puts(struct md_mbuf *p, const char *buf, size_t *pos)
                    232: {
                    233:        size_t           sz;
                    234:
1.4       kristaps  235:        if (0 == (sz = strlen(buf)))
                    236:                return(1);
                    237:
1.3       kristaps  238:        if ( ! md_buf_puts(p, buf, sz))
                    239:                return(0);
                    240:        *pos += sz;
                    241:        return(1);
                    242: }
                    243:
                    244:
                    245: int
1.2       kristaps  246: ml_putchars(struct md_mbuf *p, char buf, size_t count, size_t *pos)
1.1       kristaps  247: {
                    248:        size_t           i;
                    249:
1.2       kristaps  250:        for (i = 0; i < count; i++)
                    251:                if ( ! ml_nputs(p, &buf, 1, pos))
                    252:                        return(0);
1.1       kristaps  253:
1.2       kristaps  254:        return(1);
1.1       kristaps  255: }

CVSweb