Index: trunk/psphot/src/psphotArguments.c
===================================================================
--- trunk/psphot/src/psphotArguments.c	(revision 5837)
+++ trunk/psphot/src/psphotArguments.c	(revision 5980)
@@ -7,5 +7,6 @@
     int N;
     unsigned int Nfail;
-    int mode = PS_DATA_STRING | PS_META_REPLACE;
+
+    psMetadata *options = psMetadataAlloc ();
 
     // basic pslib options
@@ -13,81 +14,100 @@
     psArgumentVerbosity (argc, argv);
 
-    // optional mask image - add to config
-    char *mask = NULL;
+    // command-line options -- place on options MD
+    // mask image
     if ((N = psArgumentGet (*argc, argv, "-mask"))) {
 	psArgumentRemove (N, argc, argv);
-	mask = psStringCopy (argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, "MASK_IMAGE", 0, "", psStringCopy(argv[N]));
 	psArgumentRemove (N, argc, argv);
     }
 
-    // optional weight image - add to config
-    char *weight = NULL;
+    // weight image
     if ((N = psArgumentGet (*argc, argv, "-weight"))) {
 	psArgumentRemove (N, argc, argv);
-	weight = psStringCopy (argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, "WEIGHT_IMAGE", 0, "", psStringCopy(argv[N]));
 	psArgumentRemove (N, argc, argv);
     }
 
-    // optional output residual image - add to config
-    char *resid = NULL;
+    // output residual image
     if ((N = psArgumentGet (*argc, argv, "-resid"))) {
 	psArgumentRemove (N, argc, argv);
-	resid = psStringCopy (argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, "RESID_IMAGE", 0, "", psStringCopy(argv[N]));
 	psArgumentRemove (N, argc, argv);
     }
 
-    // optional analysis region - add to config
-    char *region = NULL;
+    // analysis region
     if ((N = psArgumentGet (*argc, argv, "-region"))) {
 	psArgumentRemove (N, argc, argv);
-	region = psStringCopy (argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, "ANALYSIS_REGION", 0, "", psStringCopy(argv[N]));
 	psArgumentRemove (N, argc, argv);
     }
 
-    // optional output residual image - add to config
-    char *photcode = NULL;
+    // output residual image
+    psMetadataAddStr (options, PS_LIST_TAIL, "PHOTCODE", 0, "", psStringCopy("NONE"));
     if ((N = psArgumentGet (*argc, argv, "-photcode"))) {
 	psArgumentRemove (N, argc, argv);
-	photcode = psStringCopy (argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, "PHOTCODE", PS_META_REPLACE, "", psStringCopy(argv[N]));
 	psArgumentRemove (N, argc, argv);
     }
 
-    char *psffile = NULL;
+    // input PSF file
     if ((N = psArgumentGet (*argc, argv, "-psf"))) {
 	psArgumentRemove (N, argc, argv);
-	psffile = psStringCopy (argv[N]);
+	psMetadataAddStr (options, PS_LIST_TAIL, "PSF_INPUT_FILE", 0, "", psStringCopy (argv[N]));
 	psArgumentRemove (N, argc, argv);
     }
 
-    bool ModelTest = false;
-    float ModelTest_X = 0;
-    float ModelTest_Y = 0;
-    char *model = NULL;
-    char *fitset = NULL;
-    char *fitmode = NULL;
+    // run the 0ltest model (requires X,Y coordinate)
     if ((N = psArgumentGet (*argc, argv, "-modeltest"))) {
-	ModelTest = true;
+	psMetadataAddBool (options, PS_LIST_TAIL, "TEST_FIT",   0, "", true);
+	psMetadataAddF32  (options, PS_LIST_TAIL, "TEST_FIT_X", 0, "", atof(argv[N+1]));
+	psMetadataAddF32  (options, PS_LIST_TAIL, "TEST_FIT_Y", 0, "", atof(argv[N+2]));
+
 	psArgumentRemove (N, argc, argv);
-	ModelTest_X = atof (argv[N]);
 	psArgumentRemove (N, argc, argv);
-	ModelTest_Y = atof (argv[N]);
 	psArgumentRemove (N, argc, argv);
 
+	// specify the modeltest model
 	if ((N = psArgumentGet (*argc, argv, "-model"))) {
 	    psArgumentRemove (N, argc, argv);
-	    model = psStringCopy (argv[N]);
+	    psMetadataAddStr (options, PS_LIST_TAIL, "TEST_FIT_MODEL", 0, "", psStringCopy (argv[N]));
 	    psArgumentRemove (N, argc, argv);
 	}
 
+	// specify the test fit mode
 	if ((N = psArgumentGet (*argc, argv, "-fitmode"))) {
 	    psArgumentRemove (N, argc, argv);
-	    fitmode = psStringCopy (argv[N]);
+	    psMetadataAddStr (options, PS_LIST_TAIL, "TEST_FIT_MODE", 0, "", psStringCopy (argv[N]));
 	    psArgumentRemove (N, argc, argv);
 	}
 	if ((N = psArgumentGet (*argc, argv, "-fitset"))) {
 	    psArgumentRemove (N, argc, argv);
-	    fitset = psStringCopy (argv[N]);
+	    psMetadataAddStr (options, PS_LIST_TAIL, "TEST_FIT_SET", 0, "", psStringCopy (argv[N]));
 	    psArgumentRemove (N, argc, argv);
 	}
+    }
+
+    // other arbitrary options: -D key value (all added as string)
+    while ((N = psArgumentGet (*argc, argv, "-D"))) {
+	psArgumentRemove (N, argc, argv);
+	psMetadataAddStr (options, PS_LIST_TAIL, argv[N], 0, "", argv[N+1]);
+	psArgumentRemove (N, argc, argv);
+	psArgumentRemove (N, argc, argv);
+    }
+
+    // other arbitrary options: -Df key value (all added as float)
+    while ((N = psArgumentGet (*argc, argv, "-Df"))) {
+	psArgumentRemove (N, argc, argv);
+	psMetadataAddF32 (options, PS_LIST_TAIL, argv[N], 0, "", atof(argv[N+1]));
+	psArgumentRemove (N, argc, argv);
+	psArgumentRemove (N, argc, argv);
+    }
+
+    // other arbitrary options: -Di key value (all added as int)
+    while ((N = psArgumentGet (*argc, argv, "-Di"))) {
+	psArgumentRemove (N, argc, argv);
+	psMetadataAddS32 (options, PS_LIST_TAIL, argv[N], 0, "", atoi(argv[N+1]));
+	psArgumentRemove (N, argc, argv);
+	psArgumentRemove (N, argc, argv);
     }
 
