]> git.sur5r.net Git - cc65/commitdiff
Removed error numbers in favour of literal error messages. The error numbers
authorcuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 2 Nov 2000 21:22:33 +0000 (21:22 +0000)
committercuz <cuz@b7a2c559-68d2-44c3-8de9-860c34a00d81>
Thu, 2 Nov 2000 21:22:33 +0000 (21:22 +0000)
were harder to manage, made the code harder to read, and lead no less
verbose messages, since it was effort to add a new message. The new approach
has the drawback that it's more difficult to translate, but this won't
happen anyway.

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

18 files changed:
src/cc65/codegen.c
src/cc65/compile.c
src/cc65/datatype.c
src/cc65/declare.c
src/cc65/declattr.c
src/cc65/error.c
src/cc65/error.h
src/cc65/expr.c
src/cc65/function.c
src/cc65/goto.c
src/cc65/loop.c
src/cc65/loop.h
src/cc65/macrotab.c
src/cc65/pragma.c
src/cc65/scanner.c
src/cc65/scanner.h
src/cc65/stmt.c
src/cc65/symtab.c

index 74e5b9774aa3dbe2f7a966281b6fd6da3b5ebebb..b1bcbbd3b17e70adb598610cd9459bcd67f24bfe 100644 (file)
@@ -94,7 +94,7 @@ static void CheckLocalOffs (unsigned Offs)
     if (Offs >= 256) {
        /* Too many local vars */
                AddCodeLine (";*** Too many locals");
-       Error (ERR_TOO_MANY_LOCALS);
+       Error ("Too many local variables");
     }
 }
 
index 58ee19f5cab69dd1c9f3f1b50975662c5947a985..b4784fcc69488e5e68ffc1b15c2f429750ba391c 100644 (file)
@@ -99,7 +99,7 @@ static void Parse (void)
 
        /* Don't accept illegal storage classes */
        if (Spec.StorageClass == SC_AUTO || Spec.StorageClass == SC_REGISTER) {
-           Error (ERR_ILLEGAL_STORAGE_CLASS);
+           Error ("Illegal storage class");
            Spec.StorageClass = SC_EXTERN | SC_STATIC;
        }
 
@@ -164,11 +164,11 @@ static void Parse (void)
                        if (!IsTypeVoid (Decl.Type)) {
                            if (!IsTypeArray (Decl.Type)) {
                                /* Size is unknown and not an array */
-                               Error (ERR_UNKNOWN_SIZE);
+                               Error ("Variable `%s' has unknown size", Decl.Ident);
                            }
                        } else if (ANSI) {
                            /* We cannot declare variables of type void */
-                           Error (ERR_ILLEGAL_TYPE);
+                           Error ("Illegal type for variable `%s'", Decl.Ident);
                        }
                    }
 
@@ -191,10 +191,10 @@ static void Parse (void)
 
                    if (IsTypeVoid (Decl.Type)) {
                        /* We cannot declare variables of type void */
-                       Error (ERR_ILLEGAL_TYPE);
+                       Error ("Illegal type for variable `%s'", Decl.Ident);
                    } else if (Size == 0) {
                        /* Size is unknown */
-                       Error (ERR_UNKNOWN_SIZE);
+                       Error ("Variable `%s' has unknown size", Decl.Ident);
                    }
 
                    /* Switch to the BSS segment */
index ba72fc1a8ec81d2fb62bf4c75d0b4fef7c850fd3..df9c7d13e3b404074d6453a28f1d2d2112f8c6a2 100644 (file)
@@ -194,7 +194,7 @@ type* GetImplicitFuncType (void)
 type* PointerTo (const type* T)
 /* Return a type string that is "pointer to T". The type string is allocated
  * on the heap and may be freed after use.
- */                           
+ */
 {
     /* Get the size of the type string including the terminator */
     unsigned Size = TypeLen (T) + 1;
@@ -382,7 +382,7 @@ unsigned SizeOf (const type* T)
     switch (UnqualifiedType (T[0])) {
 
        case T_VOID:
-           Error (ERR_ILLEGAL_SIZE);
+           Error ("Variable has unknown size");
            return 1;   /* Return something that makes sense */
 
        case T_SCHAR:
@@ -450,7 +450,7 @@ unsigned TypeOf (const type* T)
     FuncDesc* F;
 
     switch (UnqualifiedType (T[0])) {
-
+           
        case T_SCHAR:
            return CF_CHAR;
 
@@ -484,7 +484,7 @@ unsigned TypeOf (const type* T)
                    return CF_INT | CF_UNSIGNED;
 
                default:
-                   Error (ERR_ILLEGAL_TYPE);
+                   Error ("Illegal type");
                    return CF_INT;
     }
 }
index 004a9c27af4a5e6b22eadc398b63c58f66a315b4..b303adc35067bdf8e75975fc812c484063477ae6 100644 (file)
@@ -58,14 +58,14 @@ static type OptionalQualifiers (type Q)
 
            case TOK_CONST:
                if (Q & T_QUAL_CONST) {
-                   Error (ERR_DUPLICATE_QUALIFIER, "const");
-               }
+                   Error ("Duplicate qualifier: `const'");
+               }                                        
                Q |= T_QUAL_CONST;
                break;
 
            case TOK_VOLATILE:
                if (Q & T_QUAL_VOLATILE) {
-                   Error (ERR_DUPLICATE_QUALIFIER, "volatile");
+                   Error ("Duplicate qualifier: `volatile'");
                }
                Q |= T_QUAL_VOLATILE;
                break;
@@ -192,7 +192,7 @@ static void ParseEnumDecl (void)
 
        /* We expect an identifier */
        if (curtok != TOK_IDENT) {
-           Error (ERR_IDENT_EXPECTED);
+           Error ("Identifier expected");
            continue;
        }
 
@@ -241,7 +241,7 @@ static SymEntry* ParseStructDecl (const char* Name, type StructType)
            Entry = AddStructSym (Name, 0, 0);
        } else if (SymIsLocal (Entry) && (Entry->Flags & SC_STRUCT) == 0) {
            /* Already defined in the level but no struct */
-           Error (ERR_SYMBOL_KIND);
+           Error ("Symbol `%s' is already different kind", Name);
        }
        return Entry;
     }
@@ -469,7 +469,7 @@ static void ParseTypeSpec (DeclSpec* D, int Default)
                    Entry = FindTagSym (CurTok.Ident);
                    if (Entry) {
                        if (SymIsLocal (Entry) && (Entry->Flags & SC_ENUM) == 0) {
-                           Error (ERR_SYMBOL_KIND);
+                           Error ("Symbol `%s' is already different kind", Entry->Name);
                        }
                    } else {
                        /* Insert entry into table ### */
@@ -477,7 +477,7 @@ static void ParseTypeSpec (DeclSpec* D, int Default)
                    /* Skip the identifier */
                    NextToken ();
                } else {
-                   Error (ERR_IDENT_EXPECTED);
+                   Error ("Identifier expected");
                }
            }
            /* Remember we have an extra type decl */
@@ -500,7 +500,7 @@ static void ParseTypeSpec (DeclSpec* D, int Default)
 
        default:
            if (Default < 0) {
-               Error (ERR_TYPE_EXPECTED);
+               Error ("Type expected");
                D->Type[0] = T_INT;
                D->Type[1] = T_END;
            } else {
@@ -539,7 +539,7 @@ static void ParseOldStyleParamList (FuncDesc* F)
 
        /* List of identifiers expected */
        if (curtok != TOK_IDENT) {
-           Error (ERR_IDENT_EXPECTED);
+           Error ("Identifier expected");
        }
 
        /* Create a symbol table entry with type int */
@@ -567,7 +567,7 @@ static void ParseOldStyleParamList (FuncDesc* F)
     /* An optional list of type specifications follows */
     while (curtok != TOK_LCURLY) {
 
-       DeclSpec        Spec;
+       DeclSpec        Spec;
 
        /* Read the declaration specifier */
        ParseDeclSpec (&Spec, SC_AUTO, T_INT);
@@ -577,7 +577,7 @@ static void ParseOldStyleParamList (FuncDesc* F)
         */
        if ((Spec.StorageClass & SC_AUTO) == 0 &&
            (Spec.StorageClass & SC_REGISTER) == 0) {
-           Error (ERR_ILLEGAL_STORAGE_CLASS);
+           Error ("Illegal storage class");
        }
 
        /* Parse a comma separated variable list */
@@ -595,7 +595,7 @@ static void ParseOldStyleParamList (FuncDesc* F)
                    /* Found it, change the default type to the one given */
                    ChangeSymType (Sym, ParamTypeCvt (Decl.Type));
                } else {
-                   Error (ERR_UNKNOWN_IDENT, Decl.Ident);
+                   Error ("Unknown identifier: `%s'", Decl.Ident);
                }
            }
 
