int phase5(FILE **in, FILE **references, int in_count, int with_range, char *suffix, struct zip_info *zip_info) { long long size; int slices; int zipnum,written_tiles; struct tile_head *th,*th2; create_tile_hash(); th=tile_head_root; size=0; slices=0; fprintf(stderr, "Maximum slice size "LONGLONG_FMT"\n", slice_size); while (th) { if (size + th->total_size > slice_size) { fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size); size=0; slices++; } size+=th->total_size; th=th->next; } if (size) fprintf(stderr,"Slice %d is of size "LONGLONG_FMT"\n", slices, size); th=tile_head_root; size=0; slices=0; while (th) { th2=tile_head_root; while (th2) { th2->process=0; th2=th2->next; } size=0; while (th && size+th->total_size < slice_size) { size+=th->total_size; th->process=1; th=th->next; } /* process_slice() modifies zip_info, but need to retain old info */ zipnum=zip_get_zipnum(zip_info); written_tiles=process_slice(in, references, in_count, with_range, size, suffix, zip_info); zip_set_zipnum(zip_info, zipnum+written_tiles); slices++; } return 0; }
void write_tilesdir(struct tile_info *info, struct zip_info *zip_info, FILE *out) { int idx,len,maxlen; GList *next,*tiles_list; char **data; struct tile_head *th,**last=NULL; tiles_list=get_tiles_list(); info->tiles_list=&tiles_list; if (! info->write) create_tile_hash_list(tiles_list); next=g_list_first(tiles_list); last=&tile_head_root; maxlen=info->maxlen; if (! maxlen) { while (next) { if (strlen(next->data) > maxlen) maxlen=strlen(next->data); next=g_list_next(next); } } len=maxlen; while (len >= 0) { #if 0 fprintf(stderr,"PROGRESS: collecting tiles with len=%d\n", len); #endif next=g_list_first(tiles_list); while (next) { if (strlen(next->data) == len) { th=g_hash_table_lookup(tile_hash, next->data); if (!info->write) { *last=th; last=&th->next; th->next=NULL; th->zipnum=zip_get_zipnum(zip_info); fprintf(out,"%s:%d",strlen((char *)next->data)?(char *)next->data:"index",th->total_size); for ( idx = 0; idx< th->num_subtiles; idx++ ) { data= th_get_subtile( th, idx ); fprintf(out,":%s", *data); } fprintf(out,"\n"); } if (th->name[strlen(info->suffix)]) index_submap_add(info, th); zip_add_member(zip_info); processed_tiles++; } next=g_list_next(next); } len--; } if (info->suffix[0] && info->write) { struct item_bin *item_bin=init_item(type_submap); item_bin_add_coord_rect(item_bin, &world_bbox); item_bin_add_attr_range(item_bin, attr_order, 0, 255); item_bin_add_attr_int(item_bin, attr_zipfile_ref, zip_get_zipnum(zip_info)-1); item_bin_write(item_bin, zip_get_index(zip_info)); } }