зеркало из https://github.com/mozilla/gecko-dev.git
131 строка
3.2 KiB
C
131 строка
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;
|
|
}
|