read_nat.c

Go to the documentation of this file.
00001 
00026 #include <grass/gis.h>
00027 #include <grass/Vect.h>
00028 #include <grass/glocale.h>
00029 
00030 static int
00031 Vect__Read_line_nat(struct Map_info *,
00032                     struct line_pnts *, struct line_cats *, long);
00033 
00047 int
00048 V1_read_line_nat(struct Map_info *Map,
00049                  struct line_pnts *Points,
00050                  struct line_cats *Cats, long offset)
00051 {
00052     return Vect__Read_line_nat(Map, Points, Cats, offset);
00053 }
00054 
00067 int
00068 V1_read_next_line_nat(struct Map_info *Map,
00069                       struct line_pnts *line_p, struct line_cats *line_c)
00070 {
00071     int itype;
00072     long offset;
00073     BOUND_BOX lbox, mbox;
00074 
00075     G_debug(3, "V1_read_next_line_nat()");
00076 
00077     if (Map->Constraint_region_flag)
00078         Vect_get_constraint_box(Map, &mbox);
00079 
00080     while (1) {
00081         offset = dig_ftell(&(Map->dig_fp));
00082         itype = Vect__Read_line_nat(Map, line_p, line_c, offset);
00083         if (itype < 0)
00084             return (itype);
00085 
00086         if (itype == 0)         /* is it DEAD? */
00087             continue;
00088 
00089         /* Constraint on Type of line 
00090          * Default is all of  Point, Line, Area and whatever else comes along
00091          */
00092         if (Map->Constraint_type_flag) {
00093             if (!(itype & Map->Constraint_type))
00094                 continue;
00095         }
00096 
00097         /* Constraint on specified region */
00098         if (Map->Constraint_region_flag) {
00099             Vect_line_box(line_p, &lbox);
00100 
00101             if (!Vect_box_overlap(&lbox, &mbox))
00102                 continue;
00103         }
00104 
00105         return (itype);
00106     }
00107     /* NOTREACHED */
00108 }
00109 
00123 int
00124 V2_read_line_nat(struct Map_info *Map,
00125                  struct line_pnts *line_p, struct line_cats *line_c, int line)
00126 {
00127     P_LINE *Line;
00128 
00129     G_debug(3, "V2_read_line_nat(): line = %d", line);
00130 
00131 
00132     Line = Map->plus.Line[line];
00133 
00134     if (Line == NULL)
00135         G_fatal_error("V2_read_line_nat(): %s %d",
00136                       _("Attempt to read dead line"), line);
00137 
00138     return Vect__Read_line_nat(Map, line_p, line_c, Line->offset);
00139 }
00140 
00153 int
00154 V2_read_next_line_nat(struct Map_info *Map,
00155                       struct line_pnts *line_p, struct line_cats *line_c)
00156 {
00157     register int line;
00158     register P_LINE *Line;
00159     BOUND_BOX lbox, mbox;
00160 
00161     G_debug(3, "V2_read_next_line_nat()");
00162 
00163     if (Map->Constraint_region_flag)
00164         Vect_get_constraint_box(Map, &mbox);
00165 
00166     while (1) {
00167         line = Map->next_line;
00168 
00169         if (line > Map->plus.n_lines)
00170             return (-2);
00171 
00172         Line = Map->plus.Line[line];
00173         if (Line == NULL) {     /* Dead line */
00174             Map->next_line++;
00175             continue;
00176         }
00177 
00178         if ((Map->Constraint_type_flag &&
00179              !(Line->type & Map->Constraint_type))) {
00180             Map->next_line++;
00181             continue;
00182         }
00183 
00184         if (Map->Constraint_region_flag) {
00185             Vect_get_line_box(Map, line, &lbox);
00186             if (!Vect_box_overlap(&lbox, &mbox)) {
00187                 Map->next_line++;
00188                 continue;
00189             }
00190         }
00191 
00192         return V2_read_line_nat(Map, line_p, line_c, Map->next_line++);
00193     }
00194 
00195     /* NOTREACHED */ }
00196 
00197 
00211 int
00212 Vect__Read_line_nat(struct Map_info *Map,
00213                     struct line_pnts *p, struct line_cats *c, long offset)
00214 {
00215     int i, dead = 0;
00216     int n_points;
00217     long size;
00218     int n_cats, do_cats;
00219     int type;
00220     char rhead, nc;
00221     short field;
00222 
00223     G_debug(3, "Vect__Read_line_nat: offset = %ld", offset);
00224 
00225     Map->head.last_offset = offset;
00226 
00227     /* reads must set in_head, but writes use default */
00228     dig_set_cur_port(&(Map->head.port));
00229 
00230     dig_fseek(&(Map->dig_fp), offset, 0);
00231 
00232     if (0 >= dig__fread_port_C(&rhead, 1, &(Map->dig_fp)))
00233         return (-2);
00234 
00235     if (!(rhead & 0x01))        /* dead line */
00236         dead = 1;
00237 
00238     if (rhead & 0x02)           /* categories exists */
00239         do_cats = 1;            /* do not return here let file offset moves forward to next */
00240     else                        /* line */
00241         do_cats = 0;
00242 
00243     rhead >>= 2;
00244     type = dig_type_from_store((int)rhead);
00245 
00246     G_debug(3, "    type = %d, do_cats = %d dead = %d", type, do_cats, dead);
00247 
00248     if (c != NULL)
00249         c->n_cats = 0;
00250 
00251     if (do_cats) {
00252         if (Map->head.Version_Minor == 1) {     /* coor format 5.1 */
00253             if (0 >= dig__fread_port_I(&n_cats, 1, &(Map->dig_fp)))
00254                 return (-2);
00255         }
00256         else {                  /* coor format 5.0 */
00257             if (0 >= dig__fread_port_C(&nc, 1, &(Map->dig_fp)))
00258                 return (-2);
00259             n_cats = (int)nc;
00260         }
00261         G_debug(3, "    n_cats = %d", n_cats);
00262 
00263         if (c != NULL) {
00264             c->n_cats = n_cats;
00265             if (n_cats > 0) {
00266                 if (0 > dig_alloc_cats(c, (int)n_cats + 1))
00267                     return (-1);
00268 
00269                 if (Map->head.Version_Minor == 1) {     /* coor format 5.1 */
00270                     if (0 >=
00271                         dig__fread_port_I(c->field, n_cats, &(Map->dig_fp)))
00272                         return (-2);
00273                 }
00274                 else {          /* coor format 5.0 */
00275                     for (i = 0; i < n_cats; i++) {
00276                         if (0 >= dig__fread_port_S(&field, 1, &(Map->dig_fp)))
00277                             return (-2);
00278                         c->field[i] = (int)field;
00279                     }
00280                 }
00281                 if (0 >= dig__fread_port_I(c->cat, n_cats, &(Map->dig_fp)))
00282                     return (-2);
00283 
00284             }
00285         }
00286         else {
00287             if (Map->head.Version_Minor == 1) { /* coor format 5.1 */
00288                 size = (2 * PORT_INT) * n_cats;
00289             }
00290             else {              /* coor format 5.0 */
00291                 size = (PORT_SHORT + PORT_INT) * n_cats;
00292             }
00293 
00294             dig_fseek(&(Map->dig_fp), size, SEEK_CUR);
00295         }
00296     }
00297 
00298     if (type & GV_POINTS) {
00299         n_points = 1;
00300     }
00301     else {
00302         if (0 >= dig__fread_port_I(&n_points, 1, &(Map->dig_fp)))
00303             return (-2);
00304     }
00305 
00306     G_debug(3, "    n_points = %d", n_points);
00307 
00308     if (p != NULL) {
00309         if (0 > dig_alloc_points(p, n_points + 1))
00310             return (-1);
00311 
00312         p->n_points = n_points;
00313         if (0 >= dig__fread_port_D(p->x, n_points, &(Map->dig_fp)))
00314             return (-2);
00315         if (0 >= dig__fread_port_D(p->y, n_points, &(Map->dig_fp)))
00316             return (-2);
00317 
00318         if (Map->head.with_z) {
00319             if (0 >= dig__fread_port_D(p->z, n_points, &(Map->dig_fp)))
00320                 return (-2);
00321         }
00322         else {
00323             for (i = 0; i < n_points; i++)
00324                 p->z[i] = 0.0;
00325         }
00326     }
00327     else {
00328         if (Map->head.with_z)
00329             size = n_points * 3 * PORT_DOUBLE;
00330         else
00331             size = n_points * 2 * PORT_DOUBLE;
00332 
00333         dig_fseek(&(Map->dig_fp), size, SEEK_CUR);
00334     }
00335 
00336     G_debug(3, "    off = %ld", dig_ftell(&(Map->dig_fp)));
00337 
00338     if (dead)
00339         return 0;
00340 
00341     return (type);
00342 }

Generated on Thu Jul 16 13:21:17 2009 for GRASS Programmer's Manual by  doxygen 1.5.6