Log In | Get Help   
Home My Page Projects Code Snippets Project Openings Mareframe
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files
[mareframe] Annotation of /trunk/gadget/maininfo.cc
[mareframe] / trunk / gadget / maininfo.cc Repository:
ViewVC logotype

Annotation of /trunk/gadget/maininfo.cc

Parent Directory Parent Directory | Revision Log Revision Log


Revision 11 - (view) (download)

1 : agomez 1 #include "maininfo.h"
2 :     #include "errorhandler.h"
3 :     #include "gadget.h"
4 :     #include "runid.h"
5 :     #include "global.h"
6 :    
7 :     void MainInfo::showCorrectUsage(char* error) {
8 :     RUNID.Print(cerr);
9 :     cerr << "\nError in command line value - unrecognised option " << error << endl
10 :     << "Common options are -l or -s, -i <filename> -o <filename>\n"
11 :     << "For more information try running Gadget with the -h switch\n";
12 :     exit(EXIT_FAILURE);
13 :     }
14 :    
15 :     void MainInfo::showUsage() {
16 :     RUNID.Print(cout);
17 :     cout << "\nOptions for running Gadget:\n"
18 :     << " -l perform a likelihood (optimising) model run\n"
19 :     << " -s perform a single (simulation) model run\n"
20 :     << " -n perform a network run (using paramin)\n"
21 :     << " -v --version display version information and exit\n"
22 :     << " -h --help display this help screen and exit\n"
23 :     << "\nOptions for specifying the input to Gadget models:\n"
24 :     << " -i <filename> read model parameters from <filename>\n"
25 :     << " -opt <filename> read optimising parameters from <filename>\n"
26 :     << " -main <filename> read model information from <filename>\n"
27 :     << " (default filename is 'main')\n"
28 :     << " -m <filename> read other commandline parameters from <filename>\n"
29 :     << "\nOptions for specifying the output from Gadget models:\n"
30 :     << " -p <filename> print final model parameters to <filename>\n"
31 :     << " (default filename is 'params.out')\n"
32 :     << " -o <filename> print likelihood output to <filename>\n"
33 :     << " -print <number> print -o output every <number> iterations\n"
34 :     << " -precision <number> set the precision to <number> in output files\n"
35 :     << "\nOptions for debugging Gadget models:\n"
36 :     << " -log <filename> print logging information to <filename>\n"
37 :     << " -printinitial <filename> print initial model information to <filename>\n"
38 :     << " -printfinal <filename> print final model information to <filename>\n"
39 :     << "\nFor more information see the Gadget web page at http://www.hafro.is/gadget\n\n";
40 :     exit(EXIT_SUCCESS);
41 :     }
42 :    
43 :     MainInfo::MainInfo()
44 : ulcessvp 11 : givenOptInfo(0), givenInitialParam(0), runoptimise(0), runomp(0),
45 : agomez 1 runstochastic(0), runnetwork(0), runprint(1), forceprint(0),
46 :     printInitialInfo(0), printFinalInfo(0), printLogLevel(0), maxratio(0.95) {
47 :    
48 :     char tmpname[10];
49 :     strncpy(tmpname, "", 10);
50 :     strcpy(tmpname, "main");
51 :    
52 :     strOptInfoFile = NULL;
53 :     strInitialParamFile = NULL;
54 :     strPrintInitialFile = NULL;
55 :     strPrintFinalFile = NULL;
56 :     strMainGadgetFile = NULL;
57 :     setMainGadgetFile(tmpname);
58 :     }
59 :    
60 :     MainInfo::~MainInfo() {
61 :     if (strOptInfoFile != NULL) {
62 :     delete[] strOptInfoFile;
63 :     strOptInfoFile = NULL;
64 :     }
65 :     if (strInitialParamFile != NULL) {
66 :     delete[] strInitialParamFile;
67 :     strInitialParamFile = NULL;
68 :     }
69 :     if (strPrintInitialFile != NULL) {
70 :     delete[] strPrintInitialFile;
71 :     strPrintInitialFile = NULL;
72 :     }
73 :     if (strPrintFinalFile != NULL) {
74 :     delete[] strPrintFinalFile;
75 :     strPrintFinalFile = NULL;
76 :     }
77 :     if (strMainGadgetFile != NULL) {
78 :     delete[] strMainGadgetFile;
79 :     strMainGadgetFile = NULL;
80 :     }
81 : ulcessvp 11 if (seed != NULL) {
82 :     delete[] seed;
83 :     seed = NULL;
84 :     }
85 : agomez 1 }
86 :    
87 :     void MainInfo::read(int aNumber, char* const aVector[]) {
88 :    
89 :     if (aNumber == 1) {
90 :     handle.logMessage(LOGWARN, "Warning - no command line options specified, using default values");
91 :     return;
92 :     }
93 :    
94 : ulcessvp 11 seed = new unsigned[3];
95 :     seed[0] = 0;
96 :     seed[1] = 0;
97 :     seed[2] = 0;
98 : agomez 1 int k = 1;
99 :     while (k < aNumber) {
100 :     if (strcasecmp(aVector[k], "-l") == 0) {
101 :     runoptimise = 1;
102 :    
103 :     } else if (strcasecmp(aVector[k], "-n") == 0) {
104 :     runnetwork = 1;
105 :    
106 :     #ifndef GADGET_NETWORK
107 :     handle.logMessage(LOGFAIL, "Error - Gadget cannot currently run in network mode for paramin\nGadget must be recompiled to enable the network communication");
108 :     #endif
109 :    
110 :     } else if (strcasecmp(aVector[k], "-s") == 0) {
111 : ulcessvp 11 runstochastic = 1;
112 :     //FIXME
113 :     }else if (strcasecmp(aVector[k], "-omp") == 0) {
114 :     runomp = 1;
115 : agomez 1
116 :     } else if (strcasecmp(aVector[k], "-m") == 0) {
117 :     ifstream infile;
118 :     CommentStream incomment(infile);
119 :     if (k == aNumber - 1)
120 :     this->showCorrectUsage(aVector[k]);
121 :     k++;
122 :     infile.open(aVector[k], ios::in);
123 :     handle.checkIfFailure(infile, aVector[k]);
124 :     if (infile.fail())
125 :     this->showCorrectUsage(aVector[k]);
126 :     this->read(incomment);
127 :     infile.close();
128 :     infile.clear();
129 :    
130 :     } else if (strcasecmp(aVector[k], "-i") == 0) {
131 :     if (k == aNumber - 1)
132 :     this->showCorrectUsage(aVector[k]);
133 :     k++;
134 :     this->setInitialParamFile(aVector[k]);
135 :    
136 :     } else if (strcasecmp(aVector[k], "-o") == 0) {
137 :     if (k == aNumber - 1)
138 :     this->showCorrectUsage(aVector[k]);
139 :     k++;
140 :     printinfo.setOutputFile(aVector[k]);
141 :    
142 :     } else if (strcasecmp(aVector[k], "-p") == 0) {
143 :     if (k == aNumber - 1)
144 :     this->showCorrectUsage(aVector[k]);
145 :     k++;
146 :     printinfo.setParamOutFile(aVector[k]);
147 :    
148 :     } else if (strcasecmp(aVector[k], "-forceprint") == 0) {
149 :     forceprint = 1;
150 :    
151 :     } else if (strcasecmp(aVector[k], "-co") == 0) {
152 :     handle.logMessage(LOGFAIL, "The -co switch is no longer supported");
153 :    
154 :     } else if (strcasecmp(aVector[k], "-printinitial") == 0) {
155 :     if (k == aNumber - 1)
156 :     this->showCorrectUsage(aVector[k]);
157 :     k++;
158 :     this->setPrintInitialFile(aVector[k]);
159 :    
160 :     } else if (strcasecmp(aVector[k], "-printfinal") == 0) {
161 :     if (k == aNumber - 1)
162 :     this->showCorrectUsage(aVector[k]);
163 :     k++;
164 :     this->setPrintFinalFile(aVector[k]);
165 :    
166 :     } else if (strcasecmp(aVector[k], "-main") == 0) {
167 :     if (k == aNumber - 1)
168 :     this->showCorrectUsage(aVector[k]);
169 :     k++;
170 :     this->setMainGadgetFile(aVector[k]);
171 :    
172 :     } else if (strcasecmp(aVector[k], "-opt") == 0) {
173 :     if (k == aNumber - 1)
174 :     this->showCorrectUsage(aVector[k]);
175 :     k++;
176 :     this->setOptInfoFile(aVector[k]);
177 :    
178 :     } else if ((strcasecmp(aVector[k], "-printlikelihood") == 0) || (strcasecmp(aVector[k], "-likelihoodprint") == 0)) {
179 :     handle.logMessage(LOGFAIL, "The -printlikelihood switch is no longer supported\nSpecify a likelihoodprinter class in the model print file instead");
180 :    
181 :     } else if (strcasecmp(aVector[k], "-printlikesummary") == 0) {
182 :     handle.logMessage(LOGFAIL, "The -printlikesummary switch is no longer supported\nSpecify a likelihoodsummaryprinter class in the model print file instead");
183 :    
184 :     } else if (strcasecmp(aVector[k], "-printonelikelihood") == 0) {
185 :     handle.logMessage(LOGFAIL, "The -printonelikelihood switch is no longer supported\nSpecify a likelihoodprinter class in the model print file instead");
186 :    
187 :     } else if ((strcasecmp(aVector[k], "-print") == 0) || (strcasecmp(aVector[k], "-print1") == 0)) {
188 :     if (k == aNumber - 1)
189 :     this->showCorrectUsage(aVector[k]);
190 :     k++;
191 :     printinfo.setPrintIteration(atoi(aVector[k]));
192 :    
193 :     } else if (strcasecmp(aVector[k], "-precision") == 0) {
194 :     if (k == aNumber - 1)
195 :     this->showCorrectUsage(aVector[k]);
196 :     k++;
197 :     printinfo.setPrecision(atoi(aVector[k]));
198 :    
199 :     } else if ((strcasecmp(aVector[k], "-v") == 0) || (strcasecmp(aVector[k], "--version") == 0)) {
200 :     RUNID.Print(cout);
201 :     exit(EXIT_SUCCESS);
202 :    
203 :     } else if ((strcasecmp(aVector[k], "-h") == 0) || (strcasecmp(aVector[k], "--help") == 0)) {
204 :     this->showUsage();
205 :    
206 :     } else if (strcasecmp(aVector[k], "-log") == 0) {
207 :     if (k == aNumber - 1)
208 :     this->showCorrectUsage(aVector[k]);
209 :     k++;
210 :     handle.setLogFile(aVector[k]);
211 :     printLogLevel = 5;
212 :    
213 :     } else if (strcasecmp(aVector[k], "-nowarnings") == 0) {
214 :     //handle.logMessage(LOGWARN, "The -nowarnings switch is no longer supported\nSpecify a logging level using the -loglevel <number> instead");
215 :     printLogLevel = 1;
216 :    
217 :     } else if (strcasecmp(aVector[k], "-loglevel") == 0) {
218 :     if (k == aNumber - 1)
219 :     this->showCorrectUsage(aVector[k]);
220 :     k++;
221 :     printLogLevel = atoi(aVector[k]);
222 :    
223 :     } else if (strcasecmp(aVector[k], "-noprint") == 0) {
224 :     //JMB disable model printing from the commandline
225 :     runprint = 0;
226 :    
227 :     } else if (strcasecmp(aVector[k], "-seed") == 0) {
228 :     //JMB experimental setting of random number seed from the commandline
229 :     //if the "seed" is also specified in the optinfo file then that will override
230 :     //any seed that is specified on the commandline
231 :     if (k == aNumber - 1)
232 :     this->showCorrectUsage(aVector[k]);
233 :     k++;
234 : ulcessvp 11 seed[0] = atoi(aVector[k]);
235 :     srand(seed[0]);
236 :     //FIXME
237 :     } else if (strcasecmp(aVector[k], "-seedM") == 0) {
238 :     //JMB experimental setting of random number seed from the commandline
239 :     //if the "seed" is also specified in the optinfo file then that will override
240 :     //any seed that is specified on the commandline
241 :     if (k == aNumber - 1)
242 :     this->showCorrectUsage(aVector[k]);
243 :     k++;
244 :     seed[1] = atoi(aVector[k]);
245 : agomez 1
246 : ulcessvp 11 } else if (strcasecmp(aVector[k], "-seedP") == 0) {
247 :     //JMB experimental setting of random number seed from the commandline
248 :     //if the "seed" is also specified in the optinfo file then that will override
249 :     //any seed that is specified on the commandline
250 :     if (k == aNumber - 1)
251 :     this->showCorrectUsage(aVector[k]);
252 :     k++;
253 :     seed[2] = atoi(aVector[k]);
254 :    
255 : agomez 1 } else if (strcasecmp(aVector[k], "-maxratio") == 0) {
256 :     //JMB experimental setting of maximum ratio of stock consumed in one timestep
257 :     if (k == aNumber - 1)
258 :     this->showCorrectUsage(aVector[k]);
259 :     k++;
260 :     maxratio = atof(aVector[k]);
261 :    
262 :     } else
263 :     this->showCorrectUsage(aVector[k]);
264 :    
265 :     k++;
266 :     }
267 : ulcessvp 11
268 :     if (seed[0] == 0) {
269 :     seed[0] = unsigned(time(NULL));
270 :     if (seed[1] == 0)
271 :     seed[1] = unsigned(time(NULL));
272 :     if (seed[2] == 0)
273 :     seed[2] = unsigned(time(NULL));
274 :     } else {
275 :     if (seed[1] == 0)
276 :     seed[1] = seed[0];
277 :     if (seed[2] == 0)
278 :     seed[2] = seed[0];
279 :     }
280 :    
281 :    
282 :    
283 :    
284 : agomez 1 }
285 :    
286 :     void MainInfo::checkUsage(const char* const inputdir, const char* const workingdir) {
287 :     int check = 0;
288 :     if (runnetwork)
289 :     check = max(0, printLogLevel);
290 :     else if (runstochastic)
291 :     check = max(3, printLogLevel);
292 :     else
293 :     check = max(2, printLogLevel);
294 :     handle.setLogLevel(check);
295 :    
296 :     //JMB dont print output if doing a network run
297 :     if (!runnetwork)
298 :     RUNID.Print(cout);
299 :     handle.logMessage(LOGINFO, "Starting Gadget from directory:", workingdir);
300 :     handle.logMessage(LOGINFO, "using data from directory:", inputdir);
301 :     handle.logMessage(LOGMESSAGE, ""); //write a blank line to the log file
302 :     if (strcasecmp(inputdir, workingdir) != 0)
303 :     handle.logMessage(LOGWARN, "Warning - working directory different from input directory");
304 :    
305 :     if (runnetwork) {
306 :     handle.logMessage(LOGINFO, "\n** Gadget running in network mode for Paramin **");
307 :     if (printInitialInfo) {
308 :     handle.logMessage(LOGINFO, "Warning - cannot print initial model information");
309 :     printInitialInfo = 0;
310 :     }
311 :     if (printFinalInfo) {
312 :     handle.logMessage(LOGINFO, "Warning - cannot print final model information");
313 :     printFinalInfo = 0;
314 :     }
315 :     }
316 :    
317 :     //JMB check to see if we can actually open required files ...
318 :     ifstream tmpin;
319 :     if (chdir(inputdir) != 0)
320 :     handle.logMessage(LOGFAIL, "Error - failed to change input directory to", inputdir);
321 :     if (givenInitialParam) {
322 :     //JMB check to see that the input and output filenames are different
323 :     //Otherwise Gadget will over-write the inputfile with a blank outputfile ...
324 :     if (strcasecmp(strInitialParamFile, printinfo.getParamOutFile()) == 0)
325 :     handle.logFileMessage(LOGFAIL, "the parameter input and output filenames are the same");
326 :    
327 :     tmpin.open(strInitialParamFile, ios::in);
328 :     handle.checkIfFailure(tmpin, strInitialParamFile);
329 :     tmpin.close();
330 :     tmpin.clear();
331 :     }
332 :     if (givenOptInfo) {
333 :     tmpin.open(strOptInfoFile, ios::in);
334 :     handle.checkIfFailure(tmpin, strOptInfoFile);
335 :     tmpin.close();
336 :     tmpin.clear();
337 :     }
338 :     ofstream tmpout;
339 :     if (chdir(workingdir) != 0)
340 :     handle.logMessage(LOGFAIL, "Error - failed to change working directory to", workingdir);
341 :     if (printInitialInfo) {
342 :     tmpout.open(strPrintInitialFile, ios::out);
343 :     handle.checkIfFailure(tmpout, strPrintInitialFile);
344 :     tmpout.close();
345 :     tmpout.clear();
346 :     }
347 :     if (printFinalInfo) {
348 :     tmpout.open(strPrintFinalFile, ios::out);
349 :     handle.checkIfFailure(tmpout, strPrintFinalFile);
350 :     tmpout.close();
351 :     tmpout.clear();
352 :     }
353 :     printinfo.checkPrintInfo(runnetwork);
354 :    
355 :     //JMB check the value of maxratio
356 :     if ((maxratio < rathersmall) || (maxratio > 1.0)) {
357 :     handle.logMessage(LOGWARN, "Warning - value of maxratio outside bounds", maxratio);
358 :     maxratio = 0.95;
359 :     }
360 :    
361 :     if ((!runstochastic) && (runnetwork)) {
362 :     handle.logMessage(LOGWARN, "\nWarning - Gadget for the paramin network should be used with -s option\nGadget will now set the -s switch to perform a simulation run");
363 :     runstochastic = 1;
364 :     }
365 :    
366 :     if ((runstochastic) && (runoptimise)) {
367 :     handle.logMessage(LOGWARN, "\nWarning - Gadget has been started with both the -s switch and the -l switch\nHowever, it is not possible to do both a simulation run and a likelihood run!\nGadget will perform only the simulation run (and ignore the -l switch)");
368 :     runoptimise = 0;
369 :     }
370 :    
371 :     if ((!runstochastic) && (!runoptimise)) {
372 :     handle.logMessage(LOGWARN, "\nWarning - Gadget has been started without either the -s switch or the -l switch\nGadget will now set the -s switch to perform a simulation run");
373 :     runstochastic = 1;
374 :     }
375 :    
376 :     handle.setRunOptimise(runoptimise);
377 :     if ((printLogLevel == 1) && (!runoptimise))
378 :     handle.logMessage(LOGWARN, "\n** Gadget cannot disable warnings for a simulation run **");
379 :    
380 :     if ((handle.checkLogFile()) && (runoptimise) && (printLogLevel >= 5))
381 :     handle.logMessage(LOGWARN, "\n** logging model information from a Gadget optimisation is not recommended **");
382 :    
383 :     if ((handle.checkLogFile()) && (runnetwork))
384 :     handle.logMessage(LOGWARN, "\n** logging model information from a Gadget network run is not recommended **");
385 :    
386 :     //check the printing options
387 :     if (forceprint)
388 :     handle.logMessage(LOGMESSAGE, "\nPrinting model output has been enabled from the command line");
389 :     if (!runprint)
390 :     handle.logMessage(LOGMESSAGE, "\nPrinting model output has been disabled from the command line");
391 :    
392 :     check = runprint;
393 :     if (runnetwork)
394 :     check = 0;
395 :     else if ((runoptimise) && (!forceprint))
396 :     check = 0;
397 :     runprint = check;
398 :    
399 :     handle.logMessage(LOGMESSAGE, ""); //write blank line to log file
400 :     }
401 :    
402 :     void MainInfo::read(CommentStream& infile) {
403 :     int dummy = 0;
404 :     char text[MaxStrLength];
405 :     strncpy(text, "", MaxStrLength);
406 :     infile >> ws;
407 :     while (!infile.eof()) {
408 :     infile >> text >> ws;
409 :    
410 :     if (strcasecmp(text, "-i") == 0) {
411 :     infile >> text >> ws;
412 :     this->setInitialParamFile(text);
413 :     } else if (strcasecmp(text, "-o") == 0) {
414 :     infile >> text >> ws;
415 :     printinfo.setOutputFile(text);
416 :     } else if (strcasecmp(text, "-co") == 0) {
417 :     handle.logMessage(LOGFAIL, "The -co switch is no longer supported");
418 :     } else if (strcasecmp(text, "-p") == 0) {
419 :     infile >> text >> ws;
420 :     printinfo.setParamOutFile(text);
421 :     } else if (strcasecmp(text, "-main") == 0) {
422 :     infile >> text >> ws;
423 :     this->setMainGadgetFile(text);
424 :     } else if (strcasecmp(text, "-printinitial") == 0) {
425 :     infile >> text >> ws;
426 :     this->setPrintInitialFile(text);
427 :     } else if (strcasecmp(text, "-printfinal") == 0) {
428 :     infile >> text >> ws;
429 :     this->setPrintFinalFile(text);
430 :     } else if (strcasecmp(text, "-opt") == 0) {
431 :     infile >> text >> ws;
432 :     this->setOptInfoFile(text);
433 :     } else if (strcasecmp(text, "-forceprint") == 0) {
434 :     forceprint = 1;
435 :     } else if (strcasecmp(text, "-noprint") == 0) {
436 :     runprint = 0;
437 :     } else if ((strcasecmp(text, "-print") == 0) || (strcasecmp(text, "-print1") == 0)) {
438 :     infile >> dummy >> ws;
439 :     printinfo.setPrintIteration(dummy);
440 :     } else if (strcasecmp(text, "-precision") == 0) {
441 :     infile >> dummy >> ws;
442 :     printinfo.setPrecision(dummy);
443 :     } else if (strcasecmp(text, "-log") == 0) {
444 :     infile >> text >> ws;
445 :     handle.setLogFile(text);
446 :     printLogLevel = 5;
447 :     } else if (strcasecmp(text, "-nowarnings") == 0) {
448 :     printLogLevel = 1;
449 :     } else if (strcasecmp(text, "-loglevel") == 0) {
450 :     infile >> printLogLevel >> ws;
451 :     } else if (strcasecmp(text, "-seed") == 0) {
452 :     infile >> dummy >> ws;
453 :     srand(dummy);
454 :     } else if (strcasecmp(text, "-maxratio") == 0) {
455 :     infile >> maxratio >> ws;
456 :     } else if (strcasecmp(text, "-printlikesummary") == 0) {
457 :     handle.logMessage(LOGWARN, "The -printlikesummary switch is no longer supported\nSpecify a likelihoodsummaryprinter class in the model print file instead");
458 :     } else if (strcasecmp(text, "-printlikelihood") == 0) {
459 :     handle.logMessage(LOGWARN, "The -printlikelihood switch is no longer supported\nSpecify a likelihoodprinter class in the model print file instead");
460 :     } else if (strcasecmp(text, "-printonelikelihood") == 0) {
461 :     handle.logMessage(LOGWARN, "The -printonelikelihood switch is no longer supported\nSpecify a likelihoodprinter class in the model print file instead");
462 :     } else
463 :     this->showCorrectUsage(text);
464 :     }
465 :     }
466 :    
467 :     void MainInfo::setPrintInitialFile(char* filename) {
468 :     if (strPrintInitialFile != NULL) {
469 :     delete[] strPrintInitialFile;
470 :     strPrintInitialFile = NULL;
471 :     }
472 :     strPrintInitialFile = new char[strlen(filename) + 1];
473 :     strcpy(strPrintInitialFile, filename);
474 :     printInitialInfo = 1;
475 :     }
476 :    
477 :     void MainInfo::setPrintFinalFile(char* filename) {
478 :     if (strPrintFinalFile != NULL) {
479 :     delete[] strPrintFinalFile;
480 :     strPrintFinalFile = NULL;
481 :     }
482 :     strPrintFinalFile = new char[strlen(filename) + 1];
483 :     strcpy(strPrintFinalFile, filename);
484 :     printFinalInfo = 1;
485 :     }
486 :    
487 :     void MainInfo::setMainGadgetFile(char* filename) {
488 :     if (strMainGadgetFile != NULL) {
489 :     delete[] strMainGadgetFile;
490 :     strMainGadgetFile = NULL;
491 :     }
492 :     strMainGadgetFile = new char[strlen(filename) + 1];
493 :     strcpy(strMainGadgetFile, filename);
494 :     }
495 :    
496 :     void MainInfo::setInitialParamFile(char* filename) {
497 :     if (strInitialParamFile != NULL) {
498 :     delete[] strInitialParamFile;
499 :     strInitialParamFile = NULL;
500 :     }
501 :     strInitialParamFile = new char[strlen(filename) + 1];
502 :     strcpy(strInitialParamFile, filename);
503 :     givenInitialParam = 1;
504 :     }
505 :    
506 :     void MainInfo::setOptInfoFile(char* filename) {
507 :     if (strOptInfoFile != NULL) {
508 :     delete[] strOptInfoFile;
509 :     strOptInfoFile = NULL;
510 :     }
511 :     strOptInfoFile = new char[strlen(filename) + 1];
512 :     strcpy(strOptInfoFile, filename);
513 :     givenOptInfo = 1;
514 :     }

root@forge.cesga.es
ViewVC Help
Powered by ViewVC 1.0.0  

Powered By FusionForge