From 9d439d9dd21e7d16d4b31c81e05cbe1a4066fd35 Mon Sep 17 00:00:00 2001 From: cuz Date: Sun, 7 Mar 2004 22:09:06 +0000 Subject: [PATCH] New module strstack git-svn-id: svn://svn.cc65.org/cc65/trunk@2904 b7a2c559-68d2-44c3-8de9-860c34a00d81 --- src/common/intstack.c | 6 +-- src/common/intstack.h | 4 +- src/common/make/gcc.mak | 1 + src/common/make/watcom.mak | 1 + src/common/strstack.c | 85 +++++++++++++++++++++++++++++ src/common/strstack.h | 106 +++++++++++++++++++++++++++++++++++++ 6 files changed, 198 insertions(+), 5 deletions(-) create mode 100644 src/common/strstack.c create mode 100644 src/common/strstack.h diff --git a/src/common/intstack.c b/src/common/intstack.c index 00077f776..ecb43030a 100644 --- a/src/common/intstack.c +++ b/src/common/intstack.c @@ -63,11 +63,11 @@ void IS_Set (IntStack* S, long Val) -long IS_Pop (IntStack* S) -/* Pop a value from an int stack */ +void IS_Drop (IntStack* S) +/* Drop a value from an int stack */ { CHECK (S->Count > 1); - return S->Stack[--S->Count]; + --S->Count; } diff --git a/src/common/intstack.h b/src/common/intstack.h index 732b38142..a03be9b2c 100644 --- a/src/common/intstack.h +++ b/src/common/intstack.h @@ -91,8 +91,8 @@ long IS_Get (const IntStack* S); 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_Drop (IntStack* S); +/* Drop a value from an int stack */ void IS_Push (IntStack* S, long Val); /* Push a value onto an int stack */ diff --git a/src/common/make/gcc.mak b/src/common/make/gcc.mak index 594764bce..073532ce9 100644 --- a/src/common/make/gcc.mak +++ b/src/common/make/gcc.mak @@ -34,6 +34,7 @@ OBJS = abend.o \ shift.o \ strbuf.o \ strpool.o \ + strstack.o \ strutil.o \ target.o \ tgttrans.o \ diff --git a/src/common/make/watcom.mak b/src/common/make/watcom.mak index ce2e9d440..9a271f7da 100644 --- a/src/common/make/watcom.mak +++ b/src/common/make/watcom.mak @@ -79,6 +79,7 @@ OBJS = abend.obj \ shift.obj \ strbuf.obj \ strpool.obj \ + strstack.obj \ strutil.obj \ target.obj \ tgttrans.obj \ diff --git a/src/common/strstack.c b/src/common/strstack.c new file mode 100644 index 000000000..c316399b2 --- /dev/null +++ b/src/common/strstack.c @@ -0,0 +1,85 @@ +/*****************************************************************************/ +/* */ +/* strstack.c */ +/* */ +/* String 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 "strstack.h" +#include "xmalloc.h" + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +const char* SS_Get (const StrStack* S) +/* Get the value on top of a string stack */ +{ + CHECK (S->Count > 0); + return S->Stack[S->Count-1]; +} + + + +void SS_Set (StrStack* S, const char* Val) +/* Set the value on top of a string stack */ +{ + CHECK (S->Count > 0); + xfree (S->Stack[S->Count-1]); + S->Stack[S->Count-1] = xstrdup (Val); +} + + + +void SS_Drop (StrStack* S) +/* Drop a value from a string stack */ +{ + CHECK (S->Count > 1); + xfree (S->Stack[--S->Count]); +} + + + +void SS_Push (StrStack* S, const char* Val) +/* Push a value onto a string stack */ +{ + CHECK (S->Count < sizeof (S->Stack) / sizeof (S->Stack[0])); + S->Stack[S->Count++] = xstrdup (Val); +} + + + diff --git a/src/common/strstack.h b/src/common/strstack.h new file mode 100644 index 000000000..6331241de --- /dev/null +++ b/src/common/strstack.h @@ -0,0 +1,106 @@ +/*****************************************************************************/ +/* */ +/* strstack.h */ +/* */ +/* String 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 STRSTACK_H +#define STRSTACK_H + + + +#include "inline.h" + + + +/*****************************************************************************/ +/* Data */ +/*****************************************************************************/ + + + +typedef struct StrStack StrStack; +struct StrStack { + unsigned Count; + char* Stack[8]; +}; + +/* Declare an empty string stack */ +#define STRSTACK() { 0 }; + + + +/*****************************************************************************/ +/* Code */ +/*****************************************************************************/ + + + +#if defined(HAVE_INLINE) +INLINE int SS_IsFull (const StrStack* S) +/* Return true if there is no space left on the given string stack */ +{ + return (S->Count >= sizeof (S->Stack) / sizeof (S->Stack[0])); +} +#else +# define SS_IsFull(S) ((S)->Count >= sizeof ((S)->Stack) / sizeof ((S)->Stack[0])) +#endif + +#if defined(HAVE_INLINE) +INLINE unsigned SS_GetCount (const StrStack* S) +/* Return the number of elements on the given string stack */ +{ + return S->Count; +} +#else +# define SS_GetCount(S) (S)->Count +#endif + +const char* SS_Get (const StrStack* S); +/* Get the value on top of a string stack */ + +void SS_Set (StrStack* S, const char* Val); +/* Set the value on top of a string stack */ + +void SS_Drop (StrStack* S); +/* Drop a value from a string stack */ + +void SS_Push (StrStack* S, const char* Val); +/* Push a value onto a string stack */ + + + +/* End of strstack.h */ +#endif + + + -- 2.39.5