~ubuntu-branches/debian/jessie/arb/jessie

« back to all changes in this revision

Viewing changes to ARBDB/adlmacros.h

  • Committer: Package Import Robot
  • Author(s): Elmar Pruesse, Andreas Tille, Elmar Pruesse
  • Date: 2014-09-02 15:15:06 UTC
  • mfrom: (1.1.6)
  • Revision ID: package-import@ubuntu.com-20140902151506-jihq58b3iz342wif
Tags: 6.0.2-1
[ Andreas Tille ]
* New upstream version
  Closes: #741890
* debian/upstream -> debian/upstream/metadata
* debian/control:
   - Build-Depends: added libglib2.0-dev
   - Depends: added mafft, mrbayes
* debian/rules
   - Add explicite --remove-section=.comment option to manual strip call
* cme fix dpkg-control
* arb-common.dirs: Do not create unneeded lintian dir
* Add turkish debconf translation (thanks for the patch to Mert Dirik
  <mertdirik@gmail.com>)
  Closes: #757497

[ Elmar Pruesse ]
* patches removed:
   - 10_config.makefiles.patch,
     80_no_GL.patch
       removed in favor of creating file from config.makefile.template via 
       sed in debian/control
   - 20_Makefile_main.patch
       merged upstream
   - 21_Makefiles.patch
       no longer needed
   - 30_tmpfile_CVE-2008-5378.patch: 
       merged upstream
   - 50_fix_gcc-4.8.patch:
       merged upstream
   - 40_add_libGLU.patch:
       libGLU not needed for arb_ntree)
   - 60_use_debian_packaged_raxml.patch:
       merged upstream
   - 70_hardening.patch
       merged upstream
   - 72_add_math_lib_to_linker.patch
       does not appear to be needed
* patches added:
   - 10_upstream_r12793__show_db_load_progress:
       backported patch showing progress while ARB is loading a database
       (needed as indicator/splash screen while ARB is launching)
   - 20_upstream_r12794__socket_permissions:
       backported security fix
   - 30_upstream_r12814__desktop_keywords:
       backported add keywords to desktop (fixes lintian warning)
   - 40_upstream_r12815__lintian_spelling:
       backported fix for lintian reported spelling errors
   - 50_private_nameservers
       change configuration to put nameservers into users home dirs
       (avoids need for shared writeable directory)
   - 60_use_debian_phyml
       use phyml from debian package for both interfaces in ARB
* debian/rules:
   - create config.makefile from override_dh_configure target
   - use "make tarfile" in override_dh_install
   - remove extra cleaning not needed for ARB 6
   - use "dh_install --list-missing" to avoid missing files
   - added override_dh_fixperms target
* debian/control:
   - added libarb-dev package
   - Depends: added phyml, xdg-utils
   - Suggests: removed phyml
   - fix lintian duplicate-short-description (new descriptions)
* debian/*.install:
   - "unrolled" confusing globbing to select files
   - pick files from debian/tmp
   - moved all config files to /etc/arb
* debian/arb-common.templates: updated
* scripts:
   - removed arb-add-pt-server
   - launch-wrapper: 
     - only add demo.arb to newly created $ARBUSERDATA
     - pass commandline arguments through bin/arb wrapper
   - preinst: removing old PT server index files on upgrade from 5.5*
   - postinst: set setgid on shared PT dir
* rewrote arb.1 manfile
* added file icon for ARB databases
* using upstream arb_tcp.dat

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -------------------- adlmacros.h -------------------- */
2
 
 
3
 
#define A_TO_I(c) if(c>'9') c-='A'-10; else c-='0';
4
 
 
5
 
 
6
 
#if defined(DIGITAL) || defined(DARWIN)
7
 
# define GB_MEMALIGN(a,b) malloc(b)
8
 
#else
9
 
# define GB_MEMALIGN(a,b) memalign(a,b)
10
 
#endif
11
 
 
12
 
#define GB_MIN(a,b) ( (a)>(b) ? (b):(a) )
13
 
#define GB_MAX(a,b) ( (a)<(b) ? (b):(a) )
14
 
 
15
 
/********************* SECURITY ******************/
16
 
 
17
 
# define GB_GET_SECURITY_READ(gb)   ((gb)->flags.security_read)
18
 
# define GB_GET_SECURITY_WRITE(gb)  ((gb)->flags.security_write)
19
 
# define GB_GET_SECURITY_DELETE(gb) ((gb)->flags.security_delete)
20
 
 
21
 
# define GB_PUT_SECURITY_READ(gb,i)   ((gb)->flags.security_read   = (i))
22
 
# define GB_PUT_SECURITY_WRITE(gb,i)  ((gb)->flags.security_write  = (i))
23
 
# define GB_PUT_SECURITY_DELETE(gb,i) ((gb)->flags.security_delete = (i))
24
 
 
25
 
/********************* RELATIVE ADRESSING **********/
26
 
 
27
 
#if (MEMORY_TEST==1)
28
 
 
29
 
# define GB_RESOLVE(typ,struct_add,member_name) ( (typ)(struct_add->member_name) )
30
 
# define GB_SETREL(struct_add,member_name,creator) ( struct_add)->member_name = creator
31
 
# define GB_ENTRIES_ENTRY(entries,idx)      (entries)[idx]
32
 
# define SET_GB_ENTRIES_ENTRY(entries,idx,ie)  entries[idx] = ie;
33
 
 
34
 
#else /* !(MEMORY_TEST==1) */
35
 
 
36
 
