Move source into src directory
[a56.git] / lex.c
diff --git a/lex.c b/lex.c
deleted file mode 100644 (file)
index 2f09a34..0000000
--- a/lex.c
+++ /dev/null
@@ -1,509 +0,0 @@
-/*******************************************************
- *
- *  a56 - a DSP56001 assembler
- *
- *  Written by Quinn C. Jensen
- *  July 1990
- *
- *******************************************************\
-
-/*
- * Copyright (C) 2012 Thorsten Alteholz <debian@alteholz.de>
- *
- * This file is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published
- * by the Free Software Foundation, either version 3 of the License,
- * or (at your option) any later version.
- *
- * This program 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
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see
- * <http://www.gnu.org/licenses/>.
- *
- * This file incorporates work covered by the following copyright and
- * permission notice:
- *
- * Copyright (C) 1990-1998 Quinn C. Jensen
- *
- * Permission to use, copy, modify, distribute, and sell this
- * software and its documentation for any purpose is hereby granted
- * without fee, provided that the above copyright notice appear in
- * all copies and that both that copyright notice and this permission
- * notice appear in supporting documentation.  The author makes no
- * representations about the suitability of this software for any
- * purpose. It is provided "as is" without express or implied
- * warranty.
- */
-
-/*
- *  lex.c - lexical analyzer envelope.  lexyy.c, included below,
- *  is the LEX-generated code.
- *
- */
-
-#include "a56.h"
-#include "gram.h"
-
-int ldebug = 0;
-#ifdef LDEBUG
-#define RET(val) \
-       {\
-               if(ldebug) {\
-                       printf("[%s]", tok_print(val));\
-                       fflush(stdout);\
-               }\
-               return val;\
-       }
-#else
-#define RET(val) {return val;}
-#endif
-
-extern YYSTYPE yyval;
-
-double atof();
-
-/**************** yylex - returns next token *****************************/
-
-#define MAX_TOK 1024
-char tok[MAX_TOK];
-
-yylex()
-{
-       int ltok = next_tok();
-       int itok;
-
-       switch(ltok) {
-       case EOF:
-               if(yywrap() == 1)
-                       return 0;
-               else
-                       return yylex();
-               break;
-       case SYM:
-               if(itok = is_keyword(tok)) {
-                       RET(itok);
-               } else {
-                       yylval.sval = strsave(tok);
-                       RET(SYM);
-               }
-               break;
-       case CHEX:
-               yylval.n.type = INT;
-               yylval.n.seg = ANY;
-               yylval.n.val.i = a56_strtol(tok, 0, 16);
-               RET(CHEX);
-               break;
-       case CDEC:
-               yylval.n.type= INT;
-               yylval.n.seg = ANY;
-               yylval.n.val.i = atoi(tok);
-               RET(CDEC);
-               break;
-       case FRAC:
-               yylval.n.type = FLT;
-               yylval.n.seg = ANY;
-               yylval.n.val.f = atof(tok);
-               RET(FRAC);
-       case CHAR:
-               yylval.cval = *tok;
-               RET(CHAR);
-       case STRING:
-               yylval.sval = (char *)fixstring(tok);
-               yylval.sval = strsave(yylval.sval);
-               RET(STRING);
-       default:
-               RET(ltok);
-       }
-}
-
-is_keyword(tok)
-char *tok;
-{
-       int kval = kparse(tok);
-       if(kval > 0)
-               return kval;
-
-       return 0;
-}
-
-struct ascii_tab {
-       char *str;
-       int flags;
-} ascii_tab[];
-#define IS_NONE                0x0000
-#define IS_NUM         0x0001
-#define IS_ALPHA       0x0002
-#define IS_HEX         0x0004
-#define IS_WHITE       0x0008
-
-extern FILE *yyin;
-
-int next_tok()
-{
-       char *tp = tok;
-       enum {S_TOP, S_HEXNUM, S_NUM, S_ALNUM, S_CHAR, S_ESC_CHAR, S_COMMENT,
-               S_SQ_STRING, S_DQ_STRING, S_SHL, S_SHR} state = S_TOP;
-       static int unget = 0;
-       BOOL dot_seen = FALSE;
-
-       for(;;) {
-               int c = unget ? unget : lgetc(yyin);
-               int flags;
-               unget = 0;
-               flags = ascii_tab[c & 0x7F].flags;
-               if(tp > tok + MAX_TOK - 2) return LEXBAD;
-               switch(state) {
-               case S_TOP:
-                       if(c == EOF) {
-                               return EOF;
-                       } else if(flags & IS_WHITE) {
-                               /* ignore */ ;
-                       } else if(flags & IS_ALPHA) {
-                               *tp++ = c;
-                               state = S_ALNUM;
-                       } else if((flags & IS_NUM) || c == '.') {
-                               unget = c;
-                               state = S_NUM;
-                       } else {
-                               switch(c) {
-                               case '$': state = S_HEXNUM; break;
-                               case '"': state = S_DQ_STRING; break;
-                               case '\'': state = S_CHAR; break;
-                               case '>': state = S_SHR; break;
-                               case '<': state = S_SHL; break;
-                               case ';': state = S_COMMENT; break;
-                               case '\n': return EOL;
-                               case '@': return EOS;
-                               default: return c;
-                               }
-                       }
-                       break;
-               case S_COMMENT:
-                       if(c == EOF) {
-                               unget = EOF;
-                               *tp = '\0';
-                               return EOL;
-                       } else if(c == '\n') {
-                               return EOL;
-                       }
-                       break;
-               case S_SHR:
-                       if(c == EOF) {
-                               unget = EOF;
-                               *tp = '\0';
-                               return '>';
-                       } else if(c == '>') {
-                               return SHR;
-                       } else {
-                               unget = c;
-                               return '>';
-                       }
-                       break;
-               case S_SHL:
-                       if(c == EOF) {
-                               unget = EOF;
-                               *tp = '\0';
-                               return '<';
-                       } else if(c == '<') {
-                               return SHL;
-                       } else {
-                               unget = c;
-                               return '<';
-                       }
-                       break;
-               case S_HEXNUM:
-                       if(c == EOF) {
-                               unget = EOF;
-                               *tp = '\0';
-                               return CHEX;
-                       } else if(flags & IS_HEX) {
-                               *tp++ = c;
-                               break;
-                       } else {
-                               unget = c;
-                               *tp = '\0';
-                               return CHEX;
-                       }
-                       break;
-               case S_ALNUM:
-                       if(c == EOF) {
-                               unget = EOF;
-                               *tp = '\0';
-                               return SYM;
-                       } else if(c == ':') {
-                               *tp++ = c;
-                               *tp = '\0';
-                               return SYM;
-                               break;
-                       } else if(flags & (IS_ALPHA|IS_NUM)) {
-                               *tp++ = c;
-                               break;
-                       } else {
-                               unget = c;
-                               *tp = '\0';
-                               return SYM;
-                       }
-                       break;
-               case S_NUM:
-                       if(c == EOF) {
-                               unget = EOF;
-                               *tp = '\0';
-                               return dot_seen ? FRAC : CDEC;
-                       } else if((flags & IS_NUM) || (c == '.' && NOT dot_seen)) {
-                               *tp++ = c;
-                               if(c == '.') dot_seen = TRUE;
-                               break;
-                       } else {
-                               unget = c;
-                               *tp = '\0';
-                               return dot_seen ? FRAC : CDEC;
-                       }
-                       break;
-               case S_CHAR:
-                       if(c == EOF) {
-                               unget = EOF;
-                               *tp = '\0';
-                               return CHAR;
-                       } else if(c == '\\') {
-                               state = S_ESC_CHAR;
-                       } else if(c == '\'') {
-                               *tp = '\0';
-                               return CHAR;
-                       } else {
-                               *tp++ = c;
-                               if(tp > tok + 1)
-                                       state = S_SQ_STRING;
-                       }
-                       break;
-               case S_ESC_CHAR:
-                       if(c == EOF) {
-                               unget = EOF;
-                               *tp = '\0';
-                               return CHAR;
-                       }
-                       switch(c) {
-                       case 'b': *tp = '\b'; break;
-                       case 'f': *tp = '\f'; break;
-                       case 'n': *tp = '\n'; break;
-                       case 'r': *tp = '\r'; break;
-                       case 't': *tp = '\t'; break;
-                       case '\\': *tp = '\\'; break;
-                       case '\'':
-                               *tp = '\0';
-                               return CHAR;
-                               break;
-                       default:
-                               *tp++ = c;
-                               state = S_SQ_STRING;
-                               break;
-                       }
-                       break;
-               case S_SQ_STRING:
-                       if(c == EOF) {
-                               unget = EOF;
-                               *tp = '\0';
-                               return STRING;
-                       } else if(c == '\'') {
-                               *tp = '\0';
-                               return STRING;
-                       } else {
-                               *tp++ = c;
-                       }
-                       break;
-               case S_DQ_STRING:
-                       if(c == EOF) {
-                               unget = EOF;
-                               *tp = '\0';
-                               return STRING;
-                       } else if(c == '"') {
-                               *tp = '\0';
-                               return STRING;
-                       } else {
-                               *tp++ = c;
-                       }
-                       break;
-               } /* switch(state) */
-       } /* for(;;) */
-}
-
-struct ascii_tab ascii_tab[] = {
-       {"\\z00",       IS_NONE                                 /* 0x00 */},
-       {"\\z01",       IS_NONE                                 /* 0x01 */},
-       {"\\z02",       IS_NONE                                 /* 0x02 */},
-       {"\\z03",       IS_NONE                                 /* 0x03 */},
-       {"\\z04",       IS_NONE                                 /* 0x04 */},
-       {"\\z05",       IS_NONE                                 /* 0x05 */},
-       {"\\z06",       IS_NONE                                 /* 0x06 */},
-       {"\\z07",       IS_NONE                                 /* 0x07 */},
-       {"\\b",         IS_NONE                                 /* 0x08 */},
-       {"\\t",         IS_NONE|IS_WHITE                /* 0x09 */},
-       {"\\n",         IS_NONE                                 /* 0x0A */},
-       {"\\z0B",       IS_NONE                                 /* 0x0B */},
-       {"\\z0C",       IS_NONE                                 /* 0x0C */},
-       {"\\r",         IS_NONE                                 /* 0x0D */},
-       {"\\z0E",       IS_NONE                                 /* 0x0E */},
-       {"\\z0F",       IS_NONE                                 /* 0x0F */},
-       {"\\z10",       IS_NONE                                 /* 0x10 */},
-       {"\\z11",       IS_NONE                                 /* 0x11 */},
-       {"\\z12",       IS_NONE                                 /* 0x12 */},
-       {"\\z13",       IS_NONE                                 /* 0x13 */},
-       {"\\z14",       IS_NONE                                 /* 0x14 */},
-       {"\\z15",       IS_NONE                                 /* 0x15 */},
-       {"\\z16",       IS_NONE                                 /* 0x16 */},
-       {"\\z17",       IS_NONE                                 /* 0x17 */},
-       {"\\z18",       IS_NONE                                 /* 0x18 */},
-       {"\\z19",       IS_NONE                                 /* 0x19 */},
-       {"\\z1A",       IS_NONE                                 /* 0x1A */},
-       {"\\z1B",       IS_NONE                                 /* 0x1B */},
-       {"\\z1C",       IS_NONE                                 /* 0x1C */},
-       {"\\z1D",       IS_NONE                                 /* 0x1D */},
-       {"\\z1E",       IS_NONE                                 /* 0x1E */},
-       {"\\z1F",       IS_NONE                                 /* 0x1F */},
-       {" ",           IS_NONE|IS_WHITE                /* 0x20 */},
-       {"!",           IS_NONE                                 /* 0x21 */},
-       {"\"",          IS_NONE                                 /* 0x22 */},
-       {"#",           IS_NONE                                 /* 0x23 */},
-       {"$",           IS_NONE                                 /* 0x24 */},
-       {"%",           IS_NONE                                 /* 0x25 */},
-       {"&",           IS_NONE                                 /* 0x26 */},
-       {"'",           IS_NONE                                 /* 0x27 */},
-       {"(",           IS_NONE                                 /* 0x28 */},
-       {")",           IS_NONE                                 /* 0x29 */},
-       {"*",           IS_NONE                                 /* 0x2A */},
-       {"+",           IS_NONE                                 /* 0x2B */},
-       {",",           IS_NONE                                 /* 0x2C */},
-       {"-",           IS_NONE                                 /* 0x2D */},
-       {".",           IS_NONE                                 /* 0x2E */},
-       {"/",           IS_NONE                                 /* 0x2F */},
-       {"0",           IS_NONE|IS_NUM|IS_HEX   /* 0x30 */},
-       {"1",           IS_NONE|IS_NUM|IS_HEX   /* 0x31 */},
-       {"2",           IS_NONE|IS_NUM|IS_HEX   /* 0x32 */},
-       {"3",           IS_NONE|IS_NUM|IS_HEX   /* 0x33 */},
-       {"4",           IS_NONE|IS_NUM|IS_HEX   /* 0x34 */},
-       {"5",           IS_NONE|IS_NUM|IS_HEX   /* 0x35 */},
-       {"6",           IS_NONE|IS_NUM|IS_HEX   /* 0x36 */},
-       {"7",           IS_NONE|IS_NUM|IS_HEX   /* 0x37 */},
-       {"8",           IS_NONE|IS_NUM|IS_HEX   /* 0x38 */},
-       {"9",           IS_NONE|IS_NUM|IS_HEX   /* 0x39 */},
-       {":",           IS_NONE                                 /* 0x3A */},
-       {";",           IS_NONE                                 /* 0x3B */},
-       {"<",           IS_NONE                                 /* 0x3C */},
-       {"=",           IS_NONE                                 /* 0x3D */},
-       {">",           IS_NONE                                 /* 0x3E */},
-       {"?",           IS_NONE                                 /* 0x3F */},
-       {"@",           IS_NONE                                 /* 0x40 */},
-       {"A",           IS_NONE|IS_ALPHA|IS_HEX /* 0x41 */},
-       {"B",           IS_NONE|IS_ALPHA|IS_HEX /* 0x42 */},
-       {"C",           IS_NONE|IS_ALPHA|IS_HEX /* 0x43 */},
-       {"D",           IS_NONE|IS_ALPHA|IS_HEX /* 0x44 */},
-       {"E",           IS_NONE|IS_ALPHA|IS_HEX /* 0x45 */},
-       {"F",           IS_NONE|IS_ALPHA|IS_HEX /* 0x46 */},
-       {"G",           IS_NONE|IS_ALPHA                /* 0x47 */},
-       {"H",           IS_NONE|IS_ALPHA                /* 0x48 */},
-       {"I",           IS_NONE|IS_ALPHA                /* 0x49 */},
-       {"J",           IS_NONE|IS_ALPHA                /* 0x4A */},
-       {"K",           IS_NONE|IS_ALPHA                /* 0x4B */},
-       {"L",           IS_NONE|IS_ALPHA                /* 0x4C */},
-       {"M",           IS_NONE|IS_ALPHA                /* 0x4D */},
-       {"N",           IS_NONE|IS_ALPHA                /* 0x4E */},
-       {"O",           IS_NONE|IS_ALPHA                /* 0x4F */},
-       {"P",           IS_NONE|IS_ALPHA                /* 0x50 */},
-       {"Q",           IS_NONE|IS_ALPHA                /* 0x51 */},
-       {"R",           IS_NONE|IS_ALPHA                /* 0x52 */},
-       {"S",           IS_NONE|IS_ALPHA                /* 0x53 */},
-       {"T",           IS_NONE|IS_ALPHA                /* 0x54 */},
-       {"U",           IS_NONE|IS_ALPHA                /* 0x55 */},
-       {"V",           IS_NONE|IS_ALPHA                /* 0x56 */},
-       {"W",           IS_NONE|IS_ALPHA                /* 0x57 */},
-       {"X",           IS_NONE|IS_ALPHA                /* 0x58 */},
-       {"Y",           IS_NONE|IS_ALPHA                /* 0x59 */},
-       {"Z",           IS_NONE|IS_ALPHA                /* 0x5A */},
-       {"[",           IS_NONE                                 /* 0x5B */},
-       {"\\",          IS_NONE                                 /* 0x5C */},
-       {"]",           IS_NONE                                 /* 0x5D */},
-       {"^",           IS_NONE                                 /* 0x5E */},
-       {"_",           IS_NONE|IS_ALPHA                /* 0x5F */},
-       {"`",           IS_NONE                                 /* 0x60 */},
-       {"a",           IS_NONE|IS_ALPHA|IS_HEX /* 0x61 */},
-       {"b",           IS_NONE|IS_ALPHA|IS_HEX /* 0x62 */},
-       {"c",           IS_NONE|IS_ALPHA|IS_HEX /* 0x63 */},
-       {"d",           IS_NONE|IS_ALPHA|IS_HEX /* 0x64 */},
-       {"e",           IS_NONE|IS_ALPHA|IS_HEX /* 0x65 */},
-       {"f",           IS_NONE|IS_ALPHA|IS_HEX /* 0x66 */},
-       {"g",           IS_NONE|IS_ALPHA                /* 0x67 */},
-       {"h",           IS_NONE|IS_ALPHA                /* 0x68 */},
-       {"i",           IS_NONE|IS_ALPHA                /* 0x69 */},
-       {"j",           IS_NONE|IS_ALPHA                /* 0x6A */},
-       {"k",           IS_NONE|IS_ALPHA                /* 0x6B */},
-       {"l",           IS_NONE|IS_ALPHA                /* 0x6C */},
-       {"m",           IS_NONE|IS_ALPHA                /* 0x6D */},
-       {"n",           IS_NONE|IS_ALPHA                /* 0x6E */},
-       {"o",           IS_NONE|IS_ALPHA                /* 0x6F */},
-       {"p",           IS_NONE|IS_ALPHA                /* 0x70 */},
-       {"q",           IS_NONE|IS_ALPHA                /* 0x71 */},
-       {"r",           IS_NONE|IS_ALPHA                /* 0x72 */},
-       {"s",           IS_NONE|IS_ALPHA                /* 0x73 */},
-       {"t",           IS_NONE|IS_ALPHA                /* 0x74 */},
-       {"u",           IS_NONE|IS_ALPHA                /* 0x75 */},
-       {"v",           IS_NONE|IS_ALPHA                /* 0x76 */},
-       {"w",           IS_NONE|IS_ALPHA                /* 0x77 */},
-       {"x",           IS_NONE|IS_ALPHA                /* 0x78 */},
-       {"y",           IS_NONE|IS_ALPHA                /* 0x79 */},
-       {"z",           IS_NONE|IS_ALPHA                /* 0x7A */},
-       {"{",           IS_NONE                                 /* 0x7B */},
-       {"|",           IS_NONE                                 /* 0x7C */},
-       {"}",           IS_NONE                                 /* 0x7D */},
-       {"~",           IS_NONE                                 /* 0x7E */},
-       {"\\z7F",       IS_NONE                                 /* 0x7F */},
-};
-
-
-/**************** lgetc - returns next character *************************/
-
-#define INLINE 1024
-
-char line_buf[INLINE];
-char *cur_line = line_buf;             /* points to current line buffer */
-char *clp = NULL;                              /* where we're at in cur_line */
-
-lgetc(fp)
-FILE *fp;
-{
-       int c;
-
-       if(clp == NULL) {
-               if(fgets(cur_line, INLINE, fp) == NULL) {
-                       c = EOF;
-               } else {
-                       clp = cur_line;
-                       c = *clp++;
-               }
-       } else {
-               c = *clp++;
-       }
-
-       switch(c) {
-       case EOF:
-               /* at EOF: all done */
-               if(ldebug)
-                       printf("<eof>\n");
-               return EOF;
-               break;
-       case '\0':
-               c = '\n';
-       case '\n':
-               clp = NULL;
-               break;
-       default:
-               break;
-       }
-
-       if(ldebug)
-               printf(c < ' ' ? "<\\z%02X>%s" : "<%c>", c, c == '\n' ? "\n" : "");
-
-       return c;
-}