]> git.sur5r.net Git - cc65/commitdiff
Add #pragma charmap()
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 18 Feb 2002 08:40:11 +0000 (08:40 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Mon, 18 Feb 2002 08:40:11 +0000 (08:40 +0000)
Cosmetical changes.

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

src/cc65/declare.c
src/cc65/expr.c
src/cc65/expr.h
src/cc65/pragma.c
src/cc65/preproc.c
src/cc65/swstmt.c

index 9aabf0eabc9346364403e8d5a7a685d1a6989dc3..0b516c95636c1574dc4aa5cfe09fedcf18482e33 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2001 Ullrich von Bassewitz                                       */
+/* (C) 1998-2002 Ullrich von Bassewitz                                       */
 /*               Wacholderweg 14                                             */
 /*               D-70597 Stuttgart                                           */
 /* EMail:        uz@musoftware.de                                            */
@@ -230,7 +230,7 @@ static void ParseEnumDecl (void)
        if (CurTok.Tok == TOK_ASSIGN) {
            ExprDesc lval;
            NextToken ();
-           constexpr (&lval);
+           ConstExpr (&lval);
            EnumVal = lval.ConstVal;
        }
 
@@ -858,7 +858,7 @@ static void Decl (Declaration* D, unsigned Mode)
            /* Read the size if it is given */
                    if (CurTok.Tok != TOK_RBRACK) {
                ExprDesc lval;
-                       constexpr (&lval);
+                       ConstExpr (&lval);
                        Size = lval.ConstVal;
                    }
                    ConsumeRBrack ();
@@ -960,7 +960,7 @@ static void ParseVoidInit (void)
     /* Allow an arbitrary list of values */
     ConsumeLCurly ();
     do {
-       constexpr (&lval);
+       ConstExpr (&lval);
        switch (lval.Type[0]) {
 
            case T_SCHAR:
@@ -1069,7 +1069,7 @@ void ParseInit (type* T)
 
        case T_SCHAR:
        case T_UCHAR:
-           constexpr (&lval);
+           ConstExpr (&lval);
            if ((lval.Flags & E_MCTYPE) == E_TCONST) {
                /* Make it byte sized */
                lval.ConstVal &= 0xFF;
@@ -1083,7 +1083,7 @@ void ParseInit (type* T)
        case T_INT:
        case T_UINT:
        case T_PTR:
-           constexpr (&lval);
+           ConstExpr (&lval);
            if ((lval.Flags & E_MCTYPE) == E_TCONST) {
                /* Make it word sized */
                lval.ConstVal &= 0xFFFF;
@@ -1094,7 +1094,7 @@ void ParseInit (type* T)
 
        case T_LONG:
        case T_ULONG:
-           constexpr (&lval);
+           ConstExpr (&lval);
            if ((lval.Flags & E_MCTYPE) == E_TCONST) {
                /* Make it long sized */
                lval.ConstVal &= 0xFFFFFFFF;
index a814b402f4bc2486112411d7076b2f1a61fb7cb5..e272bba98b6a6be3dc4549b72981c738450616b3 100644 (file)
@@ -3215,14 +3215,29 @@ void expression (ExprDesc* lval)
 
 
 
-void constexpr (ExprDesc* lval)
+void ConstExpr (ExprDesc* lval)
 /* Get a constant value */
 {
     memset (lval, 0, sizeof (*lval));
     if (expr (hie1, lval) != 0 || (lval->Flags & E_MCONST) == 0) {
        Error ("Constant expression expected");
        /* To avoid any compiler errors, make the expression a valid const */
-       MakeConstIntExpr (lval, 1);
+       MakeConstIntExpr (lval, 1);
+    }
+}
+
+
+
+void ConstIntExpr (ExprDesc* Val)
+/* Get a constant int value */
+{
+    memset (Val, 0, sizeof (*Val));
+    if (expr (hie1, Val) != 0        ||
+       (Val->Flags & E_MCONST) == 0 ||
+       !IsClassInt (Val->Type)) {
+       Error ("Constant integer expression expected");
+       /* To avoid any compiler errors, make the expression a valid const */
+       MakeConstIntExpr (Val, 1);
     }
 }
 
@@ -3235,7 +3250,7 @@ void intexpr (ExprDesc* lval)
     if (!IsClassInt (lval->Type)) {
        Error ("Integer expression expected");
        /* To avoid any compiler errors, make the expression a valid int */
-       MakeConstIntExpr (lval, 1);
+       MakeConstIntExpr (lval, 1);
     }
 }
 
index 1a6d18a8f4c486055a4fee08415271a3d2788f84..fabd91b40e5c2754504a99edf3d3f37b4f3f6049 100644 (file)
@@ -92,9 +92,12 @@ int evalexpr (unsigned flags, int (*f) (ExprDesc*), ExprDesc* lval);
  * primary register and 1 is returned.
  */
 
-void constexpr (ExprDesc* lval);
+void ConstExpr (ExprDesc* lval);
 /* Get a constant value */
 
+void ConstIntExpr (ExprDesc* Val);
+/* Get a constant int value */
+
 void intexpr (ExprDesc* lval);
 /* Get an integer expression */
 
index ce1a8a4ba2be30de09d13a6b27a4f8723f930045..125bc22b6d5db31420061c42bb98548d0e41c0f3 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2001 Ullrich von Bassewitz                                       */
+/* (C) 1998-2002 Ullrich von Bassewitz                                       */
 /*               Wacholderweg 14                                             */
 /*               D-70597 Stuttgart                                           */
 /* EMail:        uz@cc65.org                                                 */
@@ -36,6 +36,9 @@
 #include <stdlib.h>
 #include <string.h>
 
+/* common */
+#include "tgttrans.h"
+
 /* cc65 */
 #include "codegen.h"
 #include "error.h"
@@ -58,6 +61,7 @@
 /* Tokens for the #pragmas */
 typedef enum {
     PR_BSSSEG,
+    PR_CHARMAP,
     PR_CHECKSTACK,
     PR_CODESEG,
     PR_DATASEG,
@@ -72,9 +76,10 @@ typedef enum {
 /* Pragma table */
 static const struct Pragma {
     const char*        Key;            /* Keyword */
-    pragma_t   Tok;            /* Token */
+    pragma_t           Tok;            /* Token */
 } Pragmas[] = {
     {  "bssseg",       PR_BSSSEG       },
+    {   "charmap",      PR_CHARMAP      },
     {  "checkstack",   PR_CHECKSTACK   },
     {   "codeseg",     PR_CODESEG      },
     {   "dataseg",     PR_DATASEG      },
@@ -170,15 +175,49 @@ static void SegNamePragma (segment_t Seg)
 
 
 
+static void CharMapPragma (void)
+/* Change the character map */
+{
+    unsigned Index, C;
+
+    ExprDesc Val;
+
+    /* Read the character index */
+    ConstIntExpr (&Val);
+    if (Val.ConstVal < 1 || Val.ConstVal > 255) {
+       Error ("Character index out of range");
+       Index = 'A';
+    } else {
+       Index = Val.ConstVal;
+    }
+
+    /* Comma follows */
+    ConsumeComma ();
+
+    /* Read the character code */
+    ConstIntExpr (&Val);
+    if (Val.ConstVal < 1 || Val.ConstVal > 255) {
+       Error ("Character code out of range");
+       C = 'A';
+    } else {
+       C = Val.ConstVal;
+    }
+
+    /* Remap the character */
+    TgtTranslateSet (Index, C);
+}
+
+
+
 static void FlagPragma (unsigned char* Flag)
 /* Handle a pragma that expects a boolean paramater */
 {
-    /* Read a constant expression */
-    ExprDesc val;
-    constexpr (&val);
+    /* Read a constant integer expression */
+    ExprDesc Val;
+    ConstIntExpr (&Val);
 
     /* Store the value into the flag parameter */
-    *Flag = (val.ConstVal != 0);
+    *Flag = (Val.ConstVal != 0);
 }
 
 
@@ -221,6 +260,10 @@ void DoPragma (void)
            SegNamePragma (SEG_BSS);
            break;
 
+       case PR_CHARMAP:
+           CharMapPragma ();
+           break;
+
        case PR_CHECKSTACK:
            FlagPragma (&CheckStack);
            break;
index 8a826e0bba60739a9ee5db37c530f19794871689..f1135acb23df277611e23f5ea6650d4ccb472e1c 100644 (file)
@@ -147,7 +147,7 @@ static void keepch (char c)
 {
     *mptr++ = c;
 }
-           
+
 
 
 static void keepstr (const char* S)
@@ -758,7 +758,7 @@ static int DoIf (int Skip)
     NextToken ();
 
     /* Call the expression parser */
-    constexpr (&lval);
+    ConstExpr (&lval);
 
     /* End preprocessing mode */
     Preprocessing = 0;
index c1317449fedc55487cf660f0869a32c56844d846..fc4d40a6362ff565f2831772d543f3540b006a83 100644 (file)
@@ -6,7 +6,7 @@
 /*                                                                           */
 /*                                                                           */
 /*                                                                           */
-/* (C) 1998-2001 Ullrich von Bassewitz                                       */
+/* (C) 1998-2002 Ullrich von Bassewitz                                       */
 /*               Wacholderweg 14                                             */
 /*               D-70597 Stuttgart                                           */
 /* EMail:        uz@cc65.org                                                 */
@@ -121,7 +121,7 @@ void SwitchStatement (void)
                NextToken ();
 
                /* Read the selector expression */
-               constexpr (&CaseExpr);
+               ConstExpr (&CaseExpr);
                if (!IsClassInt (CaseExpr.Type)) {
                    Error ("Switch quantity not an integer");
                }
@@ -142,14 +142,14 @@ void SwitchStatement (void)
                            Error ("Range error");
                        }
                        break;
-                            
+
                    case T_SHORT:
                    case T_INT:
                        if (Val < -32768 || Val > 32767) {
                            Error ("Range error");
                        }
                        break;
-                                
+
                    case T_USHORT:
                    case T_UINT:
                        if (Val < 0 || Val > 65535) {