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

Annotation of mandoc/ml.c, Revision 1.8

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

CVSweb