ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/rxvt-unicode/src/salloc.C
Revision: 1.7
Committed: Sun May 9 18:19:49 2004 UTC (20 years ago) by pcg
Content type: text/plain
Branch: MAIN
CVS Tags: rel-5_5, rel-5_4, rel-5_7, rel-5_1, rel-5_0, rel-5_3, rel-5_2, rel-4_4, rel-4_6, rel-4_7, rel-5_9, rel-5_8, rel-4_2, rel-4_3, rel-3_7, rel-3_8, rel-3_5, rel-3_4, rel-3_3, rel-3_2, rel-3_0, rel-3_6, rel-4_1, rel-4_0, rel-4_8, rel-4_9
Changes since 1.6: +16 -0 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 /*--------------------------------*-C-*---------------------------------*
2 * File: salloc.C
3 *----------------------------------------------------------------------*
4 *
5 * All portions of code are copyright by their respective author/s.
6 * Copyright (c) 2003-2004 Marc Lehmann <pcg@goof.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 *----------------------------------------------------------------------*/
22
23 #include "salloc.h"
24
25 #define SALLOC_BLOCK 65536 // size of basic block to allocate
26
27 rxvt_salloc::rxvt_salloc (unsigned int size)
28 {
29 this->size = size < sizeof (chain) ? sizeof (chain) : size;
30 firstline = 0;
31 firstblock = 0;
32 firstfree = SALLOC_BLOCK;
33 }
34
35 rxvt_salloc::~rxvt_salloc ()
36 {
37 while (firstblock)
38 {
39 chain *next = firstblock->next;
40 ::free (firstblock);
41 firstblock = next;
42 }
43 }
44
45 void *
46 rxvt_salloc::alloc ()
47 {
48 void *r;
49
50 if (firstline)
51 {
52 r = (void *)firstline;
53 firstline = firstline->next;
54 }
55 else
56 {
57 if (firstfree + size > SALLOC_BLOCK)
58 {
59 chain *next = (chain *)rxvt_malloc ((SALLOC_BLOCK - sizeof (chain)) / size * size + sizeof (chain));
60 next->next = firstblock;
61 firstblock = next;
62 firstfree = sizeof (chain);
63 }
64
65 r = (void *) ((char *)firstblock + firstfree);
66
67 firstfree += size;
68 }
69
70 return r;
71 }
72
73 void *
74 rxvt_salloc::alloc (void *data, unsigned int datalen)
75 {
76 void *s = alloc ();
77
78 if (datalen < size)
79 {
80 memcpy (s, data, datalen);
81 memset ((unsigned char *)s + datalen, 0, size - datalen); // not strictly required for screen.C
82 }
83 else
84 memcpy (s, data, size);
85
86 return s;
87 }
88
89 void
90 rxvt_salloc::free (void *data)
91 {
92 chain *line = (chain *)data;
93 line->next = firstline;
94 firstline = line;
95 }
96