Check for config.h (currently not generated).
[yaz-moved-to-github.git] / odr / odr_mem.c
1 /*
2  * Copyright (c) 1995-2000, Index Data
3  * See the file LICENSE for details.
4  *
5  * $Log: odr_mem.c,v $
6  * Revision 1.18  2000-02-29 13:44:55  adam
7  * Check for config.h (currently not generated).
8  *
9  * Revision 1.17  2000/01/31 13:15:21  adam
10  * Removed uses of assert(3). Cleanup of ODR. CCL parser update so
11  * that some characters are not surrounded by spaces in resulting term.
12  * ILL-code updates.
13  *
14  * Revision 1.16  1999/11/30 13:47:11  adam
15  * Improved installation. Moved header files to include/yaz.
16  *
17  * Revision 1.15  1999/03/31 11:18:25  adam
18  * Implemented odr_strdup. Added Reference ID to backend server API.
19  *
20  * Revision 1.14  1998/07/20 12:38:15  adam
21  * More LOG_DEBUG-diagnostics.
22  *
23  * Revision 1.13  1998/02/11 11:53:34  adam
24  * Changed code so that it compiles as C++.
25  *
26  * Revision 1.12  1995/11/08 17:41:33  quinn
27  * Smallish.
28  *
29  * Revision 1.11  1995/11/01  13:54:43  quinn
30  * Minor adjustments
31  *
32  * Revision 1.10  1995/10/25  16:58:19  quinn
33  * Stupid bug in odr_malloc
34  *
35  * Revision 1.9  1995/10/13  16:08:08  quinn
36  * Added OID utility
37  *
38  * Revision 1.8  1995/09/29  17:12:24  quinn
39  * Smallish
40  *
41  * Revision 1.7  1995/09/27  15:02:59  quinn
42  * Modified function heads & prototypes.
43  *
44  * Revision 1.6  1995/08/21  09:10:41  quinn
45  * Smallish fixes to suppport new formats.
46  *
47  * Revision 1.5  1995/05/16  08:50:55  quinn
48  * License, documentation, and memory fixes
49  *
50  * Revision 1.4  1995/05/15  11:56:09  quinn
51  * More work on memory management.
52  *
53  * Revision 1.3  1995/04/18  08:15:21  quinn
54  * Added dynamic memory allocation on encoding (whew). Code is now somewhat
55  * neater. We'll make the same change for decoding one day.
56  *
57  * Revision 1.2  1995/03/17  10:17:52  quinn
58  * Added memory management.
59  *
60  * Revision 1.1  1995/03/14  10:27:40  quinn
61  * Modified makefile to use common lib
62  * Beginning to add memory management to odr
63  *
64  */
65 #if HAVE_CONFIG_H
66 #include <config.h>
67 #endif
68
69 #include <stdlib.h>
70 #include <yaz/odr.h>
71 #include <yaz/xmalloc.h>
72
73 /* ------------------------ NIBBLE MEMORY ---------------------- */
74
75 /*
76  * Extract the memory control block from o.
77  */
78 NMEM odr_extract_mem(ODR o)
79 {
80     NMEM r = o->mem;
81
82     o->mem = 0;
83     return r;
84 }
85
86 void *odr_malloc(ODR o, int size)
87 {
88     if (o && !o->mem)
89         o->mem = nmem_create();
90     return nmem_malloc(o ? o->mem : 0, size);
91 }
92
93 char *odr_strdup(ODR o, const char *str)
94 {
95     return nmem_strdup(o->mem, str);
96 }
97
98 int odr_total(ODR o)
99 {
100     return o->mem ? nmem_total(o->mem) : 0;
101 }
102
103 /* ---------- memory management for data encoding ----------*/
104
105
106 int odr_grow_block(ODR b, int min_bytes)
107 {
108     int togrow;
109
110     if (!b->can_grow)
111         return -1;
112     if (!b->size)
113         togrow = 1024;
114     else
115         togrow = b->size;
116     if (togrow < min_bytes)
117         togrow = min_bytes;
118     if (b->size && !(b->buf =
119                      (unsigned char *) xrealloc(b->buf, b->size += togrow)))
120         abort();
121     else if (!b->size && !(b->buf = (unsigned char *)
122                            xmalloc(b->size = togrow)))
123         abort();
124 #ifdef ODR_DEBUG
125     fprintf(stderr, "New size for encode_buffer: %d\n", b->size);
126 #endif
127     return 0;
128 }
129
130 int odr_write(ODR o, unsigned char *buf, int bytes)
131 {
132     if (o->pos + bytes >= o->size && odr_grow_block(o, bytes))
133     {
134         o->error = OSPACE;
135         return -1;
136     }
137     memcpy(o->buf + o->pos, buf, bytes);
138     o->pos += bytes;
139     if (o->pos > o->top)
140         o->top = o->pos;
141     return 0;
142 }
143
144 int odr_seek(ODR o, int whence, int offset)
145 {
146     if (whence == ODR_S_CUR)
147         offset += o->pos;
148     else if (whence == ODR_S_END)
149         offset += o->top;
150     if (offset > o->size && odr_grow_block(o, offset - o->size))
151     {
152         o->error = OSPACE;
153         return -1;
154     }
155     o->pos = offset;
156     return 0;
157 }