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

Annotation of mandoc/tokens.c, Revision 1.4

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

CVSweb