@@ -639,7 +639,7 @@ static void ParseAnsiParamList (FuncDesc* F)
         */
        if ((Spec.StorageClass & SC_AUTO) == 0 &&
            (Spec.StorageClass & SC_REGISTER) == 0) {
-           Error (ERR_ILLEGAL_STORAGE_CLASS);
+           Error ("Illegal storage class");
        }
        Spec.StorageClass = SC_AUTO | SC_PARAM | SC_DEF;
 
@@ -687,7 +687,7 @@ static void ParseAnsiParamList (FuncDesc* F)
         * parameters.
         */
                if (ANSI && (F->Flags & FD_UNNAMED_PARAMS) != 0) {
-           Error (ERR_MISSING_PARAM_NAME);
+           Error ("Parameter name omitted");
        }
     }
 }
@@ -775,7 +775,7 @@ static void Decl (Declaration* D, unsigned Mode)
        Decl (D, Mode);
        /* Set the fastcall flag */
        if (!IsTypeFunc (T)) {
-           Error (ERR_ILLEGAL_MODIFIER);
+           Error ("__fastcall__ modifier applied to non function");
        } else {
            FuncDesc* F = DecodePtr (T+1);
                    F->Flags |= FD_FASTCALL;
@@ -799,7 +799,7 @@ static void Decl (Declaration* D, unsigned Mode)
            NextToken ();
        } else {
            if (Mode == DM_NEED_IDENT) {
-               Error (ERR_IDENT_EXPECTED);
+               Error ("Identifier expected");
            }
            D->Ident[0] = '\0';
            return;
@@ -879,7 +879,11 @@ void ParseDecl (const DeclSpec* Spec, Declaration* D, unsigned Mode)
 
     /* Check the size of the generated type */
     if (!IsTypeFunc (D->Type) && !IsTypeVoid (D->Type) && SizeOf (D->Type) >= 0x10000) {
-       Error (ERR_ILLEGAL_SIZE);
+       if (D->Ident[0] != '\0') {
+           Error ("Size of `%s' is invalid", D->Ident);
+       } else {
+           Error ("Invalid size");
+       }
     }
 }
 
@@ -952,7 +956,7 @@ static void ParseVoidInit (void)
                break;
 
            default:
-               Error (ERR_ILLEGAL_TYPE);
+               Error ("Illegal type in initialization");
                break;
 
        }
@@ -986,7 +990,7 @@ static void ParseStructInit (type* Type)
      */
     Tab = Entry->V.S.SymTab;
     if (Tab == 0) {
-       Error (ERR_INIT_INCOMPLETE_TYPE);
+       Error ("Cannot initialize variables with incomplete type");
        /* Returning here will cause lots of errors, but recovery is difficult */
        return;
     }
@@ -995,7 +999,7 @@ static void ParseStructInit (type* Type)
     Entry = Tab->SymHead;
     while (curtok != TOK_RCURLY) {
        if (Entry == 0) {
-           Error (ERR_TOO_MANY_INITIALIZERS);
+           Error ("Too many initializers");
            return;
        }
        ParseInit (Entry->Type);
@@ -1091,7 +1095,7 @@ void ParseInit (type* T)
            } else if (count < sz) {
                g_zerobytes ((sz - count) * SizeOf (T + DECODE_SIZE + 1));
            } else if (count > sz) {
-               Error (ERR_TOO_MANY_INITIALIZERS);
+               Error ("Too many initializers");
            }
            break;
 
@@ -1109,7 +1113,7 @@ void ParseInit (type* T)
            /* FALLTHROUGH */
 
        default:
-           Error (ERR_ILLEGAL_TYPE);
+           Error ("Illegal type");
            break;
 
     }
index 9450356b781e22193a9df39a3117d8c0f67fb926..b06c36aed3dfc5b460af0093483661bef1f84f2c 100644 (file)
@@ -92,14 +92,14 @@ static void AliasAttrib (const Declaration* D, DeclAttr* A)
 
     /* The next identifier is the name of the alias symbol */
     if (CurTok.Tok != TOK_IDENT) {
-               Error (ERR_IDENT_EXPECTED);
+               Error ("Identifier expected");
        return;
     }
 
     /* Lookup the symbol for this name, it must exist */
     Sym = FindSym (CurTok.Ident);
     if (Sym == 0) {
-       Error (ERR_UNKNOWN_IDENT, CurTok.Ident);
+       Error ("Unknown identifier: `%s'", CurTok.Ident);
        NextToken ();
        return;
     }
@@ -110,7 +110,7 @@ static void AliasAttrib (const Declaration* D, DeclAttr* A)
     /* Check if the types of the symbols are identical */
     if (TypeCmp (D->Type, Sym->Type) < TC_EQUAL) {
        /* Types are not identical */
-       Error (ERR_INCOMPATIBLE_TYPES);
+       Error ("Incompatible types");
        return;
     }
 
@@ -124,7 +124,8 @@ static void AliasAttrib (const Declaration* D, DeclAttr* A)
 void ParseAttribute (const Declaration* D, DeclAttr* A)
 /* Parse an additional __attribute__ modifier */
 {
-    attrib_t AttrType;
+    ident    AttrName;
+    attrib_t AttrType;              
 
     /* Initialize the attribute description with "no attribute" */
     A->AttrType = atNone;
@@ -144,13 +145,14 @@ void ParseAttribute (const Declaration* D, DeclAttr* A)
 
     /* Identifier follows */
     if (CurTok.Tok != TOK_IDENT) {
-               Error (ERR_IDENT_EXPECTED);
+               Error ("Identifier expected");
        /* We should *really* try to recover here, but for now: */
        return;
     }
 
     /* Map the attribute name to its id, then skip the identifier */
-    AttrType = FindAttribute (CurTok.Ident);
+    strcpy (AttrName, CurTok.Ident);
+    AttrType = FindAttribute (AttrName);
     NextToken ();
 
     /* Handle possible attributes */
@@ -162,7 +164,7 @@ void ParseAttribute (const Declaration* D, DeclAttr* A)
 
        default:
            /* Attribute not known, maybe typo */
-           Error (ERR_ILLEGAL_ATTRIBUTE);
+           Error ("Illegal attribute: `%s'", AttrName);
            break;
     }
 
index 95db80a45b140e081be74082d8697d53f2034142..2f443f28d6a9ae002be25add342f7aa205bc858e 100644 (file)
 
 
 /*****************************************************************************/
-/*                                  Data                                    */
+/*                                  Data                                    */
 /*****************************************************************************/
 
 
 
-/* Error messages sorted by ErrTypes */
-static char* ErrMsg [ERR_COUNT-1] = {
-    "Syntax error",
-    "`\"' expected",
-    "`:' expected",
-    "`;' expected",
-    "`,' expected",
-    "`(' expected",
-    "`)' expected",
-    "`[' expected",
-    "`]' expected",
-    "`{' expected",
-    "`}' expected",
-    "Identifier expected",
-    "Type expected",
-    "Incompatible types",
-    "Incompatible pointer types",
-    "Too many arguments in function call",
-    "Too few arguments in function call",
-    "Duplicate macro parameter: %s",
-    "Variable identifier expected",
-    "Integer expression expected",
-    "Constant expression expected",
-    "No active loop",
-    "Redefinition of `%s'",
-    "Conflicting types for `%s'",
-    "String literal expected",
-    "`while' expected",
-    "Function must return a value",
-    "Function cannot return a value",
-    "Unexpected `continue'",
-    "Undefined symbol: `%s'",
-    "Undefined label: `%s'",
-    "Too many local variables",
-    "Too many initializers",
-    "Cannot initialize incomplete type",
-    "Cannot subscript",
-    "Operation not allowed with this type of argument",
-    "Struct expected",
-    "Struct/union has no field named `%s'",
-    "Struct pointer expected",
-    "lvalue expected",
-    "Expression expected",
-    "Preprocessor expression expected",
-    "Illegal type",
-    "Illegal function call",
-    "Illegal indirection",
-    "Illegal address",
-    "Illegal hex digit",
-    "Illegal character constant",
-    "Illegal modifier",
-    "Illegal type qualifier",
-    "Illegal storage class",
-    "Illegal attribute",
-    "Illegal segment name: `%s'",
-    "Division by zero",
-    "Modulo operation with zero",
-    "Range error",
-    "Symbol is already different kind",
-    "Too many lexical levels",
-    "Parameter name omitted",
-    "Old style function decl used as prototype",
-    "Declaration for parameter `%s' but no such parameter",
-    "Cannot take address of a register variable",
-    "Illegal size of data type",
-    "__fastcall__ is not allowed for C functions",
-    "Variable has unknown size",
-    "Unknown identifier: `%s'",
-    "Duplicate qualifier: `%s'",
-    "Assignment to const",
-    "Pointer types differ in type qualifiers",
-};
-
-
-
 /* Count of errors/warnings */
 unsigned ErrorCount    = 0;
 unsigned WarningCount  = 0;
