Annotation of mandoc/literals.c, Revision 1.6
1.6 ! kristaps 1: /* $Id: literals.c,v 1.5 2008/12/09 17:09:12 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: */
19: #include <assert.h>
20: #include <string.h>
21: #include <stdlib.h>
22:
23: #include "private.h"
24:
1.5 kristaps 25: #define ROFF_ATTname_V1 "v1"
1.6 ! kristaps 26: #define ROFF_ATTname_V2 "v2"
1.5 kristaps 27: #define ROFF_ATTname_V3 "v3"
28: #define ROFF_ATTname_V6 "v6"
29: #define ROFF_ATTname_V7 "v7"
30: #define ROFF_ATTname_32V "32v"
31: #define ROFF_ATTname_V_1 "V.1"
32: #define ROFF_ATTname_V_4 "V.4"
33:
34: #define ROFFSecname_NAME "NAME"
35: #define ROFFSecname_SYNOP "SYNOPSIS"
36: #define ROFFSecname_DESC "DESCRIPTION"
37: #define ROFFSecname_ENV "ENVIRONMENT"
38: #define ROFFSecname_FILES "FILES"
39: #define ROFFSecname_EX "EXAMPLES"
40: #define ROFFSecname_DIAG "DIAGNOSTICS"
41: #define ROFFSecname_ERRS "ERRORS"
42: #define ROFFSecname_STAND "STANDARDS"
43: #define ROFFSecname_HIST "HISTORY"
44: #define ROFFSecname_AUTH "AUTHORS"
45: #define ROFFSecname_CAVEATS "CAVEATS"
46: #define ROFFSecname_BUGS "BUGS"
47: #define ROFFSecname_RETVAL "RETURN VALUES"
48: #define ROFFSecname_RETVAL1 "RETURN"
49: #define ROFFSecname_RETVAL2 "VALUES"
50: #define ROFFSecname_SEEALSO "SEE ALSO"
51: #define ROFFSecname_SEEALSO1 "SEE"
52: #define ROFFSecname_SEEALSO2 "ALSO"
53:
54: #define ROFF_MSECname_1 "1"
55: #define ROFF_MSECname_2 "2"
56: #define ROFF_MSECname_3 "3"
57: #define ROFF_MSECname_3p "3p"
58: #define ROFF_MSECname_4 "4"
59: #define ROFF_MSECname_5 "5"
60: #define ROFF_MSECname_6 "6"
61: #define ROFF_MSECname_7 "7"
62: #define ROFF_MSECname_8 "8"
63: #define ROFF_MSECname_9 "9"
64: #define ROFF_MSECname_UNASS "unass"
65: #define ROFF_MSECname_DRAFT "draft"
66: #define ROFF_MSECname_PAPER "paper"
67:
68: int
69: roff_sec(const char **p)
70: {
71:
72: assert(*p);
73: if (NULL != *(p + 1)) {
74: if (NULL != *(p + 2))
75: return(ROFFSec_OTHER);
76: if (0 == strcmp(*p, ROFFSecname_RETVAL1) &&
77: 0 == strcmp(*(p + 1), ROFFSecname_RETVAL2))
78: return(ROFFSec_RETVAL);
79: if (0 == strcmp(*p, ROFFSecname_SEEALSO1) &&
80: 0 == strcmp(*(p + 1), ROFFSecname_SEEALSO2))
81: return(ROFFSec_SEEALSO);
82: return(ROFFSec_OTHER);
83: }
84:
85: if (0 == strcmp(*p, ROFFSecname_NAME))
86: return(ROFFSec_NAME);
87: else if (0 == strcmp(*p, ROFFSecname_SYNOP))
88: return(ROFFSec_SYNOP);
89: else if (0 == strcmp(*p, ROFFSecname_DESC))
90: return(ROFFSec_DESC);
91: else if (0 == strcmp(*p, ROFFSecname_ENV))
92: return(ROFFSec_ENV);
93: else if (0 == strcmp(*p, ROFFSecname_FILES))
94: return(ROFFSec_FILES);
95: else if (0 == strcmp(*p, ROFFSecname_EX))
96: return(ROFFSec_EX);
97: else if (0 == strcmp(*p, ROFFSecname_DIAG))
98: return(ROFFSec_DIAG);
99: else if (0 == strcmp(*p, ROFFSecname_ERRS))
100: return(ROFFSec_ERRS);
101: else if (0 == strcmp(*p, ROFFSecname_STAND))
102: return(ROFFSec_STAND);
103: else if (0 == strcmp(*p, ROFFSecname_HIST))
104: return(ROFFSec_HIST);
105: else if (0 == strcmp(*p, ROFFSecname_AUTH))
106: return(ROFFSec_AUTH);
107: else if (0 == strcmp(*p, ROFFSecname_CAVEATS))
108: return(ROFFSec_CAVEATS);
109: else if (0 == strcmp(*p, ROFFSecname_BUGS))
110: return(ROFFSec_BUGS);
111: else if (0 == strcmp(*p, ROFFSecname_RETVAL))
112: return(ROFFSec_RETVAL);
113: else if (0 == strcmp(*p, ROFFSecname_SEEALSO))
114: return(ROFFSec_SEEALSO);
115:
116: return(ROFFSec_OTHER);
117: }
118:
119:
120: enum roffmsec
121: roff_msec(const char *p)
122: {
123:
124: assert(p);
125: if (0 == strcmp(p, ROFF_MSECname_1))
126: return(ROFF_MSEC_1);
127: else if (0 == strcmp(p, ROFF_MSECname_2))
128: return(ROFF_MSEC_2);
129: else if (0 == strcmp(p, ROFF_MSECname_3))
130: return(ROFF_MSEC_3);
131: else if (0 == strcmp(p, ROFF_MSECname_3p))
132: return(ROFF_MSEC_3p);
133: else if (0 == strcmp(p, ROFF_MSECname_4))
134: return(ROFF_MSEC_4);
135: else if (0 == strcmp(p, ROFF_MSECname_5))
136: return(ROFF_MSEC_5);
137: else if (0 == strcmp(p, ROFF_MSECname_6))
138: return(ROFF_MSEC_6);
139: else if (0 == strcmp(p, ROFF_MSECname_7))
140: return(ROFF_MSEC_7);
141: else if (0 == strcmp(p, ROFF_MSECname_8))
142: return(ROFF_MSEC_8);
143: else if (0 == strcmp(p, ROFF_MSECname_9))
144: return(ROFF_MSEC_9);
145: else if (0 == strcmp(p, ROFF_MSECname_UNASS))
146: return(ROFF_MSEC_UNASS);
147: else if (0 == strcmp(p, ROFF_MSECname_DRAFT))
148: return(ROFF_MSEC_DRAFT);
149: else if (0 == strcmp(p, ROFF_MSECname_PAPER))
150: return(ROFF_MSEC_PAPER);
151:
152: return(ROFF_MSEC_MAX);
153: }
1.4 kristaps 154:
1.1 kristaps 155:
156: char *
1.5 kristaps 157: roff_msecname(enum roffmsec sec)
1.2 kristaps 158: {
159:
160: switch (sec) {
161: case(ROFF_MSEC_1):
1.5 kristaps 162: return(ROFF_MSECname_1);
1.2 kristaps 163: case(ROFF_MSEC_2):
1.5 kristaps 164: return(ROFF_MSECname_2);
1.2 kristaps 165: case(ROFF_MSEC_3):
1.5 kristaps 166: return(ROFF_MSECname_3);
1.2 kristaps 167: case(ROFF_MSEC_3p):
1.5 kristaps 168: return(ROFF_MSECname_3p);
1.2 kristaps 169: case(ROFF_MSEC_4):
1.5 kristaps 170: return(ROFF_MSECname_4);
1.2 kristaps 171: case(ROFF_MSEC_5):
1.5 kristaps 172: return(ROFF_MSECname_5);
1.2 kristaps 173: case(ROFF_MSEC_6):
1.5 kristaps 174: return(ROFF_MSECname_6);
1.2 kristaps 175: case(ROFF_MSEC_7):
1.5 kristaps 176: return(ROFF_MSECname_7);
1.2 kristaps 177: case(ROFF_MSEC_8):
1.5 kristaps 178: return(ROFF_MSECname_8);
1.2 kristaps 179: case(ROFF_MSEC_9):
1.5 kristaps 180: return(ROFF_MSECname_9);
1.2 kristaps 181: case(ROFF_MSEC_UNASS):
1.5 kristaps 182: return(ROFF_MSECname_UNASS);
1.2 kristaps 183: case(ROFF_MSEC_DRAFT):
1.5 kristaps 184: return(ROFF_MSECname_DRAFT);
1.2 kristaps 185: case(ROFF_MSEC_PAPER):
1.5 kristaps 186: return(ROFF_MSECname_PAPER);
1.2 kristaps 187: default:
188: break;
189: }
190:
191: abort();
192: /* NOTREACHED */
193: }
194:
195:
196: char *
1.5 kristaps 197: roff_fmtstring(int tok)
1.1 kristaps 198: {
199:
200: switch (tok) {
201: case (ROFF_Ex):
202: return ("The %s utility exits 0 on success, and "
1.5 kristaps 203: ">0 if an error occurs.");
1.1 kristaps 204: case (ROFF_Rv):
205: return ("The %s() function returns the value 0 if "
206: "successful; otherwise the value -1 "
207: "is returned and the global variable "
1.5 kristaps 208: "errno is set to indicate the error.");
1.1 kristaps 209: case (ROFF_In):
1.5 kristaps 210: return("#include \\*(Lt%s\\*(Gt");
211: default:
212: break;
213: }
214:
215: abort();
216: /* NOTREACHED */
217: }
218:
219:
220: char *
221: roff_literal(int tok, const int *argc,
222: const char **argv, const char **morep)
223: {
224:
225: switch (tok) {
1.1 kristaps 226: case (ROFF_At):
227: assert(NULL == *argv);
228: assert(ROFF_ARGMAX == *argc);
229: if (NULL == *morep)
1.5 kristaps 230: return("AT&T UNIX");
231:
232: switch (roff_att(*morep)) {
233: case (ROFF_ATT_V1):
234: return("Version 1 AT&T UNIX");
235: case (ROFF_ATT_V2):
236: return("Version 2 AT&T UNIX");
237: case (ROFF_ATT_V3):
238: return("Version 3 AT&T UNIX");
239: case (ROFF_ATT_V6):
240: return("Version 6 AT&T UNIX");
241: case (ROFF_ATT_V7):
242: return("Version 7 AT&T UNIX");
243: case (ROFF_ATT_32V):
244: return("Version 32v AT&T UNIX");
245: case (ROFF_ATT_V_1):
246: return("AT&T System V.1 UNIX");
247: case (ROFF_ATT_V_4):
248: return("AT&T System V.4 UNIX");
249: default:
250: break;
251: }
252:
1.1 kristaps 253: abort();
254: /* NOTREACHED */
1.5 kristaps 255:
1.1 kristaps 256: case (ROFF_St):
257: assert(ROFF_ARGMAX != *argc);
258: assert(NULL == *argv);
259: switch (*argc) {
260: case(ROFF_p1003_1_88):
261: return("IEEE Std 1003.1-1988 "
1.5 kristaps 262: "(\\*(LqPOSIX\\*(Rq)");
1.1 kristaps 263: case(ROFF_p1003_1_90):
264: return("IEEE Std 1003.1-1990 "
1.5 kristaps 265: "(\\*(LqPOSIX\\*(Rq)");
1.1 kristaps 266: case(ROFF_p1003_1_96):
267: return("ISO/IEC 9945-1:1996 "
1.5 kristaps 268: "(\\*(LqPOSIX\\*(Rq)");
1.1 kristaps 269: case(ROFF_p1003_1_2001):
270: return("IEEE Std 1003.1-2001 "
1.5 kristaps 271: "(\\*(LqPOSIX\\*(Rq)");
1.1 kristaps 272: case(ROFF_p1003_1_2004):
273: return("IEEE Std 1003.1-2004 "
1.5 kristaps 274: "(\\*(LqPOSIX\\*(Rq)");
1.1 kristaps 275: case(ROFF_p1003_1):
276: return("IEEE Std 1003.1 "
1.5 kristaps 277: "(\\*(LqPOSIX\\*(Rq)");
1.1 kristaps 278: case(ROFF_p1003_1b):
279: return("IEEE Std 1003.1b "
1.5 kristaps 280: "(\\*(LqPOSIX\\*(Rq)");
1.1 kristaps 281: case(ROFF_p1003_1b_93):
282: return("IEEE Std 1003.1b-1993 "
1.5 kristaps 283: "(\\*(LqPOSIX\\*(Rq)");
1.1 kristaps 284: case(ROFF_p1003_1c_95):
285: return("IEEE Std 1003.1c-1995 "
1.5 kristaps 286: "(\\*(LqPOSIX\\*(Rq)");
1.1 kristaps 287: case(ROFF_p1003_1g_2000):
288: return("IEEE Std 1003.1g-2000 "
1.5 kristaps 289: "(\\*(LqPOSIX\\*(Rq)");
1.1 kristaps 290: case(ROFF_p1003_2_92):
291: return("IEEE Std 1003.2-1992 "
1.5 kristaps 292: "(\\*(LqPOSIX.2\\*(Rq)");
1.1 kristaps 293: case(ROFF_p1387_2_95):
294: return("IEEE Std 1387.2-1995 "
1.5 kristaps 295: "(\\*(LqPOSIX.7.2\\*(Rq)");
1.1 kristaps 296: case(ROFF_p1003_2):
297: return("IEEE Std 1003.2 "
1.5 kristaps 298: "(\\*(LqPOSIX.2\\*(Rq)");
1.1 kristaps 299: case(ROFF_p1387_2):
300: return("IEEE Std 1387.2 "
1.5 kristaps 301: "(\\*(LqPOSIX.7.2\\*(Rq)");
1.1 kristaps 302: case(ROFF_isoC_90):
303: return("ISO/IEC 9899:1990 "
1.5 kristaps 304: "(\\*(LqISO C90\\*(Rq)");
1.1 kristaps 305: case(ROFF_isoC_amd1):
306: return("ISO/IEC 9899/AMD1:1995 "
1.5 kristaps 307: "(\\*(LqISO C90\\*(Rq)");
1.1 kristaps 308: case(ROFF_isoC_tcor1):
309: return("ISO/IEC 9899/TCOR1:1994 "
1.5 kristaps 310: "(\\*(LqISO C90\\*(Rq)");
1.1 kristaps 311: case(ROFF_isoC_tcor2):
312: return("ISO/IEC 9899/TCOR2:1995 "
1.5 kristaps 313: "(\\*(LqISO C90\\*(Rq)");
1.1 kristaps 314: case(ROFF_isoC_99):
315: return("ISO/IEC 9899:1999 "
1.5 kristaps 316: "(\\*(LqISO C99\\*(Rq)");
1.1 kristaps 317: case(ROFF_ansiC):
318: return("ANSI X3.159-1989 "
1.5 kristaps 319: "(\\*(LqANSI C\\*(Rq)");
1.1 kristaps 320: case(ROFF_ansiC_89):
321: return("ANSI X3.159-1989 "
1.5 kristaps 322: "(\\*(LqANSI C\\*(Rq)");
1.1 kristaps 323: case(ROFF_ansiC_99):
324: return("ANSI/ISO/IEC 9899-1999 "
1.5 kristaps 325: "(\\*(LqANSI C99\\*(Rq)");
1.1 kristaps 326: case(ROFF_ieee754):
327: return("IEEE Std 754-1985");
328: case(ROFF_iso8802_3):
329: return("ISO 8802-3: 1989");
330: case(ROFF_xpg3):
331: return("X/Open Portability Guide Issue 3 "
1.5 kristaps 332: "(\\*(LqXPG3\\*(Rq)");
1.1 kristaps 333: case(ROFF_xpg4):
334: return("X/Open Portability Guide Issue 4 "
1.5 kristaps 335: "(\\*(LqXPG4\\*(Rq)");
1.1 kristaps 336: case(ROFF_xpg4_2):
337: return("X/Open Portability Guide Issue 4.2 "
1.5 kristaps 338: "(\\*(LqXPG4.2\\*(Rq)");
1.1 kristaps 339: case(ROFF_xpg4_3):
340: return("X/Open Portability Guide Issue 4.3 "
1.5 kristaps 341: "(\\*(LqXPG4.3\\*(Rq)");
1.1 kristaps 342: case(ROFF_xbd5):
343: return("X/Open System Interface Definitions "
1.5 kristaps 344: "Issue 5 (\\*(LqXBD5\\*(Rq)");
1.1 kristaps 345: case(ROFF_xcu5):
346: return("X/Open Commands and Utilities Issue 5 "
1.5 kristaps 347: "(\\*(LqXCU5\\*(Rq)");
1.1 kristaps 348: case(ROFF_xsh5):
349: return("X/Open System Interfaces and Headers "
1.5 kristaps 350: "Issue 5 (\\*(LqXSH5\\*(Rq)");
1.1 kristaps 351: case(ROFF_xns5):
352: return("X/Open Networking Services Issue 5 "
1.5 kristaps 353: "(\\*(LqXNS5\\*(Rq)");
1.1 kristaps 354: case(ROFF_xns5_2d2_0):
355: return("X/Open Networking Services "
356: "Issue 5.2 Draft 2.0 "
1.5 kristaps 357: "(\\*(LqXNS5.2D2.0\\*(Rq)");
1.1 kristaps 358: case(ROFF_xcurses4_2):
359: return("X/Open Curses Issue 4 Version 2 "
1.5 kristaps 360: "(\\*(LqXCURSES4.2\\*(Rq)");
1.1 kristaps 361: case(ROFF_susv2):
362: return("Version 2 of the Single "
363: "UNIX Specification");
364: case(ROFF_susv3):
365: return("Version 3 of the Single "
366: "UNIX Specification");
367: case(ROFF_svid4):
368: return("System V Interface Definition, Fourth "
1.5 kristaps 369: "Edition (\\*(LqSVID4\\*(Rq)");
1.1 kristaps 370: default:
371: break;
372: }
373: abort();
374: /* NOTREACHED */
1.5 kristaps 375:
1.1 kristaps 376: case (ROFF_Bt):
377: return("is currently in beta test.");
378: case (ROFF_Ud):
379: return("currently under development.");
380: case (ROFF_Fx):
381: return("FreeBSD");
382: case (ROFF_Nx):
383: return("NetBSD");
384: case (ROFF_Ox):
385: return("OpenBSD");
386: case (ROFF_Ux):
387: return("UNIX");
388: case (ROFF_Bx):
389: return("BSD");
390: case (ROFF_Bsx):
391: return("BSDI BSD/OS");
392: default:
393: break;
394: }
1.5 kristaps 395:
1.1 kristaps 396: abort();
397: /* NOTREACHED */
398: }
399:
1.5 kristaps 400:
401: enum roffatt
402: roff_att(const char *p)
403: {
404:
405: assert(p);
406: if (0 == strcmp(p, ROFF_ATTname_V1))
407: return(ROFF_ATT_V1);
408: else if (0 == strcmp(p, ROFF_ATTname_V2))
409: return(ROFF_ATT_V2);
410: else if (0 == strcmp(p, ROFF_ATTname_V3))
411: return(ROFF_ATT_V3);
412: else if (0 == strcmp(p, ROFF_ATTname_V6))
413: return(ROFF_ATT_V6);
414: else if (0 == strcmp(p, ROFF_ATTname_V7))
415: return(ROFF_ATT_V7);
416: else if (0 == strcmp(p, ROFF_ATTname_32V))
417: return(ROFF_ATT_32V);
418: else if (0 == strcmp(p, ROFF_ATTname_V_1))
419: return(ROFF_ATT_V_1);
420: else if (0 == strcmp(p, ROFF_ATTname_V_4))
421: return(ROFF_ATT_V_4);
422:
423: return(ROFF_ATT_MAX);
424: }
425:
CVSweb