# define GB_RESOLVE(typ,struct_add,member_name)                                      \
37
 
                        ((typ) (((struct_add)->member_name)                          \
38
 
                        ? (typ) (((char*)(struct_add))+((struct_add)->member_name))  \
39
 
                        : NULL ))
40
 
 
41
 
# define GB_SETREL(struct_add,member_name,creator)                      \
42
 
do {                                                                    \
43
 
    char *pntr = (char *)(creator);                                     \
44
 
    if (pntr)                                                           \
45
 
    {                                                                   \
46
 
        (struct_add)->member_name = (char*)(pntr)-(char*)(struct_add);  \
47
 
    }                                                                   \
48
 
    else {                                                              \
49
 
        (struct_add)->member_name = 0;                                  \
50
 
    }                                                                   \
51
 
} while(0)
52
 
 
53
 
# define GB_ENTRIES_ENTRY(entries,idx)      ((struct gb_if_entries *) ((entries)[idx] ? ((char*)entries)+(entries[idx]) : NULL))
54
 
 
55
 
# define SET_GB_ENTRIES_ENTRY(entries,idx,ie)           \
56
 
do {                                                    \
57
 
    if (ie)  {                                          \
58
 
        (entries)[idx] = (char*)(ie)-(char*)(entries);  \
59
 
    }                                                   \
60
 
    else {                                              \
61
 
        (entries)[idx] = 0;                             \
62
 
    }                                                   \
63
 
} while(0)
64
 
 
65
 
#endif /* !(MEMORY_TEST==1) */
66
 
 
67
 
/*  Please keep care that all 'member_name's of the following macros have different names
68
 
    Otherwise there will be NO WARNINGS from the compiler
69
 
 
70
 
    The parameter types for the following macros are:
71
 
 
72
 
    hl  struct gb_header_list_struct *
73
 
    dl  struct gb_data_list
74
 
    ie  struct gb_if_entries *
75
 
    if  struct gb_index_files_struct *
76
 
    gbc GBCONTAINER *
77
 
    ex  struct gb_extern_data *
78
 
    gbd GBDATA* or GBCONTAINER*
79
 
*/
80
 
 
81
 
/* -------------------------------------------------------------------------------- */
82
 
 
83
 
#ifdef __cplusplus
84
 
 
85
 
inline GBDATA *                         GB_HEADER_LIST_GBD(struct gb_header_list_struct& hl)        { return GB_RESOLVE(struct gb_data_base_type *,(&(hl)),rel_hl_gbd); }
86
 
inline struct gb_header_list_struct *   GB_DATA_LIST_HEADER(struct gb_data_list& dl)                { return GB_RESOLVE(struct gb_header_list_struct *,(&(dl)),rel_header); }
87
 
inline struct gb_if_entries *           GB_IF_ENTRIES_NEXT(struct gb_if_entries *ie)                { return GB_RESOLVE(struct gb_if_entries *,ie,rel_ie_next); }
88
 
inline GBDATA *                         GB_IF_ENTRIES_GBD(struct gb_if_entries *ie)                 { return GB_RESOLVE(struct gb_data_base_type *,ie,rel_ie_gbd); }
89
 
inline struct gb_index_files_struct *   GB_INDEX_FILES_NEXT(struct gb_index_files_struct *ixf)      { return GB_RESOLVE(struct gb_index_files_struct *,ixf,rel_if_next); }
90
 
inline GB_REL_IFES *                    GB_INDEX_FILES_ENTRIES(struct gb_index_files_struct *ifs)   { return GB_RESOLVE(GB_REL_IFES *,ifs,rel_entries); }
91
 
inline struct gb_index_files_struct *   GBCONTAINER_IFS(GBCONTAINER *gbc)                           { return GB_RESOLVE(struct gb_index_files_struct *,gbc,rel_ifs); }
92
 
inline char *                           GB_EXTERN_DATA_DATA(struct gb_extern_data& ex)              { return GB_RESOLVE(char*,(&(ex)),rel_data); }
93
 
 
94
 
#else
95
 
 
96
 
#define GB_HEADER_LIST_GBD(hl)          GB_RESOLVE(struct gb_data_base_type *,(&(hl)),rel_hl_gbd)
97
 
#define GB_DATA_LIST_HEADER(dl)         GB_RESOLVE(struct gb_header_list_struct *,(&(dl)),rel_header)
98
 
#define GB_IF_ENTRIES_NEXT(ie)          GB_RESOLVE(struct gb_if_entries *,ie,rel_ie_next)
99
 
#define GB_IF_ENTRIES_GBD(ie)           GB_RESOLVE(struct gb_data_base_type *,ie,rel_ie_gbd)
100
 
#define GB_INDEX_FILES_NEXT(ixf)        GB_RESOLVE(struct gb_index_files_struct *,ixf,rel_if_next)
101
 
#define GB_INDEX_FILES_ENTRIES(if)      GB_RESOLVE(GB_REL_IFES *,if,rel_entries)
102
 
#define GBCONTAINER_IFS(gbc)            GB_RESOLVE(struct gb_index_files_struct *,gbc,rel_ifs)
103
 
#define GB_EXTERN_DATA_DATA(ex)         GB_RESOLVE(char*,(&(ex)),rel_data)
104
 
 
105
 
#endif
106
 
 
107
 
/* -------------------------------------------------------------------------------- */
108
 
 
109
 
#ifdef __cplusplus
110
 
 
111
 
