/[zanavi_public1]/navit/navit/maptool/sourcesink.c
ZANavi

Contents of /navit/navit/maptool/sourcesink.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 37 - (hide annotations) (download)
Sat Mar 8 21:37:20 2014 UTC (7 years, 1 month ago) by zoff99
File MIME type: text/plain
File size: 4258 byte(s)
new market version, lots of new features
1 zoff99 8 /**
2     * Navit, a modular navigation system.
3     * Copyright (C) 2005-2011 Navit Team
4     *
5     * This program is free software; you can redistribute it and/or
6     * modify it under the terms of the GNU General Public License
7     * version 2 as published by the Free Software Foundation.
8     *
9     * This program is distributed in the hope that it will be useful,
10     * but WITHOUT ANY WARRANTY; without even the implied warranty of
11     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12     * GNU General Public License for more details.
13     *
14     * You should have received a copy of the GNU General Public License
15     * along with this program; if not, write to the
16     * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17     * Boston, MA 02110-1301, USA.
18     */
19     #include <stdio.h>
20     #include <glib.h>
21     #include <string.h>
22     #include "coord.h"
23     #include "item.h"
24     #include "attr.h"
25     #include "maptool.h"
26    
27     struct item_bin_sink *
28     item_bin_sink_new(void)
29     {
30     struct item_bin_sink *ret=g_new0(struct item_bin_sink, 1);
31    
32     return ret;
33     }
34    
35     struct item_bin_sink_func *
36 zoff99 37 item_bin_sink_func_new(int(*func)(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data))
37 zoff99 8 {
38     struct item_bin_sink_func *ret=g_new0(struct item_bin_sink_func, 1);
39 zoff99 37 ret->func = func;
40 zoff99 8 return ret;
41     }
42    
43 zoff99 37 void item_bin_sink_func_destroy(struct item_bin_sink_func *func)
44 zoff99 8 {
45     g_free(func);
46     }
47    
48 zoff99 37 void item_bin_sink_add_func(struct item_bin_sink *sink, struct item_bin_sink_func *func)
49 zoff99 8 {
50 zoff99 37 sink->sink_funcs = g_list_append(sink->sink_funcs, func);
51 zoff99 8 }
52    
53 zoff99 37 void item_bin_sink_destroy(struct item_bin_sink *sink)
54 zoff99 8 {
55     /* g_list_foreach(sink->sink_funcs, (GFunc)g_free, NULL); */
56     g_list_free(sink->sink_funcs);
57     g_free(sink);
58     }
59    
60 zoff99 37 int item_bin_write_to_sink(struct item_bin *ib, struct item_bin_sink *sink, struct tile_data *tile_data)
61 zoff99 8 {
62 zoff99 37 GList *list = sink->sink_funcs;
63     int ret = 0;
64     while (list)
65     {
66     struct item_bin_sink_func *func = list->data;
67     ret = func->func(func, ib, tile_data);
68 zoff99 8 if (ret)
69     break;
70 zoff99 37 list = g_list_next(list);
71 zoff99 8 }
72     return ret;
73     }
74    
75     struct item_bin_sink *
76     file_reader_new(FILE *in, int limit, int offset)
77     {
78     struct item_bin_sink *ret;
79     if (!in)
80     return NULL;
81 zoff99 37 ret = item_bin_sink_new();
82     ret->priv_data[0] = in;
83     ret->priv_data[1] = (void *) (long) limit;
84     ret->priv_data[2] = (void *) (long) offset;
85 zoff99 8 fseek(in, 0, SEEK_SET);
86     return ret;
87     }
88    
89 zoff99 37 int file_reader_finish(struct item_bin_sink *sink)
90 zoff99 8 {
91     struct item_bin *ib;
92 zoff99 37 int ret = 0;
93     FILE *in = sink->priv_data[0];
94     int limit = (int) (long) sink->priv_data[1];
95     int offset = (int) (long) sink->priv_data[2];
96     while ((ib = read_item(in, 0)))
97     {
98     if (offset > 0)
99     {
100 zoff99 8 offset--;
101 zoff99 37 }
102     else
103     {
104     ret = item_bin_write_to_sink(ib, sink, NULL);
105     if (ret || (limit != -1 && !--limit))
106     {
107 zoff99 8 item_bin_sink_destroy(sink);
108     return ret;
109     }
110     }
111     }
112     item_bin_sink_destroy(sink);
113     return 0;
114     }
115    
116 zoff99 37 int file_writer_process(struct item_bin_sink_func *func, struct item_bin *ib, struct tile_data *tile_data)
117 zoff99 8 {
118 zoff99 37 FILE *out = func->priv_data[0];
119 zoff99 8 item_bin_write(ib, out);
120     return 0;
121     }
122    
123     struct item_bin_sink_func *
124     file_writer_new(FILE *out)
125     {
126     struct item_bin_sink_func *file_writer;
127     if (!out)
128     return NULL;
129 zoff99 37 file_writer = item_bin_sink_func_new(file_writer_process);
130     file_writer->priv_data[0] = out;
131 zoff99 8 return file_writer;
132     }
133    
134 zoff99 37 int file_writer_finish(struct item_bin_sink_func *file_writer)
135 zoff99 8 {
136     item_bin_sink_func_destroy(file_writer);
137     return 0;
138     }
139    
140 zoff99 37 int tile_collector_process(struct item_bin_sink_func *tile_collector, struct item_bin *ib, struct tile_data *tile_data)
141 zoff99 8 {
142 zoff99 37 int *buffer, *buffer2;
143     int len = ib->len + 1;
144     GHashTable *hash = tile_collector->priv_data[0];
145     buffer = g_hash_table_lookup(hash, tile_data->buffer);
146     buffer2 = g_malloc((len + (buffer ? buffer[0] : 1)) * 4);
147     if (buffer)
148     {
149     memcpy(buffer2, buffer, buffer[0] * 4);
150     }
151     else
152     buffer2[0] = 1;
153     memcpy(buffer2 + buffer2[0], ib, len * 4);
154     buffer2[0] += len;
155 zoff99 8 g_hash_table_insert(hash, g_strdup(tile_data->buffer), buffer2);
156     return 0;
157     }
158    
159     struct item_bin_sink_func *
160     tile_collector_new(struct item_bin_sink *out)
161     {
162     struct item_bin_sink_func *tile_collector;
163 zoff99 37 tile_collector = item_bin_sink_func_new(tile_collector_process);
164     tile_collector->priv_data[0] = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
165     tile_collector->priv_data[1] = out;
166 zoff99 8 return tile_collector;
167     }
168    

   
Visit the ZANavi Wiki