--- /dev/null
+#include "muscle.h"\r
+#include <stdio.h>\r
+\r
+struct VALUE_OPT\r
+ {\r
+ const char *m_pstrName;\r
+ const char *m_pstrValue;\r
+ };\r
+\r
+struct FLAG_OPT\r
+ {\r
+ const char *m_pstrName;\r
+ bool m_bSet;\r
+ };\r
+\r
+static VALUE_OPT ValueOpts[] =\r
+ {\r
+ "in", 0,\r
+ "in1", 0,\r
+ "in2", 0,\r
+ "out", 0,\r
+ "MaxIters", 0,\r
+ "MaxHours", 0,\r
+ "GapOpen", 0,\r
+ "GapOpen2", 0,\r
+ "GapExtend", 0,\r
+ "GapExtend2", 0,\r
+ "GapAmbig", 0,\r
+ "Center", 0,\r
+ "SmoothScoreCeil", 0,\r
+ "MinBestColScore", 0,\r
+ "MinSmoothScore", 0,\r
+ "ObjScore", 0,\r
+ "SmoothWindow", 0,\r
+ "RefineWindow", 0,\r
+ "FromWindow", 0,\r
+ "ToWindow", 0,\r
+ "SaveWindow", 0,\r
+ "WindowOffset", 0,\r
+ "FirstWindow", 0,\r
+ "AnchorSpacing", 0,\r
+ "Log", 0,\r
+ "LogA", 0,\r
+ "MaxTrees", 0,\r
+ "SUEFF", 0,\r
+ "Distance", 0,\r
+ "Distance1", 0,\r
+ "Distance2", 0,\r
+ "Weight", 0,\r
+ "Weight1", 0,\r
+ "Weight2", 0,\r
+ "Cluster", 0,\r
+ "Cluster1", 0,\r
+ "Cluster2", 0,\r
+ "Root1", 0,\r
+ "Root2", 0,\r
+ "Tree1", 0,\r
+ "Tree2", 0,\r
+ "UseTree", 0,\r
+ "UseTree_NoWarn", 0,\r
+ "DiagLength", 0,\r
+ "DiagMargin", 0,\r
+ "DiagBreak", 0,\r
+ "Hydro", 0,\r
+ "HydroFactor", 0,\r
+ "SPScore", 0,\r
+ "SeqType", 0,\r
+ "MaxMB", 0,\r
+ "ComputeWeights", 0,\r
+ "MaxSubFam", 0,\r
+ "ScoreFile", 0,\r
+ "TermGaps", 0,\r
+ "FASTAOut", 0,\r
+ "CLWOut", 0,\r
+ "CLWStrictOut", 0,\r
+ "HTMLOut", 0,\r
+ "MSFOut", 0,\r
+ "PHYIOut", 0,\r
+ "PHYSOut", 0,\r
+ "Matrix", 0,\r
+ "DistMx1", 0,\r
+ "DistMx2", 0,\r
+ "Weight", 0,\r
+ };\r
+static int ValueOptCount = sizeof(ValueOpts)/sizeof(ValueOpts[0]);\r
+\r
+static FLAG_OPT FlagOpts[] =\r
+ {\r
+ "LE", false,\r
+ "SP", false,\r
+ "SV", false,\r
+ "SPN", false,\r
+ "Core", false,\r
+ "NoCore", false,\r
+ "Diags1", false,\r
+ "Diags2", false,\r
+ "Diags", false,\r
+ "Quiet", false,\r
+ "MSF", false,\r
+ "Verbose", false,\r
+ "Anchors", false,\r
+ "NoAnchors", false,\r
+ "Refine", false,\r
+ "RefineW", false,\r
+ "SW", false,\r
+ "Profile", false,\r
+ "PPScore", false,\r
+ "ClusterOnly", false,\r
+ "Brenner", false,\r
+ "Dimer", false,\r
+ "clw", false,\r
+ "clwstrict", false,\r
+ "HTML", false,\r
+ "Version", false,\r
+ "Stable", false,\r
+ "Group", false,\r
+ "FASTA", false,\r
+ "ProfDB", false,\r
+ "PAS", false,\r
+ "PHYI", false,\r
+ "PHYS", false,\r
+ "TomHydro", false,\r
+ "MakeTree", false,\r
+ };\r
+static int FlagOptCount = sizeof(FlagOpts)/sizeof(FlagOpts[0]);\r
+\r
+static bool TestSetFlagOpt(const char *Arg)\r
+ {\r
+ for (int i = 0; i < FlagOptCount; ++i)\r
+ if (!stricmp(Arg, FlagOpts[i].m_pstrName))\r
+ {\r
+ FlagOpts[i].m_bSet = true;\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+static bool TestSetValueOpt(const char *Arg, const char *Value)\r
+ {\r
+ for (int i = 0; i < ValueOptCount; ++i)\r
+ if (!stricmp(Arg, ValueOpts[i].m_pstrName))\r
+ {\r
+ if (0 == Value)\r
+ {\r
+ fprintf(stderr, "Option -%s must have value\n", Arg);\r
+ exit(EXIT_NotStarted);\r
+ }\r
+ ValueOpts[i].m_pstrValue = strsave(Value);\r
+ return true;\r
+ }\r
+ return false;\r
+ }\r
+\r
+bool FlagOpt(const char *Name)\r
+ {\r
+ for (int i = 0; i < FlagOptCount; ++i)\r
+ if (!stricmp(Name, FlagOpts[i].m_pstrName))\r
+ return FlagOpts[i].m_bSet;\r
+ Quit("FlagOpt(%s) invalid", Name);\r
+ return false;\r
+ }\r
+\r
+const char *ValueOpt(const char *Name)\r
+ {\r
+ for (int i = 0; i < ValueOptCount; ++i)\r
+ if (!stricmp(Name, ValueOpts[i].m_pstrName))\r
+ return ValueOpts[i].m_pstrValue;\r
+ Quit("ValueOpt(%s) invalid", Name);\r
+ return 0;\r
+ }\r
+\r
+void ProcessArgVect(int argc, char *argv[])\r
+ {\r
+ for (int iArgIndex = 0; iArgIndex < argc; )\r
+ {\r
+ const char *Arg = argv[iArgIndex];\r
+ if (Arg[0] != '-')\r
+ {\r
+ fprintf(stderr, "Command-line option \"%s\" must start with '-'\n", Arg);\r
+ exit(EXIT_NotStarted);\r
+ }\r
+ const char *ArgName = Arg + 1;\r
+ if (TestSetFlagOpt(ArgName))\r
+ {\r
+ ++iArgIndex;\r
+ continue;\r
+ }\r
+ \r
+ char *Value = 0;\r
+ if (iArgIndex < argc - 1)\r
+ Value = argv[iArgIndex+1];\r
+ if (TestSetValueOpt(ArgName, Value))\r
+ {\r
+ iArgIndex += 2;\r
+ continue;\r
+ }\r
+ fprintf(stderr, "Invalid command line option \"%s\"\n", ArgName);\r
+ Usage();\r
+ exit(EXIT_NotStarted);\r
+ }\r
+ }\r
+\r
+void ProcessArgStr(const char *ArgStr)\r
+ {\r
+ const int MAX_ARGS = 64;\r
+ char *argv[MAX_ARGS];\r
+\r
+ if (0 == ArgStr)\r
+ return;\r
+\r
+// Modifiable copy\r
+ char *StrCopy = strsave(ArgStr);\r
+\r
+ int argc = 0;\r
+ bool bInArg = false;\r
+ char *Str = StrCopy;\r
+ while (char c = *Str)\r
+ {\r
+ if (isspace(c))\r
+ {\r
+ *Str = 0;\r
+ bInArg = false;\r
+ }\r
+ else if (!bInArg)\r
+ {\r
+ bInArg = true;\r
+ if (argc >= MAX_ARGS)\r
+ Quit("Too many args in MUSCLE_CMDLINE");\r
+ argv[argc++] = Str;\r
+ }\r
+ Str++;\r
+ }\r
+ ProcessArgVect(argc, argv);\r
+ free(StrCopy);\r
+ }\r
+\r
+void ListFlagOpts()\r
+ {\r
+ for (int i = 0; i < FlagOptCount; ++i)\r
+ Log("%s %d\n", FlagOpts[i].m_pstrName, FlagOpts[i].m_bSet);\r
+ }\r