59 lines
1.5 KiB
C
Executable File
59 lines
1.5 KiB
C
Executable File
#ident "@(#)stak.h 1.6 93/06/08 SMI" /* From AT&T Toolchest */
|
|
|
|
#ifndef STAK_SMALL
|
|
/*
|
|
* David Korn
|
|
* AT&T Bell Laboratories
|
|
*
|
|
* Interface definitions for a stack-like storage library
|
|
*
|
|
*/
|
|
|
|
#if defined(__STDC__) || __cplusplus || c_plusplus
|
|
# define __ARGS(args) args
|
|
#else
|
|
# define const /*empty*/
|
|
# define __ARGS(args) ()
|
|
#endif
|
|
|
|
typedef struct _stak_
|
|
{
|
|
int stakleft; /* number of bytes left in frame */
|
|
char *staktop; /* current stack location */
|
|
char *stakbot; /* last returned stack location */
|
|
short stakref; /* reference count */
|
|
#ifdef _STAK_PRIVATE
|
|
_STAK_PRIVATE
|
|
#endif /* _STAK_PRIVATE */
|
|
} Stak_t;
|
|
|
|
#define STAK_SMALL 1 /* argument to stakcreate */
|
|
|
|
#if __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
extern Stak_t *stakcreate __ARGS((int));
|
|
extern Stak_t *stakinstall __ARGS((Stak_t*, char *(*)(int)));
|
|
extern int stakdelete __ARGS((Stak_t*));
|
|
extern char *stakalloc __ARGS((unsigned));
|
|
extern char *stakcopy __ARGS((const char*));
|
|
extern char *stakset __ARGS((char*, unsigned));
|
|
extern char *stakseek __ARGS((unsigned));
|
|
extern int stakputs __ARGS((const char*));
|
|
extern char *stakfreeze __ARGS((unsigned));
|
|
extern char *_stakgrow __ARGS((unsigned));
|
|
#if __cplusplus
|
|
}
|
|
#endif
|
|
|
|
extern Stak_t _stak_cur; /* used by macros */
|
|
|
|
#define staklink(sp) ((sp)->stakref++)
|
|
#define stakptr(n) (_stak_cur.stakbot+(n))
|
|
#define staktell() (_stak_cur.staktop-_stak_cur.stakbot)
|
|
#define stakputc(c) ((--_stak_cur.stakleft<=0? _stakgrow(1):0), \
|
|
*_stak_cur.staktop++=(c))
|
|
|
|
#endif /* STAK_SMALL */
|