Index: trunk/ppMerge/src/ppMerge.h
===================================================================
--- trunk/ppMerge/src/ppMerge.h	(revision 21244)
+++ trunk/ppMerge/src/ppMerge.h	(revision 23166)
@@ -28,7 +28,7 @@
 /// @{
 
-#define TIMERNAME "ppMerge"             ///< Name for timer 
-#define PPMERGE_RECIPE "PPMERGE"        ///< Recipe name 
-#define THREADED 1                      ///< Compile with threads? 
+#define TIMERNAME "ppMerge"             ///< Name for timer
+#define PPMERGE_RECIPE "PPMERGE"        ///< Recipe name
+#define THREADED 1                      ///< Compile with threads?
 
 /**
@@ -36,11 +36,11 @@
  */
 typedef enum {
-    PPMERGE_TYPE_UNKNOWN,               ///< Unknown type 
-    PPMERGE_TYPE_BIAS,                  ///< Bias frame 
-    PPMERGE_TYPE_DARK,                  ///< (Multi-)Dark frame 
-    PPMERGE_TYPE_MASK,                  ///< Mask frame 
-    PPMERGE_TYPE_SHUTTER,               ///< Shutter frame 
+    PPMERGE_TYPE_UNKNOWN,               ///< Unknown type
+    PPMERGE_TYPE_BIAS,                  ///< Bias frame
+    PPMERGE_TYPE_DARK,                  ///< (Multi-)Dark frame
+    PPMERGE_TYPE_MASK,                  ///< Mask frame
+    PPMERGE_TYPE_SHUTTER,               ///< Shutter frame
     PPMERGE_TYPE_FLAT,                  ///< Flat-field frame (dome or sky)
-    PPMERGE_TYPE_FRINGE,                ///< Fringe frame 
+    PPMERGE_TYPE_FRINGE,                ///< Fringe frame
 } ppMergeType;
 
@@ -49,7 +49,7 @@
  */
 typedef enum {
-    PPMERGE_FILES_ALL,                  ///< All files 
-    PPMERGE_FILES_INPUT,                ///< Input files 
-    PPMERGE_FILES_OUTPUT                ///< Output files 
+    PPMERGE_FILES_ALL,                  ///< All files
+    PPMERGE_FILES_INPUT,                ///< Input files
+    PPMERGE_FILES_OUTPUT                ///< Output files
 } ppMergeFiles;
 
@@ -60,9 +60,9 @@
  */
 typedef struct {
-    psArray *readouts;                  ///< Input readouts 
-    bool read;                          ///< Has the scan been read? 
-    bool busy;                          ///< Is the scan being processed? 
-    int firstScan;                      ///< First row of the chunk to be read for this group 
-    int lastScan;                       ///< Last row of the chunk to be read for this group 
+    psArray *readouts;                  ///< Input readouts
+    bool read;                          ///< Has the scan been read?
+    bool busy;                          ///< Is the scan being processed?
+    int firstScan;                      ///< First row of the chunk to be read for this group
+    int lastScan;                       ///< Last row of the chunk to be read for this group
 } ppMergeFileGroup;
 
@@ -71,5 +71,5 @@
  */
 bool ppMergeArguments(int argc, char *argv[], ///< Command-line arguments
-                      pmConfig *config  ///< Configuration 
+                      pmConfig *config  ///< Configuration
     );
 
@@ -77,5 +77,5 @@
  * Set up camera files
  */
-bool ppMergeCamera(pmConfig *config     ///< Configuration 
+bool ppMergeCamera(pmConfig *config     ///< Configuration
     );
 
@@ -83,5 +83,5 @@
  * Measure scale and zero-points
  */
-bool ppMergeScaleZero(pmConfig *config  ///< Configuration 
+bool ppMergeScaleZero(pmConfig *config  ///< Configuration
     );
 
@@ -89,5 +89,5 @@
  * Main loop to do the merging
  */
-bool ppMergeLoop(pmConfig *config       ///< Configuration 
+bool ppMergeLoop(pmConfig *config       ///< Configuration
     );
 
@@ -95,5 +95,5 @@
  * Main loop for masks
  */
-bool ppMergeMask(pmConfig *config       ///< Configuration 
+bool ppMergeMask(pmConfig *config       ///< Configuration
     );
 
@@ -101,8 +101,8 @@
  * Read nominated input file
  */
-bool ppMergeFileReadInput(pmConfig *config, ///< Configuration 
-                          pmReadout *readout, ///< Readout into which to read 
-                          int num,      ///< Number of file in sequence 
-                          int rows      ///< Number of rows to read at once 
+bool ppMergeFileReadInput(pmConfig *config, ///< Configuration
+                          pmReadout *readout, ///< Readout into which to read
+                          int num,      ///< Number of file in sequence
+                          int rows      ///< Number of rows to read at once
     );
 
@@ -110,7 +110,7 @@
  * Open nominated input file
  */
-bool ppMergeFileOpenInput(pmConfig *config, ///< Configuration 
-                          const pmFPAview *view, ///< View to open 
-                          int num       ///< Number of file in sequence 
+bool ppMergeFileOpenInput(pmConfig *config, ///< Configuration
+                          const pmFPAview *view, ///< View to open
+                          int num       ///< Number of file in sequence
     );
 
@@ -166,4 +166,19 @@
 bool ppMergeSetThreads(void);
 
+
+/// Return software version
+psString ppMergeVersion(void);
+
+/// Return software source
+psString ppMergeSource(void);
+
+/// Return detailed software version information
+psString ppMergeVersionLong(void);
+
+/// Populate a FITS header with version information
+bool ppMergeVersionHeader(
+    psMetadata *header                  ///< Header to populate
+    );
+
 ///@}
 #endif
