]> git.sur5r.net Git - cc65/commitdiff
Removed the strexpr module and placed the implementation of the .STRING
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 23 Jun 2000 20:49:47 +0000 (20:49 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Fri, 23 Jun 2000 20:49:47 +0000 (20:49 +0000)
builtin function into the NextTok function.
Added the .CONCAT function.

git-svn-id: svn://svn.cc65.org/cc65/trunk@113 b7a2c559-68d2-44c3-8de9-860c34a00d81

src/ca65/make/gcc.mak
src/ca65/make/watcom.mak
src/ca65/nexttok.c
src/ca65/pseudo.c
src/ca65/scanner.c
src/ca65/scanner.h
src/ca65/strexpr.c [deleted file]
src/ca65/strexpr.h [deleted file]

index 6013fca2da9f4af97acce4c84fae10243c2101da..90494d084ef85126fe79410025802345dc909224 100644 (file)
@@ -25,7 +25,6 @@ OBJS =  condasm.o     \
                options.o       \
         pseudo.o       \
         scanner.o      \
-       strexpr.o       \
         symtab.o       \
                toklist.o       \
        ulabel.o
index 8b4eba838519586d6bd9d591e18340d248625114..430b964fb6bc141907f0a5121919ce5e9371447e 100644 (file)
@@ -82,7 +82,6 @@ OBJS =        condasm.obj     \
        options.obj     \
        pseudo.obj      \
        scanner.obj     \
-       strexpr.obj     \
        symtab.obj      \
        toklist.obj     \
        ulabel.obj
@@ -126,7 +125,6 @@ FILE objfile.obj
 FILE options.obj
 FILE pseudo.obj
 FILE scanner.obj
-FILE strexpr.obj
 FILE symtab.obj
 FILE toklist.obj
 FILE ulabel.obj
index 39341263411aa32628a2dcee75c919eaa9d3b0a2..418130d86fe53e29bf8f920279053d20fd740ecf 100644 (file)
@@ -33,6 +33,8 @@
 
 
 
+#include <stdio.h>
+
 #include "error.h"
 #include "expr.h"
 #include "scanner.h"
@@ -93,10 +95,79 @@ static TokList* CollectTokens (unsigned Start, unsigned Count)
 
 
 
+static void FuncConcat (void)
+/* Handle the .CONCAT function */
+{
+    char       Buf[MAX_STR_LEN+1];
+    char*      B;
+    unsigned   Length;
+    unsigned   L;
+
+    /* Skip it */
+    NextTok ();
+
+    /* Left paren expected */
+    ConsumeLParen ();
+
+    /* Concatenate any number of strings */
+    B = Buf;
+    B[0] = '\0';
+    Length = 0;
+    while (1) {
+
+       /* Next token must be a string */
+       if (Tok != TOK_STRCON) {
+           Error (ERR_STRCON_EXPECTED);
+           SkipUntilSep ();
+           return;
+       }
+
+       /* Get the length of the string const and check total length */
+       L = strlen (SVal);
+       if (Length + L > MAX_STR_LEN) {
+           Error (ERR_STRING_TOO_LONG);
+           /* Try to recover */
+           SkipUntilSep ();
+           return;
+       }
+
+       /* Add the new string */
+       memcpy (B, SVal, L);
+       Length += L;
+       B      += L;
+
+       /* Skip the string token */
+       NextTok ();
+
+       /* Comma means another argument */
+       if (Tok == TOK_COMMA) {
+           NextTok ();
+       } else {
+           /* Done */
+           break;
+       }
+    }
+
+    /* Terminate the string */
+    *B = '\0';
+
+    /* We expect a closing parenthesis, but will not skip it but replace it
+     * by the string token just created.
+     */
+    if (Tok != TOK_RPAREN) {
+       Error (ERR_RPAREN_EXPECTED);
+    } else {
+       Tok = TOK_STRCON;
+       strcpy (SVal, Buf);
+    }
+}
+
+
+
 static void FuncMid (void)
 /* Handle the .MID function */
 {
-    long       Start;
+    long       Start;
     long               Count;
     TokList*   List;
 
@@ -104,13 +175,13 @@ static void FuncMid (void)
     NextTok ();
 
     /* Left paren expected */
-    ConsumeRParen ();
+    ConsumeLParen ();
 
     /* Start argument */
     Start = ConstExpression ();
     if (Start < 0 || Start > 100) {
        Error (ERR_RANGE);
-       Start = 0;
+       Start = 0;
     }
     ConsumeComma ();
 
@@ -133,6 +204,41 @@ static void FuncMid (void)
 
 
 
+static void FuncString (void)
+/* Handle the .STRING function */
+{
+    char Buf[MAX_STR_LEN+1];
+
+    /* Skip it */
+    NextTok ();
+
+    /* Left paren expected */
+    ConsumeLParen ();
+
+    /* Accept identifiers or numeric expressions */
+    if (Tok == TOK_IDENT) {
+       /* Save the identifier, then skip it */
+       strcpy (Buf, SVal);
+       NextTok ();
+    } else {
+       /* Numeric expression */
+       long Val = ConstExpression ();
+       sprintf (Buf, "%ld", Val);
+    }
+
+    /* We expect a closing parenthesis, but will not skip it but replace it
+     * by the string token just created.
+     */
+    if (Tok != TOK_RPAREN) {
+       Error (ERR_RPAREN_EXPECTED);
+    } else {
+       Tok = TOK_STRCON;
+       strcpy (SVal, Buf);
+    }
+}
+
+
+
 void NextTok (void)
 /* Get next token and handle token level functions */
 {
@@ -142,10 +248,18 @@ void NextTok (void)
     /* Check for token handling functions */
     switch (Tok) {
 
+       case TOK_CONCAT:
+           FuncConcat ();
+           break;
+
        case TOK_MID:
            FuncMid ();
            break;
 
+       case TOK_STRING:
+           FuncString ();
+           break;
+
        default:
            /* Quiet down gcc */
            break;
index 3190d457fa474d24a97e606328d062e0c91ca535..c00d75a9ccaf6854efe8939bd6d2ca929fd1e95c 100644 (file)
@@ -52,7 +52,6 @@
 #include "nexttok.h"
 #include "objcode.h"
 #include "options.h"
-#include "strexpr.h"
 #include "symtab.h"
 #include "pseudo.h"
 
@@ -250,7 +249,7 @@ static void DoASCIIZ (void)
 /* Define text with a zero terminator */
 {
     while (1) {
-       if (StringExpression () == 0) {
+       if (Tok != TOK_STRCON) {
            ErrorSkip (ERR_STRCON_EXPECTED);
            return;
        }
@@ -287,7 +286,7 @@ static void DoByte (void)
 /* Define bytes */
 {
     while (1) {
-       if (StringExpression () != 0) {
+       if (Tok == TOK_STRCON) {
            /* A string */
            EmitData (SVal, strlen (SVal));
            NextTok ();
@@ -399,7 +398,7 @@ static void DoEndProc (void)
 static void DoError (void)
 /* Use error */
 {
-    if (StringExpression () == 0) {
+    if (Tok == TOK_STRCON) {
        ErrorSkip (ERR_STRCON_EXPECTED);
     } else {
                Error (ERR_USER, SVal);
@@ -535,7 +534,7 @@ static void DoFileOpt (void)
        ConsumeComma ();
 
        /* We accept only string options for now */
-       if (StringExpression () == 0) {
+       if (Tok != TOK_STRCON) {
            ErrorSkip (ERR_STRCON_EXPECTED);
            return;
        }
@@ -579,7 +578,7 @@ static void DoFileOpt (void)
        ConsumeComma ();
 
        /* We accept only string options for now */
-       if (StringExpression () == 0) {
+       if (Tok != TOK_STRCON) {
            ErrorSkip (ERR_STRCON_EXPECTED);
            return;
        }
@@ -656,7 +655,7 @@ static void DoIncBin (void)
 /* Include a binary file */
 {
     /* Name must follow */
-    if (StringExpression () == 0) {
+    if (Tok != TOK_STRCON) {
        ErrorSkip (ERR_STRCON_EXPECTED);
     } else {
        /* Try to open the file */
@@ -686,7 +685,7 @@ static void DoInclude (void)
     char Name [MAX_STR_LEN+1];
 
     /* Name must follow */
-    if (StringExpression () == 0) {
+    if (Tok != TOK_STRCON) {
        ErrorSkip (ERR_STRCON_EXPECTED);
     } else {
        strcpy (Name, SVal);
@@ -823,7 +822,7 @@ static void DoOrg (void)
 static void DoOut (void)
 /* Output a string */
 {
-    if (StringExpression () == 0) {
+    if (Tok != TOK_STRCON) {
        ErrorSkip (ERR_STRCON_EXPECTED);
     } else {
        /* Output the string and be sure to flush the output to keep it in
@@ -950,7 +949,7 @@ static void DoSegment (void)
     char Name [sizeof (SVal)];
     int SegType;
 
-    if (StringExpression () == 0) {
+    if (Tok != TOK_STRCON) {
        ErrorSkip (ERR_STRCON_EXPECTED);
     } else {
 
@@ -1079,6 +1078,7 @@ static CtrlDesc CtrlCmdTab [] = {
     { ccNone,          DoByte          },
     { ccNone,          DoCase          },
     { ccNone,          DoCode          },
+    { ccNone,          DoUnexpected,   },      /* .CONCAT */
     { ccNone,          DoUnexpected    },      /* .CONST */
     { ccNone,          DoUnexpected    },      /* .CPU */
     { ccNone,          DoData          },
index 7b0718b4dfdd35c54084549dbe14097242788f78..357144aa140b3ce392565b41959ec3036bc5a6ad 100644 (file)
@@ -136,6 +136,7 @@ struct DotKeyword {
     { "BYTE",          TOK_BYTE        },
     { "CASE",                  TOK_CASE        },
     { "CODE",          TOK_CODE        },
+    { "CONCAT",                TOK_CONCAT      },
     { "CONST",                 TOK_CONST       },
     { "CPU",           TOK_CPU         },
     { "DATA",                  TOK_DATA        },
index 7c1a424c2a0c13ff9e89fb990d2cc60e22eb38f0..f28e30d47d99b7c988f08c0c0771a97f669673b4 100644 (file)
@@ -118,6 +118,7 @@ enum Token {
     TOK_BYTE,
     TOK_CASE,
     TOK_CODE,
+    TOK_CONCAT,
     TOK_CONST,
     TOK_CPU,
     TOK_DATA,
diff --git a/src/ca65/strexpr.c b/src/ca65/strexpr.c
deleted file mode 100644 (file)
index e3d30ba..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*****************************************************************************/
-/*                                                                           */
-/*                                strexpr.c                                 */
-/*                                                                           */
-/*             String expressions for the ca65 macroassembler               */
-/*                                                                           */
-/*                                                                           */
-/*                                                                           */
-/* (C) 2000      Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
-/* EMail:        uz@musoftware.de                                            */
-/*                                                                           */
-/*                                                                           */
-/* This software is provided 'as-is', without any expressed or implied       */
-/* warranty.  In no event will the authors be held liable for any damages    */
-/* arising from the use of this software.                                    */
-/*                                                                           */
-/* Permission is granted to anyone to use this software for any purpose,     */
-/* including commercial applications, and to alter it and redistribute it    */
-/* freely, subject to the following restrictions:                            */
-/*                                                                           */
-/* 1. The origin of this software must not be misrepresented; you must not   */
-/*    claim that you wrote the original software. If you use this software   */
-/*    in a product, an acknowledgment in the product documentation would be  */
-/*    appreciated but is not required.                                       */
-/* 2. Altered source versions must be plainly marked as such, and must not   */
-/*    be misrepresented as being the original software.                      */
-/* 3. This notice may not be removed or altered from any source              */
-/*    distribution.                                                          */
-/*                                                                           */
-/*****************************************************************************/
-
-
-
-#include <stdio.h>
-
-#include "error.h"
-#include "expr.h"
-#include "scanner.h"
-#include "strexpr.h"
-
-
-
-/*****************************************************************************/
-/*                                          Code                                    */
-/*****************************************************************************/
-
-
-
-const char* StringExpression (void)
-/* Evaluate a string expression. If there are no errors, the function will
- * place the string into the token attribute buffer SVal and the token will
- * be TOK_STRCON. A pointer to the buffer is returned.
- * If there was an error, a NULL pointer is returned.
- */
-{
-    char Buf [sizeof (SVal)];
-
-    /* Check for a string constant or a function that returns a string */
-    switch (Tok) {
-
-       case TOK_STRING:
-           NextTok ();
-           ConsumeLParen ();
-           if (Tok == TOK_IDENT) {
-               /* Save the identifier, then skip it */
-               strcpy (Buf, SVal);
-               NextTok ();
-           } else {
-               /* Numeric expression */
-               long Val = ConstExpression ();
-               sprintf (Buf, "%ld", Val);
-           }
-           if (Tok != TOK_RPAREN) {
-               Error (ERR_RPAREN_EXPECTED);
-           }
-           /* Overwrite the token, do not skip it! */
-           strcpy (SVal, Buf);
-           Tok = TOK_STRCON;
-           break;
-
-       case TOK_STRCON:
-           /* We already have a string */
-           break;
-
-       default:
-           /* Error - no string constant */
-           return 0;
-    }
-
-    /* Return a pointer to the buffer */
-    return SVal;
-}
-
-
-
diff --git a/src/ca65/strexpr.h b/src/ca65/strexpr.h
deleted file mode 100644 (file)
index 9457b9f..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-/*****************************************************************************/
-/*                                                                           */
-/*                                strexpr.h                                 */
-/*                                                                           */
-/*             String expressions for the ca65 macroassembler               */
-/*                                                                           */
-/*                                                                           */
-/*                                                                           */
-/* (C) 2000      Ullrich von Bassewitz                                       */
-/*               Wacholderweg 14                                             */
-/*               D-70597 Stuttgart                                           */
-/* EMail:        uz@musoftware.de                                            */
-/*                                                                           */
-/*                                                                           */
-/* This software is provided 'as-is', without any expressed or implied       */
-/* warranty.  In no event will the authors be held liable for any damages    */
-/* arising from the use of this software.                                    */
-/*                                                                           */
-/* Permission is granted to anyone to use this software for any purpose,     */
-/* including commercial applications, and to alter it and redistribute it    */
-/* freely, subject to the following restrictions:                            */
-/*                                                                           */
-/* 1. The origin of this software must not be misrepresented; you must not   */
-/*    claim that you wrote the original software. If you use this software   */
-/*    in a product, an acknowledgment in the product documentation would be  */
-/*    appreciated but is not required.                                       */
-/* 2. Altered source versions must be plainly marked as such, and must not   */
-/*    be misrepresented as being the original software.                      */
-/* 3. This notice may not be removed or altered from any source              */
-/*    distribution.                                                          */
-/*                                                                           */
-/*****************************************************************************/
-
-
-
-#ifndef STREXPR_H
-#define STREXPR_H
-
-
-
-/*****************************************************************************/
-/*                                          Code                                    */
-/*****************************************************************************/
-
-
-
-const char* StringExpression (void);
-/* Evaluate a string expression. If there are no errors, the function will
- * place the string into the token attribute buffer SVal and the token will
- * be TOK_STRCON. A pointer to the buffer is returned.
- * If there was an error, a NULL pointer is returned.
- */
-
-
-
-/* End of strexpr.h */
-
-#endif
-
-
-