#include <stdlib.h>
#include <assert.h>

#define INIT_ENV_DEPTH 256

static 
void tagstack_init(struct tagstack* tagstack) {
  tagstack->depth=INIT_ENV_DEPTH;
  tagstack->pos=-1;
  tagstack->entry=(struct tagstack_entry*) malloc (tagstack->depth * sizeof(struct tagstack_entry));
}

static 
void tagstack_free(struct tagstack* tagstack) {
  tagstack->depth=-1;
  tagstack->pos=-1;
  free(tagstack->entry);
}

INLINE
static 
int tagstack_notempty(const struct tagstack* tagstack) {
  return tagstack->pos >= 0;
}

/*
static 
void tagstack_entry_debug(struct tagstack_entry item) {
 tmpl_log(TMPL_LOG_DEBUG,"vcontext = %d value=%d\n",item.vcontext,item.value);
}
*/

INLINE
static 
struct tagstack_entry* tagstack_top(const struct tagstack* tagstack) {
  return tagstack->entry+tagstack->pos;
}

static 
struct tagstack_entry tagstack_pop(struct tagstack* tagstack, int* is_underflow) {
  if (is_underflow != NULL) *is_underflow=0;
  if (tagstack->pos<0) {
    tagstack->pos=0;
    if (is_underflow != NULL) *is_underflow=1;
    if (tagstack->depth<0) {
      tmpl_log(TMPL_LOG_ERROR,"FATAL:stack error:tags stack is uninitialized\n");
      tagstack_init(tagstack);
    }
  }
  return *(tagstack->entry+ tagstack->pos--);
}

static 
void tagstack_push(struct tagstack* tagstack, struct tagstack_entry item) {
  /* overflow check */
  if (++(tagstack->pos)>=tagstack->depth) {
    if (tagstack->depth<INIT_ENV_DEPTH) tagstack->depth=INIT_ENV_DEPTH;
    tagstack->depth*=2;
    tagstack->entry=(struct tagstack_entry*) realloc (tagstack->entry, tagstack->depth * sizeof(struct tagstack_entry));
  }
  *(tagstack->entry+tagstack->pos)=item;
}

/* 
 * Local Variables:
 * mode: c 
 * End: 
 */