Use filenm.c data for FileNameOption.
authorTeemu Murtola <teemu.murtola@gmail.com>
Mon, 30 Sep 2013 14:34:15 +0000 (17:34 +0300)
committerGerrit Code Review <gerrit@gerrit.gromacs.org>
Thu, 3 Oct 2013 12:07:30 +0000 (14:07 +0200)
Expose the necessary data (through functions) from filenm.c so that
FileNameOption can use it.  Removes the need to duplicate the file name
extensions (potentially also other stuff in the future) for the period
that both coexist.

Part of #642.

Change-Id: I0b375da494d6e9c8a0fe6a38d9e1f27078ab9726

src/gromacs/gmxlib/filenm.c
src/gromacs/legacyheaders/filenm.h
src/gromacs/options/filenameoption.cpp

index 013b8509031fdef9c7b0568cef94902c1a97c0b1..424fb9b1cc378b841f2a71936a1acaef324048f5 100644 (file)
@@ -275,6 +275,42 @@ const char *ftp2ext_generic(int ftp)
     }
 }
 
+const char *ftp2ext_with_dot(int ftp)
+{
+    if ((0 <= ftp) && (ftp < efNR))
+    {
+        return deffile[ftp].ext;
+    }
+    else
+    {
+        return "unknown";
+    }
+}
+
+int ftp2generic_count(int ftp)
+{
+    if ((0 <= ftp) && (ftp < efNR))
+    {
+        return deffile[ftp].ntps;
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+const int *ftp2generic_list(int ftp)
+{
+    if ((0 <= ftp) && (ftp < efNR))
+    {
+        return deffile[ftp].tps;
+    }
+    else
+    {
+        return 0;
+    }
+}
+
 const char *ftp2desc(int ftp)
 {
     if ((0 <= ftp) && (ftp < efNR))
index af499d4e5c52087b6aa3f6276f7cc477f3b2a52e..dd708e4e768dbaad5af7efa1615581aa7bf4772b 100644 (file)
@@ -52,6 +52,15 @@ const char *ftp2ext_generic(int ftp);
 /* Return extension for filetype, and a generic name for generic types
    (e.g. trx)*/
 
+const char *ftp2ext_with_dot(int ftp);
+/* Return extension for filetype with a leading dot */
+
+int ftp2generic_count(int ftp);
+/* Return the number of filetypes for a generic filetype */
+
+const int *ftp2generic_list(int ftp);
+/* Return the list of filetypes for a generic filetype */
+
 const char *ftp2desc(int ftp);
 /* Return description for file type */
 
index 73ae302912b1a1bc529dc82d9e548b10b5f87ab7..66c77a313b49fb78736221f6e1ec1acdd69a3615 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * This file is part of the GROMACS molecular simulation package.
  *
- * Copyright (c) 2012, by the GROMACS development team, led by
+ * Copyright (c) 2012,2013, by the GROMACS development team, led by
  * David van der Spoel, Berk Hess, Erik Lindahl, and including many
  * others, as listed in the AUTHORS file in the top-level source
  * directory and at http://www.gromacs.org.
@@ -45,6 +45,8 @@
 #include <string>
 #include <vector>
 
+#include "gromacs/legacyheaders/filenm.h"
+
 #include "gromacs/utility/file.h"
 #include "gromacs/utility/stringutil.h"
 
@@ -151,12 +153,10 @@ class FileTypeRegistry
         //! Initializes the file type registry.
         FileTypeRegistry();
 
+        //! Registers a file type that corresponds to a ftp in filenm.h.
+        void registerType(OptionFileType type, int ftp);
         //! Registers a file type with a single extension.
         void registerType(OptionFileType type, const char *extension);
-        //! Registers a file type with multiple extensions.
-        template <size_t count>
-        void registerType(OptionFileType type,
-                          const char     *const (&extensions)[count]);
 
         std::vector<FileTypeHandler> filetypes_;
 };
@@ -180,35 +180,41 @@ FileTypeRegistry::handlerForType(OptionFileType type) const
 FileTypeRegistry::FileTypeRegistry()
 {
     filetypes_.resize(eftOptionFileType_NR);
-    const char *const topExtensions[] = {
-        ".tpr", ".tpb", ".tpa", ".gro", ".g96", ".pdb", ".brk", ".ent"
-    };
-    const char *const trajExtensions[] = {
-        ".xtc", ".trr", ".trj", ".cpt", ".gro", ".g96", ".g87", ".pdb"
-    };
-    registerType(eftTopology,    topExtensions);
-    registerType(eftTrajectory,  trajExtensions);
-    registerType(eftPDB,         ".pdb");
-    registerType(eftIndex,       ".ndx");
-    registerType(eftPlot,        ".xvg");
-    registerType(eftGenericData, ".dat");
+    registerType(eftTopology,    efTPS);
+    registerType(eftTrajectory,  efTRX);
+    registerType(eftPDB,         efPDB);
+    registerType(eftIndex,       efNDX);
+    registerType(eftPlot,        efXVG);
+    registerType(eftGenericData, efDAT);
 }
 
-void FileTypeRegistry::registerType(OptionFileType type,
-                                    const char    *extension)
+void FileTypeRegistry::registerType(OptionFileType type, int ftp)
 {
     GMX_RELEASE_ASSERT(type >= 0 && static_cast<size_t>(type) < filetypes_.size(),
                        "Invalid file type");
-    filetypes_[type].extensions_.assign(1, extension);
+    const int genericTypeCount = ftp2generic_count(ftp);
+    if (genericTypeCount > 0)
+    {
+        const int *const genericTypes = ftp2generic_list(ftp);
+        filetypes_[type].extensions_.clear();
+        filetypes_[type].extensions_.reserve(genericTypeCount);
+        for (int i = 0; i < genericTypeCount; ++i)
+        {
+            filetypes_[type].extensions_.push_back(ftp2ext_with_dot(genericTypes[i]));
+        }
+    }
+    else
+    {
+        registerType(type, ftp2ext_with_dot(ftp));
+    }
 }
 
-template <size_t count>
 void FileTypeRegistry::registerType(OptionFileType type,
-                                    const char     *const (&extensions)[count])
+                                    const char    *extension)
 {
     GMX_RELEASE_ASSERT(type >= 0 && static_cast<size_t>(type) < filetypes_.size(),
                        "Invalid file type");
-    filetypes_[type].extensions_.assign(extensions, extensions + count);
+    filetypes_[type].extensions_.assign(1, extension);
 }
 
 /*! \brief