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

Annotation of mandoc/tokens.c, Revision 1.3

1.3     ! kristaps    1: /* $Id: tokens.c,v 1.2 2008/12/04 16:34:59 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 <stdlib.h>
                     21: #include <string.h>
                     22:
                     23: #include "libmdocml.h"
                     24: #include "private.h"
                     25:
                     26:
1.3     ! kristaps   27: static int              rofftok_dashes(const char *, int *);
        !            28: static int              rofftok_special(const char *, int *);
        !            29: static int              rofftok_predef(const char *, int *);
        !            30: static int              rofftok_defined(const char *, int *);
1.1       kristaps   31:
                     32:
                     33: static int
1.3     ! kristaps   34: rofftok_defined(const char *buf, int *i)
1.1       kristaps   35: {
1.3     ! kristaps   36:        const char       *p;
        !            37:
        !            38:        if (0 == buf[*i])
1.1       kristaps   39:                return(-1);
1.3     ! kristaps   40:        if (0 == buf[*i + 1])
1.1       kristaps   41:                return(-1);
                     42:
1.3     ! kristaps   43:        (*i)++;
        !            44:        p = &buf[(*i)++];
        !            45:
        !            46:        if (0 == memcmp(p, ">=", 2))
1.1       kristaps   47:                return(ROFFTok_Ge);
1.3     ! kristaps   48:        else if (0 == memcmp(p, "<=", 2))
1.1       kristaps   49:                return(ROFFTok_Le);
1.3     ! kristaps   50:        else if (0 == memcmp(p, "Rq", 2))
1.1       kristaps   51:                return(ROFFTok_Rquote);
1.3     ! kristaps   52:        else if (0 == memcmp(p, "Lq", 2))
1.1       kristaps   53:                return(ROFFTok_Lquote);
1.3     ! kristaps   54:        else if (0 == memcmp(p, "ua", 2))
1.1       kristaps   55:                return(ROFFTok_Uparrow);
1.3     ! kristaps   56:        else if (0 == memcmp(p, "aa", 2))
1.1       kristaps   57:                return(ROFFTok_Acute);
1.3     ! kristaps   58:        else if (0 == memcmp(p, "ga", 2))
1.1       kristaps   59:                return(ROFFTok_Grave);
1.3     ! kristaps   60:        else if (0 == memcmp(p, "Pi", 2))
1.1       kristaps   61:                return(ROFFTok_Pi);
1.3     ! kristaps   62:        else if (0 == memcmp(p, "Ne", 2))
1.1       kristaps   63:                return(ROFFTok_Ne);
1.3     ! kristaps   64:        else if (0 == memcmp(p, "Le", 2))
1.1       kristaps   65:                return(ROFFTok_Le);
1.3     ! kristaps   66:        else if (0 == memcmp(p, "Ge", 2))
1.1       kristaps   67:                return(ROFFTok_Ge);
1.3     ! kristaps   68:        else if (0 == memcmp(p, "Lt", 2))
1.1       kristaps   69:                return(ROFFTok_Lt);
1.3     ! kristaps   70:        else if (0 == memcmp(p, "Gt", 2))
1.1       kristaps   71:                return(ROFFTok_Gt);
1.3     ! kristaps   72:        else if (0 == memcmp(p, "Pm", 2))
1.1       kristaps   73:                return(ROFFTok_Plusmin);
1.3     ! kristaps   74:        else if (0 == memcmp(p, "If", 2))
1.1       kristaps   75:                return(ROFFTok_Infty);
1.3     ! kristaps   76:        else if (0 == memcmp(p, "Na", 2))
1.1       kristaps   77:                return(ROFFTok_Nan);
1.3     ! kristaps   78:        else if (0 == memcmp(p, "Ba", 2))
1.1       kristaps   79:                return(ROFFTok_Bar);
                     80:
                     81:        return(-1);
                     82: }
                     83:
                     84:
                     85: static int
1.3     ! kristaps   86: rofftok_predef(const char *buf, int *i)
1.1       kristaps   87: {
1.3     ! kristaps   88:        if (0 == buf[*i])
1.1       kristaps   89:                return(-1);
1.3     ! kristaps   90:        if ('(' == buf[*i])
        !            91:                return(rofftok_defined(buf, i));
1.1       kristaps   92:
1.3     ! kristaps   93:        switch (buf[*i]) {
1.2       kristaps   94:        case ('q'):
                     95:                return(ROFFTok_Quote);
                     96:        default:
                     97:                break;
                     98:        }
1.1       kristaps   99:
                    100:        return(-1);
                    101: }
                    102:
                    103:
                    104: static int
1.3     ! kristaps  105: rofftok_dashes(const char *buf, int *i)
1.1       kristaps  106: {
                    107:
1.3     ! kristaps  108:        if (0 == buf[*i])
1.1       kristaps  109:                return(-1);
1.3     ! kristaps  110:        else if (buf[(*i)++] != 'e')
1.1       kristaps  111:                return(-1);
1.3     ! kristaps  112:        if (0 == buf[*i])
1.1       kristaps  113:                return(-1);
                    114:
1.3     ! kristaps  115:        switch (buf[*i]) {
1.1       kristaps  116:        case ('m'):
                    117:                return(ROFFTok_Em);
                    118:        case ('n'):
                    119:                return(ROFFTok_En);
                    120:        default:
                    121:                break;
                    122:        }
                    123:        return(-1);
                    124: }
                    125:
                    126:
                    127: static int
1.3     ! kristaps  128: rofftok_special(const char *buf, int *i)
1.1       kristaps  129: {
                    130:
1.3     ! kristaps  131:        if (0 == buf[*i])
        !           132:                return(ROFFTok_Slash);
1.1       kristaps  133:
1.3     ! kristaps  134:        switch (buf[*i]) {
1.1       kristaps  135:        case ('a'):
                    136:                return(ROFFTok_Sp_A);
                    137:        case ('b'):
                    138:                return(ROFFTok_Sp_B);
                    139:        case ('f'):
                    140:                return(ROFFTok_Sp_F);
                    141:        case ('n'):
                    142:                return(ROFFTok_Sp_N);
                    143:        case ('r'):
                    144:                return(ROFFTok_Sp_R);
                    145:        case ('t'):
                    146:                return(ROFFTok_Sp_T);
                    147:        case ('v'):
                    148:                return(ROFFTok_Sp_V);
1.3     ! kristaps  149:        case ('0'):
        !           150:                return(ROFFTok_Sp_0);
1.1       kristaps  151:        default:
                    152:                break;
                    153:        }
                    154:        return(-1);
                    155: }
                    156:
                    157:
                    158: int
1.3     ! kristaps  159: rofftok_scan(const char *buf, int *i)
1.1       kristaps  160: {
                    161:
                    162:        assert(*buf);
1.3     ! kristaps  163:        assert(buf[*i] == '\\');
        !           164:
        !           165:        (*i)++;
1.1       kristaps  166:
1.3     ! kristaps  167:        for ( ; buf[*i]; (*i)++) {
        !           168:                switch (buf[*i]) {
1.1       kristaps  169:                case ('e'):
1.3     ! kristaps  170:                        (*i)++;
        !           171:                        return(rofftok_special(buf, i));
1.1       kristaps  172:                case ('('):
1.3     ! kristaps  173:                        (*i)++;
        !           174:                        return(rofftok_dashes(buf, i));
1.1       kristaps  175:                case (' '):
                    176:                        return(ROFFTok_Space);
                    177:                case ('&'):
                    178:                        return(ROFFTok_Null);
                    179:                case ('-'):
                    180:                        return(ROFFTok_Hyphen);
                    181:                case ('*'):
1.3     ! kristaps  182:                        (*i)++;
        !           183:                        return(rofftok_predef(buf, i));
1.2       kristaps  184:                case ('\\'):
1.3     ! kristaps  185:                        return(ROFFTok_Slash);
1.1       kristaps  186:                default:
                    187:                        break;
                    188:                }
                    189:        }
                    190:
                    191:        return(-1);
                    192: }
                    193:
                    194:

CVSweb