/* 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