[GRASS-SVN] r55482 - grass/trunk/lib/vector/Vlib
svn_grass at osgeo.org
svn_grass at osgeo.org
Thu Mar 21 08:58:23 PDT 2013
Author: mmetz
Date: 2013-03-21 08:58:22 -0700 (Thu, 21 Mar 2013)
New Revision: 55482
Modified:
grass/trunk/lib/vector/Vlib/ascii.c
Log:
Vlib: fix ascii export selection
Modified: grass/trunk/lib/vector/Vlib/ascii.c
===================================================================
--- grass/trunk/lib/vector/Vlib/ascii.c 2013-03-21 14:57:14 UTC (rev 55481)
+++ grass/trunk/lib/vector/Vlib/ascii.c 2013-03-21 15:58:22 UTC (rev 55482)
@@ -24,8 +24,8 @@
#define BUFFSIZE 128
static int srch(const void *, const void *);
-static int check_cat(const struct line_cats *, const struct cat_list *,
- const int *, int);
+static int get_cat(const struct line_cats *, const struct cat_list *,
+ const int *, int, int, int *);
static void free_col_arrays(int *, char *, char **);
/*!
@@ -511,7 +511,7 @@
if (format == GV_ASCII_FORMAT_POINT && !(ltype & GV_POINTS))
continue;
- found = check_cat(Cats, Clist, cats, ncats);
+ found = get_cat(Cats, Clist, cats, ncats, field, &cat);
if (!found && ltype == GV_BOUNDARY &&
type & GV_AREA && Vect_level(Map) > 1) {
@@ -520,13 +520,13 @@
left = Vect_get_isle_area(Map, abs(left));
if (left > 0) {
Vect_get_area_cats(Map, left, ACats);
- found = check_cat(ACats, Clist, cats, ncats);
+ found = get_cat(ACats, Clist, cats, ncats, field, &cat);
}
if (right < 0)
right = Vect_get_isle_area(Map, abs(right));
if (!found && right > 0) {
Vect_get_area_cats(Map, right, ACats);
- found = check_cat(ACats, Clist, cats, ncats);
+ found = get_cat(ACats, Clist, cats, ncats, field, &cat);
}
}
@@ -606,7 +606,7 @@
if (columns) {
for (i = 0; columns[i]; i++) {
if (db_select_value
- (driver, Fi->table, Fi->key, fcats->value[0],
+ (driver, Fi->table, Fi->key, cat,
columns[i], &value) < 0)
G_fatal_error(_("Unable to select record from table <%s> (key %s, column %s)"),
Fi->table, Fi->key, columns[i]);
@@ -636,18 +636,18 @@
}
- if (fcats->n_values > 0) {
+ if (fcats->n_values > 0 && cat > -1) {
if (fcats->n_values > 1) {
- G_warning(_("Feature has more categories. Only first category (%d) "
- "is exported."), fcats->value[0]);
+ G_warning(_("Feature has more categories. Only one category (%d) "
+ "is exported."), cat);
}
- fprintf(ascii, "%s%d", fs, fcats->value[0]);
+ fprintf(ascii, "%s%d", fs, cat);
/* print attributes */
if (columns) {
G_rasprintf(&buf, &bufsize, "SELECT %s FROM %s WHERE %s = %d",
- all_columns, Fi->table, Fi->key, fcats->value[0]);
+ all_columns, Fi->table, Fi->key, cat);
G_debug(2, "SQL: %s", buf);
db_set_string(&dbstring, buf);
@@ -656,7 +656,7 @@
db_close_database(driver);
db_shutdown_driver(driver);
G_fatal_error(_("Cannot select attributes for cat = %d"),
- fcats->value[0]);
+ cat);
}
if (db_fetch(&cursor, DB_NEXT, &more) != DB_OK) {
db_close_database(driver);
@@ -667,7 +667,7 @@
Table = db_get_cursor_table(&cursor);
- for(i = 0; columns[i]; i++) {
+ for (i = 0; columns[i]; i++) {
Column = db_get_table_column(Table, i);
Value = db_get_column_value(Column);
@@ -748,7 +748,7 @@
}
}
else {
- if (cat > 0) {
+ if (cat > -1) {
if (ltype == GV_POINT) {
G_rasprintf(&xstring, &xsize, "%.*f", dp, Points->x[0]);
G_trim_decimal(xstring);
@@ -861,30 +861,46 @@
}
/* check category */
-int check_cat(const struct line_cats *Cats, const struct cat_list *Clist,
- const int *cats, int ncats)
+int get_cat(const struct line_cats *Cats, const struct cat_list *Clist,
+ const int *cats, int ncats, int field, int *cat)
{
- int i, cat;
+ int i;
- if (Clist) {
- Vect_cat_get(Cats, Clist->field, &cat);
- if (!Vect_cat_in_cat_list(cat, Clist))
- return FALSE;
+ *cat = -1;
+
+ if (Clist && Clist->field == field) {
+ for (i = 0; i < Cats->n_cats; i++) {
+ if (Cats->field[i] == field &&
+ Vect_cat_in_cat_list(Cats->cat[i], Clist)) {
+ *cat = Cats->cat[i];
+ return TRUE;
+ }
+ }
+ return FALSE;
}
if (cats) {
+ int *found;
+
for (i = 0; i < Cats->n_cats; i++) {
- if ((int *)bsearch((void *) &(Cats->cat[i]), cats, ncats, sizeof(int),
- srch)) {
- /* found */
- break;
+ if (Cats->field[i] == field) {
+ found = (int *)bsearch((void *) &(Cats->cat[i]), cats,
+ ncats, sizeof(int), srch);
+ if (found) {
+ /* found */
+ *cat = *found;
+ return TRUE;
+ }
}
}
-
- if (i == Cats->n_cats)
- return FALSE;
+ return FALSE;
}
+ if (!Clist && !cats && field > 0) {
+ Vect_cat_get(Cats, field, cat);
+ if (*cat > -1)
+ return TRUE;
+ }
- return TRUE;
+ return FALSE;
}
/* free column arrays, see Vect_write_ascii() */
More information about the grass-commit
mailing list