gecko-dev/lib/libaddr/abdeque.c
1998-06-22 21:46:46 +00:00

131 lines
3.2 KiB
C

/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*-
*
* The contents of this file are subject to the Netscape Public License
* Version 1.0 (the "NPL"); you may not use this file except in
* compliance with the NPL. You may obtain a copy of the NPL at
* http://www.mozilla.org/NPL/
*
* Software distributed under the NPL is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL
* for the specific language governing rights and limitations under the
* NPL.
*
* The Initial Developer of this code under the NPL is Netscape
* Communications Corporation. Portions created by Netscape are
* Copyright (C) 1998 Netscape Communications Corporation. All Rights
* Reserved.
*/
/*
* File: abdeque.c
* Contains: Ferrum deque (double ended queue (linked list))
*
* Copied directly from public domain IronDoc, with minor naming tweaks.
*
* Change History:
* <4> 25Nov1997 copy verbatim for use in Netscape address books
* <3> 21Sep1997 Fe v0.16 add per method comments
* <2> 01Sep1997 Fe v0.15 use "self" for first method parameter
* <1> 24Jul1997 Fe v0.11
* <0> 04Jul1997 first draft
*/
#ifndef _ABTABLE_
#include "abtable.h"
#endif
#ifndef _ABDEQUE_
#include "abdeque.h"
#endif
/*| RemoveFirst:
|*/
AB_API_IMPL(AB_Link*)
AB_Deque_RemoveFirst(AB_Deque* self) /*i*/
{
AB_Link* link = self->sDeque_Head.sLink_Next;
if ( link != &self->sDeque_Head )
{
(self->sDeque_Head.sLink_Next = link->sLink_Next)->sLink_Prev =
&self->sDeque_Head;
return link;
}
return (AB_Link*) 0;
}
/*| RemoveLast:
|*/
AB_API_IMPL(AB_Link*)
AB_Deque_RemoveLast(AB_Deque* self) /*i*/
{
AB_Link* link = self->sDeque_Head.sLink_Prev;
if ( link != &self->sDeque_Head )
{
(self->sDeque_Head.sLink_Prev = link->sLink_Prev)->sLink_Next =
&self->sDeque_Head;
return link;
}
return (AB_Link*) 0;
}
/*| At:
|*/
AB_API_IMPL(AB_Link*)
AB_Deque_At(register const AB_Deque* self, ab_pos index) /*i*/
/* indexes are one based (and not zero based) */
{
register ab_num count = 0;
register AB_Link* link;
for ( link = AB_Deque_First(self); link; link = AB_Deque_After(self,link) )
{
if ( ++count == index )
break;
}
return link;
}
/*| IndexOf:
|*/
AB_API_IMPL(ab_pos)
AB_Deque_IndexOf(register const AB_Deque* self, const AB_Link* member) /*i*/
/* indexes are one based (and not zero based) */
/* zero means member is not in deque */
{
register ab_num count = 0;
register const AB_Link* link;
for ( link = AB_Deque_First(self); link; link = AB_Deque_After(self,link) )
{
++count;
if ( member == link )
return count;
}
return 0;
}
/*| Length:
|*/
AB_API_IMPL(ab_num)
AB_Deque_Length(register const AB_Deque* self) /*i*/
{
register ab_num count = 0;
register AB_Link* link;
for ( link = AB_Deque_First(self); link; link = AB_Deque_After(self,link) )
++count;
return count;
}
/*| LengthCompare:
|*/
AB_API_IMPL(int)
AB_Deque_LengthCompare(register const AB_Deque* self, ab_num c) /*i*/
{
register ab_num count = 0;
register const AB_Link* link;
for ( link = AB_Deque_First(self); link; link = AB_Deque_After(self,link) )
{
if ( ++count > c )
return 1;
}
return ( count == c )? 0 : -1;
}