зеркало из https://github.com/mozilla/gecko-dev.git
171 строка
3.8 KiB
C
171 строка
3.8 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.1 (the "License"); you may not use this file
|
|
* except in compliance with the License. You may obtain a copy of
|
|
* the License at http://www.mozilla.org/NPL/
|
|
*
|
|
* Software distributed under the License is distributed on an "AS
|
|
* IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
* implied. See the License for the specific language governing
|
|
* rights and limitations under the License.
|
|
*
|
|
* The Original Code is mozilla.org code.
|
|
*
|
|
* The Initial Developer of the Original Code is Netscape
|
|
* Communications Corporation. Portions created by Netscape are
|
|
* Copyright (C) 1998 Netscape Communications Corporation. All
|
|
* Rights Reserved.
|
|
*
|
|
* Contributor(s):
|
|
*/
|
|
#include "mkutils.h"
|
|
#include "mksort.h"
|
|
#include "nsQuickSort.h"
|
|
|
|
#define CHUNK_SIZE 400
|
|
|
|
#ifdef PROFILE
|
|
#pragma profile on
|
|
#endif
|
|
|
|
|
|
MODULE_PRIVATE SortStruct *
|
|
NET_SortInit (void)
|
|
{
|
|
|
|
SortStruct * sort_struct = PR_NEW(SortStruct);
|
|
|
|
if(!sort_struct)
|
|
return(0);
|
|
|
|
sort_struct->list = (void **) PR_Malloc((sizeof(void *) * CHUNK_SIZE));
|
|
|
|
if(!sort_struct->list)
|
|
return(0);
|
|
|
|
sort_struct->cur_size = CHUNK_SIZE;
|
|
sort_struct->num_entries = 0;
|
|
|
|
return(sort_struct);
|
|
}
|
|
|
|
MODULE_PRIVATE Bool
|
|
NET_SortAdd (SortStruct * sort_struct, void * add_object)
|
|
{
|
|
if(!sort_struct)
|
|
{
|
|
TRACEMSG(("Trying to add to NULL sort_struct"));
|
|
return(0);
|
|
}
|
|
|
|
if(sort_struct->cur_size == sort_struct->num_entries)
|
|
{ /* whoops the list was too small, expand it */
|
|
|
|
sort_struct->cur_size += CHUNK_SIZE;
|
|
sort_struct->list = (void **) PR_Realloc(sort_struct->list,
|
|
(sizeof(void *) * sort_struct->cur_size));
|
|
|
|
if(!sort_struct->list)
|
|
return(0); /* very bad! */
|
|
}
|
|
|
|
sort_struct->list[sort_struct->num_entries++] = add_object;
|
|
|
|
return(1);
|
|
|
|
}
|
|
|
|
MODULE_PRIVATE Bool
|
|
NET_SortInsert(SortStruct * sort_struct, void * insert_before, void * new_object)
|
|
{
|
|
int i;
|
|
|
|
if(sort_struct->cur_size == sort_struct->num_entries)
|
|
{ /* whoops the list was too small, expand it */
|
|
|
|
sort_struct->cur_size += CHUNK_SIZE;
|
|
sort_struct->list = (void **) PR_Realloc(sort_struct->list,
|
|
(sizeof(void *) * sort_struct->cur_size));
|
|
|
|
if(!sort_struct->list)
|
|
return(0); /* very bad! */
|
|
}
|
|
|
|
/* find the insert_before object in the list
|
|
*/
|
|
for(i=0; i < sort_struct->num_entries; i++)
|
|
{
|
|
if(sort_struct->list[i] == insert_before)
|
|
break;
|
|
}
|
|
|
|
if(sort_struct->list[i] == insert_before)
|
|
{
|
|
void * tmp_ptr1;
|
|
void * tmp_ptr2;
|
|
|
|
tmp_ptr2 = new_object;
|
|
|
|
for(; i < sort_struct->num_entries; i++)
|
|
{
|
|
tmp_ptr1 = sort_struct->list[i];
|
|
sort_struct->list[i] = tmp_ptr2;
|
|
tmp_ptr2 = tmp_ptr1;
|
|
}
|
|
|
|
sort_struct->list[i] = tmp_ptr2;
|
|
sort_struct->num_entries++;
|
|
}
|
|
else
|
|
{
|
|
return(0);
|
|
}
|
|
|
|
return(1);
|
|
}
|
|
|
|
MODULE_PRIVATE void
|
|
NET_DoSort(SortStruct * sort_struct, int (*compar) (const void *, const void *, void *))
|
|
{
|
|
NS_QuickSort(sort_struct->list, (unsigned int) (sort_struct->num_entries), sizeof(void *), compar, NULL);
|
|
}
|
|
|
|
/* unloads backwards :(
|
|
*/
|
|
MODULE_PRIVATE void *
|
|
NET_SortUnloadNext(SortStruct * sort_struct)
|
|
{
|
|
if(sort_struct->num_entries < 1)
|
|
return(0);
|
|
|
|
return(sort_struct->list[--sort_struct->num_entries]);
|
|
}
|
|
|
|
MODULE_PRIVATE void *
|
|
NET_SortRetrieveNumber(SortStruct * sort_struct, int number)
|
|
{
|
|
if(number >= sort_struct->num_entries)
|
|
return(0);
|
|
|
|
return(sort_struct->list[number]);
|
|
}
|
|
|
|
MODULE_PRIVATE int
|
|
NET_SortCount(SortStruct * sort_struct)
|
|
{
|
|
return(sort_struct->num_entries);
|
|
}
|
|
|
|
MODULE_PRIVATE void
|
|
NET_SortFree(SortStruct * sort_struct)
|
|
{
|
|
PR_Free(sort_struct->list);
|
|
PR_Free(sort_struct);
|
|
}
|
|
|
|
#ifdef PROFILE
|
|
#pragma profile off
|
|
#endif
|
|
|