inline void SET_GB_HEADER_LIST_GBD(struct gb_header_list_struct& hl, GBDATA *gbd)                               { GB_SETREL(&hl, rel_hl_gbd, gbd); }
112
 
inline void SET_GB_DATA_LIST_HEADER(struct gb_data_list& dl, struct gb_header_list_struct *head)                { GB_SETREL(&dl, rel_header, head); }
113
 
inline void SET_GB_IF_ENTRIES_NEXT(struct gb_if_entries *ie, struct gb_if_entries *next)                        { GB_SETREL(ie, rel_ie_next, next); }
114
 
inline void SET_GB_IF_ENTRIES_GBD(struct gb_if_entries *ie, GBDATA *gbd)                                        { GB_SETREL(ie, rel_ie_gbd, gbd); }
115
 
inline void SET_GB_INDEX_FILES_NEXT(struct gb_index_files_struct *ixf, struct gb_index_files_struct *next)      { GB_SETREL(ixf, rel_if_next, next); }
116
 
inline void SET_GB_INDEX_FILES_ENTRIES(struct gb_index_files_struct *ixf, struct gb_if_entries **entries)        { GB_SETREL(ixf, rel_entries, entries); }
117
 
inline void SET_GBCONTAINER_IFS(GBCONTAINER *gbc, struct gb_index_files_struct *ifs)                            { GB_SETREL(gbc, rel_ifs, ifs); }
118
 
inline void SET_GB_EXTERN_DATA_DATA(struct gb_extern_data& ex, char *data)                                      { GB_SETREL(&ex, rel_data, data); }
119
 
 
120
 
#else
121
 
 
122
 
# define SET_GB_HEADER_LIST_GBD(hl,gbd)             GB_SETREL((&(hl)),rel_hl_gbd,gbd)
123
 
# define SET_GB_DATA_LIST_HEADER(dl,head)           GB_SETREL((&(dl)),rel_header,head)
124
 
# define SET_GB_IF_ENTRIES_NEXT(ie,next)            GB_SETREL(ie,rel_ie_next,next)
125
 
# define SET_GB_IF_ENTRIES_GBD(ie,gbd)              GB_SETREL(ie,rel_ie_gbd,gbd)
126
 
# define SET_GB_INDEX_FILES_NEXT(if,next)           GB_SETREL(if,rel_if_next,next)
127
 
# define SET_GB_INDEX_FILES_ENTRIES(if,entries)     GB_SETREL(if,rel_entries,entries)
128
 
# define SET_GBCONTAINER_IFS(gbc,ifs)               GB_SETREL(gbc,rel_ifs,ifs)
129
 
# define SET_GB_EXTERN_DATA_DATA(ex,data)           GB_SETREL((&(ex)),rel_data,data)
130
 
 
131
 
#endif
132
 
 
133
 
/* -------------------------------------------------------------------------------- */
134
 
 
135
 
#define HAS_FATHER(gbd) ((gbd)->rel_father != NULL)
136
 
 
137
 
#ifdef __cplusplus
138
 
 
139
 
inline GBCONTAINER* GB_FATHER(GBDATA *gbd)                                  { return GB_RESOLVE(struct gb_data_base_type2 *,gbd,rel_father); }
140
 
inline GBCONTAINER* GB_FATHER(GBCONTAINER *gbc)                             { return GB_RESOLVE(struct gb_data_base_type2 *,gbc,rel_father); }
141
 
inline void SET_GB_FATHER(GBDATA *gbd, GBCONTAINER *father)                 { GB_SETREL(gbd, rel_father, father); }
142
 
inline void SET_GB_FATHER(GBCONTAINER *gbc, GBCONTAINER *father)            { GB_SETREL(gbc, rel_father, father); }
143
 
 
144
 
inline GBCONTAINER* GB_GRANDPA(GBDATA *gbd)                                 { return GB_FATHER(GB_FATHER(gbd)); }
145
 
 
146
 
inline GBDATA *EXISTING_GBCONTAINER_ELEM(GBCONTAINER *gbc,int idx)          { return GB_HEADER_LIST_GBD(GB_DATA_LIST_HEADER((gbc)->d)[idx]); }
147
 
inline GBDATA *GBCONTAINER_ELEM(GBCONTAINER *gbc,int idx)                   { if (idx<gbc->d.nheader) return EXISTING_GBCONTAINER_ELEM(gbc, idx); return (GBDATA*)0; }
148
 
inline void SET_GBCONTAINER_ELEM(GBCONTAINER *gbc, int idx, GBDATA *gbd)    { SET_GB_HEADER_LIST_GBD(GB_DATA_LIST_HEADER(gbc->d)[idx], gbd); }
149
 
 
150
 
// inline GB_MAIN_TYPE *GBCONTAINER_MAIN(GBCONTAINER *gbc)                     { return gb_main_array[(gbc->main_idx) % GB_MAIN_ARRAY_SIZE]; }
151
 
inline GB_MAIN_TYPE *GBCONTAINER_MAIN(GBCONTAINER *gbc)                     { return gb_main_array[gbc->main_idx]; }
152
 
inline GB_MAIN_TYPE *GB_MAIN(GBDATA *gbd)                                   { return GBCONTAINER_MAIN(GB_FATHER(gbd)); }
153
 
inline GB_MAIN_TYPE *GB_MAIN(GBCONTAINER *gbc)                              { return GBCONTAINER_MAIN(gbc); }
154
 
 
155
 
