small sisez
[tedtools.git] / psort.h
1 /*
2  * Copyright (c) 2004 Teodor Sigaev <teodor@sigaev.ru>
3  * All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *        notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *        notice, this list of conditions and the following disclaimer in the
12  *        documentation and/or other materials provided with the distribution.
13  * 3. Neither the name of the author nor the names of any co-contributors
14  *        may be used to endorse or promote products derived from this software
15  *        without specific prior written permission.
16  *
17  * THIS SOFTWARE IS PROVIDED BY CONTRIBUTORS ``AS IS'' AND ANY EXPRESS
18  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20  * ARE DISCLAIMED. IN NO EVENT SHALL CONTRIBUTORS BE LIABLE FOR ANY
21  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23  * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 #ifndef __PSORT_H__
30 #define __PSORT_H__
31
32 typedef int (*compare_sort)(const void*, const void*);
33 typedef void (*ffree)(void*);
34
35 typedef struct SORTITEM {
36         void*  value;
37         struct SORTITEM *prev;
38         struct SORTITEM *next;
39 } SORTITEM;
40
41 typedef struct {
42         SORTITEM* buf;          /* buffer */
43         int     buflen;         /* length of buffer in items */
44         int     curlen;         /* current number of items */
45         compare_sort    cmpr;   /* compare two items */
46         ffree   free;           /* free mem unused item, may be NULL */
47
48         /* pointer for sorting */
49         SORTITEM* first;
50         SORTITEM* last;
51
52         SORTITEM* curitem;              /* current position for iterator */
53 } SORT;
54
55 /*
56  * init object
57  */
58 int PS_init( SORT* sobj, int buflen, compare_sort func, ffree ffunc );
59 /*
60  * reset sort object to initial state
61  */
62 void  PS_reset( SORT* sobj );
63 /*
64  * clear sort object (after it it's need to call PS_init)
65  */
66 void  PS_clear( SORT* sobj );
67
68 /*
69  * functions for go trought sorted array 
70  */ 
71 int PS_init_iterator( SORT* sobj, int start ); 
72 void*  PS_getnext( SORT* sobj );
73
74 /*
75  * insert, return 1 if inserted
76  */
77 int PS_insert( SORT* sobj, void* nobj );
78
79 /*
80  * bulk insert
81  */
82 void PS_bulkinsert( SORT* sobj, void** nobjs, int len );
83 /*
84  * insert a-la qsort, require sobj->free = NULL
85  */
86 int PS_bulkplain( SORT* sobj, void* nobjs, int size, int len );
87
88 /*
89  * return number of result in buffer
90  */
91 int PS_number( SORT* sobj );
92
93 #endif