GRASS Programmer's Manual 6.4.1(2011)
|
00001 00017 #include <unistd.h> 00018 #include <stdlib.h> 00019 #include <stdio.h> 00020 #include <grass/gis.h> 00021 #include <grass/Vect.h> 00022 #include <grass/glocale.h> 00023 00031 int dig_init_plus(struct Plus_head *Plus) 00032 { 00033 G_debug(3, "dig_init_plus()"); 00034 00035 Plus->Version_Major = 0; 00036 Plus->Version_Minor = 0; 00037 Plus->Back_Major = 0; 00038 Plus->Back_Minor = 0; 00039 Plus->with_z = 0; 00040 00041 Plus->box.N = 0; 00042 Plus->box.S = 0; 00043 Plus->box.E = 0; 00044 Plus->box.W = 0; 00045 Plus->box.T = 0; 00046 Plus->box.B = 0; 00047 00048 Plus->built = GV_BUILD_NONE; 00049 00050 Plus->Node = NULL; 00051 Plus->Line = NULL; 00052 Plus->Area = NULL; 00053 Plus->Isle = NULL; 00054 00055 Plus->n_nodes = 0; 00056 Plus->n_edges = 0; 00057 Plus->n_lines = 0; 00058 Plus->n_areas = 0; 00059 Plus->n_isles = 0; 00060 Plus->n_volumes = 0; 00061 Plus->n_holes = 0; 00062 00063 Plus->alloc_nodes = 0; 00064 Plus->alloc_edges = 0; 00065 Plus->alloc_lines = 0; 00066 Plus->alloc_areas = 0; 00067 Plus->alloc_isles = 0; 00068 Plus->alloc_volumes = 0; 00069 Plus->alloc_holes = 0; 00070 00071 Plus->n_plines = 0; 00072 Plus->n_llines = 0; 00073 Plus->n_blines = 0; 00074 Plus->n_clines = 0; 00075 Plus->n_flines = 0; 00076 Plus->n_klines = 0; 00077 00078 Plus->Node_offset = 0L; 00079 Plus->Edge_offset = 0L; 00080 Plus->Line_offset = 0L; 00081 Plus->Area_offset = 0L; 00082 Plus->Isle_offset = 0L; 00083 Plus->Volume_offset = 0L; 00084 Plus->Hole_offset = 0L; 00085 00086 Plus->Node_spidx_offset = 0L; 00087 Plus->Edge_spidx_offset = 0L; 00088 Plus->Line_spidx_offset = 0L; 00089 Plus->Area_spidx_offset = 0L; 00090 Plus->Isle_spidx_offset = 0L; 00091 Plus->Volume_spidx_offset = 0L; 00092 Plus->Hole_spidx_offset = 0L; 00093 00094 dig_spidx_init(Plus); 00095 dig_cidx_init(Plus); 00096 00097 return 1; 00098 } 00099 00105 void dig_free_plus_nodes(struct Plus_head *Plus) 00106 { 00107 int i; 00108 P_NODE *Node; 00109 00110 G_debug(2, "dig_free_plus_nodes()"); 00111 00112 /* Nodes */ 00113 if (Plus->Node) { /* it may be that header only is loaded */ 00114 for (i = 1; i <= Plus->n_nodes; i++) { 00115 Node = Plus->Node[i]; 00116 if (Node == NULL) 00117 continue; 00118 00119 if (Node->alloc_lines > 0) { 00120 G_free(Node->lines); 00121 G_free(Node->angles); 00122 } 00123 G_free(Node); 00124 } 00125 G_free(Plus->Node); 00126 } 00127 Plus->Node = NULL; 00128 Plus->n_nodes = 0; 00129 Plus->alloc_nodes = 0; 00130 } 00131 00137 void dig_free_plus_lines(struct Plus_head *Plus) 00138 { 00139 int i; 00140 P_LINE *Line; 00141 00142 G_debug(2, "dig_free_plus_lines()"); 00143 00144 /* Lines */ 00145 if (Plus->Line) { /* it may be that header only is loaded */ 00146 for (i = 1; i <= Plus->n_lines; i++) { 00147 Line = Plus->Line[i]; 00148 if (Line == NULL) 00149 continue; 00150 00151 G_free(Line); 00152 } 00153 G_free(Plus->Line); 00154 } 00155 00156 Plus->Line = NULL; 00157 Plus->n_lines = 0; 00158 Plus->alloc_lines = 0; 00159 00160 Plus->n_plines = 0; 00161 Plus->n_llines = 0; 00162 Plus->n_blines = 0; 00163 Plus->n_clines = 0; 00164 Plus->n_flines = 0; 00165 Plus->n_klines = 0; 00166 } 00167 00173 void dig_free_plus_areas(struct Plus_head *Plus) 00174 { 00175 int i; 00176 P_AREA *Area; 00177 00178 G_debug(2, "dig_free_plus_areas()"); 00179 00180 /* Areas */ 00181 if (Plus->Area) { /* it may be that header only is loaded */ 00182 for (i = 1; i <= Plus->n_areas; i++) { 00183 Area = Plus->Area[i]; 00184 if (Area == NULL) 00185 continue; 00186 00187 if (Area->alloc_lines > 0) 00188 G_free(Area->lines); 00189 00190 if (Area->alloc_isles > 0) 00191 G_free(Area->isles); 00192 00193 G_free(Area); 00194 } 00195 G_free(Plus->Area); 00196 } 00197 Plus->Area = NULL; 00198 Plus->n_areas = 0; 00199 Plus->alloc_areas = 0; 00200 } 00201 00207 void dig_free_plus_isles(struct Plus_head *Plus) 00208 { 00209 int i; 00210 P_ISLE *Isle; 00211 00212 G_debug(2, "dig_free_plus_isles()"); 00213 00214 /* Isles */ 00215 if (Plus->Isle) { /* it may be that header only is loaded */ 00216 for (i = 1; i <= Plus->n_isles; i++) { 00217 Isle = Plus->Isle[i]; 00218 if (Isle == NULL) 00219 continue; 00220 00221 if (Isle->alloc_lines > 0) 00222 G_free(Isle->lines); 00223 00224 G_free(Isle); 00225 } 00226 G_free(Plus->Isle); 00227 } 00228 00229 Plus->Isle = NULL; 00230 Plus->n_isles = 0; 00231 Plus->alloc_isles = 0; 00232 } 00233 00241 void dig_free_plus(struct Plus_head *Plus) 00242 { 00243 G_debug(2, "dig_free_plus()"); 00244 dig_free_plus_nodes(Plus); 00245 dig_free_plus_lines(Plus); 00246 dig_free_plus_areas(Plus); 00247 dig_free_plus_isles(Plus); 00248 00249 dig_cidx_free(Plus); 00250 } 00251 00262 int dig_load_plus(struct Plus_head *Plus, GVFILE * plus, int head_only) 00263 { 00264 int i; 00265 00266 00267 G_debug(1, "dig_load_plus()"); 00268 /* TODO 00269 if (do_checks) 00270 dig_do_file_checks (map, map->plus_file, map->digit_file); 00271 */ 00272 00273 /* free and init old */ 00274 dig_init_plus(Plus); 00275 00276 /* Now let's begin reading the Plus file nodes, lines, areas and isles */ 00277 00278 if (dig_Rd_Plus_head(plus, Plus) == -1) 00279 return 0; 00280 00281 if (head_only) 00282 return 1; 00283 00284 dig_set_cur_port(&(Plus->port)); 00285 00286 /* Nodes */ 00287 if (dig_fseek(plus, Plus->Node_offset, 0) == -1) 00288 G_fatal_error(_("Unable read topology for nodes")); 00289 00290 dig_alloc_nodes(Plus, Plus->n_nodes); 00291 for (i = 1; i <= Plus->n_nodes; i++) { 00292 if (dig_Rd_P_node(Plus, i, plus) == -1) 00293 G_fatal_error(_("Unable to read topology for node %d"), i); 00294 } 00295 00296 /* Lines */ 00297 if (dig_fseek(plus, Plus->Line_offset, 0) == -1) 00298 G_fatal_error(_("Unable read topology for lines")); 00299 00300 dig_alloc_lines(Plus, Plus->n_lines); 00301 for (i = 1; i <= Plus->n_lines; i++) { 00302 if (dig_Rd_P_line(Plus, i, plus) == -1) 00303 G_fatal_error(_("Unable to read topology for line %d"), i); 00304 } 00305 00306 /* Areas */ 00307 if (dig_fseek(plus, Plus->Area_offset, 0) == -1) 00308 G_fatal_error(_("Unable to read topo for areas")); 00309 00310 dig_alloc_areas(Plus, Plus->n_areas); 00311 for (i = 1; i <= Plus->n_areas; i++) { 00312 if (dig_Rd_P_area(Plus, i, plus) == -1) 00313 G_fatal_error(_("Unable read topology for area %d"), i); 00314 } 00315 00316 /* Isles */ 00317 if (dig_fseek(plus, Plus->Isle_offset, 0) == -1) 00318 G_fatal_error(_("Unable to read topology for isles")); 00319 00320 dig_alloc_isles(Plus, Plus->n_isles); 00321 for (i = 1; i <= Plus->n_isles; i++) { 00322 if (dig_Rd_P_isle(Plus, i, plus) == -1) 00323 G_fatal_error(_("Unable to read topology for isle %d"), i); 00324 } 00325 00326 return (1); 00327 } 00328 00338 int dig_write_plus_file(GVFILE * fp_plus, struct Plus_head *Plus) 00339 { 00340 00341 dig_set_cur_port(&(Plus->port)); 00342 dig_rewind(fp_plus); 00343 00344 if (dig_Wr_Plus_head(fp_plus, Plus) < 0) { 00345 G_warning(_("Unable to write head to plus file")); 00346 return (-1); 00347 } 00348 00349 if (dig_write_nodes(fp_plus, Plus) < 0) { 00350 G_warning(_("Unable to write nodes to plus file")); 00351 return (-1); 00352 } 00353 00354 if (dig_write_lines(fp_plus, Plus) < 0) { 00355 G_warning(_("Unable to write lines to plus file")); 00356 return (-1); 00357 } 00358 00359 if (dig_write_areas(fp_plus, Plus) < 0) { 00360 G_warning(_("Unable to write areas to plus file")); 00361 return (-1); 00362 } 00363 00364 if (dig_write_isles(fp_plus, Plus) < 0) { 00365 G_warning(_("Unable to write isles to plus file")); 00366 return (-1); 00367 } 00368 00369 dig_rewind(fp_plus); 00370 if (dig_Wr_Plus_head(fp_plus, Plus) < 0) { 00371 G_warning(_("Unable to write head to plus file")); 00372 return (-1); 00373 } 00374 00375 dig_fflush(fp_plus); 00376 return (0); 00377 } /* write_plus_file() */ 00378 00388 int dig_write_nodes(GVFILE * plus, struct Plus_head *Plus) 00389 { 00390 int i; 00391 00392 00393 Plus->Node_offset = dig_ftell(plus); 00394 00395 for (i = 1; i <= Plus->n_nodes; i++) { 00396 if (dig_Wr_P_node(Plus, i, plus) < 0) 00397 return (-1); 00398 } 00399 00400 return (0); 00401 } /* write_nodes() */ 00402 00412 int dig_write_lines(GVFILE * plus, struct Plus_head *Plus) 00413 { 00414 int i; 00415 00416 00417 Plus->Line_offset = dig_ftell(plus); 00418 00419 for (i = 1; i <= Plus->n_lines; i++) { 00420 if (dig_Wr_P_line(Plus, i, plus) < 0) 00421 return (-1); 00422 } 00423 00424 return (0); 00425 00426 } /* write_line() */ 00427 00437 int dig_write_areas(GVFILE * plus, struct Plus_head *Plus) 00438 { 00439 int i; 00440 00441 00442 Plus->Area_offset = dig_ftell(plus); 00443 00444 for (i = 1; i <= Plus->n_areas; i++) { 00445 if (dig_Wr_P_area(Plus, i, plus) < 0) 00446 return (-1); 00447 } 00448 00449 return (0); 00450 00451 } /* write_areas() */ 00452 00462 int dig_write_isles(GVFILE * plus, struct Plus_head *Plus) 00463 { 00464 int i; 00465 00466 00467 Plus->Isle_offset = dig_ftell(plus); 00468 00469 for (i = 1; i <= Plus->n_isles; i++) { 00470 if (dig_Wr_P_isle(Plus, i, plus) < 0) 00471 return (-1); 00472 } 00473 00474 return (0); 00475 00476 } /* write_isles() */