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 = " ";
! 86: ssz = 6;
! 87: break;
! 88: case (ROFFTok_Hyphen):
! 89: seq = "‐";
! 90: ssz = 7;
! 91: break;
! 92: case (ROFFTok_Em):
! 93: seq = "—";
! 94: ssz = 7;
! 95: break;
! 96: case (ROFFTok_En):
! 97: seq = "–";
! 98: ssz = 7;
! 99: break;
! 100: case (ROFFTok_Ge):
! 101: seq = "≥";
! 102: ssz = 7;
! 103: break;
! 104: case (ROFFTok_Le):
! 105: seq = "≤";
! 106: ssz = 7;
! 107: break;
! 108: case (ROFFTok_Rquote):
! 109: seq = "”";
! 110: ssz = 7;
! 111: break;
! 112: case (ROFFTok_Lquote):
! 113: seq = "“";
! 114: ssz = 7;
! 115: break;
! 116: case (ROFFTok_Uparrow):
! 117: seq = "↑";
! 118: ssz = 7;
! 119: break;
! 120: case (ROFFTok_Acute):
! 121: seq = "´";
! 122: ssz = 6;
! 123: break;
! 124: case (ROFFTok_Grave):
! 125: seq = "`";
! 126: ssz = 5;
! 127: break;
! 128: case (ROFFTok_Pi):
! 129: seq = "π";
! 130: ssz = 6;
! 131: break;
! 132: case (ROFFTok_Ne):
! 133: seq = "≠";
! 134: ssz = 7;
! 135: break;
! 136: case (ROFFTok_Lt):
! 137: seq = "<";
! 138: ssz = 4;
! 139: break;
! 140: case (ROFFTok_Gt):
! 141: seq = ">";
! 142: ssz = 4;
! 143: break;
! 144: case (ROFFTok_Plusmin):
! 145: seq = "±";
! 146: ssz = 6;
! 147: break;
! 148: case (ROFFTok_Infty):
! 149: seq = "∞";
! 150: ssz = 7;
! 151: break;
! 152: case (ROFFTok_Bar):
! 153: seq = "|";
! 154: ssz = 6;
! 155: break;
! 156: case (ROFFTok_Nan):
! 157: seq = "Nan";
! 158: ssz = 3;
! 159: break;
! 160: case (ROFFTok_Quote):
! 161: seq = """;
! 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 = "&";
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 = """;
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 = "<";
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 = ">";
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