Example #1
0
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);
}
Example #2
0
/* 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);
}