Next version of JABA
[jabaws.git] / binaries / src / muscle / options.cpp
1 #include "muscle.h"\r
2 #include <stdio.h>\r
3 \r
4 struct VALUE_OPT\r
5         {\r
6         const char *m_pstrName;\r
7         const char *m_pstrValue;\r
8         };\r
9 \r
10 struct FLAG_OPT\r
11         {\r
12         const char *m_pstrName;\r
13         bool m_bSet;\r
14         };\r
15 \r
16 static VALUE_OPT ValueOpts[] =\r
17         {\r
18         "in",                           0,\r
19         "in1",                          0,\r
20         "in2",                          0,\r
21         "out",                          0,\r
22         "MaxIters",                     0,\r
23         "MaxHours",                     0,\r
24         "GapOpen",                      0,\r
25         "GapOpen2",                     0,\r
26         "GapExtend",            0,\r
27         "GapExtend2",           0,\r
28         "GapAmbig",                     0,\r
29         "Center",                       0,\r
30         "SmoothScoreCeil",      0,\r
31         "MinBestColScore",      0,\r
32         "MinSmoothScore",       0,\r
33         "ObjScore",                     0,\r
34         "SmoothWindow",         0,\r
35         "RefineWindow",         0,\r
36         "FromWindow",           0,\r
37         "ToWindow",                     0,\r
38         "SaveWindow",           0,\r
39         "WindowOffset",         0,\r
40         "FirstWindow",          0,\r
41         "AnchorSpacing",        0,\r
42         "Log",                          0,\r
43         "LogA",                         0,\r
44         "MaxTrees",                     0,\r
45         "SUEFF",                        0,\r
46         "Distance",                     0,\r
47         "Distance1",            0,\r
48         "Distance2",            0,\r
49         "Weight",                       0,\r
50         "Weight1",                      0,\r
51         "Weight2",                      0,\r
52         "Cluster",                      0,\r
53         "Cluster1",                     0,\r
54         "Cluster2",                     0,\r
55         "Root1",                        0,\r
56         "Root2",                        0,\r
57         "Tree1",                        0,\r
58         "Tree2",                        0,\r
59         "UseTree",                      0,\r
60         "UseTree_NoWarn",       0,\r
61         "DiagLength",           0,\r
62         "DiagMargin",           0,\r
63         "DiagBreak",            0,\r
64         "Hydro",                        0,\r
65         "HydroFactor",          0,\r
66         "SPScore",                      0,\r
67         "SeqType",                      0,\r
68         "MaxMB",                        0,\r
69         "ComputeWeights",       0,\r
70         "MaxSubFam",            0,\r
71         "ScoreFile",            0,\r
72         "TermGaps",                     0,\r
73         "FASTAOut",                     0,\r
74         "CLWOut",                       0,\r
75         "CLWStrictOut",         0,\r
76         "HTMLOut",                      0,\r
77         "MSFOut",                       0,\r
78         "PHYIOut",                      0,\r
79         "PHYSOut",                      0,\r
80         "Matrix",                       0,\r
81         "DistMx1",                      0,\r
82         "DistMx2",                      0,\r
83         "Weight",                       0,\r
84         };\r
85 static int ValueOptCount = sizeof(ValueOpts)/sizeof(ValueOpts[0]);\r
86 \r
87 static FLAG_OPT FlagOpts[] =\r
88         {\r
89         "LE",                                   false,\r
90         "SP",                                   false,\r
91         "SV",                                   false,\r
92         "SPN",                                  false,\r
93         "Core",                                 false,\r
94         "NoCore",                               false,\r
95         "Diags1",                               false,\r
96         "Diags2",                               false,\r
97         "Diags",                                false,\r
98         "Quiet",                                false,\r
99         "MSF",                                  false,\r
100         "Verbose",                              false,\r
101         "Anchors",                              false,\r
102         "NoAnchors",                    false,\r
103         "Refine",                               false,\r
104         "RefineW",                              false,\r
105         "SW",                                   false,\r
106         "Profile",                              false,\r
107         "PPScore",                              false,\r
108         "ClusterOnly",                  false,\r
109         "Brenner",                              false,\r
110         "Dimer",                                false,\r
111         "clw",                                  false,\r
112         "clwstrict",                    false,\r
113         "HTML",                                 false,\r
114         "Version",                              false,\r
115         "Stable",                               false,\r
116         "Group",                                false,\r
117         "FASTA",                                false,\r
118         "ProfDB",                               false,\r
119         "PAS",                                  false,\r
120         "PHYI",                                 false,\r
121         "PHYS",                                 false,\r
122         "TomHydro",                             false,\r
123         "MakeTree",                             false,\r
124         };\r
125 static int FlagOptCount = sizeof(FlagOpts)/sizeof(FlagOpts[0]);\r
126 \r
127 static bool TestSetFlagOpt(const char *Arg)\r
128         {\r
129         for (int i = 0; i < FlagOptCount; ++i)\r
130                 if (!stricmp(Arg, FlagOpts[i].m_pstrName))\r
131                         {\r
132                         FlagOpts[i].m_bSet = true;\r
133                         return true;\r
134                         }\r
135         return false;\r
136         }\r
137 \r
138 static bool TestSetValueOpt(const char *Arg, const char *Value)\r
139         {\r
140         for (int i = 0; i < ValueOptCount; ++i)\r
141                 if (!stricmp(Arg, ValueOpts[i].m_pstrName))\r
142                         {\r
143                         if (0 == Value)\r
144                                 {\r
145                                 fprintf(stderr, "Option -%s must have value\n", Arg);\r
146                                 exit(EXIT_NotStarted);\r
147                                 }\r
148                         ValueOpts[i].m_pstrValue = strsave(Value);\r
149                         return true;\r
150                         }\r
151         return false;\r
152         }\r
153 \r
154 bool FlagOpt(const char *Name)\r
155         {\r
156         for (int i = 0; i < FlagOptCount; ++i)\r
157                 if (!stricmp(Name, FlagOpts[i].m_pstrName))\r
158                         return FlagOpts[i].m_bSet;\r
159         Quit("FlagOpt(%s) invalid", Name);\r
160         return false;\r
161         }\r
162 \r
163 const char *ValueOpt(const char *Name)\r
164         {\r
165         for (int i = 0; i < ValueOptCount; ++i)\r
166                 if (!stricmp(Name, ValueOpts[i].m_pstrName))\r
167                         return ValueOpts[i].m_pstrValue;\r
168         Quit("ValueOpt(%s) invalid", Name);\r
169         return 0;\r
170         }\r
171 \r
172 void ProcessArgVect(int argc, char *argv[])\r
173         {\r
174         for (int iArgIndex = 0; iArgIndex < argc; )\r
175                 {\r
176                 const char *Arg = argv[iArgIndex];\r
177                 if (Arg[0] != '-')\r
178                         {\r
179                         fprintf(stderr, "Command-line option \"%s\" must start with '-'\n", Arg);\r
180                         exit(EXIT_NotStarted);\r
181                         }\r
182                 const char *ArgName = Arg + 1;\r
183                 if (TestSetFlagOpt(ArgName))\r
184                         {\r
185                         ++iArgIndex;\r
186                         continue;\r
187                         }\r
188                 \r
189                 char *Value = 0;\r
190                 if (iArgIndex < argc - 1)\r
191                         Value = argv[iArgIndex+1];\r
192                 if (TestSetValueOpt(ArgName, Value))\r
193                         {\r
194                         iArgIndex += 2;\r
195                         continue;\r
196                         }\r
197                 fprintf(stderr, "Invalid command line option \"%s\"\n", ArgName);\r
198                 Usage();\r
199                 exit(EXIT_NotStarted);\r
200                 }\r
201         }\r
202 \r
203 void ProcessArgStr(const char *ArgStr)\r
204         {\r
205         const int MAX_ARGS = 64;\r
206         char *argv[MAX_ARGS];\r
207 \r
208         if (0 == ArgStr)\r
209                 return;\r
210 \r
211 // Modifiable copy\r
212         char *StrCopy = strsave(ArgStr);\r
213 \r
214         int argc = 0;\r
215         bool bInArg = false;\r
216         char *Str = StrCopy;\r
217         while (char c = *Str)\r
218                 {\r
219                 if (isspace(c))\r
220                         {\r
221                         *Str = 0;\r
222                         bInArg = false;\r
223                         }\r
224                 else if (!bInArg)\r
225                         {\r
226                         bInArg = true;\r
227                         if (argc >= MAX_ARGS)\r
228                                 Quit("Too many args in MUSCLE_CMDLINE");\r
229                         argv[argc++] = Str;\r
230                         }\r
231                 Str++;\r
232                 }\r
233         ProcessArgVect(argc, argv);\r
234         free(StrCopy);\r
235         }\r
236 \r
237 void ListFlagOpts()\r
238         {\r
239         for (int i = 0; i < FlagOptCount; ++i)\r
240                 Log("%s %d\n", FlagOpts[i].m_pstrName, FlagOpts[i].m_bSet);\r
241         }\r