static void ParseArgv(int argc, char **argv, char **input_path, char **output_path, char **dictionary_path, int *force, int *quality, int *decompress, int *repeat, int *verbose, int *lgwin) { int k; *force = 0; *input_path = 0; *output_path = 0; *repeat = 1; *verbose = 0; *lgwin = 22; { size_t argv0_len = strlen(argv[0]); *decompress = argv0_len >= 5 && strcmp(&argv[0][argv0_len - 5], "unbro") == 0; } for (k = 1; k < argc; ++k) { if (!strcmp("--force", argv[k]) || !strcmp("-f", argv[k])) { if (*force != 0) { goto error; } *force = 1; continue; } else if (!strcmp("--decompress", argv[k]) || !strcmp("--uncompress", argv[k]) || !strcmp("-d", argv[k])) { *decompress = 1; continue; } else if (!strcmp("--verbose", argv[k]) || !strcmp("-v", argv[k])) { if (*verbose != 0) { goto error; } *verbose = 1; continue; } if (k < argc - 1) { if (!strcmp("--input", argv[k]) || !strcmp("--in", argv[k]) || !strcmp("-i", argv[k])) { if (*input_path != 0) { goto error; } *input_path = argv[k + 1]; ++k; continue; } else if (!strcmp("--output", argv[k]) || !strcmp("--out", argv[k]) || !strcmp("-o", argv[k])) { if (*output_path != 0) { goto error; } *output_path = argv[k + 1]; ++k; continue; } else if (!strcmp("--custom-dictionary", argv[k])) { if (*dictionary_path != 0) { goto error; } *dictionary_path = argv[k + 1]; ++k; continue; } else if (!strcmp("--quality", argv[k]) || !strcmp("-q", argv[k])) { if (!ParseQuality(argv[k + 1], quality)) { goto error; } ++k; continue; } else if (!strcmp("--repeat", argv[k]) || !strcmp("-r", argv[k])) { if (!ParseQuality(argv[k + 1], repeat)) { goto error; } ++k; continue; } else if (!strcmp("--window", argv[k]) || !strcmp("-w", argv[k])) { if (!ParseQuality(argv[k + 1], lgwin)) { goto error; } if (*lgwin < 10 || *lgwin >= 25) { goto error; } ++k; continue; } } goto error; } return; error: fprintf(stderr, "Usage: %s [--force] [--quality n] [--decompress]" " [--input filename] [--output filename] [--repeat iters]" " [--verbose] [--window n] [--custom-dictionary filename]\n", argv[0]); exit(1); }
/* load a description from a file */ PMSDESCRIPTION LoadSiteDescription(const char *Filename) { int error; /* non-zero if error occurred */ int foundPattern; /* non-zero if pattern found */ int foundScoring; /* non-zero if scoring parameters found*/ int foundQuality; /* non-zero if quality filter found */ PMSDESCRIPTION pDescription; /* site description to be loaded */ xmlDocPtr pXMLDocument; /* the XML document in the file */ xmlNode *pNode; /* current node in XML document */ /* parse XML file */ xmlInitParser(); pXMLDocument=xmlParseFile(Filename); if (!pXMLDocument) { fprintf(stderr,"Could not parse site description file!\n"); return(NULL); } /* get memory for site description */ pDescription=(PMSDESCRIPTION)malloc(sizeof(MSDESCRIPTION)); if (!pDescription) { fprintf(stderr,"Could not allocate memory for site description!\n"); xmlFreeDoc(pXMLDocument); xmlCleanupParser(); return(NULL); } pDescription->Length=0; pDescription->Sequence=NULL; pDescription->RepeatBasePosition=-1; pDescription->Minimal5Flank=5; pDescription->Minimal3Flank=5; pDescription->MaximalMismatch=10; pDescription->MaxMismatch5Req=1; pDescription->MaxMismatch3Req=1; pDescription->CutoffForNs=20; pDescription->MaximumNs=30; error=0; do { /* region of controlled exit */ for(pNode=xmlDocGetRootElement(pXMLDocument);pNode;pNode=pNode->next) if (pNode->type==XML_ELEMENT_NODE && !strcmp((const char*)pNode->name,"SiteDescription")) break; if (!pNode) { fprintf(stderr,"Could not find <SiteDescription> in description file!\n"); error=1; break; } foundPattern=0; foundScoring=0; foundQuality=0; for(pNode=pNode->children;pNode;pNode=pNode->next) { if (pNode->type != XML_ELEMENT_NODE) continue; if (!strcmp((const char*)pNode->name,"Pattern")) { if (foundPattern) { fprintf(stderr,"Site description contains two patterns!\n"); error=1; break; } foundPattern=1; error=ParsePatterns(pDescription,pNode); } if (!strcmp((const char*)pNode->name,"ScoringRules")) { if (foundScoring) { fprintf(stderr,"Site description contains two scoring parameter " "sets!\n"); error=1; break; } foundScoring=1; error=ParseScoring(pDescription,pNode); } if (!strcmp((const char*)pNode->name,"QualityFilter")) { if (foundQuality) { fprintf(stderr,"Site description contains two quality filter " "parameter sets!\n"); error=1; break; } foundQuality=1; error=ParseQuality(pDescription,pNode); } if (error) break; } if (!foundPattern) { fprintf(stderr,"Site description does not contain a pattern!\n"); error=1; break; } if (pDescription->RepeatBasePosition<pDescription->Minimal5Flank) { fprintf(stderr,"5' flank is shorter than requested minimal 5' flank " "length!\n"); error=1; break; } if (pDescription->Length-pDescription->RepeatBasePosition-1 <pDescription->Minimal3Flank) { fprintf(stderr,"3' flank is shorter than requested minimal 3' flank " "length!\n"); error=1; break; } } while(0); /* end of region of controlled exit */ xmlFreeDoc(pXMLDocument); xmlCleanupParser(); if (error) DestroySiteDescription(&pDescription); return(pDescription); }