From 3f5c83bc26e98dd41e93fc9023a610cd0ec1d363 Mon Sep 17 00:00:00 2001
From: Samo Penic <samo.penic@fe.uni-lj.si>
Date: Tue, 11 Mar 2014 08:52:58 +0000
Subject: [PATCH] Fixed bugs when dump file is missing. Prepared flags for setting filenames

---
 src/main.c |    4 ++
 src/io.c   |   83 ++++++++++++++++++++++++++++-------------
 src/io.h   |    5 ++
 3 files changed, 64 insertions(+), 28 deletions(-)

diff --git a/src/io.c b/src/io.c
index d4a9cc4..db4e64f 100644
--- a/src/io.c
+++ b/src/io.c
@@ -142,6 +142,20 @@
 ts_vesicle *restore_state(ts_uint *iteration){
     ts_uint i,j,k;
     FILE *fh=fopen("dump.bin","rb");
+
+    struct stat sb;
+    if (stat("dump.bin", &sb) == -1) {
+        //dump file does not exist.
+        return NULL;
+    }
+
+    //check if it is regular file
+    if((sb.st_mode & S_IFMT) != S_IFREG) {
+        //dump file is not a regular file.
+        ts_fprintf(stderr,"Dump file is not a regular file!\n");
+        return NULL;
+    }
+
     ts_uint retval;
 	ts_uint idx;
 
@@ -326,9 +340,14 @@
 
 
 ts_bool parse_args(int argc, char **argv){
- int c, retval;
- DIR *dir;
-    path[0]=0;
+    int c, retval;
+    struct stat sb;
+    sprintf(command_line_args.path, "./"); //clear string;
+    sprintf(command_line_args.output_fullfilename,"./output.pvd");
+    sprintf(command_line_args.dump_fullfilename,"./dump.bin");
+    sprintf(command_line_args.tape_fullfilename,"./tape");
+            FILE *file;
+    
 while (1)
      {
        static struct option long_options[] =
@@ -338,13 +357,13 @@
            {"tape",     no_argument,       0, 't'},
            {"output-file",  required_argument, 0, 'o'},
            {"directory",  required_argument, 0, 'd'},
-           {"dump-file", required_argument,0, 'f'},
+           {"dump-filename", required_argument,0, 'f'},
            {0, 0, 0, 0}
          };
        /* getopt_long stores the option index here. */
        int option_index = 0;
 
-       c = getopt_long (argc, argv, "d:fot",
+       c = getopt_long (argc, argv, "d:f:o:t:",
                         long_options, &option_index);
 
        /* Detect the end of the options. */
@@ -365,46 +384,56 @@
 
          case 't':
             //check if tape exists. If not, fail immediately.
-           puts ("option -t\n");
+            if (stat(optarg, &sb) == -1) {
+                ts_fprintf(stderr,"Tape '%s' does not exist!\n",optarg);
+                fatal("Please select correct tape",1);
+            } else {
+                strcpy(command_line_args.tape_fullfilename,optarg);
+            }
            break;
 
          case 'o':
             //set filename of master output file
-           printf ("option -o with value `%s'\n", optarg);
-           break;
+            if ((file = fopen(optarg, "w")) == NULL) {
+                fprintf(stderr,"Could not create output file!\n");
+                fatal("Please specify correct output file",1);
+                
+            } else {
+                fclose(file);
+            }
+            strcpy(command_line_args.output_fullfilename, optarg);
+            break;
 
          case 'd':
             //check if directory exists. If not create one. If creation is
             //successful, set directory for output files.
             //printf ("option -d with value `%s'\n", optarg);
-            dir = opendir(optarg);
-            if (dir)
-            {
-                /* Directory exists. */
-                closedir(dir);
-            }
-            else if (ENOENT == errno)
-            {
-                /* Directory does not exist. */
+            if (stat(optarg, &sb) == -1) {
+                //directory does not exist
                 retval=mkdir(optarg, 0700);
                 if(retval){
-                fatal("Could not create requested directory. Check if you have permissions",1);
+                    fatal("Could not create requested directory. Check if you have permissions",1);
                 }
             }
-            else
-            {
-                /* opendir() failed for some other reason. */
-                fatal("Could not check if directory exists. Reason unknown",1);
+            //check if is a proper directory
+            else if((sb.st_mode & S_IFMT) != S_IFDIR) {
+                //it is not a directory. fatal error.
+                ts_fprintf(stderr,"%s is not a directory!\n",optarg);
+                fatal("Cannot continue",1);
             }
-            ts_fprintf(stdout,"\n*** Using output directory: %s\n\n", optarg);
-//            sprintf(path,"%s", optarg);
-            strcpy(path, optarg);
-           // ts_fprintf(stdout,"ok!\n"); 
-
+            strcpy(command_line_args.path, optarg);
            break;
 
         case 'f':
             //check if dump file specified exists. Defaults to dump.bin
+            if ((file = fopen(optarg, "w")) == NULL) {
+                fprintf(stderr,"Could not create dump file!\n");
+                fatal("Please specify correct dump file",1);
+                
+            } else {
+                fclose(file);
+            }
+            strcpy(command_line_args.dump_fullfilename, optarg);
             break;
 
          case '?':
diff --git a/src/io.h b/src/io.h
index c8dfd17..eb0b737 100644
--- a/src/io.h
+++ b/src/io.h
@@ -6,7 +6,6 @@
 static char prefixname[1024];
 static ts_bool restore=0;
 static char tape[1024]; */
-char path[1024];
 int force_from_tape;
 
 
@@ -36,6 +35,10 @@
 typedef struct{
 	ts_int force_from_tape;
 	ts_int reset_iteration_count;
+    char path[1024]; //path where all files should be added
+    char output_fullfilename[1024]; //name of the master file
+    char dump_fullfilename[1024]; //name of the dump file
+    char tape_fullfilename[1024]; //name of the tape file
 } ts_args;
 
 ts_args command_line_args;
diff --git a/src/main.c b/src/main.c
index 54f8aff..1b97f10 100644
--- a/src/main.c
+++ b/src/main.c
@@ -38,6 +38,10 @@
 		ts_fprintf(stdout,"**********************************************************************\n\n");
 		tape=parsetape("tape");
 		vesicle=restore_state(&start_iteration);
+        if(vesicle==NULL){
+            ts_fprintf(stderr, "Dump file does not exist or is not a regular file! Did you mean to invoke trisurf with --force-from-tape option?\n\n");
+            return 1;
+        }
 		// nove vrednosti iz tapea...
 		vesicle->bending_rigidity=tape->xk0;
 		vtx_set_global_values(vesicle);

--
Gitblit v1.9.3