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