#else
156
 
 
157
 
# define GB_FATHER(gbd)                     GB_RESOLVE(struct gb_data_base_type2 *,gbd,rel_father)
158
 
# define SET_GB_FATHER(gbd,father)          GB_SETREL(gbd,rel_father,father)
159
 
 
160
 
# define GB_GRANDPA(gbd)                    GB_FATHER(GB_FATHER(gbd))
161
 
 
162
 
# define EXISTING_GBCONTAINER_ELEM(gbc,idx) (GB_HEADER_LIST_GBD(GB_DATA_LIST_HEADER((gbc)->d)[idx]))
163
 
# define GBCONTAINER_ELEM(gbc,idx)          ((struct gb_data_base_type *)((idx)<(gbc)->d.nheader ? EXISTING_GBCONTAINER_ELEM(gbc, idx) : NULL))
164
 
# define SET_GBCONTAINER_ELEM(gbc,idx,gbd)  SET_GB_HEADER_LIST_GBD(GB_DATA_LIST_HEADER((gbc)->d)[idx],gbd)
165
 
 
166
 
// # define GBCONTAINER_MAIN(gbc)              gb_main_array[((gbc)->main_idx) % GB_MAIN_ARRAY_SIZE]
167
 
# define GBCONTAINER_MAIN(gbc)              gb_main_array[(gbc)->main_idx]
168
 
# define GB_MAIN(gbd)                       GBCONTAINER_MAIN(GB_FATHER(gbd))
169
 
 
170
 
#endif
171
 
 
172
 
/********************* SOME FLAGS ******************/
173
 
 
174
 
#ifdef __cplusplus
175
 
 
176
 
inline int GB_KEY_QUARK(GBDATA *gbd)                        { return GB_DATA_LIST_HEADER(GB_FATHER(gbd)->d)[gbd->index].flags.key_quark; }
177
 
inline char *GB_KEY(GBDATA *gbd)                            { return GB_MAIN(gbd)->keys[GB_KEY_QUARK(gbd)].key; }
178
 
inline GB_TYPES GB_TYPE(GBDATA *gbd)                        { return GB_TYPES(gbd->flags.type); }
179
 
inline GB_TYPES GB_TYPE(GBCONTAINER *gbd)                   { return GB_TYPES(gbd->flags.type); }
180
 
inline GB_TYPES GB_TYPE_TS(struct gb_transaction_save *ts)  { return GB_TYPES(ts->flags.type); }
181
 
 
182
 
inline gb_header_flags& GB_ARRAY_FLAGS(GBDATA *gbd)         { return GB_DATA_LIST_HEADER(GB_FATHER(gbd)->d)[gbd->index].flags; }
183
 
inline gb_header_flags& GB_ARRAY_FLAGS(GBCONTAINER *gbc)    { return GB_DATA_LIST_HEADER(GB_FATHER(gbc)->d)[gbc->index].flags; }
184
 
 
185
 
#else
186
 
 
187
 
#define GB_KEY_QUARK(gbd) (GB_DATA_LIST_HEADER(GB_FATHER(gbd)->d)[(gbd)->index].flags.key_quark)
188
 
#define GB_KEY(gbd)       (GB_MAIN(gbd)->keys[GB_KEY_QUARK(gbd)].key)
189
 
#define GB_TYPE(gbd)      ((GB_TYPES)(gbd)->flags.type) // return type was 'int', changed 11.Mai.07 hopefully w/o harm --ralf
190
 
#define GB_TYPE_TS(ts)    ((GB_TYPES)(ts)->flags.type)
191
 
 
192
 
#define GB_ARRAY_FLAGS(gbd)         (GB_DATA_LIST_HEADER(GB_FATHER(gbd)->d)[(gbd)->index].flags)
193
 
 
194
 
#endif
195
 
 
196
 
/********************* INDEX ******************/
197
 
 
198
 
# define GB_GBM_INDEX(gbd) ((gbd)->flags2.gbm_index)
199
 
 
200
 
#ifdef __cplusplus
201
 
 
202
 
inline long GB_QUARK_2_GBMINDEX(GB_MAIN_TYPE *Main, int key_quark)  { return (Main->keys[key_quark].nref<GBM_MAX_UNINDEXED_ENTRIES) ? 0 : key_quark; }
203
 
inline long GB_GBD_2_GBMINDEX(GBDATA *gbd)                          { return GB_QUARK_2_GBMINDEX(GB_MAIN(gbd), GB_KEY_QUARK(gbd)); }
204
 
 
205
 
#else
206
 
 
207
 
# define GB_QUARK_2_GBMINDEX(Main,key_quark)        (((Main)->keys[key_quark].nref<GBM_MAX_UNINDEXED_ENTRIES) ? 0 : (key_quark))
208
 
# define GB_GBD_2_GBMINDEX(gbd)                     GB_QUARK_2_GBMINDEX(GB_MAIN(gbd), GB_KEY_QUARK(gbd))
209
 
 
210
 
#endif
211
 
 
212
 
/********************* READ and WRITE ******************/
213
 
 
214
 
#ifdef __cplusplus
215
 
 
216
 
inline GB_BOOL GB_COMPRESSION_ENABLED(GBDATA *gbd, long size) { return (!GB_MAIN(gbd)->compression_mask) && size>=GBTUM_SHORT_STRING_SIZE; }
217
 
 
218
 
