plus.c

Go to the documentation of this file.
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()  */
Generated on Tue Apr 6 13:28:10 2010 for GRASS Programmer's Manual by  doxygen 1.6.3