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
00113 if (Plus->Node) {
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
00145 if (Plus->Line) {
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
00181 if (Plus->Area) {
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
00215 if (Plus->Isle) {
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
00269
00270
00271
00272
00273
00274 dig_init_plus(Plus);
00275
00276
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
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
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
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
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 }
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 }
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 }
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 }
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 }