inline void GB_TEST_TRANSACTION(GBDATA *gbd) {
219
 
    if (!GB_MAIN(gbd)->transaction) {
220
 
        GBK_terminate("No running transaction");
221
 
    }
222
 
}
223
 
 
224
 
#else
225
 
 
226
 
#define GB_COMPRESSION_ENABLED(gbd,size) ((!GB_MAIN(gbd)->compression_mask) && (size)>=GBTUM_SHORT_STRING_SIZE)
227
 
 
228
 
#define GB_TEST_TRANSACTION(gbd)                        \
229
 
    do {                                                \
230
 
        if (!GB_MAIN(gbd)->transaction) {               \
231
 
            GBK_terminate("No running transaction");    \
232
 
        }                                               \
233
 
    } while(0)
234
 
 
235
 
#endif // __cplusplus
236
 
 
237
 
#define GB_TEST_READ(gbd,ty,error)                                      \
238
 
    do {                                                                \
239
 
        GB_TEST_TRANSACTION(gbd);                                       \
240
 
        if (GB_ARRAY_FLAGS(gbd).changed == gb_deleted) {                \
241
 
            GB_internal_errorf("%s: %s",error,"Entry is deleted !!");   \
242
 
            return 0;}                                                  \
243
 
        if ( GB_TYPE(gbd) != ty && (ty != GB_STRING || GB_TYPE(gbd) == GB_LINK)) { \
244
 
            GB_internal_errorf("%s: %s",error,"wrong type");            \
245
 
            return 0;}                                                  \
246
 
    } while(0)
247
 
 
248
 
#define GB_TEST_WRITE(gbd,ty,gerror)                                    \
249
 
    do {                                                                \
250
 
        GB_TEST_TRANSACTION(gbd);                                       \
251
 
        if ( GB_ARRAY_FLAGS(gbd).changed == gb_deleted) {               \
252
 
            GB_internal_errorf("%s: %s",gerror,"Entry is deleted !!");  \
253
 
            return 0;}                                                  \
254
 
        if ( GB_TYPE(gbd) != ty && (ty != GB_STRING || GB_TYPE(gbd) != GB_LINK)) { \
255
 
            GB_internal_errorf("%s: %s",gerror,"type conflict !!");     \
256
 
            return 0;}                                                  \
257
 
        if (GB_GET_SECURITY_WRITE(gbd)>GB_MAIN(gbd)->security_level)    \
258
 
            return gb_security_error(gbd);                              \
259
 
    } while(0)
260
 
 
261
 
#define GB_TEST_NON_BUFFER(x,gerror)                                    \
262
 
    do {                                                                \
263
 
        if (GB_is_in_buffer(x)) {                                       \
264
 
            GBK_terminatef("%s: you are not allowed to write any data, which you get by pntr", gerror); \
265
 
        }                                                               \
266
 
    } while(0)
267
 
 
268
 
/********************* INDEX CHECK  ******************/
269
 
 
270
 
#ifdef __cplusplus
271
 
 
272
 
inline void GB_INDEX_CHECK_IN(GBDATA *gbd) { if (gbd->flags2.tisa_index) gb_index_check_in(gbd); }
273
 
inline void GB_INDEX_CHECK_OUT(GBDATA *gbd) { if ((gbd)->flags2.is_indexed) gb_index_check_out(gbd); }
274
 
 
275
 
#else
276
 
 
277
 
#define GB_INDEX_CHECK_IN(gbd)  do { if ((gbd)->flags2.tisa_index) gb_index_check_in(gbd); } while(0)
278
 
#define GB_INDEX_CHECK_OUT(gbd) do { if ((gbd)->flags2.is_indexed) gb_index_check_out(gbd); } while(0)
279
 
 
280
 
#endif // __cplusplus
281
 
 
282
 
/********************* EXTENDED DATA ******************/
283
 
 
284
 
#ifdef __cplusplus
285
 
 
286
 
inline struct gb_callback *GB_GET_EXT_CALLBACKS(GBDATA *gbd) { return gbd->ext ? gbd->ext->callback : 0; }
287
 
inline long GB_GET_EXT_CREATION_DATE(GBDATA *gbd) { return gbd->ext ? gbd->ext->creation_date : 0; }
288
 
inline long GB_GET_EXT_UPDATE_DATE(GBDATA *gbd) { return gbd->ext ? gbd->ext->update_date : 0; }
289
 
inline struct gb_transaction_save *GB_GET_EXT_OLD_DATA(GBDATA *gbd) { return gbd->ext ? gbd->ext->old : 0; }
290
 
 
291
 
inline struct gb_cache_struct& GB_GET_CACHE(GB_MAIN_TYPE *gbmain) { return gbmain->cache; }
292
 
inline void GB_SET_CACHE(GB_MAIN_TYPE *gbmain, struct gb_cache_struct& val) { gbmain->cache = val; }
293
 
 
294
 
inline void GB_CREATE_EXT(GBDATA *gbd) { if (!gbd->ext) gb_create_extended(gbd); }
295
 
inline void _GB_DELETE_EXT(GBDATA *gbd, long gbm_index) {
296
 
    if (gbd->ext) {
297
 
        gbm_free_mem((char *) gbd->ext, sizeof(struct gb_db_extended), gbm_index);
298
 
        gbd->ext = 0;
299
 
    }
300
 
}
301
 
 
302
 
#else
303
 
 
304
 
#define GB_GET_EXT_CALLBACKS(gbd)   (((gbd)->ext)?(gbd)->ext->callback:0)
305
 