@@ -195,18 +120,7 @@ static void IntError (const char* Filename, unsigned Line, const char* Msg, va_l
 
 
 
-void Error (unsigned ErrNum, ...)
-/* Print an error message */
-{
-    va_list ap;
-    va_start (ap, ErrNum);
-    IntError (GetCurrentFile(), curpos, ErrMsg [ErrNum-1], ap);
-    va_end (ap);
-}
-
-
-
-void MError (const char* Format, ...)
+void Error (const char* Format, ...)
 /* Print an error message */
 {
     va_list ap;
index b67fcb240251571f7666ea50bcfb9ab0a1aceb69..b10d786c60b3f7528382f628a9e7df2aec3ea2fa 100644 (file)
 
 
 
-/* Error numbers */
-enum Errors {
-    ERR_NONE,                          /* No error */
-    ERR_SYNTAX,
-    ERR_QUOTE_EXPECTED,
-    ERR_COLON_EXPECTED,
-    ERR_SEMICOLON_EXPECTED,
-    ERR_COMMA_EXPECTED,
-    ERR_LPAREN_EXPECTED,
-    ERR_RPAREN_EXPECTED,
-    ERR_LBRACK_EXPECTED,
-    ERR_RBRACK_EXPECTED,
-    ERR_LCURLY_EXPECTED,
-    ERR_RCURLY_EXPECTED,
-    ERR_IDENT_EXPECTED,
-    ERR_TYPE_EXPECTED,
-    ERR_INCOMPATIBLE_TYPES,
-    ERR_INCOMPATIBLE_POINTERS,
-    ERR_TOO_MANY_FUNC_ARGS,
-    ERR_TOO_FEW_FUNC_ARGS,
-    ERR_DUPLICATE_MACRO_ARG,
-    ERR_VAR_IDENT_EXPECTED,
-    ERR_INT_EXPR_EXPECTED,
-    ERR_CONST_EXPR_EXPECTED,
-    ERR_NO_ACTIVE_LOOP,
-    ERR_MULTIPLE_DEFINITION,
-    ERR_CONFLICTING_TYPES,
-    ERR_STRLIT_EXPECTED,
-    ERR_WHILE_EXPECTED,
-    ERR_MUST_RETURN_VALUE,
-    ERR_CANNOT_RETURN_VALUE,
-    ERR_UNEXPECTED_CONTINUE,
-    ERR_UNDEFINED_SYMBOL,
-    ERR_UNDEFINED_LABEL,
-    ERR_TOO_MANY_LOCALS,
-    ERR_TOO_MANY_INITIALIZERS,
-    ERR_INIT_INCOMPLETE_TYPE,
-    ERR_CANNOT_SUBSCRIPT,
-    ERR_OP_NOT_ALLOWED,
-    ERR_STRUCT_EXPECTED,
-    ERR_STRUCT_FIELD_MISMATCH,
-    ERR_STRUCT_PTR_EXPECTED,
-    ERR_LVALUE_EXPECTED,
-    ERR_EXPR_EXPECTED,
-    ERR_CPP_EXPR_EXPECTED,
-    ERR_ILLEGAL_TYPE,
-    ERR_ILLEGAL_FUNC_CALL,
-    ERR_ILLEGAL_INDIRECT,
-    ERR_ILLEGAL_ADDRESS,
-    ERR_ILLEGAL_HEX_DIGIT,
-    ERR_ILLEGAL_CHARCONST,
-    ERR_ILLEGAL_MODIFIER,
-    ERR_ILLEGAL_QUALIFIER,
-    ERR_ILLEGAL_STORAGE_CLASS,
-    ERR_ILLEGAL_ATTRIBUTE,
-    ERR_ILLEGAL_SEG_NAME,
-    ERR_DIV_BY_ZERO,
-    ERR_MOD_BY_ZERO,
-    ERR_RANGE,
-    ERR_SYMBOL_KIND,
-    ERR_LEVEL_NESTING,
-    ERR_MISSING_PARAM_NAME,
-    ERR_OLD_STYLE_PROTO,
-    ERR_PARAM_DECL,
-    ERR_CANNOT_TAKE_ADDR_OF_REG,
-    ERR_ILLEGAL_SIZE,
-    ERR_FASTCALL,
-    ERR_UNKNOWN_SIZE,
-    ERR_UNKNOWN_IDENT,
-    ERR_DUPLICATE_QUALIFIER,
-    ERR_CONST_ASSIGN,
-    ERR_QUAL_DIFF,
-    ERR_COUNT                          /* Error count */
-};
-
 /* Count of errors/warnings */
 extern unsigned ErrorCount;
 extern unsigned WarningCount;
@@ -142,10 +67,7 @@ void Warning (const char* Format, ...) attribute ((format (printf, 1, 2)));
 void PPWarning (const char* Format, ...) attribute ((format (printf, 1, 2)));
 /* Print warning message. For use within the preprocessor. */
 
-void Error (unsigned ErrNum, ...);
-/* Print an error message */
-
-void MError (const char* Format, ...) attribute ((format (printf, 1, 2)));
+void Error (const char* Format, ...) attribute ((format (printf, 1, 2)));
 /* Print an error message */
 
 void PPError (const char* Format, ...) attribute ((format (printf, 1, 2)));
index b7bd14ac2d16867df42a6f947376f98ec0226c9a..4e5cc2791ad881f76cb8c856c9a26c5ead6f41d0 100644 (file)
@@ -209,13 +209,13 @@ unsigned assignadjust (type* lhst, struct expent* rhs)
        /* If one of the sides are of type void, output a more apropriate
         * error message.
         */
-               Error (ERR_ILLEGAL_TYPE);
+               Error ("Illegal type");
     } else if (IsClassInt (lhst)) {
                if (IsClassPtr (rhst)) {
            /* Pointer -> int conversion */
            Warning ("Converting pointer to integer without a cast");
                } else if (!IsClassInt (rhst)) {
-           Error (ERR_INCOMPATIBLE_TYPES);                        
+           Error ("Incompatible types");
        } else {
            /* Adjust the int types. To avoid manipulation of TOS mark lhs
             * as const.
@@ -238,11 +238,11 @@ unsigned assignadjust (type* lhst, struct expent* rhs)
                switch (TypeCmp (lhst, rhst)) {
 
                    case TC_INCOMPATIBLE:
-                       Error (ERR_INCOMPATIBLE_POINTERS);
+                       Error ("Incompatible pointer types");
                        break;
 
                    case TC_QUAL_DIFF:
-                       Error (ERR_QUAL_DIFF);
+                       Error ("Pointer types differ in type qualifiers");
                        break;
 
                    default:
@@ -260,13 +260,13 @@ unsigned assignadjust (type* lhst, struct expent* rhs)
             * that both functions have the same parameter list.
             */
            if (TypeCmp (Indirect (lhst), rhst) < TC_EQUAL) {
-               Error (ERR_INCOMPATIBLE_TYPES);
+               Error ("Incompatible types");
            }
        } else {
-           Error (ERR_INCOMPATIBLE_TYPES);
+           Error ("Incompatible types");
        }
     } else {
-       Error (ERR_INCOMPATIBLE_TYPES);
+       Error ("Incompatible types");
     }
 
     /* Return an int value in all cases where the operands are not both ints */
@@ -292,7 +292,7 @@ void DefineData (struct expent* lval)
             * allowed.
             */
            if (!AllowRegVarAddr) {
-               Error (ERR_CANNOT_TAKE_ADDR_OF_REG);
+               Error ("Cannot take the address of a register variable");
            }
            /* FALLTHROUGH */
 
@@ -333,7 +333,7 @@ static void lconst (unsigned flags, struct expent* lval)
             * allowed.
             */
            if (!AllowRegVarAddr) {
-               Error (ERR_CANNOT_TAKE_ADDR_OF_REG);
+               Error ("Cannot take the address of a register variable");
            }
            /* FALLTHROUGH */
 
@@ -387,13 +387,13 @@ static int kcalc (int tok, long val1, long val2)
            return (val1 * val2);
                case TOK_DIV:
            if (val2 == 0) {
-               Error (ERR_DIV_BY_ZERO);
+               Error ("Division by zero");
                return 0x7FFFFFFF;
            }
            return (val1 / val2);
                case TOK_MOD:
            if (val2 == 0) {
-               Error (ERR_MOD_BY_ZERO);
+               Error ("Modulo operation with zero");
                return 0;
            }
            return (val1 % val2);
@@ -568,7 +568,7 @@ static void callfunction (struct expent* lval)
            /* Too many arguments. Do we have an open param list? */
            if ((Func->Flags & FD_ELLIPSIS) == 0) {
                /* End of param list reached, no ellipsis */
-               Error (ERR_TOO_MANY_FUNC_ARGS);
+               Error ("Too many arguments in function call");
            }
            /* Assume an ellipsis even in case of errors to avoid an error
             * message for each other argument.
@@ -633,7 +633,7 @@ static void callfunction (struct expent* lval)
 
     /* Check if we had enough parameters */
     if (ParamCount < Func->ParamCount) {
-       Error (ERR_TOO_FEW_FUNC_ARGS);
+       Error ("Too few arguments in function call");
     }
 
     /* */
@@ -667,7 +667,7 @@ void doasm (void)
 
     /* String literal */
     if (curtok != TOK_SCONST) {
-       Error (ERR_STRLIT_EXPECTED);
+       Error ("String literal expected");
     } else {
        /* Write the string directly into the output, followed by a newline */
                AddCodeLine (GetLiteral (curval));
@@ -722,7 +722,7 @@ static int primary (struct expent* lval)
      */
     if (Preprocessing) {
                /* Illegal expression in PP mode */
-       Error (ERR_CPP_EXPR_EXPECTED);
+       Error ("Preprocessor expression expected");
        lval->e_flags = E_MCONST;
        lval->e_tptr = type_int;
        return 0;
@@ -747,13 +747,10 @@ static int primary (struct expent* lval)
            lval->e_tptr = Sym->Type;
 
            /* Check for illegal symbol types */
-           if ((Sym->Flags & SC_LABEL) == SC_LABEL) {
-               /* Cannot use labels in expressions */
-               Error (ERR_SYMBOL_KIND);
-               return 1;
-                   } else if (Sym->Flags & SC_TYPE) {
+           CHECK ((Sym->Flags & SC_LABEL) != SC_LABEL);
+                   if (Sym->Flags & SC_TYPE) {
                /* Cannot use type symbols */
-               Error (ERR_VAR_IDENT_EXPECTED);
+               Error ("Variable identifier expected");
                /* Assume an int type to make lval valid */
                lval->e_flags = E_MLOCAL | E_TLOFFS;
                lval->e_tptr = type_int;
@@ -830,7 +827,7 @@ static int primary (struct expent* lval)
            lval->e_flags = E_MLOCAL | E_TLOFFS;
            lval->e_tptr = type_int;
            lval->e_const = 0;
-           Error (ERR_UNDEFINED_SYMBOL, Ident);
+           Error ("Undefined symbol: `%s'", Ident);
            return 1;
 
        }
@@ -865,7 +862,7 @@ static int primary (struct expent* lval)
     }
 
     /* Illegal primary. */
-    Error (ERR_EXPR_EXPECTED);
+    Error ("Expression expected");
     lval->e_flags = E_MCONST;
     lval->e_tptr = type_int;
     return 0;
@@ -973,7 +970,7 @@ static int arrayref (int k, struct expent* lval)
            /* */
            lval->e_tptr = lval2.e_tptr;
        } else {
-           Error (ERR_CANNOT_SUBSCRIPT);
+           Error ("Cannot subscript");
        }
 
        /* Add the subscript. Since arrays are indexed by integers,
@@ -1023,7 +1020,7 @@ static int arrayref (int k, struct expent* lval)
            g_scale (TypeOf (tptr1), SizeOf (lval2.e_tptr));
            lval->e_tptr = lval2.e_tptr;
        } else {
-           Error (ERR_CANNOT_SUBSCRIPT);
+           Error ("Cannot subscript");
        }
 
        /* The offset is now in the primary register. It didn't have a
@@ -1116,7 +1113,7 @@ static int structref (int k, struct expent* lval)
     /* Skip the token and check for an identifier */
     NextToken ();
     if (curtok != TOK_IDENT) {
-       Error (ERR_IDENT_EXPECTED);
+       Error ("Identifier expected");
        lval->e_tptr = type_int;
        return 0;
     }
@@ -1126,7 +1123,7 @@ static int structref (int k, struct expent* lval)
     NextToken ();
     Field = FindStructField (lval->e_tptr, Ident);
     if (Field == 0) {
-       Error (ERR_STRUCT_FIELD_MISMATCH, Ident);
+       Error ("Struct/union has no field named `%s'", Ident);
                lval->e_tptr = type_int;
        return 0;
     }
@@ -1187,14 +1184,14 @@ static int hie11 (struct expent *lval)
                lval->e_flags = E_MEXPR;
                lval->e_tptr += DECODE_SIZE + 1;        /* Set to result */
            } else {
-               Error (ERR_ILLEGAL_FUNC_CALL);
+               Error ("Illegal function call");
            }
            k = 0;
 
        } else if (curtok == TOK_DOT) {
 
            if (!IsClassStruct (lval->e_tptr)) {
-               Error (ERR_STRUCT_EXPECTED);
+               Error ("Struct expected");
            }
            k = structref (0, lval);
 
@@ -1202,7 +1199,7 @@ static int hie11 (struct expent *lval)
 
            tptr = lval->e_tptr;
            if (tptr[0] != T_PTR || (tptr[1] & T_STRUCT) == 0) {
-               Error (ERR_STRUCT_PTR_EXPECTED);
+               Error ("Struct pointer expected");
            }
            k = structref (k, lval);
 
@@ -1260,7 +1257,7 @@ static void pre_incdec (struct expent* lval, void (*inc) (unsigned, unsigned lon
 
     NextToken ();
     if ((k = hie10 (lval)) == 0) {
-       Error (ERR_LVALUE_EXPECTED);
+       Error ("Invalid lvalue");
        return;
     }
 
@@ -1339,7 +1336,7 @@ static void post_incdec (struct expent *lval, int k, void (*inc) (unsigned, unsi
 
     NextToken ();
     if (k == 0) {
-       Error (ERR_LVALUE_EXPECTED);
+       Error ("Invalid lvalue");
                return;
     }
 
@@ -1540,7 +1537,7 @@ static int hie10 (struct expent* lval)
                    if (IsClassPtr (t)) {
                        lval->e_tptr = Indirect (t);
            } else {
-               Error (ERR_ILLEGAL_INDIRECT);
+               Error ("Illegal indirection");
            }
            return 1;
 
@@ -1550,7 +1547,7 @@ static int hie10 (struct expent* lval)
            if (k == 0) {
                /* Allow the & operator with an array */
                if (!IsTypeArray (lval->e_tptr)) {
-                   Error (ERR_ILLEGAL_ADDRESS);
+                   Error ("Illegal address");
                }
            } else {
                t = TypeAlloc (TypeLen (lval->e_tptr) + 2);
@@ -1630,7 +1627,7 @@ static int hie_internal (GenDesc** ops,           /* List of generators */
 
        /* All operators that call this function expect an int on the lhs */
        if (!IsClassInt (lval->e_tptr)) {
-           Error (ERR_INT_EXPR_EXPECTED);
+           Error ("Integer expression expected");
        }
 
        /* Remember the operator token, then skip it */
@@ -1656,7 +1653,7 @@ static int hie_internal (GenDesc** ops,           /* List of generators */
 
        /* Check the type of the rhs */
        if (!IsClassInt (lval2.e_tptr)) {
-           Error (ERR_INT_EXPR_EXPECTED);
+           Error ("Integer expression expected");
        }
 
        /* Check for const operands */
@@ -1685,9 +1682,9 @@ static int hie_internal (GenDesc** ops,           /* List of generators */
                type |= CF_CONST;
                rtype |= CF_CONST;
                if (tok == TOK_DIV && lval2.e_const == 0) {
-                   Error (ERR_DIV_BY_ZERO);
+                   Error ("Division by zero");
                } else if (tok == TOK_MOD && lval2.e_const == 0) {
-                   Error (ERR_MOD_BY_ZERO);
+                   Error ("Modulo operation with zero");
                }
                if ((Gen->Flags & GEN_NOPUSH) != 0) {
                    RemoveCode (Mark2);
@@ -1757,7 +1754,7 @@ static int hie_compare (GenDesc** ops,            /* List of generators */
        /* Make sure, the types are compatible */
        if (IsClassInt (lval->e_tptr)) {
            if (!IsClassInt (lval2.e_tptr) && !(IsClassPtr(lval2.e_tptr) && IsNullPtr(lval))) {
-               Error (ERR_INCOMPATIBLE_TYPES);
+               Error ("Incompatible types");
            }
        } else if (IsClassPtr (lval->e_tptr)) {
            if (IsClassPtr (lval2.e_tptr)) {
@@ -1768,10 +1765,10 @@ static int hie_compare (GenDesc** ops,          /* List of generators */
                type* right = Indirect (lval2.e_tptr);
                if (TypeCmp (left, right) < TC_EQUAL && *left != T_VOID && *right != T_VOID) {
                    /* Incomatible pointers */
-                   Error (ERR_INCOMPATIBLE_TYPES);
+                   Error ("Incompatible types");
                }
            } else if (!IsNullPtr (&lval2)) {
-               Error (ERR_INCOMPATIBLE_TYPES);
+               Error ("Incompatible types");
            }
        }
 
@@ -1896,7 +1893,7 @@ static void parseadd (int k, struct expent* lval)
                typeadjust (lval, &lval2, 1);
            } else {
                        /* OOPS */
-               Error (ERR_OP_NOT_ALLOWED);
+               Error ("Invalid operands for binary operator `+'");
            }
 
                    /* Result is constant, condition codes not set */
@@ -1924,7 +1921,7 @@ static void parseadd (int k, struct expent* lval)
                        flags = typeadjust (lval, &lval2, 1);
            } else {
                        /* OOPS */
-               Error (ERR_OP_NOT_ALLOWED);
+               Error ("Invalid operands for binary operator `+'");
                    }
 
            /* Generate code for the add */
@@ -1970,7 +1967,7 @@ static void parseadd (int k, struct expent* lval)
                flags = typeadjust (lval, &lval2, 1);
                    } else {
                        /* OOPS */
-               Error (ERR_OP_NOT_ALLOWED);
+               Error ("Invalid operands for binary operator `+'");
            }
 
            /* Generate code for the add */
@@ -2004,7 +2001,7 @@ static void parseadd (int k, struct expent* lval)
                        flags = typeadjust (lval, &lval2, 0);
            } else {
                        /* OOPS */
-               Error (ERR_OP_NOT_ALLOWED);
+               Error ("Invalid operands for binary operator `+'");
            }
 
            /* Generate code for the add */
@@ -2032,7 +2029,7 @@ static void parsesub (int k, struct expent* lval)
     type* lhst;                        /* Type of left hand side */
     type* rhst;                        /* Type of right hand side */
     CodeMark Mark1;            /* Save position of output queue */
-    CodeMark Mark2;            /* Another position in the queue */
+    CodeMark Mark2;                    /* Another position in the queue */
     int rscale;                /* Scale factor for the result */
 
 
@@ -2071,7 +2068,7 @@ static void parsesub (int k, struct expent* lval)
            } else if (IsClassPtr (lhst) && IsClassPtr (rhst)) {
                /* Left is pointer, right is pointer, must scale result */
                if (TypeCmp (Indirect (lhst), Indirect (rhst)) < TC_EQUAL) {
-                   Error (ERR_INCOMPATIBLE_POINTERS);
+                   Error ("Incompatible pointer types");
                } else {
                    lval->e_const = (lval->e_const - lval2.e_const) / PSizeOf (lhst);
                }
@@ -2083,7 +2080,7 @@ static void parsesub (int k, struct expent* lval)
                lval->e_const -= lval2.e_const;
            } else {
                /* OOPS */
-               Error (ERR_OP_NOT_ALLOWED);
+               Error ("Invalid operands for binary operator `-'");
            }
 
            /* Result is constant, condition codes not set */
@@ -2106,7 +2103,7 @@ static void parsesub (int k, struct expent* lval)
            } else if (IsClassPtr (lhst) && IsClassPtr (rhst)) {
                /* Left is pointer, right is pointer, must scale result */
                if (TypeCmp (Indirect (lhst), Indirect (rhst)) < TC_EQUAL) {
-                   Error (ERR_INCOMPATIBLE_POINTERS);
+                   Error ("Incompatible pointer types");
                } else {
                    rscale = PSizeOf (lhst);
                }
@@ -2118,7 +2115,7 @@ static void parsesub (int k, struct expent* lval)
                        flags = typeadjust (lval, &lval2, 1);
            } else {
                /* OOPS */
-               Error (ERR_OP_NOT_ALLOWED);
+               Error ("Invalid operands for binary operator `-'");
            }
 
            /* Do the subtraction */
@@ -2149,7 +2146,7 @@ static void parsesub (int k, struct expent* lval)
        } else if (IsClassPtr (lhst) && IsClassPtr (rhst)) {
            /* Left is pointer, right is pointer, must scale result */
            if (TypeCmp (Indirect (lhst), Indirect (rhst)) < TC_EQUAL) {
-               Error (ERR_INCOMPATIBLE_POINTERS);
+               Error ("Incompatible pointer types");
            } else {
                rscale = PSizeOf (lhst);
            }
@@ -2168,7 +2165,7 @@ static void parsesub (int k, struct expent* lval)
            flags = typeadjust (lval, &lval2, 0);
        } else {
            /* OOPS */
-           Error (ERR_OP_NOT_ALLOWED);
+           Error ("Invalid operands for binary operator `-'");
        }
 
        /* Generate code for the sub (the & is a hack here) */
@@ -2508,7 +2505,7 @@ static int hieQuest (struct expent *lval)
        } else if (IsClassPtr (type2) && IsClassPtr (type3)) {
            /* Must point to same type */
            if (TypeCmp (Indirect (type2), Indirect (type3)) < TC_EQUAL) {
-               Error (ERR_INCOMPATIBLE_TYPES);
+               Error ("Incompatible pointer types");
            }
            /* Result has the common type */
            rtype = lval2.e_tptr;
@@ -2519,7 +2516,7 @@ static int hieQuest (struct expent *lval)
            /* Result type is pointer, no cast needed */
            rtype = lval3.e_tptr;
        } else {
-           Error (ERR_INCOMPATIBLE_TYPES);
+           Error ("Incompatible types");
            rtype = lval2.e_tptr;               /* Doesn't matter here */
        }
 
@@ -2548,7 +2545,7 @@ static void opeq (GenDesc* Gen, struct expent *lval, int k)
 
     NextToken ();
     if (k == 0) {
-       Error (ERR_LVALUE_EXPECTED);
+       Error ("Invalid lvalue in assignment");
        return;
     }
 
@@ -2628,7 +2625,7 @@ static void addsubeq (GenDesc* Gen, struct expent *lval, int k)
 
 
     if (k == 0) {
-       Error (ERR_LVALUE_EXPECTED);
+       Error ("Invalid lvalue in assignment");
        return;
     }
 
@@ -2721,7 +2718,7 @@ static void Assignment (struct expent* lval)
 
     /* Check for assignment to const */
     if (IsQualConst (ltype)) {
-       Error (ERR_CONST_ASSIGN);
+       Error ("Assignment to const");
     }
 
     /* cc65 does not have full support for handling structs by value. Since
@@ -2741,7 +2738,7 @@ static void Assignment (struct expent* lval)
            exprhs (0, 0, &lval2);
        } else {
            /* We need an lvalue */
-           Error (ERR_LVALUE_EXPECTED);
+           Error ("Invalid lvalue in assignment");
        }
 
        /* Push the address (or whatever is in ax in case of errors) */
@@ -2749,7 +2746,7 @@ static void Assignment (struct expent* lval)
 
        /* Check for equality of the structs */
        if (TypeCmp (ltype, lval2.e_tptr) < TC_EQUAL) {
-           Error (ERR_INCOMPATIBLE_TYPES);
+           Error ("Incompatible types");
        }
 
        /* Load the size of the struct into the primary */
@@ -2803,7 +2800,7 @@ int hie1 (struct expent* lval)
        case TOK_ASSIGN:
            NextToken ();
            if (k == 0) {
-               Error (ERR_LVALUE_EXPECTED);
+               Error ("Invalid lvalue in assignment");
            } else {
                Assignment (lval);
            }
@@ -2943,7 +2940,7 @@ void constexpr (struct expent* lval)
 {
     memset (lval, 0, sizeof (*lval));
     if (expr (hie1, lval) != 0 || (lval->e_flags & E_MCONST) == 0) {
-       Error (ERR_CONST_EXPR_EXPECTED);
+       Error ("Constant expression expected");
        /* To avoid any compiler errors, make the expression a valid const */
        lval->e_flags = E_MCONST;
        lval->e_tptr = type_int;
@@ -2958,7 +2955,7 @@ void intexpr (struct expent* lval)
 {
     expression (lval);
     if (!IsClassInt (lval->e_tptr)) {
-       Error (ERR_INT_EXPR_EXPECTED);
+       Error ("Integer expression expected");
        /* To avoid any compiler errors, make the expression a valid int */
        lval->e_flags = E_MCONST;
        lval->e_tptr = type_int;
@@ -2975,11 +2972,10 @@ void boolexpr (struct expent* lval)
     expression (lval);
 
     /* If it's an integer, it's ok. If it's not an integer, but a pointer,
-     * the pointer used in a boolean context is also ok (Ootherwise check if it's a pointer
-     * expression.
+     * the pointer used in a boolean context is also ok
      */
     if (!IsClassInt (lval->e_tptr) && !IsClassPtr (lval->e_tptr)) {
-       Error (ERR_INT_EXPR_EXPECTED);
+       Error ("Boolean expression expected");
        /* To avoid any compiler errors, make the expression a valid int */
        lval->e_flags = E_MCONST;
        lval->e_tptr = type_int;
index d515bec886be295f5d3804a730f55c8b2bbce8fa..91888fabf89517ce9575bec80d6dc1cc9ee87881 100644 (file)
@@ -213,12 +213,12 @@ void NewFunc (SymEntry* Func)
 
     /* C functions cannot currently have __fastcall__ calling conventions */
     if (IsFastCallFunc (Func->Type)) {
-       Error (ERR_FASTCALL);
+       Error ("__fastcall__ is not allowed for C functions");
     }
 
     /* Need a starting curly brace */
     if (curtok != TOK_LCURLY) {
-       Error (ERR_LCURLY_EXPECTED);
+       Error ("`{' expected");
     }
 
     /* Setup register variables */
@@ -247,7 +247,7 @@ void NewFunc (SymEntry* Func)
 #if 0
        /* If the function has a return type, flag an error */
        if (!voidfunc) {
-           Error (ERR_MUST_RETURN_VALUE);
+           Error ("Function `%s' must return a value", Func->Name);
        }
 #endif
        RestoreRegVars (0);
index 5d6290004f674781b683eb77ccfb8214e7747c40..7141ec46eb3d4bf0f3d662fa0f79542b091f3565 100644 (file)
@@ -56,7 +56,7 @@ void DoGoto (void)
     /* Label name must follow */
     if (curtok != TOK_IDENT) {
 
-               Error (ERR_IDENT_EXPECTED);
+               Error ("Identifier expected");
 
     } else {
 
index b8e8b61fe43dce45f0c8164c372f1941389c175b..732a12b7dd475fd1a2c005f379145f962eee0272 100644 (file)
-/*
- * loop.c
- *
- * Ullrich von Bassewitz, 20.06.1998
- */
+/*****************************************************************************/
+/*                                                                           */
+/*                                 loop.c                                   */
+/*                                                                           */
+/*                             Loop management                              */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 1998-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 "../common/xmalloc.h"
+/* common */
+#include "xmalloc.h"
 
+/* cc65 */
 #include "error.h"
 #include "loop.h"
 
 
 
 /*****************************************************************************/
-/*                                  data                                    */
+/*                                  Data                                    */
 /*****************************************************************************/
 
 
 
 /* The root */
-static struct loopdesc* loopstack = 0;
+static LoopDesc* LoopStack = 0;
 
 
 
 /*****************************************************************************/
-/*                                  code                                    */
+/*                                  Code                                    */
 /*****************************************************************************/
 
 
 
-struct loopdesc* addloop (unsigned sp, unsigned loop, unsigned label,
-                         unsigned linc, unsigned lstat)
+LoopDesc* AddLoop (unsigned sp, unsigned loop, unsigned label,
+                  unsigned linc, unsigned lstat)
 /* Create and add a new loop descriptor */
 {
-    struct loopdesc* l;
+    LoopDesc* L;
 
     /* Allocate a new struct */
-    l = xmalloc (sizeof (struct loopdesc));
+    L = xmalloc (sizeof (LoopDesc));
 
     /* Fill in the data */
-    l->sp              = sp;
-    l->loop            = loop;
-    l->label           = label;
-    l->linc            = linc;
-    l->lstat           = lstat;
+    L->StackPtr        = sp;
+    L->Loop            = loop;
+    L->Label           = label;
+    L->linc            = linc;
+    L->lstat           = lstat;
 
     /* Insert it into the list */
-    l->next = loopstack;
-    loopstack = l;
+    L->Next = LoopStack;
+    LoopStack = L;
 
     /* Return a pointer to the struct */
-    return l;
+    return L;
 }
 
 
 
-struct loopdesc* currentloop (void)
+LoopDesc* CurrentLoop (void)
 /* Return a pointer to the descriptor of the current loop */
 {
-    if (loopstack == 0) {
-       /* Stack is empty */
-       Error (ERR_NO_ACTIVE_LOOP);
-    }
-    return loopstack;
+    return LoopStack;
 }
 
 
 
-void delloop (void)
+void DelLoop (void)
 /* Remove the current loop */
 {
-    struct loopdesc* l;
-
-    l = loopstack;
-    loopstack = loopstack->next;
-    xfree (l);
+    LoopDesc* L = LoopStack;
+    LoopStack = LoopStack->Next;
+    xfree (L);
 }
 
 
index b5c7561f209ed89ba422c657adcc5f876d955100..d71e3668b04e1e8ed615877bbda7c08a4b147ba6 100644 (file)
@@ -1,8 +1,35 @@
-/*
- * loop.h
- *
- * Ullrich von Bassewitz, 20.06.1998
- */
+/*****************************************************************************/
+/*                                                                           */
+/*                                 loop.h                                   */
+/*                                                                           */
+/*                             Loop management                              */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 1998-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.                                                          */
+/*                                                                           */
+/*****************************************************************************/
 
 
 
 
 
 
-struct loopdesc {
-    struct loopdesc*   next;
-    unsigned           sp;
-    unsigned           loop;
-    unsigned           label;
-    unsigned           linc;
-    unsigned           lstat;
+typedef struct LoopDesc LoopDesc;
+struct LoopDesc {
+    LoopDesc*  Next;
+    unsigned   StackPtr;
+    unsigned   Loop;
+    unsigned   Label;
+    unsigned   linc;
+    unsigned   lstat;
 };
 
 
@@ -34,14 +62,14 @@ struct loopdesc {
 
 
 
-struct loopdesc* addloop (unsigned sp, unsigned loop, unsigned label,
-                         unsigned linc, unsigned lstat);
+LoopDesc* AddLoop (unsigned sp, unsigned loop, unsigned label,
+                  unsigned linc, unsigned lstat);
 /* Create and add a new loop descriptor */
 
-struct loopdesc* currentloop (void);
+LoopDesc* CurrentLoop (void);
 /* Return a pointer to the descriptor of the current loop */
 
-void delloop (void);
+void DelLoop (void);
 /* Remove the current loop */
 
 
index c616d9bbe39a20f54c16833458a6c292616a7e62..3d28dcf8124620654c069ae0b0cacc542b230483 100644 (file)
@@ -39,7 +39,7 @@
 /* common */
 #include "hashstr.h"
 #include "xmalloc.h"
-         
+
 /* cc65 */
 #include "error.h"
 #include "macrotab.h"
@@ -283,7 +283,7 @@ void AddMacroArg (Macro* M, const char* Arg)
     for (I = 0; I < M->ArgCount; ++I) {
        if (strcmp (M->FormalArgs[I], Arg) == 0) {
            /* Found */
-           Error (ERR_DUPLICATE_MACRO_ARG, Arg);
+           Error ("Duplicate macro parameter: `%s'", Arg);
            break;
        }
     }
@@ -308,7 +308,7 @@ void AddMacroArg (Macro* M, const char* Arg)
 
 int MacroCmp (const Macro* M1, const Macro* M2)
 /* Compare two macros and return zero if both are identical. */
-{          
+{
     int I;
 
     /* Argument count must be identical */
index ebd429379b329b22d3675ba85161774859e4763e..f4020cf3b64e8b2636f4c6af707d3e8d760828d7 100644 (file)
@@ -117,7 +117,7 @@ static void StringPragma (void (*Func) (const char*))
 /* Handle a pragma that expects a string parameter */
 {
     if (curtok != TOK_SCONST) {
-       Error (ERR_STRLIT_EXPECTED);
+       Error ("String literal expected");
     } else {
        /* Get the string */
        const char* Name = GetLiteral (curval);
@@ -139,7 +139,7 @@ static void SegNamePragma (void (*Func) (const char*))
 /* Handle a pragma that expects a segment name parameter */
 {
     if (curtok != TOK_SCONST) {
-       Error (ERR_STRLIT_EXPECTED);
+       Error ("String literal expected");
     } else {
        /* Get the segment name */
        const char* Name = GetLiteral (curval);
@@ -153,7 +153,7 @@ static void SegNamePragma (void (*Func) (const char*))
        } else {
 
            /* Segment name is invalid */
-           Error (ERR_ILLEGAL_SEG_NAME, Name);
+           Error ("Illegal segment name: `%s'", Name);
 
        }
 
@@ -190,7 +190,7 @@ void DoPragma (void)
 
     /* Identifier must follow */
     if (curtok != TOK_IDENT) {
-       Error (ERR_IDENT_EXPECTED);
+       Error ("Identifier expected");
        return;
     }
 
index ae339ed9dd1b0536694572de152f999583248adc..7af2e8dd4b32f09deec101ecade1cdeae2efc050 100644 (file)
@@ -192,7 +192,7 @@ int IsSym (char *s)
 static void unknown (char C)
 /* Error message for unknown character */
 {
-    MError ("Invalid input character with code %02X", C & 0xFF);
+    Error ("Invalid input character with code %02X", C & 0xFF);
     NextChar ();                       /* Skip */
 }
 
@@ -202,7 +202,7 @@ static unsigned hexval (int c)
 /* Convert a hex digit into a value */
 {
     if (!isxdigit (c)) {
-       Error (ERR_ILLEGAL_HEX_DIGIT);
+       Error ("Invalid hexadecimal digit: `%c'", c);
     }
     if (isdigit (c)) {
        return c - '0';
@@ -288,7 +288,7 @@ static int ParseChar (void)
                }
                break;
            default:
-               Error (ERR_ILLEGAL_CHARCONST);
+               Error ("Illegal character constant");
                C = ' ';
                break;
        }
@@ -318,7 +318,7 @@ static void CharConst (void)
 
     /* Check for closing quote */
     if (CurC != '\'') {
-               Error (ERR_QUOTE_EXPECTED);
+               Error ("`\'' expected");
     } else {
        /* Skip the quote */
        NextChar ();
@@ -350,7 +350,7 @@ static void StringConst (void)
 
        while (CurC != '\"') {
            if (CurC == '\0') {
-               MError ("Unexpected newline");
+               Error ("Unexpected newline");
                break;
            }
            AddLiteralChar (ParseChar ());
@@ -754,7 +754,7 @@ void NextToken (void)
            } while (CurC == ' ');
            if (!IsSym (token) || strcmp (token, "pragma") != 0) {
                /* OOPS - should not happen */
-               MError ("Preprocessor directive expected");
+               Error ("Preprocessor directive expected");
            }
            nxttok = TOK_PRAGMA;
            break;
@@ -768,7 +768,7 @@ void NextToken (void)
 
 
 
-void Consume (token_t Token, unsigned ErrNum)
+void Consume (token_t Token, const char* ErrorMsg)
 /* Eat token if it is the next in the input stream, otherwise print an error
  * message.
  */
@@ -776,7 +776,7 @@ void Consume (token_t Token, unsigned ErrNum)
     if (curtok == Token) {
        NextToken ();
     } else {
-               Error (ErrNum);
+               Error (ErrorMsg);
     }
 }
 
@@ -785,7 +785,7 @@ void Consume (token_t Token, unsigned ErrNum)
 void ConsumeColon (void)
 /* Check for a colon and skip it. */
 {
-    Consume (TOK_COLON, ERR_COLON_EXPECTED);
+    Consume (TOK_COLON, "`:' expected");
 }
 
 
@@ -797,7 +797,7 @@ void ConsumeSemi (void)
     if (curtok == TOK_SEMI) {
        NextToken ();
     } else {
-       Error (ERR_SEMICOLON_EXPECTED);
+       Error ("`;' expected");
        if (curtok == TOK_COLON || curtok == TOK_COMMA) {
            NextToken ();
        }
@@ -813,7 +813,7 @@ void ConsumeComma (void)
     if (CurTok.Tok == TOK_COMMA) {
        NextToken ();
     } else {
-       Error (ERR_COMMA_EXPECTED);
+       Error ("`,' expected");
        if (CurTok.Tok == TOK_SEMI) {
            NextToken ();
        }
@@ -825,7 +825,7 @@ void ConsumeComma (void)
 void ConsumeLParen (void)
 /* Check for a left parenthesis and skip it */
 {
-    Consume (TOK_LPAREN, ERR_LPAREN_EXPECTED);
+    Consume (TOK_LPAREN, "`(' expected");
 }
 
 
@@ -833,7 +833,7 @@ void ConsumeLParen (void)
 void ConsumeRParen (void)
 /* Check for a right parenthesis and skip it */
 {
-    Consume (TOK_RPAREN, ERR_RPAREN_EXPECTED);
+    Consume (TOK_RPAREN, "`)' expected");
 }
 
 
@@ -841,7 +841,7 @@ void ConsumeRParen (void)
 void ConsumeLBrack (void)
 /* Check for a left bracket and skip it */
 {
-    Consume (TOK_LBRACK, ERR_LBRACK_EXPECTED);
+    Consume (TOK_LBRACK, "`[' expected");
 }
 
 
@@ -849,7 +849,7 @@ void ConsumeLBrack (void)
 void ConsumeRBrack (void)
 /* Check for a right bracket and skip it */
 {
-    Consume (TOK_RBRACK, ERR_RBRACK_EXPECTED);
+    Consume (TOK_RBRACK, "`]' expected");
 }
 
 
@@ -857,7 +857,7 @@ void ConsumeRBrack (void)
 void ConsumeLCurly (void)
 /* Check for a left curly brace and skip it */
 {
-    Consume (TOK_LCURLY, ERR_LCURLY_EXPECTED);
+    Consume (TOK_LCURLY, "`{' expected");
 }
 
 
@@ -865,7 +865,7 @@ void ConsumeLCurly (void)
 void ConsumeRCurly (void)
 /* Check for a right curly brace and skip it */
 {
-    Consume (TOK_RCURLY, ERR_RCURLY_EXPECTED);
+    Consume (TOK_RCURLY, "`}' expected");
 }
 
 
index 55c37de5cd5ff24dd9543630b8863d84dab409da..216c007c93bd768af87b62ec2e6aa9f678b12f4b 100644 (file)
@@ -187,7 +187,7 @@ int IsSym (char* s);
 void NextToken (void);
 /* Get next token from input stream */
 
-void Consume (token_t Token, unsigned ErrNum);
+void Consume (token_t Token, const char* ErrorMsg);
 /* Eat token if it is the next in the input stream, otherwise print an error
  * message.
  */
index 2d1d0ea8c58b223e57a22f3759db65545993d013..e9851786e5da4cd2ca48c5763a824c626029870e 100644 (file)
@@ -122,7 +122,7 @@ static void dowhile (char wtype)
     NextToken ();
     loop = GetLabel ();
     lab = GetLabel ();
-    addloop (oursp, loop, lab, 0, 0);
+    AddLoop (oursp, loop, lab, 0, 0);
     g_defloclabel (loop);
     if (wtype == 'w') {
 
@@ -151,13 +151,13 @@ static void dowhile (char wtype)
 
        /* Do loop */
                statement ();
-       Consume (TOK_WHILE, ERR_WHILE_EXPECTED);
+       Consume (TOK_WHILE, "`while' expected");
        test (loop, 1);
        ConsumeSemi ();
        g_defloclabel (lab);
 
     }
-    delloop ();
+    DelLoop ();
 }
 
 
@@ -173,7 +173,7 @@ static void doreturn (void)
     NextToken ();
     if (curtok != TOK_SEMI) {
                if (HasVoidReturn (CurrentFunc)) {
-                   Error (ERR_CANNOT_RETURN_VALUE);
+                   Error ("Returning a value in function with return type void");
                }
                if (evalexpr (CF_NONE, hie0, &lval) == 0) {
                    /* Constant value */
@@ -188,7 +188,7 @@ static void doreturn (void)
                    etype |= assignadjust (GetReturnType (CurrentFunc), &lval) & ~CF_CONST;
        }
     } else if (!HasVoidReturn (CurrentFunc)) {
-               Error (ERR_MUST_RETURN_VALUE);
+       Error ("Function `%s' must return a value", GetFuncName (CurrentFunc));
     }
     RestoreRegVars (HaveVal);
     g_leave (etype, lval.e_const);
@@ -199,15 +199,26 @@ static void doreturn (void)
 static void dobreak (void)
 /* Handle 'break' statement here */
 {
-    struct loopdesc* l;
+    LoopDesc* L;
 
+    /* Skip the break */
     NextToken ();
-    if ((l = currentloop ()) == 0) {
+
+    /* Get the current loop descriptor */
+    L = CurrentLoop ();
+
+    /* Check if we are inside a loop */
+    if (L == 0) {
        /* Error: No current loop */
-               return;
+       Error ("`break' statement not within loop or switch");
+       return;
     }
-    g_space (oursp - l->sp);
-    g_jump (l->label);
+
+    /* Correct the stack pointer if needed */
+    g_space (oursp - L->StackPtr);
+
+    /* Jump to the exit label of the loop */
+    g_jump (L->Label);
 }
 
 
@@ -215,28 +226,37 @@ static void dobreak (void)
 static void docontinue (void)
 /* Handle 'continue' statement here */
 {
-    struct loopdesc* l;
+    LoopDesc* L;
 
+    /* Skip the continue */
     NextToken ();
-    if ((l = currentloop ()) == 0) {
-       /* Error: Not in loop */
-               return;
+
+    /* Get the current loop descriptor */
+    L = CurrentLoop ();
+    if (L) {
+       /* Search for the correct loop */
+       do {
+           if (L->Loop) {
+               break;
+           }
+           L = L->Next;
+       } while (L);
     }
-    do {
-       if (l->loop) {
-           break;
-       }
-       l = l->next;
-    } while (l);
-    if (l == 0) {
-               Error (ERR_UNEXPECTED_CONTINUE);
-               return;
+
+    /* Did we find it? */
+    if (L == 0) {
+       Error ("`continue' statement not within a loop");
+       return;
     }
-    g_space (oursp - l->sp);
-    if (l->linc) {
-               g_jump (l->linc);
+
+    /* Correct the stackpointer if needed */
+    g_space (oursp - L->StackPtr);
+
+    /* Output the loop code */
+    if (L->linc) {
+               g_jump (L->linc);
     } else {
-               g_jump (l->loop);
+               g_jump (L->Loop);
     }
 }
 
@@ -257,7 +277,7 @@ static void cascadeswitch (struct expent* eval)
 
     /* Create a loop so we may break out, init labels */
     exitlab = GetLabel ();
-    addloop (oursp, 0, exitlab, 0, 0);
+    AddLoop (oursp, 0, exitlab, 0, 0);
 
     /* Setup some variables needed in the loop  below */
     flags = TypeOf (eval->e_tptr) | CF_CONST | CF_FORCECHAR;
@@ -301,7 +321,7 @@ static void cascadeswitch (struct expent* eval)
                    /* Read the selector expression */
                    constexpr (&lval);
                    if (!IsClassInt (lval.e_tptr)) {
-                       Error (ERR_ILLEGAL_TYPE);
+                       Error ("Switch quantity not an integer");
                    }
 
                    /* Check the range of the expression */
@@ -311,26 +331,26 @@ static void cascadeswitch (struct expent* eval)
                        case T_SCHAR:
                            /* Signed char */
                            if (val < -128 || val > 127) {
-                               Error (ERR_RANGE);
+                               Error ("Range error");
                            }
                            break;
 
                        case T_UCHAR:
                            if (val < 0 || val > 255) {
-                               Error (ERR_RANGE);
+                               Error ("Range error");
                            }
                            break;
 
                        case T_INT:
                            if (val < -32768 || val > 32767) {
-                               Error (ERR_RANGE);
+                               Error ("Range error");
                            }
                            break;
 
                        case T_UINT:
                            if (val < 0 || val > 65535) {
-                               Error (ERR_RANGE);
-                           }
+                               Error ("Range error");
+                           }                         
                            break;
 
                        default:
@@ -410,7 +430,7 @@ static void cascadeswitch (struct expent* eval)
     g_defloclabel (exitlab);
 
     /* End the loop */
-    delloop ();
+    DelLoop ();
 }
 
 
@@ -443,7 +463,7 @@ static void tableswitch (struct expent* eval)
     dlabel = 0;                        /* init */
     lab = GetLabel ();         /* get exit */
     p = swtab;
-    addloop (oursp, 0, lab, 0, 0);
+    AddLoop (oursp, 0, lab, 0, 0);
 
     /* Jump behind the code for the CASE labels */
     g_jump (lcase = GetLabel ());
@@ -459,7 +479,7 @@ static void tableswitch (struct expent* eval)
                            NextToken ();
                    constexpr (&lval);
                    if (!IsClassInt (lval.e_tptr)) {
-                       Error (ERR_ILLEGAL_TYPE);
+                       Error ("Switch quantity not an integer");
                    }
                    p->sw_const = lval.e_const;
                    p->sw_lab = label;
@@ -515,7 +535,7 @@ static void tableswitch (struct expent* eval)
                g_jump (dlabel);
     }
     g_defloclabel (lab);
-    delloop ();
+    DelLoop ();
 
     /* Free the allocated space for the labels */
     xfree (swtab);
@@ -565,7 +585,7 @@ static void dofor (void)
     lab = GetLabel ();
     linc = GetLabel ();
     lstat = GetLabel ();
-    addloop (oursp, loop, lab, linc, lstat);
+    AddLoop (oursp, loop, lab, linc, lstat);
     ConsumeLParen ();
     if (curtok != TOK_SEMI) {  /* exp1 */
        expression (&lval1);
@@ -590,7 +610,7 @@ static void dofor (void)
     statement ();
     g_jump (linc);
     g_defloclabel (lab);
-    delloop ();
+    DelLoop ();
 }
 
 
index 45af446abaf708f5e765da1d529dad7ab30e0df6..8dcd432aee3c68987e67ceb772f4c8df21cce414 100644 (file)
@@ -176,7 +176,7 @@ static void CheckSymTable (SymTable* Tab)
            if (Flags & SC_LABEL) {
                if ((Flags & SC_DEF) == 0) {
                    /* Undefined label */
-                   Error (ERR_UNDEFINED_LABEL, Entry->Name);
+                   Error ("Undefined label: `%s'", Entry->Name);
                } else if ((Flags & SC_REF) == 0) {
                    /* Defined but not used */
                    Warning ("`%s' is defined but never used", Entry->Name);
@@ -536,10 +536,10 @@ SymEntry* AddStructSym (const char* Name, unsigned Size, SymTable* Tab)
        /* We do have an entry. This may be a forward, so check it. */
        if ((Entry->Flags & SC_STRUCT) == 0) {
            /* Existing symbol is not a struct */
-           Error (ERR_SYMBOL_KIND);
+           Error ("Symbol `%s' is already different kind", Name);
        } else if (Size > 0 && Entry->V.S.Size > 0) {
            /* Both structs are definitions. */
-           Error (ERR_MULTIPLE_DEFINITION, Name);
+           Error ("Multiple definition for `%s'", Name);
        } else {
            /* Define the struct size if it is given */
            if (Size > 0) {
@@ -574,9 +574,9 @@ SymEntry* AddEnumSym (const char* Name, int Val)
     SymEntry* Entry = FindSymInTable (SymTab, Name, HashStr (Name));
     if (Entry) {
        if (Entry->Flags != SC_ENUM) {
-           Error (ERR_SYMBOL_KIND);
+           Error ("Symbol `%s' is already different kind", Name);
        } else {
-           Error (ERR_MULTIPLE_DEFINITION, Name);
+           Error ("Multiple definition for `%s'", Name);
        }
        return Entry;
     }
@@ -608,8 +608,8 @@ SymEntry* AddLabelSym (const char* Name, unsigned Flags)
 
        if ((Entry->Flags & SC_DEF) != 0 && (Flags & SC_DEF) != 0) {
            /* Trying to define the label more than once */
-                   Error (ERR_MULTIPLE_DEFINITION, Name);
-       }
+                   Error ("Label `%s' is defined more than once", Name);
+       }                                                
        Entry->Flags |= Flags;
 
     } else {
@@ -639,7 +639,7 @@ SymEntry* AddLocalSym (const char* Name, type* Type, unsigned Flags, int Offs)
     if (Entry) {
 
        /* We have a symbol with this name already */
-       Error (ERR_MULTIPLE_DEFINITION, Name);
+       Error ("Multiple definition for `%s'", Name);
 
     } else {
 
@@ -675,7 +675,7 @@ SymEntry* AddGlobalSym (const char* Name, type* Type, unsigned Flags)
 
        /* We have a symbol with this name already */
        if (Entry->Flags & SC_TYPE) {
-           Error (ERR_MULTIPLE_DEFINITION, Name);
+           Error ("Multiple definition for `%s'", Name);
            return Entry;
        }
 
@@ -695,7 +695,7 @@ SymEntry* AddGlobalSym (const char* Name, type* Type, unsigned Flags)
            if ((Size != 0 && ESize != 0) ||
                TypeCmp (Type+DECODE_SIZE+1, EType+DECODE_SIZE+1) < TC_EQUAL) {
                /* Types not identical: Conflicting types */
-               Error (ERR_CONFLICTING_TYPES, Name);
+               Error ("Conflicting types for `%s'", Name);
            } else {
                /* Check if we have a size in the existing definition */
                if (ESize == 0) {
@@ -707,8 +707,8 @@ SymEntry* AddGlobalSym (const char* Name, type* Type, unsigned Flags)
                } else {
            /* New type must be identical */
            if (TypeCmp (EType, Type) < TC_EQUAL) {
-               Error (ERR_CONFLICTING_TYPES, Name);
-           }
+               Error ("Conflicting types for `%s'", Name);
+           }                                      
 
            /* In case of a function, use the new type descriptor, since it
             * contains pointers to the new symbol tables that are needed if
@@ -772,7 +772,7 @@ void MakeZPSym (const char* Name)
     if (Entry) {
        Entry->Flags |= SC_ZEROPAGE;
     } else {
-       Error (ERR_UNDEFINED_SYMBOL, Name);
+       Error ("Undefined symbol: `%s'", Name);
     }
 }