add .gitignore
[tedtools.git] / tmalloc.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
30 #ifndef __TMALLOC_H__
31 #define __TMALLOC_H__
32
33 #include <sys/types.h>
34 #include "tools.h"
35
36 void * tmalloc(size_t size);
37 void * trealloc(void * ptr, size_t size); 
38 void * t0malloc(size_t size);
39 void tfree(void * ptr);
40
41 char * tstrdup(char * src); 
42 char * tnstrdup(char *src, int len);
43 char * strlower(char * src);
44 char * strupper(char * src);
45 int clrspace(char *buf);
46
47 /* fast allocate */
48
49 #define CNTXCHUNK       (64*1024)
50
51 typedef struct MemoryChunk {
52         size_t  size;
53         size_t  freesize;
54         struct MemoryChunk      *next;
55         char data[1];
56 } MemoryChunk;
57
58 #define MEMCHNKHDRSZ    offsetof(MemoryChunk, data)
59
60 typedef struct MemoryContext {
61         u_int32_t       flags;
62         struct MemoryContext    *parent;
63         struct MemoryContext    *child;
64         MemoryChunk     *chunk;
65 } MemoryContext;
66
67 #define MC_DEBUG        0x01    
68
69 typedef struct {
70         size_t  size;
71         MemoryContext   *cntx;
72         char    data[1];        
73 } MCAllocatedSpace;
74
75 #define MCASHDRSZ offsetof(MCAllocatedSpace, data)
76 #define MCMAGICKNUMBER  (0xFE0FBEEF)
77
78 MemoryContext *allocMemoryContext(MemoryContext* parent, int flags);
79 void freeMemoryContext(MemoryContext* cntx);
80 void resetMemoryContext(MemoryContext* cntx);
81 void*   mcalloc(MemoryContext *cntx, size_t size);
82 void*   mc0alloc(MemoryContext *cntx, size_t size);
83 void*   mcrealloc(void * ptr, size_t size);
84 void    mcfree(void * ptr);
85 char * mcstrdup(MemoryContext *cntx, char * src);
86 char * mcnstrdup(MemoryContext *cntx, char *src, int len);
87
88 typedef void* (*MemAlloc)(void *ptr, size_t size);
89
90 typedef struct {
91     char            *buf;
92         char            *ptr;
93         u_int32_t       len;
94         MemoryContext   *mc;
95         MemAlloc                memalloc;
96 } StringBuffer;
97
98 StringBuffer* initStringBuffer(StringBuffer* state, int initsize);
99 StringBuffer* initStringBufferMC(StringBuffer* state, MemoryContext *mc, int initsize);
100 StringBuffer* initStringBufferMA(StringBuffer* state, MemAlloc memalloc, int initsize);
101 StringBuffer* appendStringBuffer( StringBuffer *state, char *string, int stringlen);
102 StringBuffer* printStringBuffer( StringBuffer *state, const char *format, ...);
103
104 #endif