16 #define ADMAP_BYTE_ORDER 0x01020304
17 #define GB_MAX_MAPPED_FILES 10
22 # define ALIGN_BITS 2 // if ALIGN_BITS == 3 we get problems when writing pointer-arrays
25 #define ALIGN(size) (((((size)-1)>>ALIGN_BITS)+1)<<ALIGN_BITS)
26 #define PTR_DIFF(p1, p2) ((char*)(p1)-(char*)(p2))
44 return offset ? offset-rel_to : 0;
50 #define cmp(h1, h2) ((long)(h1).gbd - (long)(h2).gbd)
52 #define swap(h1, h2) \
54 gbdata_offset xxx = (h1); \
67 if (
cmp(heap[idx2], heap[idx])>0) {
69 cmp(heap[idx2], heap[idx21])<0)
71 swap(heap[idx], heap[idx21]);
75 swap(heap[idx], heap[idx2]);
79 else if (idx21 <= num &&
80 cmp(heap[idx], heap[idx21])<0)
82 swap(heap[idx], heap[idx21]);
97 for (i=num/2; i>=1; i--)
110 for (i=1; i<onum; i++) {
119 h=gb_gbk[quark].
cnt-1,
129 cmpres = (
long)gbd - (
long)gbdo[m].
gbd;
136 if (cmpres < 0) h = m;
141 printf(
"not found(1): gbd=%lx\n", (
long)gbd);
153 h=gb_gbk[quark].
cnt-1,
163 cmpres = (
long)gbd - (
long)gbdo[m].
gbd;
171 if (cmpres < 0) h = m;
176 printf(
"not found(2): gbd=%lx\n", (
long)gbd);
194 if (!
writeError && fwrite((
const char *)ptr, 1, ali_siz, fil) != ali_siz) {
206 size_t ali_siz =
ALIGN(unali_siz);
207 size_t pad_bytes = ali_siz-unali_siz;
209 if (fwrite((
const char*)(ptr), 1, unali_siz, fil) == unali_siz) {
210 if (pad_bytes == 0 || fwrite(alignment_bytes, 1, pad_bytes, fil) == pad_bytes) {
220 long ieoffset = ie ? *offset : 0;
233 copy_size =
ALIGN(
sizeof(copy));
236 *offset += copy_size;
264 memcpy(iecopy, ie, iesize);
297 else ifscopy_size =
ALIGN(
sizeof(ifscopy));
299 *offset += ifscopy_size;
352 memset(headercopy, 0x0, headermemsize);
354 for (
int item = 0; item<nitems; item++) {
360 hs_offset = headeroffset +
PTR_DIFF(&(headercopy[valid]), &(headercopy[0]));
371 gb_assert(headercopy[valid].rel_hl_gbd != 0);
379 headermemsize =
ALIGN(valid *
sizeof(*header));
386 for (
int item = 0; item<nitems; item++) {
394 gb_assert((
size_t)headermemsize >= valid *
sizeof(*header));
395 headermemsize =
ALIGN(valid *
sizeof(*header));
403 *offset += headermemsize;
436 gbccopy_size =
ALIGN(
sizeof(gbccopy));
438 *offset += gbccopy_size;
448 memset(&gbecopy, 0,
sizeof(gbecopy));
483 gbecopy_size =
ALIGN(
sizeof(gbecopy));
485 *offset += gbecopy_size;
497 for (idx=0; idx<Main->
keycnt; idx++) {
498 for (idx2=0; idx2<gbk[idx].
cnt; idx2++) {
500 gb_assert(gboffset == gbk[idx].gbdoff[idx2].offset);
512 for (idx=0; idx<Main->
keycnt; idx++) {
513 for (idx2=0; idx2<gbk[idx].
cnt; idx2++) {
531 for (
int idx=0; idx < gbc->
d.
nheader; idx++) {
541 printf(
"KeyQuark==0 found:\n");
556 for (idx=0; idx<Main->
keycnt; idx++) {
569 for (idx=0; idx<Main->
keycnt; idx++)
579 for (idx=0; idx<Main->
keycnt; idx++) free(gbk[idx].gbdoff);
591 FILE *out = fopen(path,
"w");
601 memset(&mheader, 0,
sizeof(mheader));
634 if (out && fclose(out) != 0)
writeError =
true;
645 #if (MEMORY_TEST == 1)
660 #if ( MEMORY_TEST == 1)
662 UNUSED_IN_MEMTEST(path);
663 UNUSED_IN_MEMTEST(mheader);
664 UNUSED_IN_MEMTEST(verbose);
667 FILE *in = fopen(path,
"r");
671 if (verbose) printf(
"ARB: Opening FastLoad File '%s' ...\n", path);
672 if (fread((
char *)mheader,
sizeof(*mheader), 1, in) != 1) {
678 const char *error_form =
NULp;
680 if (strcmp(mheader->
mapfileID,
ADMAP_ID)!=0) error_form =
"'%s' is not a ARB-FastLoad-File";
728 while (file<mappedFiles) {
729 if (mem>=fileMappedTo[file] &&
730 mem<(fileMappedTo[file]+
fileLen[file]))
return 1;
void GB_dump_db_path(GBDATA *gbd)
static void freeGbdByKey(GB_MAIN_TYPE *Main, gbdByKey *gbk)
static void ftwrite_aligned(const void *ptr, size_t ali_siz, FILE *fil)
static char * fileMappedTo[GB_MAX_MAPPED_FILES]
gb_data_base_type_union info
void GB_unlink_or_warn(const char *path, GB_ERROR *error)
unsigned int folded_container
static void convertFlags4Save(gb_flag_types *flags, gb_flag_types2 *flags2, gb_flag_types3 *)
bool GB_supports_mapfile()
static long calcGbdOffsets(GB_MAIN_TYPE *Main, gbdByKey *gbk)
GB_ERROR GB_IO_error(const char *action, const char *filename)
const char * GBS_global_string(const char *templat,...)
GB_REL_CONTAINER rel_father
CONSTEXPR_INLINE gb_header_list * GB_DATA_LIST_HEADER(gb_data_list &dl)
gb_index_files * GB_INDEX_FILES_NEXT(gb_index_files *ixf)
GB_MAIN_IDX gb_make_main_idx(GB_MAIN_TYPE *Main)
GBCONTAINER * root_container
long GB_size_of_file(const char *path)
GBDATA * GB_IF_ENTRIES_GBD(gb_if_entries *ie)
static char alignment_bytes[ALIGN(1)]
static void downheap(gbdata_offset *heap, int idx, int num)
unsigned int last_updated
static long write_IFS(gb_index_files *ifs, FILE *out, long *offset)
GB_ERROR GB_export_error(const char *error)
static void scanGbdByKey(GB_MAIN_TYPE *Main, GBDATA *gbd, gbdByKey *gbk)
bool is_container() const
char * GB_map_file(const char *path, int writeable)
static void error(const char *msg)
int gb_is_valid_mapfile(const char *path, gb_map_header *mheader, int verbose)
static gbdByKey * createGbdByKey(GB_MAIN_TYPE *Main)
unsigned int update_in_server
GBCONTAINER * as_container() const
static gbdata_offset * find_gbdata_offset(GBQUARK quark, GBDATA *gbd)
static long write_GBDATA(GB_MAIN_TYPE *, GBDATA *gbd, GBQUARK quark, FILE *out, long *offset, GB_MAIN_IDX main_idx)
long index_of_touched_one_son
CONSTEXPR_INLINE GBCONTAINER * GB_FATHER(GBDATA *gbd)
static long getrel_GBDATA(long rel_to, GBDATA *gbd)
CONSTEXPR_INLINE bool valid(SpeciesCreationMode m)
gb_index_files * GBCONTAINER_IFS(GBCONTAINER *gbc)
gb_if_entries * GB_IF_ENTRIES_NEXT(gb_if_entries *ie)
GB_ERROR GB_print_error()
#define GB_MAX_MAPPED_FILES
int gb_isMappedMemory(void *mem)
static void copy(double **i, double **j)
static long writeGbdByKey(GB_MAIN_TYPE *Main, gbdByKey *gbk, FILE *out, GB_MAIN_IDX main_idx)
CONSTEXPR_INLINE_Cxx14 void SET_GB_FATHER(GBDATA *gbd, GBCONTAINER *father)
GBQUARK GB_KEY_QUARK(GBDATA *gbd)
static void sort_gbdata_offsets(gbdata_offset *gbdo, int num)
TYPE * ARB_calloc(size_t nelem)
#define IF_ASSERTION_USED(x)
#define GBTUM_MAGIC_NUMBER
long MAKEREL(long rel_to, long offset)
bool stored_external() const
static long fileLen[GB_MAX_MAPPED_FILES]
GBENTRY * as_entry() const
static long write_IE(gb_if_entries *ie, FILE *out, long *offset)
static size_t ftwrite_unaligned(const void *ptr, size_t unali_siz, FILE *fil)
GB_REL_IFES * GB_INDEX_FILES_ENTRIES(gb_index_files *ifs)
#define GB_ENTRIES_ENTRY(entries, idx)
GB_ERROR gb_save_mapfile(GB_MAIN_TYPE *Main, GB_CSTR path)
#define STATIC_ASSERT(const_expression)
unsigned int header_changed
GBDATA * gb_map_mapfile(const char *path)
GBCONTAINER * dummy_father