#define GB_GET_EXT_CREATION_DATE(gbd)   (((gbd)->ext)?(gbd)->ext->creation_date:0)
306
 
#define GB_GET_EXT_UPDATE_DATE(gbd)     (((gbd)->ext)?(gbd)->ext->update_date:0)
307
 
#define GB_GET_EXT_OLD_DATA(gbd)    (((gbd)->ext)?(gbd)->ext->old:0)
308
 
#define GB_GET_CACHE(gbd)       ((gbd)->cache)
309
 
#define GB_SET_CACHE(gbd,val)       do { (gbd)->cache = (val); } while(0)
310
 
 
311
 
 
312
 
#define GB_CREATE_EXT(gbd)  do { if (!(gbd)->ext) gb_create_extended(gbd); } while(0)
313
 
 
314
 
#define _GB_DELETE_EXT(gbd, gbm_index)                                                  \
315
 
do {                                                                                    \
316
 
    if ((gbd)->ext) {                                                                   \
317
 
        gbm_free_mem((char *) (gbd)->ext, sizeof(struct gb_db_extended), gbm_index);    \
318
 
        (gbd)->ext = 0;                                                                 \
319
 
    }                                                                                   \
320
 
} while(0)
321
 
 
322
 
#endif
323
 
 
324
 
/********************* DATA ACCESS  ******************/
325
 
 
326
 
#ifdef __cplusplus
327
 
 
328
 
inline long GB_GETSIZE(const GBDATA *gbd)       { return gbd->flags2.extern_data ? gbd->info.ex.size     : gbd->info.istr.size; }
329
 
inline long GB_GETMEMSIZE(const GBDATA *gbd)    { return gbd->flags2.extern_data ? gbd->info.ex.memsize  : gbd->info.istr.memsize; }
330
 
inline char *GB_GETDATA(GBDATA *gbd)            { return gbd->flags2.extern_data ? GB_EXTERN_DATA_DATA(gbd->info.ex)  : &((gbd)->info.istr.data[0]); }
331
 
 
332
 
inline long GB_GETSIZE_TS(struct gb_transaction_save *ts)       { return ts->flags2.extern_data ? ts->info.ex.size     : ts->info.istr.size; }
333
 
inline long GB_GETMEMSIZE_TS(struct gb_transaction_save *ts)    { return ts->flags2.extern_data ? ts->info.ex.memsize  : ts->info.istr.memsize; }
334
 
inline char *GB_GETDATA_TS(struct gb_transaction_save *ts)      { return ts->flags2.extern_data ? ts->info.ex.data     : &(ts->info.istr.data[0]); }
335
 
 
336
 
#else
337
 
 
338
 
#define GB_GETSIZE(gbd)     (((gbd)->flags2.extern_data)    ? (gbd)->info.ex.size  : (gbd)->info.istr.size)
339
 
#define GB_GETMEMSIZE(gbd)  (((gbd)->flags2.extern_data)    ? (gbd)->info.ex.memsize  : (gbd)->info.istr.memsize)
340
 
#define GB_GETDATA(gbd)     (((gbd)->flags2.extern_data)    ? GB_EXTERN_DATA_DATA((gbd)->info.ex)  : &((gbd)->info.istr.data[0]))
341
 
 
342
 
#define GB_GETSIZE_TS(ts)       GB_GETSIZE(ts)
343
 
#define GB_GETMEMSIZE_TS(ts)    GB_GETMEMSIZE(ts)
344
 
#define GB_GETDATA_TS(ts)   (((ts)->flags2.extern_data) ? ts->info.ex.data : & ((ts)->info.istr.data[0]))
345
 
 
346
 
#endif
347
 
 
348
 
/********************* DATA MODIFY  ******************/
349
 
 
350
 
#ifdef __cplusplus
351
 
 
352
 
inline void GB_FREE_TRANSACTION_SAVE(GBDATA *gbd) {
353
 
    if (gbd->ext && gbd->ext->old) {
354
 
        gb_del_ref_gb_transaction_save(gbd->ext->old);
355
 
        gbd->ext->old = NULL;
356
 
    }
357
 
}
358
 
 
359
 
/* frees local data */
360
 
inline void GB_FREEDATA(GBDATA *gbd) {
361
 
    GB_INDEX_CHECK_OUT(gbd);
362
 
    if (gbd->flags2.extern_data && GB_EXTERN_DATA_DATA(gbd->info.ex)) {
363
 
        gbm_free_mem(GB_EXTERN_DATA_DATA(gbd->info.ex), (size_t)(gbd->info.ex.memsize), GB_GBM_INDEX(gbd));
364
 
        SET_GB_EXTERN_DATA_DATA(gbd->info.ex,0);
365
 
    }
366
 
}
367
 
 
368
 
#else
369
 
 
370
 
#define GB_FREE_TRANSACTION_SAVE(gbd)                       \
371
 
do {                                                        \
372
 
    if ((gbd)->ext && (gbd)->ext->old) {                    \
373
 
        gb_del_ref_gb_transaction_save((gbd)->ext->old);    \
374
 
        (gbd)->ext->old = NULL;                             \
375
 
    }                                                       \
376
 
} while(0)
377
 
 
378
 
/* frees local data */
379
 
#define GB_FREEDATA(gbd)                                                                                        \
380
 
