New stack ADT implementation.

Fri Jan 22 02:06:10 EST 1999  Jeff Garzik  <jgarzik@pobox.com>

        * gstack.c:
        New stack ADT implementation.

        * glib.h:
        Add g_stack function prototypes and macros.
This commit is contained in:
EST 1999 Jeff Garzik
1999-01-22 07:08:35 +00:00
committed by Jeff Garzik
parent 2ae91cff96
commit ee3d2a3d4d
12 changed files with 209 additions and 2 deletions

View File

@@ -1,3 +1,11 @@
Fri Jan 22 02:06:10 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* gstack.c:
New stack ADT implementation.
* glib.h:
Add g_stack function prototypes and macros.
Thu Jan 21 23:55:54 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* TODO:

View File

@@ -1,3 +1,11 @@
Fri Jan 22 02:06:10 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* gstack.c:
New stack ADT implementation.
* glib.h:
Add g_stack function prototypes and macros.
Thu Jan 21 23:55:54 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* TODO:

View File

@@ -1,3 +1,11 @@
Fri Jan 22 02:06:10 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* gstack.c:
New stack ADT implementation.
* glib.h:
Add g_stack function prototypes and macros.
Thu Jan 21 23:55:54 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* TODO:

View File

@@ -1,3 +1,11 @@
Fri Jan 22 02:06:10 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* gstack.c:
New stack ADT implementation.
* glib.h:
Add g_stack function prototypes and macros.
Thu Jan 21 23:55:54 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* TODO:

View File

@@ -1,3 +1,11 @@
Fri Jan 22 02:06:10 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* gstack.c:
New stack ADT implementation.
* glib.h:
Add g_stack function prototypes and macros.
Thu Jan 21 23:55:54 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* TODO:

View File

@@ -1,3 +1,11 @@
Fri Jan 22 02:06:10 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* gstack.c:
New stack ADT implementation.
* glib.h:
Add g_stack function prototypes and macros.
Thu Jan 21 23:55:54 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* TODO:

View File

@@ -1,3 +1,11 @@
Fri Jan 22 02:06:10 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* gstack.c:
New stack ADT implementation.
* glib.h:
Add g_stack function prototypes and macros.
Thu Jan 21 23:55:54 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* TODO:

View File

@@ -1,3 +1,11 @@
Fri Jan 22 02:06:10 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* gstack.c:
New stack ADT implementation.
* glib.h:
Add g_stack function prototypes and macros.
Thu Jan 21 23:55:54 EST 1999 Jeff Garzik <jgarzik@pobox.com>
* TODO:

2
TODO
View File

@@ -28,8 +28,6 @@ Ideas for GLib 1.3:
* 'make check' tests one per module, plus bug report regression tests
and such
* new func g_list_delete, combines g_list_remove_link and g_list_free1
* primitive memory leak checking by g_malloc, g_free
* alloca-based convenience macros, counterparts to:

34
glib.h
View File

@@ -681,6 +681,7 @@ typedef struct _GRelation GRelation;
typedef struct _GScanner GScanner;
typedef struct _GScannerConfig GScannerConfig;
typedef struct _GSList GSList;
typedef struct _GStack GStack;
typedef struct _GString GString;
typedef struct _GStringChunk GStringChunk;
typedef struct _GTimer GTimer;
@@ -797,6 +798,11 @@ struct _GSList
GSList *next;
};
struct _GStack
{
GList *list;
};
struct _GString
{
gchar *str;
@@ -933,6 +939,34 @@ gpointer g_slist_nth_data (GSList *list,
#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL)
/* Stacks
*/
GStack * g_stack_new (void);
#ifndef G_STACK_MACROIZE
void g_stack_free (GStack *stack);
void g_stack_push (GStack *stack, gpointer data);
#endif
gpointer g_stack_pop (GStack *stack);
#if G_STACK_MACROIZE
#define g_stack_free(stack) G_STMT_START { \
if ((GStack *)(stack)) { \
if ((GStack *)(stack)->list) \
g_list_free ((GStack *)(stack)->list); \
g_free (stack); \
} \
} G_STMT_END
#define g_stack_push(stack) G_STMT_START { \
if ((GStack *)(stack)) \
(GStack *)(stack)->list = \
g_list_prepend ((GStack *)(stack)->list, data); \
} G_STMT_END
#endif
/* Hash tables
*/
GHashTable* g_hash_table_new (GHashFunc hash_func,

View File

@@ -681,6 +681,7 @@ typedef struct _GRelation GRelation;
typedef struct _GScanner GScanner;
typedef struct _GScannerConfig GScannerConfig;
typedef struct _GSList GSList;
typedef struct _GStack GStack;
typedef struct _GString GString;
typedef struct _GStringChunk GStringChunk;
typedef struct _GTimer GTimer;
@@ -797,6 +798,11 @@ struct _GSList
GSList *next;
};
struct _GStack
{
GList *list;
};
struct _GString
{
gchar *str;
@@ -933,6 +939,34 @@ gpointer g_slist_nth_data (GSList *list,
#define g_slist_next(slist) ((slist) ? (((GSList *)(slist))->next) : NULL)
/* Stacks
*/
GStack * g_stack_new (void);
#ifndef G_STACK_MACROIZE
void g_stack_free (GStack *stack);
void g_stack_push (GStack *stack, gpointer data);
#endif
gpointer g_stack_pop (GStack *stack);
#if G_STACK_MACROIZE
#define g_stack_free(stack) G_STMT_START { \
if ((GStack *)(stack)) { \
if ((GStack *)(stack)->list) \
g_list_free ((GStack *)(stack)->list); \
g_free (stack); \
} \
} G_STMT_END
#define g_stack_push(stack) G_STMT_START { \
if ((GStack *)(stack)) \
(GStack *)(stack)->list = \
g_list_prepend ((GStack *)(stack)->list, data); \
} G_STMT_END
#endif
/* Hash tables
*/
GHashTable* g_hash_table_new (GHashFunc hash_func,

77
gstack.c Normal file
View File

@@ -0,0 +1,77 @@
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include <glib.h>
/*
* GStack, opaque ADT with interface:
stack = g_stack_new ();
count = g_stack_size (stack);
g_stack_push (stack, data);
data = g_stack_pop (stack);
slist = g_stack_get_list (stack);
*/
GStack *
g_stack_new (void)
{
GStack *s;
s = g_new (GStack, 1);
if (!s)
return NULL;
s->list = NULL;
return s;
}
#ifndef G_STACK_MACROIZE
void
g_stack_free (GStack *stack)
{
if (stack) {
if (stack->list)
g_list_free (stack->list);
g_free (stack);
}
}
void
g_stack_push (GStack *stack, gpointer data)
{
if (stack)
stack->list = g_list_prepend (stack->list, data);
}
#endif /* G_STACK_MACROIZE */
gpointer
g_stack_pop (GStack *stack)
{
gpointer data = NULL;
if ((stack) && (stack->list)) {
GList *node = stack->list;
stack->list = stack->list->next;
data = node->data;
g_list_free_1 (node);
}
return data;
}