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