do {                                                                                                            \
381
 
    GB_INDEX_CHECK_OUT(gbd);                                                                                    \
382
 
    if ((gbd)->flags2.extern_data && GB_EXTERN_DATA_DATA((gbd)->info.ex)) {                                     \
383
 
        gbm_free_mem(GB_EXTERN_DATA_DATA((gbd)->info.ex), (size_t)((gbd)->info.ex.memsize), GB_GBM_INDEX(gbd)); \
384
 
        SET_GB_EXTERN_DATA_DATA((gbd)->info.ex,0);                                                              \
385
 
    }                                                                                                           \
386
 
} while(0)
387
 
 
388
 
#endif
389
 
 
390
 
#ifdef __cplusplus
391
 
 
392
 
inline GB_BOOL GB_CHECKINTERN(int size, int memsize) { return size<256 && memsize<SIZOFINTERN; }
393
 
inline void GB_SETINTERN(GBDATA *gbd) { gbd->flags2.extern_data = 0; }
394
 
inline void GB_SETEXTERN(GBDATA *gbd) { gbd->flags2.extern_data = 1; }
395
 
 
396
 
#else
397
 
 
398
 
#define GB_CHECKINTERN(size,memsize)    (((int)(size) < 256) && ((int)(memsize) < SIZOFINTERN))
399
 
#define GB_SETINTERN(gbd)       (gbd)->flags2.extern_data = 0
400
 
#define GB_SETEXTERN(gbd)       (gbd)->flags2.extern_data = 1
401
 
 
402
 
#endif
403
 
 
404
 
    /** insert external data into any db. field
405
 
        Warning: this function has a lot of side effects:
406
 
        1. extern_data must be set by the user before calling this
407
 
        2. if !extern_data the data is not set
408
 
        -> better use GB_SETSMDMALLOC
409
 
    */
410
 
 
411
 
#ifdef __cplusplus
412
 
 
413
 
inline void GB_SETSMD(GBDATA *gbd, long siz, long memsiz, char *dat) {
414
 
    if (gbd->flags2.extern_data) {
415
 
        gbd->info.ex.size = siz;
416
 
        gbd->info.ex.memsize = memsiz;
417
 
        SET_GB_EXTERN_DATA_DATA(gbd->info.ex,dat);
418
 
    }else{
419
 
        gbd->info.istr.size = (unsigned char)siz;
420
 
        gbd->info.istr.memsize = (unsigned char)memsiz;
421
 
    }
422
 
    GB_INDEX_CHECK_IN(gbd);
423
 
}
424
 
 
425
 
inline void GB_SETSMDMALLOC(GBDATA *gbd, long siz, long memsiz, char *dat) {
426
 
    gb_assert(dat);
427
 
    if (GB_CHECKINTERN(siz,memsiz)) {
428
 
        GB_SETINTERN(gbd);
429
 
        gbd->info.istr.size = (unsigned char)siz;
430
 
        gbd->info.istr.memsize = (unsigned char)memsiz;
431
 
        if (dat) memcpy(&(gbd->info.istr.data[0]), (char *)dat, (size_t)(memsiz));
432
 
    }else{
433
 
        char *exData;
434
 
        GB_SETEXTERN(gbd);
435
 
        gbd->info.ex.size = siz;
436
 
        gbd->info.ex.memsize = memsiz;
437
 
        exData = gbm_get_mem((size_t)memsiz,GB_GBM_INDEX(gbd));
438
 
        SET_GB_EXTERN_DATA_DATA(gbd->info.ex,exData);
439
 
        if (dat) memcpy(exData, (char *)dat, (size_t)(memsiz));
440
 
    }
441
 
    GB_INDEX_CHECK_IN(gbd);
442
 
}
443
 
 
444
 
inline void GB_SETSMDMALLOC_UNINITIALIZED(GBDATA *gbd, long siz, long memsiz) {
445
 
    if (GB_CHECKINTERN(siz,memsiz)) {
446
 
        GB_SETINTERN(gbd);
447
 
        gbd->info.istr.size = (unsigned char)siz;
448
 
        gbd->info.istr.memsize = (unsigned char)memsiz;
449
 
    }else{
450
 
        char *exData;
451
 
        GB_SETEXTERN(gbd);
452
 
        gbd->info.ex.size = siz;
453
 
        gbd->info.ex.memsize = memsiz;
454
 
        exData = gbm_get_mem((size_t)memsiz,GB_GBM_INDEX(gbd));
455
 
        SET_GB_EXTERN_DATA_DATA(gbd->info.ex,exData);
456
 
    }
457
 
    GB_INDEX_CHECK_IN(gbd);
458
 
}
459
 
 
460
 
#else
461
 
 
462
 
#define GB_SETSMD(gbd,siz,memsiz,dat)                       \
463
 
do {                                                        \
464
 
    if ((gbd)->flags2.extern_data) {                        \
465
 
        (gbd)->info.ex.size = (siz);                        \
466
 
        (gbd)->info.ex.memsize = (memsiz);                  \
467
 
        SET_GB_EXTERN_DATA_DATA((gbd)->info.ex,(dat));      \
468
 
    }else{                                                  \
469
 
        (gbd)->info.istr.size = (unsigned char)(siz);       \
470
 
        (gbd)->info.istr.memsize = (unsigned char)(memsiz); \
471
 
    }                                                       \
472
 
    GB_INDEX_CHECK_IN(gbd);                                 \
473
 
} while(0)
474
 
 
475
 
/** copies any data into any db field */
476
 
#define GB_SETSMDMALLOC(gbd,siz,memsiz,dat)                                                 \
477
 
do {                                                                                        \
478
 
    gb_assert(dat);                                                                         \
479
 
    if (GB_CHECKINTERN(siz,memsiz)) {                                                       \
480
 
        GB_SETINTERN(gbd);                                                                  \
481
 
        (gbd)->info.istr.size = (unsigned char)(siz);                                       \
482
 
        (gbd)->info.istr.memsize = (unsigned char)(memsiz);                                 \
483
 
        if (dat) memcpy(&((gbd)->info.istr.data[0]), (char *)(dat), (size_t)(memsiz));      \
484
 
    }else{                                                                                  \
485
 
        char *exData;                                                                       \
486
 
        GB_SETEXTERN(gbd);                                                                  \
487
 
        (gbd)->info.ex.size = (siz);                                                        \
488
 
        (gbd)->info.ex.memsize = (memsiz);                                                  \
489
 
        exData = gbm_get_mem((size_t)(memsiz),GB_GBM_INDEX(gbd));                           \
490
 
        SET_GB_EXTERN_DATA_DATA((gbd)->info.ex,exData);                                     \
491
 
        if (dat) memcpy(exData, (char *)(dat), (size_t)(memsiz));                           \
492
 
    }                                                                                       \
493
 
    GB_INDEX_CHECK_IN(gbd);                                                                 \
494
 
}while(0)
495
 
 
496
 
/** allocate data  */
497
 
#define GB_SETSMDMALLOC_UNINITIALIZED(gbd,siz,memsiz)                                       \
498
 
do {                                                                                        \
499
 
    if (GB_CHECKINTERN(siz,memsiz)) {                                                       \
500
 
        GB_SETINTERN(gbd);                                                                  \
501
 
        (gbd)->info.istr.size = (unsigned char)(siz);                                       \
502
 
        (gbd)->info.istr.memsize = (unsigned char)(memsiz);                                 \
503
 
    }else{                                                                                  \
504
 
        char *exData;                                                                       \
505
 
        GB_SETEXTERN(gbd);                                                                  \
506
 
        (gbd)->info.ex.size = (siz);                                                        \
507
 
        (gbd)->info.ex.memsize = (memsiz);                                                  \
508
 
        exData = gbm_get_mem((size_t)(memsiz),GB_GBM_INDEX(gbd));                           \
509
 
        SET_GB_EXTERN_DATA_DATA((gbd)->info.ex,exData);                                     \
510
 
    }                                                                                       \
511
 
    GB_INDEX_CHECK_IN(gbd);                                                                 \
512
 
}while(0)
513
 
 
514
 
 
515
 
 
516
 
#endif
517
 
 
518
 
/********************* UNDO  ******************/
519
 
/** copy all info + external data mem
520
 
    to an one step undo buffer (to abort a transaction */
521
 
 
522
 
#ifdef __cplusplus
523
 
 
524
 
inline void _GB_CHECK_IN_UNDO_DELETE(GB_MAIN_TYPE *Main, GBDATA *gbd) {
525
 
    if (Main->undo_type) gb_check_in_undo_delete(Main,gbd,0);
526
 
    else gb_delete_entry(gbd);
527
 
}
528
 
inline void _GB_CHECK_IN_UNDO_CREATE(GB_MAIN_TYPE *Main, GBDATA *gbd) {
529
 
    if (Main->undo_type) gb_check_in_undo_create(Main,gbd);
530
 
}
531
 
inline void _GB_CHECK_IN_UNDO_MODIFY(GB_MAIN_TYPE *Main, GBDATA *gbd) {
532
 
    if (Main->undo_type) gb_check_in_undo_modify(Main,gbd);
533
 
}
534
 
inline void STATIC_BUFFER(char*& strvar, int minlen) {
535
 
    ad_assert(minlen > 0); 
536
 
    if (strvar && (strlen(strvar) < (size_t)(minlen-1))) { freeset(strvar, NULL); }
537
 
    if (!strvar) strvar=(char*)GB_calloc(minlen,1);
538
 
}
539
 
 
540
 
#else
541
 
 
542
 
#define _GB_CHECK_IN_UNDO_DELETE(Main,gbd)                      \
543
 
do {                                                            \
544
 
    if ((Main)->undo_type) gb_check_in_undo_delete(Main,gbd,0); \
545
 
    else gb_delete_entry(&(gbd));                               \
546
 
} while(0)
547
 
 
548
 
#define _GB_CHECK_IN_UNDO_CREATE(Main,gbd)                      \
549
 
do {                                                            \
550
 
    if ((Main)->undo_type) gb_check_in_undo_create(Main,gbd);   \
551
 
} while(0)
552
 
 
553
 
#define _GB_CHECK_IN_UNDO_MODIFY(Main,gbd)                      \
554
 
do {                                                            \
555
 
    if ((Main)->undo_type) gb_check_in_undo_modify(Main,gbd);   \
556
 
} while(0)
557
 
 
558
 
#define STATIC_BUFFER(strvar,static_buffer_minlen)                      \
559
 
do {                                                                    \
560
 
    ad_assert(static_buffer_minlen > 0);                                \
561
 
    size_t static_buffer_len = (static_buffer_minlen);                  \
562
 
    if ((strvar) && (strlen(strvar) < (static_buffer_len-1))) {         \
563
 
        freeset(strvar, NULL);                                          \
564
 
    }                                                                   \
565
 
    if (!(strvar)) (strvar)=(char*)GB_calloc(static_buffer_len,1);      \
566
 
} while(0)
567
 
 
568
 
#endif