Listing 4

#include "list.h"
#include <alloc.h>
#define ARRAY_LIST_CLASS        LIST_CLASS \
/*  Index of current member */  int curr; \
/*  Total members in array */   int tot_members;

typedef struct array_list {
  ARRAY_LIST_CLASS
} ARRAY_LIST;

ARRAY_LIST *new_array_list();
destroy_array_list(ARRAY_LIST *);

/*------------------ ARRYLIST.C ------------------------*/

#include "arrylist.h"

static long total_members(ARRAY_LIST *this) {
    return((long) this->tot_members);
}

static unsigned at_top(ARRAY_LIST *this) {
    return(this->curr == 0);
}

static unsigned at_end(ARRAY_LIST *this) {
    return(this->curr == this->tot_members);
}

static void prev(ARRAY_LIST *this) {
  if (this->curr > 0)
    --(this->curr);
}
static void next(ARRAY_LIST *this) {
    if (this->curr < (this->tot_members))
      ++(this->curr);
}

static void seek(ARRAY_LIST *this, long where, int from) {
switch(from) {
    case SEEK_SET:
       if (where < this->tot_members)
          this->curr = (int) where;
    break;
    case SEEK_CUR:
       if (where > 0) {
          if ( (this->curr + (int) where) <
                this->tot_members ) {
             this->curr += (int) where;
          }
       }
       else {
          if ((this->curr - (int) where) > 0) {
              this->curr -= (int) where;
          }
       }
    break;
    case SEEK_END:
      if (where <= this->tot_members) {
          this->curr = this->tot_members - (int) where;
      }
    break;
  }
}
static void top(ARRAY_LIST *this) {
    this->curr = 0;
}
static void end(ARRAY_LIST *this) {
    this->curr = this->tot_members - 1;
}
static long tell(ARRAY_LIST *this) {
    return(this->curr);


}
ARRAY_LIST *new_array_list(void) {
    ARRAY_LIST *this;
    LIST *1;
    
    l = new list();
    if (l == NULL)
       return(NULL);
    
    this = calloc(l,sizeof(ARRAY_LIST));
    if (this == NULL) {
       destroy list(l);
       return(NULL);
    }
    memmove(this,l,sizeof(LIST));
    free(l);
    
    this->total_members = total_members;
    this->at_top = at_top;  this->at_end = at_end;
    this->prev = prev;      this->next = next;
    this->seek = seek;      this->top = top;
    this->end = end;        this->tell = tell;
    return(this);
}

destroy_array_list(ARRAY_LIST *this) {
    destroy_list(this);
}