summaryrefslogtreecommitdiff
path: root/idlc/source/preproc/lex.c
diff options
context:
space:
mode:
Diffstat (limited to 'idlc/source/preproc/lex.c')
-rw-r--r--idlc/source/preproc/lex.c702
1 files changed, 0 insertions, 702 deletions
diff --git a/idlc/source/preproc/lex.c b/idlc/source/preproc/lex.c
deleted file mode 100644
index 61929f1af8aa..000000000000
--- a/idlc/source/preproc/lex.c
+++ /dev/null
@@ -1,702 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#if (defined(_WIN32) || defined(__IBMC__))
-#include <io.h>
-#else
-#include <unistd.h>
-#endif
-#include "cpp.h"
-
-/*
- * lexical FSM encoding
- * when in state state, and one of the characters
- * in ch arrives, enter nextstate.
- * States >= S_SELF are either final, or at least require special action.
- * In 'fsm' there is a line for each state X charset X nextstate.
- * List chars that overwrite previous entries later (e.g. C_ALPH
- * can be overridden by '_' by a later entry; and C_XX is the
- * the universal set, and should always be first.
- * States above S_SELF are represented in the big table as negative values.
- * S_SELF and S_SELFB encode the resulting token type in the upper bits.
- * These actions differ in that S_SELF doesn't have a lookahead char,
- * S_SELFB does.
- *
- * The encoding is blown out into a big table for time-efficiency.
- * Entries have
- * nextstate: 6 bits; ?\ marker: 1 bit; tokentype: 9 bits.
- */
-
-#define MAXSTATE 32
-#define ACT(tok,act) ((tok<<7)+act)
-#define QBSBIT 0100
-#define GETACT(st) ((st>>7)&0x1ff)
-
-/* character classes */
-#define C_WS 1
-#define C_ALPH 2
-#define C_NUM 3
-#define C_EOF 4
-#define C_XX 5
-
-enum state
-{
- START = 0, NUM1, NUM2, NUM3, ID1, ST1, ST2, ST3, COM1, COM2, COM3, COM4,
- CC1, CC2, WS1, PLUS1, MINUS1, STAR1, SLASH1, PCT1, SHARP1,
- CIRC1, GT1, GT2, LT1, LT2, OR1, AND1, ASG1, NOT1, DOTS1,
- S_SELF = MAXSTATE, S_SELFB, S_EOF, S_NL, S_EOFSTR,
- S_STNL, S_COMNL, S_EOFCOM, S_COMMENT, S_EOB, S_WS, S_NAME
-};
-
-int tottok;
-int tokkind[256];
-struct fsm
-{
- int state; /* if in this state */
- uchar ch[4]; /* and see one of these characters */
- int nextstate; /* enter this state if +ve */
-};
-
- /*const*/ struct fsm fsm[] = {
- /* start state */
- { START, {C_XX}, ACT(UNCLASS, S_SELF) },
- { START, {' ', '\t', '\v'}, WS1 },
- { START, {C_NUM}, NUM1 },
- { START, {'.'}, NUM3 },
- { START, {C_ALPH}, ID1 },
- { START, {'L'}, ST1 },
- { START, {'"'}, ST2 },
- { START, {'\''}, CC1 },
- { START, {'/'}, COM1 },
- { START, {EOFC}, S_EOF },
- { START, {'\n'}, S_NL },
- { START, {'-'}, MINUS1 },
- { START, {'+'}, PLUS1 },
- { START, {'<'}, LT1 },
- { START, {'>'}, GT1 },
- { START, {'='}, ASG1 },
- { START, {'!'}, NOT1 },
- { START, {'&'}, AND1 },
- { START, {'|'}, OR1 },
- { START, {'#'}, SHARP1 },
- { START, {'%'}, PCT1 },
- { START, {'['}, ACT(SBRA, S_SELF) },
- { START, {']'}, ACT(SKET, S_SELF) },
- { START, {'('}, ACT(LP, S_SELF) },
- { START, {')'}, ACT(RP, S_SELF) },
- { START, {'*'}, STAR1 },
- { START, {','}, ACT(COMMA, S_SELF) },
- { START, {'?'}, ACT(QUEST, S_SELF) },
- { START, {':'}, ACT(COLON, S_SELF) },
- { START, {';'}, ACT(SEMIC, S_SELF) },
- { START, {'{'}, ACT(CBRA, S_SELF) },
- { START, {'}'}, ACT(CKET, S_SELF) },
- { START, {'~'}, ACT(TILDE, S_SELF) },
- { START, {'^'}, CIRC1 },
-
- /* saw a digit */
- { NUM1, {C_XX}, ACT(NUMBER, S_SELFB) },
- { NUM1, {C_NUM, C_ALPH, '.'}, NUM1 },
- { NUM1, {'E', 'e'}, NUM2 },
- { NUM1, {'_'}, ACT(NUMBER, S_SELFB) },
-
- /* saw possible start of exponent, digits-e */
- { NUM2, {C_XX}, ACT(NUMBER, S_SELFB) },
- { NUM2, {'+', '-'}, NUM1 },
- { NUM2, {C_NUM, C_ALPH}, NUM1 },
- { NUM2, {'_'}, ACT(NUMBER, S_SELFB) },
-
- /* saw a '.', which could be a number or an operator */
- { NUM3, {C_XX}, ACT(DOT, S_SELFB) },
- { NUM3, {'.'}, DOTS1 },
- { NUM3, {C_NUM}, NUM1 },
-
- { DOTS1, {C_XX}, ACT(UNCLASS, S_SELFB) },
- { DOTS1, {C_NUM}, NUM1 },
- { DOTS1, {'.'}, ACT(ELLIPS, S_SELF) },
-
- /* saw a letter or _ */
- { ID1, {C_XX}, ACT(NAME, S_NAME) },
- { ID1, {C_ALPH, C_NUM}, ID1 },
-
- /* saw L (start of wide string?) */
- { ST1, {C_XX}, ACT(NAME, S_NAME) },
- { ST1, {C_ALPH, C_NUM}, ID1 },
- { ST1, {'"'}, ST2 },
- { ST1, {'\''}, CC1 },
-
- /* saw " beginning string */
- { ST2, {C_XX}, ST2 },
- { ST2, {'"'}, ACT(STRING, S_SELF) },
- { ST2, {'\\'}, ST3 },
- { ST2, {'\n'}, S_STNL },
- { ST2, {EOFC}, S_EOFSTR },
-
- /* saw \ in string */
- { ST3, {C_XX}, ST2 },
- { ST3, {'\n'}, S_STNL },
- { ST3, {EOFC}, S_EOFSTR },
-
- /* saw ' beginning character const */
- { CC1, {C_XX}, CC1 },
- { CC1, {'\''}, ACT(CCON, S_SELF) },
- { CC1, {'\\'}, CC2 },
- { CC1, {'\n'}, S_STNL },
- { CC1, {EOFC}, S_EOFSTR },
-
- /* saw \ in ccon */
- { CC2, {C_XX}, CC1 },
- { CC2, {'\n'}, S_STNL },
- { CC2, {EOFC}, S_EOFSTR },
-
- /* saw /, perhaps start of comment */
- { COM1, {C_XX}, ACT(SLASH, S_SELFB) },
- { COM1, {'='}, ACT(ASSLASH, S_SELF) },
- { COM1, {'*'}, COM2 },
- { COM1, {'/'}, COM4 },
-
- /* saw / followed by *, start of comment */
- { COM2, {C_XX}, COM2 },
- { COM2, {'\n'}, S_COMNL },
- { COM2, {'*'}, COM3 },
- { COM2, {EOFC}, S_EOFCOM },
-
- /* saw the * possibly ending a comment */
- { COM3, {C_XX}, COM2 },
- { COM3, {'\n'}, S_COMNL },
- { COM3, {'*'}, COM3 },
- { COM3, {'/'}, S_COMMENT },
-
- /* // comment */
- { COM4, {C_XX}, COM4 },
- { COM4, {'\n'}, S_COMMENT },
- /* { COM4, {'\n'}, S_NL }, */
- { COM4, {EOFC}, S_EOFCOM },
-
- /* saw white space, eat it up */
- { WS1, {C_XX}, S_WS },
- { WS1, {'\t', '\v', ' '}, WS1 },
-
- /* saw -, check --, -=, -> */
- { MINUS1, {C_XX}, ACT(MINUS, S_SELFB) },
- { MINUS1, {'-'}, ACT(MMINUS, S_SELF) },
- { MINUS1, {'='}, ACT(ASMINUS, S_SELF) },
- { MINUS1, {'>'}, ACT(ARROW, S_SELF) },
-
- /* saw +, check ++, += */
- { PLUS1, {C_XX}, ACT(PLUS, S_SELFB) },
- { PLUS1, {'+'}, ACT(PPLUS, S_SELF) },
- { PLUS1, {'='}, ACT(ASPLUS, S_SELF) },
-
- /* saw <, check <<, <<=, <= */
- { LT1, {C_XX}, ACT(LT, S_SELFB) },
- { LT1, {'<'}, LT2 },
- { LT1, {'='}, ACT(LEQ, S_SELF) },
- { LT2, {C_XX}, ACT(LSH, S_SELFB) },
- { LT2, {'='}, ACT(ASLSH, S_SELF) },
-
- /* saw >, check >>, >>=, >= */
- { GT1, {C_XX}, ACT(GT, S_SELFB) },
- { GT1, {'>'}, GT2 },
- { GT1, {'='}, ACT(GEQ, S_SELF) },
- { GT2, {C_XX}, ACT(RSH, S_SELFB) },
- { GT2, {'='}, ACT(ASRSH, S_SELF) },
-
- /* = */
- { ASG1, {C_XX}, ACT(ASGN, S_SELFB) },
- { ASG1, {'='}, ACT(EQ, S_SELF) },
-
- /* ! */
- { NOT1, {C_XX}, ACT(NOT, S_SELFB) },
- { NOT1, {'='}, ACT(NEQ, S_SELF) },
-
- /* & */
- { AND1, {C_XX}, ACT(AND, S_SELFB) },
- { AND1, {'&'}, ACT(LAND, S_SELF) },
- { AND1, {'='}, ACT(ASAND, S_SELF) },
-
- /* | */
- { OR1, {C_XX}, ACT(OR, S_SELFB) },
- { OR1, {'|'}, ACT(LOR, S_SELF) },
- { OR1, {'='}, ACT(ASOR, S_SELF) },
-
- /* # */
- { SHARP1, {C_XX}, ACT(SHARP, S_SELFB) },
- { SHARP1, {'#'}, ACT(DSHARP, S_SELF) },
-
- /* % */
- { PCT1, {C_XX}, ACT(PCT, S_SELFB) },
- { PCT1, {'='}, ACT(ASPCT, S_SELF) },
-
- /* * */
- { STAR1, {C_XX}, ACT(STAR, S_SELFB) },
- { STAR1, {'='}, ACT(ASSTAR, S_SELF) },
-
- /* ^ */
- { CIRC1, {C_XX}, ACT(CIRC, S_SELFB) },
- { CIRC1, {'='}, ACT(ASCIRC, S_SELF) },
-
- { -1, {'\0'}, S_SELF }
-};
-
-/* first index is char, second is state */
-/* increase #states to power of 2 to encourage use of shift */
-short bigfsm[256][MAXSTATE];
-
-void
- expandlex(void)
-{
- /* const */ struct fsm *fp;
- int i, j, nstate;
-
- for (fp = fsm; fp->state >= 0; fp++)
- {
- for (i = 0; fp->ch[i]; i++)
- {
- nstate = fp->nextstate;
- if (nstate >= S_SELF)
- nstate = ~nstate;
- switch (fp->ch[i])
- {
-
- case C_XX: /* random characters */
- for (j = 0; j < 256; j++)
- bigfsm[j][fp->state] = (short) nstate;
- continue;
- case C_ALPH:
- for (j = 0; j < 256; j++)
- if (('a' <= j && j <= 'z') || ('A' <= j && j <= 'Z')
- || j == '_')
- bigfsm[j][fp->state] = (short) nstate;
- continue;
- case C_NUM:
- for (j = '0'; j <= '9'; j++)
- bigfsm[j][fp->state] = (short) nstate;
- continue;
- default:
- bigfsm[fp->ch[i]][fp->state] = (short) nstate;
- }
- }
- }
-
- /*
- * install special cases for ? (trigraphs), \ (splicing), runes, and
- * EOB
- */
- for (i = 0; i < MAXSTATE; i++)
- {
- for (j = 0; j < 0xFF; j++)
- if (j == '?' || j == '\\' || j == '\n' || j == '\r')
- {
- if (bigfsm[j][i] > 0)
- bigfsm[j][i] = ~bigfsm[j][i];
- bigfsm[j][i] &= ~QBSBIT;
- }
- bigfsm[EOB][i] = ~S_EOB;
- if (bigfsm[EOFC][i] >= 0)
- bigfsm[EOFC][i] = ~S_EOF;
- }
-}
-
-/*
- * fill in a row of tokens from input, terminated by NL or END
- * First token is put at trp->lp.
- * Reset is non-zero when the input buffer can be "rewound."
- * The value is a flag indicating that possible macros have
- * been seen in the row.
- */
-int
- gettokens(Tokenrow * trp, int reset)
-{
- register int c, state, oldstate;
- register uchar *ip;
- register Token *tp, *maxp;
- int runelen;
- Source *s = cursource;
- int nmac = 0;
-
- tp = trp->lp;
- ip = s->inp;
- if (reset)
- {
- s->lineinc = 0;
- if (ip >= s->inl)
- { /* nothing in buffer */
- s->inl = s->inb;
- fillbuf(s);
- ip = s->inp = s->inb;
- }
- else
- if (ip >= s->inb + (3 * INS / 4))
- {
- memmove(s->inb, ip, 4 + s->inl - ip);
- s->inl = s->inb + (s->inl - ip);
- ip = s->inp = s->inb;
- }
- }
- maxp = &trp->bp[trp->max];
- runelen = 1;
- for (;;)
- {
-continue2:
- if (tp >= maxp)
- {
- trp->lp = tp;
- tp = growtokenrow(trp);
- maxp = &trp->bp[trp->max];
- }
- tp->type = UNCLASS;
- tp->t = ip;
- tp->wslen = 0;
- tp->flag = 0;
- state = START;
- for (;;)
- {
- oldstate = state;
-
- c = *ip;
-
- if ((state = bigfsm[c][state]) >= 0)
- {
- ip += runelen;
- runelen = 1;
- continue;
- }
- state = ~state;
- reswitch:
- switch (state & 0177)
- {
- case S_SELF:
- ip += runelen;
- runelen = 1;
- case S_SELFB:
- tp->type = (unsigned char) GETACT(state);
- tp->len = ip - tp->t;
- tp++;
- goto continue2;
-
- case S_NAME: /* like S_SELFB but with nmac check */
- tp->type = NAME;
- tp->len = ip - tp->t;
- nmac |= quicklook(tp->t[0], tp->len > 1 ? tp->t[1] : 0);
- tp++;
- goto continue2;
-
- case S_WS:
- tp->wslen = ip - tp->t;
- tp->t = ip;
- state = START;
- continue;
-
- default:
- if ((state & QBSBIT) == 0)
- {
- ip += runelen;
- runelen = 1;
- continue;
- }
- state &= ~QBSBIT;
- s->inp = ip;
-
- if (c == '\n')
- {
- while (s->inp + 1 >= s->inl && fillbuf(s) != EOF);
-
- if (s->inp[1] == '\r')
- {
- memmove(s->inp + 1, s->inp + 2, s->inl - s->inp + 2);
- s->inl -= 1;
- }
-
- goto reswitch;
- }
-
- if (c == '\r')
- {
- while (s->inp + 1 >= s->inl && fillbuf(s) != EOF);
-
- if (s->inp[1] == '\n')
- {
- memmove(s->inp, s->inp + 1, s->inl - s->inp + 1);
- s->inl -= 1;
- }
- else
- *s->inp = '\n';
-
- state = oldstate;
- continue;
- }
-
- if (c == '?')
- { /* check trigraph */
- if (trigraph(s))
- {
- state = oldstate;
- continue;
- }
- goto reswitch;
- }
- if (c == '\\')
- { /* line-folding */
- if (foldline(s))
- {
- s->lineinc++;
- state = oldstate;
- continue;
- }
- goto reswitch;
- }
- error(WARNING, "Lexical botch in cpp");
- ip += runelen;
- runelen = 1;
- continue;
-
- case S_EOB:
- s->inp = ip;
- fillbuf(cursource);
- state = oldstate;
- continue;
-
- case S_EOF:
- tp->type = END;
- tp->len = 0;
- s->inp = ip;
- if (tp != trp->bp && (tp - 1)->type != NL && cursource->fd != -1)
- error(WARNING, "No newline at end of file");
- trp->lp = tp + 1;
- return nmac;
-
- case S_STNL:
- error(ERROR, "Unterminated string or char const");
- case S_NL:
- tp->t = ip;
- tp->type = NL;
- tp->len = 1;
- tp->wslen = 0;
- s->lineinc++;
- s->inp = ip + 1;
- trp->lp = tp + 1;
- return nmac;
-
- case S_EOFSTR:
- error(FATAL, "EOF in string or char constant");
- break;
-
- case S_COMNL:
- s->lineinc++;
- state = COM2;
- ip += runelen;
- runelen = 1;
- continue;
-
- case S_EOFCOM:
- error(WARNING, "EOF inside comment");
- --ip;
- case S_COMMENT:
- if (!Cflag)
- {
- tp->t = ++ip;
- tp->t[-1] = ' ';
- tp->wslen = 1;
- state = START;
- continue;
- }
- else
- {
- runelen = 1;
- /* s->lineinc = 0; */
- tp->type = COMMENT;
- tp->flag |= XTWS;
- }
- }
- break;
- }
- ip += runelen;
- runelen = 1;
- tp->len = ip - tp->t;
- tp++;
- }
-}
-
-/* have seen ?; handle the trigraph it starts (if any) else 0 */
-int
- trigraph(Source * s)
-{
- uchar c;
-
- while (s->inp + 2 >= s->inl && fillbuf(s) != EOF);
- ;
- if (s->inp[1] != '?')
- return 0;
- c = 0;
- switch (s->inp[2])
- {
- case '=':
- c = '#';
- break;
- case '(':
- c = '[';
- break;
- case '/':
- c = '\\';
- break;
- case ')':
- c = ']';
- break;
- case '\'':
- c = '^';
- break;
- case '<':
- c = '{';
- break;
- case '!':
- c = '|';
- break;
- case '>':
- c = '}';
- break;
- case '-':
- c = '~';
- break;
- }
- if (c)
- {
- *s->inp = c;
- memmove(s->inp + 1, s->inp + 3, s->inl - s->inp + 2);
- s->inl -= 2;
- }
- return c;
-}
-
-int
- foldline(Source * s)
-{
- int n = 1;
-
- while (s->inp + 2 >= s->inl && fillbuf(s) != EOF);
-
- /* skip DOS line ends */
- if (((s->inp[n] == '\r') && (s->inp[n+1] == '\n')) ||
- ((s->inp[n] == '\n') && (s->inp[n+1] == '\r')))
- n++;
-
- if ((s->inp[n] == '\n') || (s->inp[n] == '\r'))
- {
- memmove(s->inp, s->inp + n + 1, s->inl - s->inp + n + 2);
- s->inl -= n + 1;
- return 1;
- }
- return 0;
-}
-
-int
- fillbuf(Source * s)
-{
- int n;
-
- if (s->fd < 0 || (n = read(s->fd, (char *) s->inl, INS / 8)) <= 0)
- n = 0;
- s->inl += n;
- s->inl[0] = s->inl[1] = s->inl[2] = s->inl[3] = EOB;
- if (n == 0)
- {
- s->inl[0] = s->inl[1] = s->inl[2] = s->inl[3] = EOFC;
- return EOF;
- }
- return 0;
-}
-
-/*
- * Push down to new source of characters.
- * If fd>0 and str==NULL, then from a file `name';
- * if fd==-1 and str, then from the string.
- */
-Source *
- setsource(char *name, int path, int fd, char *str, int wrap)
-{
- Source *s = new(Source);
- int len;
-
- s->line = 1;
- s->lineinc = 0;
- s->fd = fd;
- s->filename = name;
- s->next = cursource;
- s->ifdepth = 0;
- s->pathdepth = path;
- s->wrap = wrap;
-
- cursource = s;
-
- if (s->wrap)
- genwrap(0);
-
- /* slop at right for EOB */
- if (str)
- {
- len = strlen(str);
- s->inb = domalloc(len + 4);
- s->inp = s->inb;
- strncpy((char *) s->inp, str, len);
- }
- else
- {
- s->inb = domalloc(INS + 4);
- s->inp = s->inb;
- len = 0;
- }
- s->inl = s->inp + len;
- s->inl[0] = s->inl[1] = EOB;
-
- return s;
-}
-
-void
- unsetsource(void)
-{
- Source *s = cursource;
-
- if (s->wrap)
- genwrap(1);
-
- if (s->fd >= 0)
- {
- (void) close(s->fd);
- dofree(s->filename);
- }
-
- if (s->inb)
- dofree(s->inb);
-
- cursource = s->next;
- dofree(s);
-}
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */