From 5faea71a56230b27c5618489185f74daf4515f88 Mon Sep 17 00:00:00 2001 From: cuz Date: Fri, 6 Jun 2003 21:15:42 +0000 Subject: [PATCH] Added missing files git-svn-id: svn://svn.cc65.org/cc65/trunk@2206 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/ld65/asserts.c | 134 +++++++++++++++++++++++++++++++++++++++++++++ src/ld65/asserts.h | 85 ++++++++++++++++++++++++++++ 2 files changed, 219 insertions(+) create mode 100644 src/ld65/asserts.c create mode 100644 src/ld65/asserts.h diff --git a/src/ld65/asserts.c b/src/ld65/asserts.c new file mode 100644 index 000000000..56b546afb --- /dev/null +++ b/src/ld65/asserts.c @@ -0,0 +1,134 @@ +/*****************************************************************************/ +/* */ +/* asserts.c */ +/* */ +/* Assertions for the ld65 linker */ +/* */ +/* */ +/* */ +/* (C) 2003 Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* 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. */ +/* */ +/*****************************************************************************/ + + + +/* common */ +#include "assertdefs.h" +#include "coll.h" +#include "xmalloc.h" + +/* ld65 */ +#include "asserts.h" +#include "error.h" +#include "expr.h" +#include "fileio.h" +#include "objdata.h" +#include "spool.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +/* List with all assertions */ +static Collection Assertions = STATIC_COLLECTION_INITIALIZER; + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +Assertion* ReadAssertion (FILE* F, struct ObjData* O) +/* Read an assertion from the given file */ +{ + /* Allocate memory */ + Assertion* A = xmalloc (sizeof (Assertion)); + + /* Read the fields from the file */ + A->Expr = ReadExpr (F, O); + A->Action = ReadVar (F); + A->Msg = MakeGlobalStringId (O, ReadVar (F)); + ReadFilePos (F, &A->Pos); + + /* Set remaining fields */ + A->Obj = O; + + /* Add the assertion to the global list */ + CollAppend (&Assertions, A); + + /* Return the new struct */ + return A; +} + + + +void CheckAssertions (void) +/* Check all assertions */ +{ + unsigned I; + + /* Walk over all assertions */ + for (I = 0; I < CollCount (&Assertions); ++I) { + + /* Get the assertion */ + Assertion* A = CollAtUnchecked (&Assertions, I); + + /* If the expression is not constant, we're not able to handle it */ + if (!IsConstExpr (A->Expr)) { + Warning ("Cannot evaluate assertion in module `%s', line %lu", + GetSourceFileName (A->Obj, A->Pos.Name), A->Pos.Line); + } else if (GetExprVal (A->Expr) == 0) { + + /* Assertion failed */ + const char* Module = GetSourceFileName (A->Obj, A->Pos.Name); + const char* Message = GetString (A->Msg); + + switch (A->Action) { + + case ASSERT_ACT_WARN: + Warning ("%s(%lu): %s", Module, A->Pos.Line, Message); + break; + + case ASSERT_ACT_ERROR: + Error ("%s(%lu): %s", Module, A->Pos.Line, Message); + break; + + default: + Internal ("Invalid assertion action (%u) in module `%s', " + "line %lu (file corrupt?)", + A->Action, Module, A->Pos.Line); + break; + } + } + } +} + + + diff --git a/src/ld65/asserts.h b/src/ld65/asserts.h new file mode 100644 index 000000000..765be6e47 --- /dev/null +++ b/src/ld65/asserts.h @@ -0,0 +1,85 @@ +/*****************************************************************************/ +/* */ +/* asserts.h */ +/* */ +/* Assertions for the ld65 linker */ +/* */ +/* */ +/* */ +/* (C) 2003 Ullrich von Bassewitz */ +/* Römerstrasse 52 */ +/* D-70794 Filderstadt */ +/* EMail: uz@cc65.org */ +/* */ +/* */ +/* 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 ASSERTS_H +#define ASSERTS_H + + + +#include + +/* common */ +#include "filepos.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +/* Assertion object */ +typedef struct Assertion Assertion; +struct Assertion { + FilePos Pos; /* File position of assertion */ + struct ExprNode* Expr; /* Expression to evaluate */ + unsigned Action; /* What to do */ + unsigned Msg; /* Message to print */ + struct ObjData* Obj; /* Object file containing the assertion */ +}; + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +Assertion* ReadAssertion (FILE* F, struct ObjData* O); +/* Read an assertion from the given file */ + +void CheckAssertions (void); +/* Check all assertions */ + + + +/* End of asserts.h */ + +#endif + + +