From: cuz Date: Sun, 7 Mar 2004 21:52:30 +0000 (+0000) Subject: New module intstack X-Git-Tag: V2.12.0~920 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=7492c924e3ce5b6b3ab193e7c98af0a8dd26a11e;p=cc65 New module intstack git-svn-id: svn://svn.cc65.org/cc65/trunk@2901 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- diff --git a/src/common/intstack.c b/src/common/intstack.c new file mode 100644 index 000000000..00077f776 --- /dev/null +++ b/src/common/intstack.c @@ -0,0 +1,83 @@ +/*****************************************************************************/ +/* */ +/* intstack.c */ +/* */ +/* Integer stack used for program settings */ +/* */ +/* */ +/* */ +/* (C) 2004 Ullrich von Bassewitz */ +/* Römerstraße 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 "check.h" +#include "intstack.h" + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +long IS_Get (const IntStack* S) +/* Get the value on top of an int stack */ +{ + CHECK (S->Count > 0); + return S->Stack[S->Count-1]; +} + + + +void IS_Set (IntStack* S, long Val) +/* Set the value on top of an int stack */ +{ + CHECK (S->Count > 0); + S->Stack[S->Count-1] = Val; +} + + + +long IS_Pop (IntStack* S) +/* Pop a value from an int stack */ +{ + CHECK (S->Count > 1); + return S->Stack[--S->Count]; +} + + + +void IS_Push (IntStack* S, long Val) +/* Push a value onto an int stack */ +{ + CHECK (S->Count < sizeof (S->Stack) / sizeof (S->Stack[0])); + S->Stack[S->Count++] = Val; +} + + + diff --git a/src/common/intstack.h b/src/common/intstack.h new file mode 100644 index 000000000..732b38142 --- /dev/null +++ b/src/common/intstack.h @@ -0,0 +1,106 @@ +/*****************************************************************************/ +/* */ +/* intstack.h */ +/* */ +/* Integer stack used for program settings */ +/* */ +/* */ +/* */ +/* (C) 2004 Ullrich von Bassewitz */ +/* Römerstraße 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 INTSTACK_H +#define INTSTACK_H + + + +#include "inline.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +typedef struct IntStack IntStack; +struct IntStack { + unsigned Count; + long Stack[8]; +}; + +/* Declare an int stack with the given value as first element */ +#define INTSTACK(Val) { 1, { Val, 0, 0, 0, 0, 0, 0, 0 } } + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +#if defined(HAVE_INLINE) +INLINE int IS_IsFull (const IntStack* S) +/* Return true if there is no space left on the given int stack */ +{ + return (S->Count >= sizeof (S->Stack) / sizeof (S->Stack[0])); +} +#else +# define IS_IsFull(S) ((S)->Count >= sizeof ((S)->Stack) / sizeof ((S)->Stack[0])) +#endif + +#if defined(HAVE_INLINE) +INLINE unsigned IS_GetCount (const IntStack* S) +/* Return the number of elements on the given int stack */ +{ + return S->Count; +} +#else +# define IS_GetCount(S) (S)->Count +#endif + +long IS_Get (const IntStack* S); +/* Get the value on top of an int stack */ + +void IS_Set (IntStack* S, long Val); +/* Set the value on top of an int stack */ + +long IS_Pop (IntStack* S); +/* Pop a value from an int stack */ + +void IS_Push (IntStack* S, long Val); +/* Push a value onto an int stack */ + + + +/* End of intstack.h */ +#endif + + + diff --git a/src/common/make/gcc.mak b/src/common/make/gcc.mak index 8763b8249..594764bce 100644 --- a/src/common/make/gcc.mak +++ b/src/common/make/gcc.mak @@ -24,6 +24,7 @@ OBJS = abend.o \ fname.o \ hashstr.o \ hashtab.o \ + intstack.o \ matchpat.o \ mmodel.o \ print.o \ diff --git a/src/common/make/watcom.mak b/src/common/make/watcom.mak index bf27af1e8..ce2e9d440 100644 --- a/src/common/make/watcom.mak +++ b/src/common/make/watcom.mak @@ -69,6 +69,7 @@ OBJS = abend.obj \ fname.obj \ hashstr.obj \ hashtab.obj \ + intstack.obj \ matchpat.obj \ mmodel.obj \ print.obj \