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