]> jfr.im git - irc/quakenet/newserv.git/blame - channel/channelalloc.c
Cleanup old svn tags and add proper build id's.
[irc/quakenet/newserv.git] / channel / channelalloc.c
CommitLineData
c86edd1d
Q
1/* channelalloc.c */
2
3#include <stdlib.h>
4#include "channel.h"
5#include <assert.h>
6
7#define ALLOCUNIT 100
8
9channel *freechans;
10chanuserhash *freehash;
11chanban *freebans;
12chanindex *freechanindices;
13
14void initchannelalloc() {
15 freechans=NULL;
16 freehash=NULL;
17 freebans=NULL;
18 freechanindices=NULL;
19}
20
21/* channel records don't have next pointers.
22 * Overload the index pointer for chaining free channels */
23
24channel *newchan() {
25 int i;
26 channel *cp;
27
28 if (freechans==NULL) {
29 freechans=(channel *)malloc(ALLOCUNIT*sizeof(channel));
30 for (i=0;i<(ALLOCUNIT-1);i++) {
31 freechans[i].index=(struct chanindex *)&(freechans[i+1]);
32 }
33 freechans[ALLOCUNIT-1].index=NULL;
34 }
35
36 cp=freechans;
37 freechans=(channel *)cp->index;
38
39 return cp;
40}
41
42void freechan(channel *cp) {
43 cp->index=(struct chanindex *)freechans;
44 freechans=cp;
45}
46
47/*
48 * Free hash for all!
49 *
50 * Since these things don't naturally have a "next" pointer
51 * we abuse the "content" pointer to build our list of free
52 * structures.
53 *
54 * Hence some somewhat bizarre casts...
55 */
56
57chanuserhash *newchanuserhash(int hashsize) {
58 int i;
59 chanuserhash *cuhp;
60
61 if (freehash==NULL) {
62 freehash=(chanuserhash *)malloc(ALLOCUNIT*sizeof(chanuserhash));
63 for (i=0;i<(ALLOCUNIT-1);i++) {
64 freehash[i].content=(unsigned long *)&(freehash[i+1]);
65 }
66 freehash[ALLOCUNIT-1].content=NULL;
67 }
68
69 cuhp=freehash;
70 freehash=(chanuserhash *)cuhp->content;
71
72
73 cuhp->content=(unsigned long *)malloc(hashsize*sizeof(unsigned long));
74 for (i=0;i<hashsize;i++) {
75 cuhp->content[i]=nouser;
76 }
77
78 cuhp->hashsize=hashsize;
79 cuhp->totalusers=0;
80
81 return cuhp;
82}
83
84void freechanuserhash(chanuserhash *cuhp) {
85 free(cuhp->content);
86 cuhp->content=(unsigned long *)freehash;
87 freehash=cuhp;
88}
89
90chanban *getchanban() {
91 int i;
92 chanban *cbp;
93
94 if (freebans==NULL) {
95 freebans=(chanban *)malloc(ALLOCUNIT*sizeof(chanban));
96 for (i=0;i<ALLOCUNIT-1;i++) {
97 freebans[i].next=(struct chanban *)&(freebans[i+1]);
98 }
99 freebans[ALLOCUNIT-1].next=NULL;
100 }
101
102 cbp=freebans;
103 freebans=cbp->next;
104
105 cbp->nick=NULL;
106 cbp->user=NULL;
107 cbp->host=NULL;
108
109 return cbp;
110}
111
112void freechanban(chanban *cbp) {
113 cbp->next=(struct chanban *)freebans;
114
115 if (cbp->nick)
116 freesstring(cbp->nick);
117 if (cbp->user)
118 freesstring(cbp->user);
119 if (cbp->host)
120 freesstring(cbp->host);
121
122 freebans=cbp;
123}
124
125chanindex *getchanindex() {
126 int i;
127 chanindex *cip;
128
129 if (freechanindices==NULL) {
130 freechanindices=(chanindex *)malloc(ALLOCUNIT*sizeof(chanindex));
131 for(i=0;i<ALLOCUNIT-1;i++) {
132 freechanindices[i].next=&(freechanindices[i+1]);
133 }
134 freechanindices[ALLOCUNIT-1].next=NULL;
135 }
136
137 cip=freechanindices;
138 freechanindices=cip->next;
139
140 return cip;
141}
142
143void freechanindex(chanindex *cip) {
144 cip->next=freechanindices;
145 freechanindices=cip;
146}
147