vec.c - bmf - bmf (Bayesian Mail Filter) 0.9.4 fork + patches
(HTM) git clone git://git.codemadness.org/bmf
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) LICENSE
---
vec.c (2589B)
---
1 /* $Id: vec.c,v 1.4 2002/10/20 18:19:17 tommy Exp $ */
2
3 /*
4 * Copyright (c) 2002 Tom Marshall <tommy@tig-grr.com>
5 *
6 * This program is free software. It may be distributed under the terms
7 * in the file LICENSE, found in the top level of the distribution.
8 *
9 * vec.c: vector functions for bmf.
10 * Vectors are used to hold token lists for input data and flatfile database
11 * entries in standalone mode. They dramatically reduce the number of small
12 * mallocs and, if used properly, have no performance penalty over fancier
13 * data structures.
14 */
15
16 #include "config.h"
17 #include "dbg.h"
18 #include "str.h"
19 #include "lex.h"
20 #include "vec.h"
21
22 /*****************************************************************************
23 * vector
24 */
25
26 void
27 vec_create(vec_t * pthis)
28 {
29 pthis->nalloc = VEC_INITIAL_SIZE;
30 pthis->nitems = 0;
31 /* TODO: check malloc() */
32 pthis->pitems = malloc(VEC_INITIAL_SIZE * sizeof(str_t));
33 }
34
35 void
36 vec_destroy(vec_t * pthis)
37 {
38 pthis->nitems = 0;
39 free(pthis->pitems);
40 pthis->pitems = NULL;
41 }
42
43 static void
44 vec_setsize(vec_t * pthis, uint nsize)
45 {
46 uint nnewalloc;
47 str_t *pnewitems;
48 uint n;
49
50 if (nsize > pthis->nalloc) {
51 nnewalloc = pthis->nalloc * 2;
52 if (nnewalloc < nsize)
53 nnewalloc = nsize;
54 pnewitems = (str_t *) realloc(pthis->pitems, nnewalloc * sizeof(str_t));
55 if (pnewitems == NULL) {
56 perror("realloc()");
57 exit(2);
58 }
59 for (n = pthis->nitems; n < nsize; n++) {
60 str_create(&pnewitems[n]);
61 }
62 pthis->pitems = pnewitems;
63 pthis->nalloc = nnewalloc;
64 }
65 }
66
67 void
68 vec_addtail(vec_t * pthis, str_t * pstr)
69 {
70 vec_setsize(pthis, pthis->nitems + 1);
71 pthis->pitems[pthis->nitems] = *pstr;
72 pthis->nitems++;
73 }
74
75 void
76 vec_first(vec_t * pthis, veciter_t * piter)
77 {
78 piter->plist = pthis;
79 piter->index = 0;
80 }
81
82 /*****************************************************************************
83 * sorted vector
84 */
85
86 static int
87 svec_compare(const void *p1, const void *p2)
88 {
89 return str_casecmp((const str_t *) p1, (const str_t *) p2);
90 }
91
92 void
93 svec_sort(vec_t * pthis)
94 {
95 if (pthis->nitems > 1) {
96 qsort(pthis->pitems, pthis->nitems, sizeof(str_t), svec_compare);
97 }
98 }
99
100 /*****************************************************************************
101 * vector iterator
102 */
103
104 void
105 veciter_destroy(veciter_t * pthis)
106 {
107 /* empty */
108 }
109
110 str_t *
111 veciter_get(veciter_t * pthis)
112 {
113 if (pthis->plist == NULL || pthis->index >= pthis->plist->nitems) {
114 return NULL;
115 }
116 return &pthis->plist->pitems[pthis->index];
117 }
118
119 bool_t
120 veciter_next(veciter_t * pthis)
121 {
122 pthis->index++;
123 if (pthis->index == pthis->plist->nitems) {
124 return false;
125 }
126 return true;
127 }