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

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