JAL-629 --substitutions --nosubstitutions flags, --nil[{++n}] just in case needed
[jalview.git] / src / jalview / bin / ArgParser.java
index 77b3e87..dfd3457 100644 (file)
@@ -42,8 +42,11 @@ public class ArgParser
 
   private static final String NEGATESTRING = "no";
 
-  // the linked id used for no id (not even square braces)
-  private static final String DEFAULTLINKEDID = "";
+  // the default linked id prefix used for no id (not even square braces)
+  private static final String DEFAULTLINKEDIDPREFIX = "JALVIEW:";
+
+  // the counter added to the default linked id prefix
+  private int defaultLinkedIdCounter = 0;
 
   // the linked id used to increment the idCounter (and use the incremented
   // value)
@@ -54,10 +57,14 @@ public class ArgParser
 
   private int idCounter = 0;
 
+  // flag to say whether {n} subtitutions in output filenames should be made.
+  // Turn on and off with --subs and --nosubs
+  private boolean substitutions = false;
+
   private static enum Opt
   {
     BOOLEAN, STRING, UNARY, MULTI, LINKED, NODUPLICATEVALUES, BOOTSTRAP,
-    GLOB
+    GLOB, NOACTION
   }
 
   public enum Arg
@@ -76,7 +83,7 @@ public class ArgParser
     VSESS, OUTPUT, OUTPUTTYPE, SSANNOTATION, NOTEMPFAC, TEMPFAC,
     TEMPFAC_LABEL, TEMPFAC_DESC, TEMPFAC_SHADING, TITLE, PAEMATRIX, WRAP,
     NOSTRUCTURE, STRUCTURE, IMAGE, QUIT, CLOSE, DEBUG("d"), QUIET("q"),
-    ARGFILE;
+    ARGFILE, INCREMENT, NPP("n++"), SUBSTITUTIONS, NIL;
 
     static
     {
@@ -132,11 +139,14 @@ public class ArgParser
       DEBUG.setOptions(Opt.BOOLEAN, Opt.BOOTSTRAP);
       QUIET.setOptions(Opt.UNARY, Opt.MULTI, Opt.BOOTSTRAP);
       ARGFILE.setOptions(Opt.STRING, Opt.MULTI, Opt.BOOTSTRAP, Opt.GLOB);
+      INCREMENT.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
+      NPP.setOptions(Opt.UNARY, Opt.MULTI, Opt.NOACTION);
+      SUBSTITUTIONS.setOptions(Opt.BOOLEAN, Opt.MULTI, Opt.NOACTION);
+      NIL.setOptions(Opt.UNARY, Opt.LINKED, Opt.MULTI, Opt.NOACTION);
       // BOOTSTRAP args are parsed before a full parse of arguments and
       // so are accessible at an earlier stage to (e.g.) set debug log level,
       // provide a props file (that might set log level), run headlessly, read
       // an argfile instead of other args.
-
     }
 
     private final String[] argNames;
@@ -579,13 +589,34 @@ public class ArgParser
           }
         }
 
+        // make NOACTION adjustments
+        // default and auto counter increments
+        if (a == Arg.INCREMENT)
+        {
+          defaultLinkedIdCounter++;
+        }
+        else if (a == Arg.NPP)
+        {
+          idCounter++;
+        }
+        else if (a == Arg.SUBSTITUTIONS)
+        {
+          substitutions = !negated;
+        }
+
         String autoCounterString = null;
+        boolean usingAutoCounterLinkedId = false;
+        String defaultLinkedId = new StringBuilder(DEFAULTLINKEDIDPREFIX)
+                .append(Integer.toString(defaultLinkedIdCounter))
+                .toString();
+        boolean usingDefaultLinkedId = false;
         if (a.hasOption(Opt.LINKED))
         {
           if (linkedId == null)
           {
             // use default linkedId for linked arguments
-            linkedId = DEFAULTLINKEDID;
+            linkedId = defaultLinkedId;
+            usingDefaultLinkedId = true;
             Console.debug(
                     "Changing linkedId to '" + linkedId + "' from " + arg);
           }
@@ -594,6 +625,7 @@ public class ArgParser
             // turn {n} to the autoCounter
             autoCounterString = Integer.toString(idCounter);
             linkedId = autoCounterString;
+            usingAutoCounterLinkedId = true;
             Console.debug(
                     "Changing linkedId to '" + linkedId + "' from " + arg);
           }
@@ -602,6 +634,7 @@ public class ArgParser
             // turn {++n} to the incremented autoCounter
             autoCounterString = Integer.toString(++idCounter);
             linkedId = autoCounterString;
+            usingAutoCounterLinkedId = true;
             Console.debug(
                     "Changing linkedId to '" + linkedId + "' from " + arg);
           }
@@ -610,6 +643,10 @@ public class ArgParser
         if (!linkedArgs.containsKey(linkedId))
           linkedArgs.put(linkedId, new ArgValuesMap());
 
+        // do not continue for NOACTION args
+        if (a.hasOption(Opt.NOACTION))
+          continue;
+
         ArgValuesMap avm = linkedArgs.get(linkedId);
 
         // not dealing with both NODUPLICATEVALUES and GLOB
@@ -665,7 +702,7 @@ public class ArgParser
         {
           // allow a default linked id for single usage
           if (linkedId == null)
-            linkedId = DEFAULTLINKEDID;
+            linkedId = defaultLinkedId;
           // store the order of linkedIds
           if (linkedOrder == null)
             linkedOrder = new ArrayList<>();