Просмотр исходного кода

v.clean: use error handlers to clean up when fails

git-svn-id: https://svn.osgeo.org/grass/grass/trunk@58336 15284696-431f-4ddb-bdfa-cd5b030d7da7
Martin Landa 11 лет назад
Родитель
Сommit
b423fb3774
1 измененных файлов с 20 добавлено и 9 удалено
  1. 20 9
      vector/v.clean/main.c

+ 20 - 9
vector/v.clean/main.c

@@ -25,6 +25,8 @@
 
 #include "proto.h"
 
+static void error_handler_err(void *p);
+
 int main(int argc, char *argv[])
 {
     struct Map_info In, Out, Err, *pErr;
@@ -276,18 +278,13 @@ int main(int argc, char *argv[])
 
     with_z = Vect_is_3d(&In);
     
-    if (0 > Vect_open_new(&Out, opt.out->answer, with_z)) {
-	Vect_close(&In);
-	exit(EXIT_FAILURE);
-    }
+    Vect_open_new(&Out, opt.out->answer, with_z);
+    Vect_set_error_handler_io(&In, &Out);
 
     if (opt.err->answer) {
 	Vect_set_open_level(2);
-	if (0 > Vect_open_new(&Err, opt.err->answer, with_z)) {
-	    Vect_close(&In);
-	    Vect_close(&Out);
-	    exit(EXIT_FAILURE);
-	}
+	Vect_open_new(&Err, opt.err->answer, with_z);
+        G_add_error_handler(error_handler_err, &Err);
 	pErr = &Err;
     }
     else {
@@ -493,3 +490,17 @@ int main(int argc, char *argv[])
 
     exit(EXIT_SUCCESS);
 }
+
+void error_handler_err(void *p)
+{
+    char *name;
+    struct Map_info *Err;
+    
+    Err = (struct Map_info *) p;
+
+    if (Err && Err->open == VECT_OPEN_CODE) {
+	name = G_store(Err->name);
+	Vect_delete(name);
+	G_free(name);
+    }
+}