/*  util.c  */

#include "../Ideq.h"

/*--------------------------------------------------------------------*/
/*
   -----------------------
   clear the dequeue,
  
   created -- 96jun06, cca
   -----------------------
*/
void
Ideq_clear (
   Ideq   *deq
) {
/*
   ---------------
   check the input
   ---------------
*/
if ( deq == NULL ) {
   fprintf(stderr, "\n fatal error in Ideq_clear(%p)"
           "\n bad input\n", deq) ;
   exit(-1) ;
}
deq->head = deq->tail = -1 ;

return ; }

/*--------------------------------------------------------------------*/
/*
   ---------------------------------
   return the head of the dequeue,
   return -1 if the dequeue is empty
  
   created -- 96jun06, cca
   ---------------------------------
*/
int
Ideq_head (
   Ideq   *deq
) {
int   val ;
/*
   ---------------
   check the input
   ---------------
*/
if ( deq == NULL ) {
   fprintf(stderr, "\n fatal error in Ideq_head(%p)"
           "\n bad input\n", deq) ;
   exit(-1) ;
}
if ( deq->head == -1 ) {
   val = -1 ;
} else {
   val =  deq->iv.vec[deq->head] ;
} 
return(val) ; }

/*--------------------------------------------------------------------*/
/*
   ------------------------------------------
   return and remove the head of the dequeue,
   return -1 if the dequeue is empty
  
   created -- 96jun06, cca
   ------------------------------------------
*/
int
Ideq_removeFromHead (
   Ideq   *deq
) {
int   val ;
/*
   ---------------
   check the input
   ---------------
*/
if ( deq == NULL ) {
   fprintf(stderr, "\n fatal error in Ideq_removeFromHead(%p)"
           "\n bad input\n", deq) ;
   exit(-1) ;
}
if ( deq->head == -1 ) {
   val = -1 ;
} else {
   val =  deq->iv.vec[deq->head] ;
   if ( deq->head == deq->tail ) {
      deq->head = deq->tail = -1 ;
   } else if ( deq->head == deq->iv.size - 1 ) {
      deq->head = 0 ;
   } else {
      deq->head++ ;
   }
} 
return(val) ; }

/*--------------------------------------------------------------------*/
/*
   ---------------------------------------
   insert value at head of dequeue
   return value
     1 --> value inserted
    -1 --> no room in dequeue, must resize
  
   created -- 96jun06, cca
   ---------------------------------------
*/
int
Ideq_insertAtHead (
   Ideq   *deq,
   int    val 
) {
int   rc, size ;
int   *ivec ;
/*
   ---------------
   check the input
   ---------------
*/
if ( deq == NULL ) {
   fprintf(stderr, "\n fatal error in Ideq_insertAtHead(%p,%d)"
           "\n bad input\n", deq, val) ;
   exit(-1) ;
}
ivec = deq->iv.vec ;
size = deq->iv.size ;
if ( deq->head == -1 ) {
   ivec[0] = val ;
   deq->head = deq->tail = 0 ;
   rc = 1 ;
} else {
   if ( deq->head == 0 ) {
      if ( deq->tail == size - 1 ) {
         rc = -1 ;
      } else {
         ivec[(deq->head = size - 1)] = val ;
         rc = 1 ;
      }
   } else if ( deq->tail == deq->head - 1 ) {
      rc = -1 ;
   } else {
      ivec[--deq->head] = val ;
      rc = 1 ;
   }
} 
return(rc) ; }

/*--------------------------------------------------------------------*/
/*
   ---------------------------------
   return the tail of the dequeue,
   return -1 if the dequeue is empty
  
   created -- 96jun06, cca
   ---------------------------------
*/
int
Ideq_tail (
   Ideq   *deq
) {
int   val ;
/*
   ---------------
   check the input
   ---------------
*/
if ( deq == NULL ) {
   fprintf(stderr, "\n fatal error in Ideq_tail(%p)"
           "\n bad input\n", deq) ;
   exit(-1) ;
}
if ( deq->tail == -1 ) {
   val = -1 ;
} else {
   val =  deq->iv.vec[deq->tail] ;
} 
return(val) ; }

/*--------------------------------------------------------------------*/
/*
   ------------------------------------------
   return and remove the tail of the dequeue,
   return -1 if the dequeue is empty
  
   created -- 96jun06, cca
   ------------------------------------------
*/
int
Ideq_removeFromTail (
   Ideq   *deq
) {
int   val ;
/*
   ---------------
   check the input
   ---------------
*/
if ( deq == NULL ) {
   fprintf(stderr, "\n fatal error in Ideq_removeFromTail(%p)"
           "\n bad input\n", deq) ;
   exit(-1) ;
}
if ( deq->tail == -1 ) {
   val = -1 ;
} else {
   val =  deq->iv.vec[deq->tail] ;
   if ( deq->head == deq->tail ) {
      deq->head = deq->tail = -1 ;
   } else if ( deq->tail == 0 ) {
      deq->tail = deq->iv.size - 1 ;
   } else {
      deq->tail-- ;
   }
} 
return(val) ; }

/*--------------------------------------------------------------------*/
/*
   ---------------------------------------
   insert value at tail of dequeue
   return value
     1 --> value inserted
    -1 --> no room in dequeue, must resize
  
   created -- 96jun06, cca
   ---------------------------------------
*/
int
Ideq_insertAtTail (
   Ideq   *deq,
   int    val 
) {
int   rc, size ;
int   *ivec ;
/*
   ---------------
   check the input
   ---------------
*/
if ( deq == NULL ) {
   fprintf(stderr, "\n fatal error in Ideq_insertAtTail(%p,%d)"
           "\n bad input\n", deq, val) ;
   exit(-1) ;
}
ivec = deq->iv.vec ;
size = deq->iv.size ;
if ( deq->tail == -1 ) {
   ivec[0] = val ;
   deq->head = deq->tail = 0 ;
   rc = 1 ;
} else {
   if ( deq->tail == size - 1 ) {
      if ( deq->head == 0 ) {
         rc = -1 ;
      } else {
         ivec[(deq->tail = 0)] = val ;
         rc = 1 ;
      }
   } else if ( deq->tail + 1 == deq->head ) {
      rc = -1 ;
   } else {
      ivec[++deq->tail] = val ;
      rc = 1 ;
   }
} 
return(rc) ; }

/*--------------------------------------------------------------------*/


syntax highlighted by Code2HTML, v. 0.9.1