10 item_bin_sink_new(void)
12 struct item_bin_sink *ret=g_new0(struct item_bin_sink, 1);
17 struct item_bin_sink_func *
18 item_bin_sink_func_new(int (*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data))
20 struct item_bin_sink_func *ret=g_new0(struct item_bin_sink_func, 1);
26 item_bin_sink_func_destroy(struct item_bin_sink_func *func)
32 item_bin_sink_add_func(struct item_bin_sink *sink, struct item_bin_sink_func *func)
34 sink->sink_funcs=g_list_append(sink->sink_funcs, func);
38 item_bin_sink_destroy(struct item_bin_sink *sink)
40 /* g_list_foreach(sink->sink_funcs, (GFunc)g_free, NULL); */
41 g_list_free(sink->sink_funcs);
46 item_bin_write_to_sink(struct item_bin *ib, struct item_bin_sink *sink, struct tile_data *tile_data)
48 GList *list=sink->sink_funcs;
51 struct item_bin_sink_func *func=list->data;
52 ret=func->func(func, ib, tile_data);
55 list=g_list_next(list);
60 struct item_bin_sink *
61 file_reader_new(FILE *in, int limit, int offset)
63 struct item_bin_sink *ret;
66 ret=item_bin_sink_new();
68 ret->priv_data[1]=(void *)(long)limit;
69 ret->priv_data[2]=(void *)(long)offset;
70 fseek(in, 0, SEEK_SET);
75 file_reader_finish(struct item_bin_sink *sink)
77 struct item_bin *ib=(struct item_bin *)buffer;
79 FILE *in=sink->priv_data[0];
80 int limit=(int)(long)sink->priv_data[1];
81 int offset=(int)(long)sink->priv_data[2];
83 switch (item_bin_read(ib, in)) {
85 item_bin_sink_destroy(sink);
91 ret=item_bin_write_to_sink(ib, sink, NULL);
92 if (ret || (limit != -1 && !--limit)) {
93 item_bin_sink_destroy(sink);
104 file_writer_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data)
106 FILE *out=func->priv_data[0];
107 item_bin_write(ib, out);
111 struct item_bin_sink_func *
112 file_writer_new(FILE *out)
114 struct item_bin_sink_func *file_writer;
117 file_writer=item_bin_sink_func_new(file_writer_process);
118 file_writer->priv_data[0]=out;
123 file_writer_finish(struct item_bin_sink_func *file_writer)
125 item_bin_sink_func_destroy(file_writer);
131 tile_collector_process(struct item_bin_sink_func *tile_collector, struct item_bin *ib, struct tile_data *tile_data)
133 int *buffer,*buffer2;
135 GHashTable *hash=tile_collector->priv_data[0];
136 buffer=g_hash_table_lookup(hash, tile_data->buffer);
137 buffer2=g_malloc((len+(buffer ? buffer[0] : 1))*4);
139 memcpy(buffer2, buffer, buffer[0]*4);
142 memcpy(buffer2+buffer2[0], ib, len*4);
144 g_hash_table_insert(hash, g_strdup(tile_data->buffer), buffer2);
148 struct item_bin_sink_func *
149 tile_collector_new(struct item_bin_sink *out)
151 struct item_bin_sink_func *tile_collector;
152 tile_collector=item_bin_sink_func_new(tile_collector_process);
153 tile_collector->priv_data[0]=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
154 tile_collector->priv_data[1]=out;
155 return tile_collector;