@@ -96,52 +116,21 @@
     // load config information
     psMetadata *config = psMetadataAlloc ();
-    psMetadataAdd (config, PS_LIST_HEAD, "PSF_MODEL", PS_DATA_METADATA_MULTI, "folder for psf model entries", NULL);
+
+    psMetadataAdd (config, PS_LIST_TAIL, "PSF_MODEL", PS_DATA_METADATA_MULTI, "folder for psf model entries", NULL);
     config = psMetadataConfigParse (config, &Nfail, argv[3], FALSE);
+
+    psMetadataItem *item = NULL;
+    psMetadataIterator *iter = psMetadataIteratorAlloc (options, PS_LIST_HEAD, NULL);
+    while ((item = psMetadataGetAndIncrement (iter)) != NULL) {
+	psMetadataAddItem (config, item, PS_LIST_TAIL, PS_META_REPLACE);
+	// psFree (item);
+    }
+    // psFree (iter);
 
     // identify input image & optional weight & mask images
     // command-line entries override config-file entries
-    psMetadataAdd (config, PS_LIST_HEAD, "IMAGE",       mode, "", argv[1]);
-    psMetadataAdd (config, PS_LIST_HEAD, "OUTPUT_FILE", mode, "", argv[2]);
+    psMetadataAddStr (config, PS_LIST_TAIL, "IMAGE",       PS_META_REPLACE, "", argv[1]);
+    psMetadataAddStr (config, PS_LIST_TAIL, "OUTPUT_FILE", PS_META_REPLACE, "", argv[2]);
 
-    if (mask != NULL) {
-	psMetadataAdd (config, PS_LIST_HEAD, "MASK_IMAGE", mode, "", mask);
-    }
-    if (weight != NULL) {
-	psMetadataAdd (config, PS_LIST_HEAD, "WEIGHT_IMAGE", mode, "", weight);
-    }
-    if (resid != NULL) {
-	psMetadataAdd (config, PS_LIST_HEAD, "RESID_IMAGE", mode, "", resid);
-    }
-    if (region != NULL) {
-	psMetadataAdd (config, PS_LIST_HEAD, "ANALYSIS_REGION", mode, "", region);
-    }
-    if (photcode != NULL) {
-	psMetadataAdd (config, PS_LIST_HEAD, "PHOTCODE", mode, "", photcode);
-    } else {
-	psMetadataAdd (config, PS_LIST_HEAD, "PHOTCODE", mode, "", "NONE");
-    }    
-    if (psffile != NULL) {
-	psMetadataAdd (config, PS_LIST_HEAD, "PSF_INPUT_FILE", mode, "", psffile);
-    }
-
-    // model related options
-    if (ModelTest) {
-	psMetadataAdd (config, PS_LIST_HEAD, "TEST_FIT", PS_DATA_BOOL, "", true);
-
-	int fmode = PS_DATA_F32 | PS_META_REPLACE;
-	psMetadataAdd (config, PS_LIST_HEAD, "TEST_FIT_X", fmode, "", ModelTest_X);
-	psMetadataAdd (config, PS_LIST_HEAD, "TEST_FIT_Y", fmode, "", ModelTest_Y);
-
-	if (model != NULL) {
-	    psMetadataAdd (config, PS_LIST_HEAD, "TEST_FIT_MODEL", mode, "", model);
-	}
-
-	if (fitmode != NULL) {
-	    psMetadataAdd (config, PS_LIST_HEAD, "TEST_FIT_MODE", mode, "", fitmode);
-	}
-	if (fitset != NULL) {
-	    psMetadataAdd (config, PS_LIST_HEAD, "TEST_FIT_SET", mode, "", fitset);
-	}
-    }
     return (config);
 }
