Skip to main content
  • Home
  • Development
  • Documentation
  • Donate
  • Operational login
  • Browse the archive

swh logo
SoftwareHeritage
Software
Heritage
Archive
Features
  • Search

  • Downloads

  • Save code now

  • Add forge now

  • Help

Revision e6a0334445b5755bb52a0d2209120ee4e251e7b4 authored by Joao Sollari Lopes on 13 November 2017, 18:32:56 UTC, committed by Joao Sollari Lopes on 13 November 2017, 18:32:56 UTC
First commit
0 parent
  • Files
  • Changes
  • af1b4d8
  • /
  • src
  • /
  • interface.c
Raw File Download

To reference or cite the objects present in the Software Heritage archive, permalinks based on SoftWare Hash IDentifiers (SWHIDs) must be used.
Select below a type of object currently browsed in order to display its associated SWHID and permalink.

  • revision
  • directory
  • content
revision badge
swh:1:rev:e6a0334445b5755bb52a0d2209120ee4e251e7b4
directory badge
swh:1:dir:a574a6b710136758a352d12c14eaa4a6f2cefb24
content badge
swh:1:cnt:bb788c2642a0949f0e3896a80822ee8e6e949e45

This interface enables to generate software citations, provided that the root directory of browsed objects contains a citation.cff or codemeta.json file.
Select below a type of object currently browsed in order to generate citations for them.

  • revision
  • directory
  • content
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
Generate software citation in BibTex format (requires biblatex-software package)
Generating citation ...
interface.c
/*
	@author:	joao lopes
	@workplace: Reading University
	@date: 		12th May 2009
*/
#include "interface.h"

/*
	Presents the main menu to user

*/
void mainMenu();

/*
	Simulates data sets

	@return errors
*/
int simulate();

/*
	Run the ABC algorithm

	@return errors
*/
int runAbc();

/*
	Presents the customize ABC menu to user

*/
void customMenu();

/*
	Run the simulation step of ABC algorithm

	@return errors
*/
int runabc1();

/*
	Run the rejection step of ABC algorithm

	@return errors
*/
int runabc2();

/*
	Check for suitability of performing the regression step of ABC Algorithm

	@return errors
*/
int runabc3();

/*
	Presents the tools menu to user

*/
void toolsMenu();

/*
	Build a prior file (.prs)

	@return errors
*/
int buildprior();

/*
	Check if a population still exists
	
	@arg avlpop list of all available populations
	@pop population which existence should be checked
	@size number of existing populations
	
	@return int (0 - if pop doesn't exist; 1 - if pop exists) 
*/
int exists(int *avlpop,int pop, int size);

/*
	Take out a pop from the list of available pop
	
	@arg avlpop list of all available populations
	@pop population to be taken out
	@size number of existing populations
	
	@return updated list of the available pop 
*/
int *takeout(int *avlpop,int pop,int size);

/*
	Build a summary statistics set file (.sst)

	@return errors
*/
int buildsstats();

/*
	Create a target (.trg) and a sample size (.ssz) files from a table file (.len)

	@return errors
*/
int buildtarget();

/*
	Convert a sample file (.pop) into a table file (.len)

	@return errors
*/
int createtab();

/*
	Convert a IMa sample file into a table file (.len)

	@return errors
*/
int createtab2();

/*
	Convert a GenePop file into a table file (.len)

	@return errors
*/
int createtab3();

/*
	Convert a Nexus file (.nex) into a table file (.len)

	@return errors
*/
int createtab4();

/*
	Convert a table file (.len) into a sample file (.pop)

	@return errors
*/
int createpop();

/*
	Join files together

	@return errors
*/
int joinfiles();

/*
	Find segregating sites (.sgs)

	@return errors
*/
int segsites();

/*
	It creates an ASCII interface to run ABC approachs to Populacional Biology problems
*/
int main(int argc, char *argv[]){
	int i,		//iterator
		cut;	//auxiliar to work around strings
		
	/*get the path from where the progam is being run*/
	Exepathsize = strlen(argv[0])+ 5;
	Exepath = (char *)malloc(Exepathsize*sizeof(char));
	strcpy(Exepath,argv[0]);
	for(cut=-1,i=Exepathsize-1 ; Exepath[i]!='/' && Exepath[i]!='\\' && i >= 0 ; cut++,i--){
		Exepath[i]='\0';
	}
	Exepath = realloc(Exepath,(Exepathsize-cut)*sizeof(char));

	printf("\n\n  ----------------------------------\n");
	printf("   popABC - Mark Beaumont & Joao Lopes\n\n");
	printf("   version: 1.0               12/05/09\n");
	printf("\n  ----------------------------------\n");

	mainMenu();
	
	//free stuff
	free(Exepath);

} //end of main

void mainMenu(){
	char str[MAXCHAR];
	int option,
		r;

	do {
	    printf("\n\n  *Main Menu*\n\n");
	    printf("  1. Create a simulated \"real\" data\n\n");
	    printf("  2. Run the ABC algorithm on \"real\" data\n\n");
	    printf("  3. Customize the ABC algorithm\n\n");
	    printf("  4. Tools\n\n");
	    printf("  5. Exit\n\n");
	    printf("  choose an option: ");
		scanf("%s",&str);
		option = atoi(str);
	    switch (option){
	    case 1:
		printf("\n\n\n  *Simulate Data with ABC*\n\n");
		r = simulate();
		if(r==0)
			printf("\n\n>simulation completed (report created).");
		else if(r==1)
			printf("\n\n>error::cannot open the .prs file!");
		else if(r==2)
			printf("\n\n>error::cannot open the .ssz file!");
		else if(r==3)
			printf("\n\n>error::cannot open the .sst file!");
		else if(r==4)
			printf("\n\n>error::cannot create .dat file!");
		else if(r==5)
			printf("\n\n>error::cannot create info file!");
		else if(r==6)
			printf("\n\n>error::while reading .ssz file!");
		else if(r==7)
			printf("\n\n>error::while reading .sst file!");
		else if(r==8)
			printf("\n\n>error::following sstats can only be chosen with 2 or more pops: Nm_H; Nm_S; privS; S(1)!");
		else if(r==9)
			printf("\n\n>error::wrong topology prior type!");
		else if(r==10)
			printf("\n\n>error::with 1 or 2 pops only topology prior type 0 or 3 can be used!");
		else if(r==11)
			printf("\n\n>error::wrong Ne prior type!");
		else if(r==12)
			printf("\n\n>error::type-2 tev is followed by another type-2 tev!");
		else if(r==13)
			printf("\n\n>error::if using tev type 3 prior, define prior only once!");
		else if(r==14)
			printf("\n\n>error::if using tev type 4 prior, define prior only once!");
		else if(r==15)
			printf("\n\n>error::wrong Tev prior type!");
		else if(r==16)
			printf("\n\n>error::wrong Mig prior type!");
		else if(r==17)
			printf("\n\n>error::wrong Mut prior type (Microsatellites)!");
		else if(r==18)
			printf("\n\n>error::wrong Mut prior type (Sequence Data)!");
		else if(r==19)
			printf("\n\n>error::wrong Rec prior type (Microsatellites)!");
		else if(r==20)
			printf("\n\n>error::wrong Rec prior type (Sequence Data)!");
		else if(r==21)
			printf("\n\n>error::to use migration weights matrix, topology must be defined (option 1,2,4 or 5)!");
		else if(r==22)
			printf("\n\n>error::wrong migration weights matrix option!");
		else if(r==23)
			printf("\n\n>error::.dat file would be too big to be analyzed!");
		else if(r==24)
			printf("\n\n>error::when using rec with STR all STR loci must have the same scalar!");
		else if(r==25)
			printf("\n\n>error::when using rec with STR all STR loci must have the same samples per population!");
		else if(r==26)
			printf("\n\n>error::cannot create .mut file!");
		else if(r==27)
			printf("\n\n>error::cannot create .rec file!");
		else if(r==28)
			printf("\n\n>error::times are not monotonic increasing!");
		else if(r==29)
			printf("\n\n>error::choosing branching sequence!");
		else if(r==30)
			printf("\n\n>error::with more than 5 populations the topology as to be fixed using option 2 or 5!");
		else if(r==31)
			printf("\n\n>error::the locus have less than samples, it should be cleared!");
		else if(r==32)
			printf("\n\n>error::migration weights for the considered population have to be 0!");
		else if(r==33)
			printf("\n\n>error::the sum of the prob for a given migration as to be 1.0!");
		else if(r==34)
			printf("\n\n>error::cannot create .len file!");
		break;

	    case 2:
		printf("\n\n\n  *Run ABC algorithm*\n\n");
		r = runAbc();
		if(r==0)
			printf("\n\n>ABC run completed\n");
		else if(r==1)
			printf("\n\n>error::cannot open .len file!");	
		else if(r==2)
			printf("\n\n>error::cannot open .sst file!");	
		else if(r==3)
			printf("\n\n>error::cannot create .trg file!");		
		else if(r==4)
			printf("\n\n>error::cannot create .ssz file!");
		else if(r==5)
			printf("\n\n>error::cannot create info file!");
		else if(r==6)
			printf("\n\n>error::reading .sst file!");
		else if(r==7)
			printf("\n\n>error::following sstats can only be chosen with 2 or more pops: Nm_H; Nm_S; privS; S(1)!");
		else if(r==8)
			printf("\n\n>error::sequence data locus without information, discard it!");
		else if(r==101)
			printf("\n\n>error::cannot open the .prs file!");
		else if(r==102)
			printf("\n\n>error::cannot open the .ssz file!");
		else if(r==103)
			printf("\n\n>error::cannot open the .sst file!");
		else if(r==104)
			printf("\n\n>error::cannot create .dat file!");
		else if(r==105)
			printf("\n\n>error::cannot create info file!");
		else if(r==106)
			printf("\n\n>error::while reading .ssz file!");
		else if(r==107)
			printf("\n\n>error::while reading .sst file!");
		else if(r==108)
			printf("\n\n>error::following sstats can only be chosen with 2 or more pops: Nm_H; Nm_S; privS; S(1)!");
		else if(r==109)
			printf("\n\n>error::wrong topology prior type!");
		else if(r==110)
			printf("\n\n>error::with 1 or 2 pops only topology prior type 0 or 3 can be used!");
		else if(r==111)
			printf("\n\n>error::wrong Ne prior type!");
		else if(r==112)
			printf("\n\n>error::type-2 tev is followed by another type-2 tev!");
		else if(r==113)
			printf("\n\n>error::if using tev type 3 prior, define prior only once!");
		else if(r==114)
			printf("\n\n>error::if using tev type 4 prior, define prior only once!");
		else if(r==115)
			printf("\n\n>error::wrong Tev prior type!");
		else if(r==116)
			printf("\n\n>error::wrong Mig prior type!");
		else if(r==117)
			printf("\n\n>error::wrong Mut prior type (Microsatellites)!");
		else if(r==118)
			printf("\n\n>error::wrong Mut prior type (Sequence Data)!");
		else if(r==119)
			printf("\n\n>error::wrong Rec prior type (Microsatellites)!");
		else if(r==120)
			printf("\n\n>error::wrong Rec prior type (Sequence Data)!");
		else if(r==121)
			printf("\n\n>error::to use migration weights matrix, topology must be defined (option 1,2,4 or 5)!");
		else if(r==122)
			printf("\n\n>error::wrong migration weights matrix option!");
		else if(r==123)
			printf("\n\n>error::.dat file would be too big to be analyzed!");
		else if(r==124)
			printf("\n\n>error::when using rec with STR all STR loci must have the same scalar!");
		else if(r==125)
			printf("\n\n>error::when using rec with STR all STR loci must have the same samples per population!");
		else if(r==126)
			printf("\n\n>error::cannot create .mut file!");
		else if(r==127)
			printf("\n\n>error::cannot create .rec file!");
		else if(r==128)
			printf("\n\n>error::times are not monotonic increasing!");
		else if(r==129)
			printf("\n\n>error::choosing branching sequence!");
		else if(r==130)
			printf("\n\n>error::with more than 5 populations the topology as to be fixed using option 2 or 5!");
		else if(r==131)
			printf("\n\n>error::the locus have less than samples, it should be cleared!");
		else if(r==132)
			printf("\n\n>error::migration weights for the considered population have to be 0!");
		else if(r==133)
			printf("\n\n>error::the sum of the prob for a given migration as to be 1.0!");
		else if(r==134)
			printf("\n\n>error::cannot create .len file!");
		else if(r==201)
			printf("\n\n>error::could't open .dat file!");
		else if(r==202)
			printf("\n\n>error::cannot open .trg file!");
		else if(r==203)
			printf("\n\n>error::cannot create .rej file!");
		else if(r==204)
			printf("\n\n>error::cannot create .pri file!");
		else if(r==205)
			printf("\n\n>error::cannot create .txt file!");
		else if(r==206)
			printf("\n\n>error::file .dat ended prematurely!");
		else if(r==207)
			printf("\n\n>error::.dat file is too big to be analysed!");
		break;
		
	    case 3:
		customMenu();
		break;

	    case 4:
		toolsMenu();
		break;

	    case 5:
		printf("\n\n...exiting popABC\n\n");
		break;

	    default:
		printf("\n\n>error::option not available\n");
		break;
	    }
	}
	while (option != 5);

} // end of mainMenu

int simulate(){
	char str[MAXCHAR],			//auxiliar to get the input from the user
		 input_prs[MAXCHAR],	//input file name
		 input_ssz[MAXCHAR],	//input file name
		 input_sst[MAXCHAR],	//input file name
		 output[MAXCHAR];		//input file name

	//input filename
	printf("\n  choose prior file (.prs) (max %d character)",MAXCHAR-1);
	printf("\n  SHOULD HAVE ONLY ONE ITERATION: ");
	scanf("%s",input_prs);

	//input filename
	printf("\n  choose sample size file (.ssz) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_ssz);

	//input filename
	printf("\n  choose summary statistics set file (.sst) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_sst);

	//output filename
	printf("\n  insert name for output file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",output);

	return abc(input_prs,input_ssz,input_sst,output,1,1,1);

}  //ends of simulate

int runAbc(){
	int	lsstats[MAXSSTATS],		//list of the summary statistics used
	 	printMut,				//choose if the mutation rates should be print
		printRec,				//choose if the recombination rates should be print
		nparam,					//number of parameters
		nstats,					//number of summary statistics
		error;					//gets any error
	double tol;					//tolerance for the rejection method
	char str[MAXCHAR],			//auxiliar to get the input from the user
		 input_len[MAXCHAR],	//.len file name
		 input_trg[MAXCHAR],	//.trg file name
		 input_prs[MAXCHAR],	//.prs file name
		 input_ssz[MAXCHAR],	//.ssz file name
		 input_sst[MAXCHAR],	//input file name
		 input_dat[MAXCHAR],	//.dat file name
		 input_rej[MAXCHAR];	//.rej file name

	//input filename
	printf("\n  choose table file (.len) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_len);

	//input filename
	printf("\n  choose summary statistics set file (.sst) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_sst);

	//input filename
	printf("\n  insert name for target file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_trg);

	error = maketarget(input_len,input_sst,input_trg);
	if(error)
		return error;
	else
		printf("\n\n>'real' data summarization completed (report created).\n\n");
			
	//.prs filename
	printf("\n  choose prior file (.prs) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_prs);

	//.dat filename
	printf("\n  insert name for data file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_dat);
	
	//choose if file with mutation rate will be created
	printf("\n");
	do{
		printf("  choose if file with mutation rate will be created (0 - file not created;");
		printf("\n  1 - file created): ");
		scanf("%s",&str);
		printMut = atoi(str);
	}
	while(printMut !=0 && printMut !=1);

	//choose if file with recombination rate will be created
	printf("\n");
	do{
		printf("  choose if file with recombination rate will be created (0 - file not created;");
		printf("\n  1 - file created): ");
		scanf("%s",&str);
		printRec = atoi(str);
	}
	while(printRec !=0 && printRec !=1);

	strcpy(input_ssz,input_trg);
	strcat(input_ssz,".ssz"); 

	error = abc(input_prs,input_ssz,input_sst,input_dat,0,printMut,printRec);
	if(error)
		return error+100;
	else printf("\n\n>simulations completed (report created).\n\n");

	//.rej filename
	printf("\n  insert name for rejection file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_rej);

	//choose number of parameters
	printf("\n");
	do{
		printf("  specify the number of parameters used (>0): ");
		scanf("%s",&str);
		nparam = atof(str);
	}
	while(nparam <=0);

	//choose number of summary statistics
	printf("\n");
	do{
		printf("  specify the number of summary statistics used (>0): ");
		scanf("%s",&str);
		nstats = atof(str);
	}
	while(nstats <=0);

	//choose tolerance
	printf("\n");
	do{
		printf("  choose tolerance for rejection step (0 < tol < 1): ");
		scanf("%s",&str);
		tol = atof(str);
	}
	while(tol <=0 || tol >=1);

	strcat(input_dat,".dat");
	strcat(input_trg,".trg");

	error = firstpass(input_dat,input_trg,input_rej,nparam,nstats,tol);
	if(error)
		return error+200;
	else
		printf("\n\n>rejection step completed (report created).\n\n");

	return 0;
	
}  //end of runABC

void customMenu(){
	char str[MAXCHAR];
	int option,
		r;

	do {
	    printf("\n\n\n  *Customize ABC Menu*\n\n");
	    printf("  1. Summarize 'real' data with summstats set\n\n");
	    printf("  2. Run simulations\n\n");
	    printf("  3. Perform rejection step\n\n");
	    printf("  4. Exit to Main Menu\n\n");
	    printf("  choose an option: ");
		scanf("%s",&str);
		option = atoi(str);
	    switch (option){
	    case 1:
		printf("\n\n\n  *Run ABC - 'real' data summarization step*\n\n");
		r = buildtarget();
		if(r==0)
			printf("\n\n>'real' data summarization completed  (report created).");
		else if(r==1)
			printf("\n\n>error::cannot open the .len file!");	
		else if(r==2)
			printf("\n\n>error::cannot open the .sst file!");	
		else if(r==3)
			printf("\n\n>error::cannot create .trg file!");		
		else if(r==4)
			printf("\n\n>error::cannot create .ssz file!");
		else if(r==5)
			printf("\n\n>error::cannot create info file!");
		else if(r==6)
			printf("\n\n>error::reading .sst file!");
		else if(r==7)
			printf("\n\n>error::following sstats can only be chosen with 2 or more pops: Nm_H; Nm_S; privS; S(1)!");
		else if(r==8)
			printf("\n\n>error::sequence data locus without information, discard it!");
		break;

	    case 2:
		printf("\n\n\n  *Run ABC - simulation step*\n\n");
		r = runabc1();
		if(r==0)
			printf("\n\n>simulation step completed (report created).");
		else if(r==1)
			printf("\n\n>error::cannot open the .prs file!");
		else if(r==2)
			printf("\n\n>error::cannot open the .ssz file!");
		else if(r==3)
			printf("\n\n>error::cannot open the .sst file!");
		else if(r==4)
			printf("\n\n>error::cannot create .dat file!");
		else if(r==5)
			printf("\n\n>error::cannot create info file!");
		else if(r==6)
			printf("\n\n>error::while reading .ssz file!");
		else if(r==7)
			printf("\n\n>error::while reading .sst file!");
		else if(r==8)
			printf("\n\n>error::following sstats can only be chosen with 2 or more pops: Nm_H; Nm_S; privS; S(1)!");
		else if(r==9)
			printf("\n\n>error::wrong topology prior type!");
		else if(r==10)
			printf("\n\n>error::with 1 or 2 pops only topology prior type 0 or 3 can be used!");
		else if(r==11)
			printf("\n\n>error::wrong Ne prior type!");
		else if(r==12)
			printf("\n\n>error::type-2 tev is followed by another type-2 tev!");
		else if(r==13)
			printf("\n\n>error::if using tev type 3 prior, define prior only once!");
		else if(r==14)
			printf("\n\n>error::if using tev type 4 prior, define prior only once!");
		else if(r==15)
			printf("\n\n>error::wrong Tev prior type!");
		else if(r==16)
			printf("\n\n>error::wrong Mig prior type!");
		else if(r==17)
			printf("\n\n>error::wrong Mut prior type (Microsatellites)!");
		else if(r==18)
			printf("\n\n>error::wrong Mut prior type (Sequence Data)!");
		else if(r==19)
			printf("\n\n>error::wrong Rec prior type (Microsatellites)!");
		else if(r==20)
			printf("\n\n>error::wrong Rec prior type (Sequence Data)!");
		else if(r==21)
			printf("\n\n>error::to use migration weights matrix, topology must be defined (option 1,2,4 or 5)!");
		else if(r==22)
			printf("\n\n>error::wrong migration weights matrix option!");
		else if(r==23)
			printf("\n\n>error::.dat file would be too big to be analyzed!");
		else if(r==24)
			printf("\n\n>error::when using rec with STR all STR loci must have the same scalar!");
		else if(r==25)
			printf("\n\n>error::when using rec with STR all STR loci must have the same samples per population!");
		else if(r==26)
			printf("\n\n>error::cannot create .mut file!");
		else if(r==27)
			printf("\n\n>error::cannot create .rec file!");
		else if(r==28)
			printf("\n\n>error::times are not monotonic increasing!");
		else if(r==29)
			printf("\n\n>error::choosing branching sequence!");
		else if(r==30)
			printf("\n\n>error::with more than 5 populations the topology as to be fixed using option 2 or 5!");
		else if(r==31)
			printf("\n\n>error::the locus have less than samples, it should be cleared!");
		else if(r==32)
			printf("\n\n>error::migration weights for the considered population have to be 0!");
		else if(r==33)
			printf("\n\n>error::the sum of the prob for a given migration as to be 1.0!");
		else if(r==34)
			printf("\n\n>error::cannot create .len file!");
		break;

	    case 3:
		printf("\n\n\n  *Run ABC - rejection step*\n\n");
		r = runabc2();
		if(r==0)
			printf("\n\n>rejection step completed (report created).");
		else if(r==1)
			printf("\n\n>error::cannot open .dat file!");
		else if(r==2)
			printf("\n\n>error::cannot open .trg file!");
		else if(r==3)
			printf("\n\n>error::cannot create .rej file!");
		else if(r==4)
			printf("\n\n>error::cannot create .pri file!");
		else if(r==5)
			printf("\n\n>error::cannot create .txt file!");
		else if(r==6)
			printf("\n\n>error::file .dat ended prematurely!");
		else if(r==7)
			printf("\n\n>error::.dat file is too big to be analysed!");
		break;

	    case 4:
		break;

	    default:
		printf("\n\n>error::option not available\n");
		break;
	    }
	}
	while (option != 4);
	
}  //end of customMenu

int buildtarget(){
	int cstat,i,			//iterators
		lsstats[MAXSSTATS],	//list of the summary statistics used
	 	nmarks,				//param number of markers used (0-no marks; 2-two marks; 3-three marks; 4- four marks)
	 	cmark,				//auxiliar to choose the sample populations
	 	mark1,				//marker of first sample population (only if npop >= 3 AND nsample == 2)
	 	mark2,				//marker of second sample population (only if npop >= 3 AND nsample == 2 OR 3 OR 4)
	 	mark3;				//marker of third sample population (only if npop >= 3 AND nsample == 3 OR 4)
	char str[MAXCHAR],		//auxiliar to get the input from the user
		 input_len[MAXCHAR],//input file name
		 input_sst[MAXCHAR],//input file name
		 output[MAXCHAR],	//input file name
		 type;				//analysis type (M - microsatellites; S - sequence data; B - both)

	
	//input filename
	printf("\n  choose a table file (.len) (max %d characters): ",MAXCHAR-1);
	scanf("%s",input_len);

	//input filename
	printf("\n  choose a summary statistics set file (.sst) (max %d characters): ",MAXCHAR-1);
	scanf("%s",input_sst);

	//output filename
	printf("\n  choose a name for the target file (no extension) (max %d",MAXCHAR-1);
	printf("\n  characters): ");
	scanf("%s",output);

	return maketarget(input_len,input_sst,output);
	
} //end of buildtarget

int runabc1(){
	int printIt,				//choose if the table files of the simulations should be printed
		printMut,				//choose if the mutation rates should be printed
		printRec;				//choose if the recombination rates should be printed
	char str[MAXCHAR],			//auxiliar to get the input from the user
		 input_prs[MAXCHAR],	//input file name
		 input_ssz[MAXCHAR],	//input file name
		 input_sst[MAXCHAR],	//input file name
		 output[MAXCHAR];		//input file name

	//input filename
	printf("\n  choose prior file (.prs) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_prs);

	//input filename
	printf("\n  choose sample size file (.ssz) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_ssz);

	//input filename
	printf("\n  choose summary statistics set file (.sst) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_sst);

	//output filename
	printf("\n  insert name for output file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",output);

	//choose if table files of the simulations should be printed
	printf("\n");
	do{
		printf("  choose if table files (.len) for each simulation will be created (0 - file");
		printf("\n  not created;1 - file created)");
		printf("\n  THIS OPTION MEANS ONE .LEN FILE PER SIMULATION: ");
		scanf("%s",&str);
		printIt = atoi(str);
	}
	while(printIt !=0 && printIt !=1);

	//choose if file with mutation rate will be created
	printf("\n");
	do{
		printf("  choose if file with mutation rate will be created (0 - file not created;");
		printf("\n  1 - file created): ");
		scanf("%s",&str);
		printMut = atoi(str);
	}
	while(printMut !=0 && printMut !=1);

	//choose if file with recombination rate will be created
	printf("\n");
	do{
		printf("  choose if file with recombination rate will be created (0 - file not created;");
		printf("\n  1 - file created): ");
		scanf("%s",&str);
		printRec = atoi(str);
	}
	while(printRec !=0 && printRec !=1);
		
	return abc(input_prs,input_ssz,input_sst,output,printIt,printMut,printRec);
	
} //end of runabc1

int runabc2(){
	int	nparam,					//number of parameters
	 	nstats;					//number of summary statistics
	double tol;					//tolerance for the rejection method
	char str[MAXCHAR],			//auxiliar to get the input from the user
		 input_dat[MAXCHAR],	//.dat file name
		 input_trg[MAXCHAR],	//.trg file name
		 input_rej[MAXCHAR];	//.rej file name

	//.dat filename
	printf("\n  choose data file (.dat) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_dat);

	//.trg filename
	printf("\n  choose target file (.trg) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_trg);

	//.rej filename
	printf("\n  insert name for rejection file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",input_rej);

	//choose number of parameters
	printf("\n");
	do{
		printf("  specify the number of parameters used (>0): ");
		scanf("%s",&str);
		nparam = atof(str);
	}
	while(nparam <=0);

	//choose number of summary statistics
	printf("\n");
	do{
		printf("  specify the number of summary statistics used (>0): ");
		scanf("%s",&str);
		nstats = atof(str);
	}
	while(nstats <=0);

	//choose tolerance
	printf("\n");
	do{
		printf("  choose tolerance for rejection step (0 < tol < 1): ");
		scanf("%s",&str);
		tol = atof(str);
	}
	while(tol <=0 || tol >=1);

	return firstpass(input_dat,input_trg,input_rej,nparam,nstats,tol);
	
} //end of runabc2

void toolsMenu(){
	char str[MAXCHAR];
	int option,
		r;

	do {
	    printf("\n\n\n  *Tools Menu*\n\n");
	    printf("  1. Build prior file (.prs)\n\n");
	    printf("  2. Build summary statistics set file (.sst)\n\n");
	    printf("  3. Convert sample file (.pop) to table file (.len)\n\n");
	    printf("  4. Convert IMa input file to table file (.len)\n\n");
	    printf("  5. Convert GenePop input file to table file (.len)\n\n");
	    printf("  6. Convert Nexus file (.nex) to table file (.len)\n\n");
	    printf("  7. Create sample file (.pop) from table file (.len)\n\n");
	    printf("  8. Join data files together (.dat)\n\n");
	    printf("  9. Exit to Main Menu\n\n");
	    printf("  choose an option: ");
		scanf("%s",&str);
		option = atoi(str);
	    switch (option)
	    {
	    case 1:
		printf("\n\n\n  *Build prior file (.prs)*\n\n");
		r = buildprior();
		if(r==0)
			printf("\n\n>prior file (.prs) created.");
		else if(r==1)
			printf("\n\n>error::cannot create .prs file!");	
		break;

	    case 2:
		printf("\n\n\n  *Build summary statistics set file (.prs)*\n\n");
		r = buildsstats();
		if(r==0)
			printf("\n\n>summary statistics set file (.sst) created.");
		else if(r==1)
			printf("\n\n>error::cannot create .sst file!");	
		break;

	    case 3:
		printf("\n\n\n  *Convert sample file (.pop) to table file (.len)*\n\n");
		r = createtab();
		if(r==0)
			printf("\n\n>table file (.len) build.");
		else if(r==1)
			printf("\n\n>error::cannot open .pop file!");	
		else if(r==2)
			printf("\n\n>error::cannot create .len file!");	
		else if(r==3)
			printf("\n\n>error::individual has no information!");
		else if(r==4)
			printf("\n\n>error::different number of ploidy or number of sites in alleles of a loci!");
		break;

	    case 4:
		printf("\n\n\n  *Convert IMa file to table file (.len)*\n\n");
		r = createtab2();
		if(r==0)
			printf("\n\n>table file (.len) build.");
		else if(r==1)
			printf("\n\n>error::cannot open sample file!");	
		else if(r==2)
			printf("\n\n>error::cannot create .len file!");	
		else if(r==3)
			printf("\n\n>error::cannot deal with specified data type!");	
		break;

	    case 5:
		printf("\n\n\n  *Convert GenePop file to table file (.len)*\n\n");
		r = createtab3();
		if(r==0)
			printf("\n\n>table file (.len) build.");
		else if(r==1)
			printf("\n\n>error::cannot open sample file!");	
		else if(r==2)
			printf("\n\n>error::cannot create .len file!");	
		else if(r==3)
			printf("\n\n>error::file ended before the display of data!");	
		else if(r==4)
			printf("\n\n>error::incorrect number of digits in locus!");	
		break;

	    case 6:
		printf("\n\n\n  *Convert Nexus file (.nex) to table file (.len)*\n\n");
		r = createtab4();
		if(r==0)
			printf("\n\n>table file (.len) build.");
		else if(r==1)
			printf("\n\n>error::cannot open .nex file!");	
		else if(r==2)
			printf("\n\n>error::cannot create .len file!");	
		else if(r==3)
			printf("\n\n>error::cannot deal with specified data type!");	
		else if(r==4)
			printf("\n\n>error::problems reading MATRIX!");	
		else if(r==5)
			printf("\n\n>error::problems reading TAXSET!");	
		else if(r==6)
			printf("\n\n>error::problem defining TAXSET: n1>=n2!");	
		else if(r==7)
			printf("\n\n>error::unrecognized specifier after BEGIN SETS (use TAXSET)!");	
		else if(r==8)
			printf("\n\n>error::unrecognized specifier after BEGIN (use DATA or SETS)!");	
		else if(r==9)
			printf("\n\n>error::unrecognized command (only BEGIN accepted)!");	
		break;
		
	    case 7:
		printf("\n\n\n  *Create sample file (.pop) from table file (.len)*\n\n");
		r = createpop();
		if(r==0)
			printf("\n\n>sample file (.pop) converted.");
		else if(r==1)
			printf("\n\n>error::cannot open .pop files!");	
		else if(r==2)
			printf("\n\n>error::cannot create .len file!");		
		break;

	    case 8:
		printf("\n\n\n  *Join data files (.dat) together*\n\n");
		r = joinfiles();
		if(r==0)
			printf("\n\n>files joined.");
		else if(r==1)
			printf("\n\n>error::cannot create output file!");	
		else if(r==2)
			printf("\n\n>error::cannot open an input files!");		
		break;

	    case 9:
		break;

	    default:
		printf("\n\n>error::option not available\n");
		break;
	    }
	}
	while (option != 9);

}  //end of toolsMenu

int buildprior(){
	int cloc,cpop,ctev,i,j,cpop2,	//iterator
		allTev,						//check if only on prior for all tevs is used
		error,						//saves the error type
		d1,							//auxiliar to get info from the user
		from,to,					//auxiliars to construct the fixed topology when the option 2 is chosen
		niter,						//number of iterations
		genet,						//generation time
		npop,						//number of populations
		ntev,						//number of time events
		psize,						//number of populations (used in topology prior type 2)
		nloc,						//number of loci
		*avlpop;					//populations available to chose from when fixing the topology with option 2
	double *lplo;					//list of the ploidy per loci
	char str[MAXCHAR],				//auxiliar to get the input from the user
		 output[MAXCHAR],			//output filename
		 *ltype;					//list of the DNA types analysed per loci
	struct prior pr_top,			//topology prior parameters
				 pr_mutSTR,			//STR mutation prior parameters
				 pr_mutSNP,			//SNP mutation prior parameters
				 pr_recSTR,			//STR recombination prior parameters
				 pr_recSNP,			//SNP recombination prior parameters
			 	 *pr_mig,			//list of the mig prior parameters
				 *pr_Ne,			//list of the Ne prior parameters
			 	 *pr_tev;			//list of the tev prior paramters
	struct migweights migw; 		//matrix with the migration weigths
	
	/*number of iterations*/
	do{
		printf("  choose the number of iterations (>0): ");
		scanf("%s",&str);
		niter = atoi(str);
	}
	while(niter <=0);
	/*generation time*/
	printf("\n");
	do{
		printf("  choose the generation time (>0): ");
		scanf("%s",&str);
		genet = atoi(str);
	}
	while(genet <=0);
	/*number of pop*/
	printf("\n");
	do{
		printf("  choose the number of populations (>0): ");
		scanf("%s",&str);
		npop = atoi(str);
	}
	while(npop <=0);
	/*number of loci*/
	printf("\n");
	do{
		printf("  choose the number of loci (>0): ");
		scanf("%s",&str);
		nloc = atoi(str);
	}
	while(nloc <=0);
	/*inherety scalar*/
	lplo = (double*)malloc(nloc*sizeof(double));
	if(nloc==1){
		printf("\n");
		do{
			printf("  choose the hereditary scalar of the locus [autossome = 1.00; X-linked = 0.75;\n");
			printf("  haploid = 0.5; mitochodrial DNA or Y-linked = 0.25]: ");
			scanf("%s",&str);
			lplo[0] = atof(str);
		}
		while(lplo[0]!=1.0 && lplo[0]!=0.75 && lplo[0]!=0.5 && lplo[0]!=0.25);
	}
	else{
		printf("\n  choose %d scalars, one for each loci [autossome = 1.00; X-linked = 0.75;\n",nloc);
		printf("  haploid = 0.5; mitochodrial DNA or Y-linked = 0.25]:\n");
		for(cloc=0; cloc<nloc; cloc++){
			do{
				printf("    locus %d: ",cloc+1);
				scanf("%s",&str);
				lplo[cloc] = atof(str);
			}
		while(lplo[0]!=1.0 && lplo[0]!=0.75 && lplo[0]!=0.5 && lplo[0]!=0.25);
		}
	}
	/*DNA types*/
	ltype = (char*)malloc(nloc*sizeof(char));
	if(nloc==1){
		printf("\n");
		do{	
			printf("  choose the DNA type of the locus [s - DNA sequence or m - microsatellites]: ");
			scanf("%s",&str);
			ltype[0] = str[0];
		}
		while(ltype[0]!='m' && ltype[0]!='s' && ltype[0]!='M' && ltype[0]!='S');
	}
	else{
		printf("\n  choose the DNA type of each locus [s - DNA sequence or m - microsatellites]:\n");
		for(cloc=0; cloc<nloc; cloc++){
			do{
				printf("    locus %d: ",cloc+1);
				scanf("%s",&str);
				ltype[cloc] = str[0];
			}
			while(ltype[cloc]!='m' && ltype[cloc]!='s' && ltype[cloc]!='M' && ltype[cloc]!='S');
		}
	}
	/*topology priors*/
	if(npop<=2){
		printf("\n");
		do{
			printf("  choose to add a marker to the simulations [0 - no marker; 3 - marker]: ");
			scanf("%s",&str);
			pr_top.type = atoi(str);
		}
		while(pr_top.type!=0 && pr_top.type!=3);
	}
	else if(npop<=5){
		printf("\n");
		do{
			printf("  choose the topology prior and to add or not a marker to the simulations   \n");
			printf("  [No marker: 0 - random; 1 - predefined topology; 2 - write topology]      \n");
			printf("  [With marker: 3 - random; 4 - predefined topology; 5 - write topology]: ");
			scanf("%s",&str);
			pr_top.type = atoi(str);
		}
		while(pr_top.type!=0 && pr_top.type!=1 && pr_top.type!=2 && pr_top.type!=3 && pr_top.type!=4 && pr_top.type!=5);
	}
	else{
		printf("\n");
		do{
			printf("  choose to add a marker to the simulations [2 - no marker; 5 - marker]: ");
			scanf("%s",&str);
			pr_top.type = atoi(str);
		}
		while(pr_top.type!=2 && pr_top.type!=5);
	}

	if(pr_top.type==1){
		pr_top.p = (double *)malloc(sizeof(double));
		if(npop == 3){
			printf("\n");
			do{
				printf("  choose the predifined topology [1 to 3 (See user-guide)]: ");
				scanf("%s",&str);
				pr_top.p[0] = atof(str);
			}
			while(pr_top.p[0]<1 || pr_top.p[0]>3);
		}
		else if(npop == 4){
			printf("\n");
			do{
				printf("  choose the predifined topology [1 to 18 (See user-guide)]: ");
				scanf("%s",&str);
				pr_top.p[0] = atoi(str);
			}
			while(pr_top.p[0]<1 || pr_top.p[0]>18);
		}
		else if(npop == 5){
			printf("\n");
			do{
				printf("  choose the predifined topology [1 to 180 (See user-guide)]: ");
				scanf("%s",&str);
				pr_top.p[0] = atoi(str);
			}
			while(pr_top.p[0]<1 || pr_top.p[0]>180);
		}
	}
	else if(pr_top.type==2){
		pr_top.p = (double *)malloc(2*(npop+1)*sizeof(double));
		avlpop = (int*)malloc(npop*sizeof(int));
		for(i=0; i<npop; i++)
			avlpop[i] = i;
		psize = npop;
		printf("\n  choose the topology to be used (%d numbers)",2*(npop-1));
		for(i=0; i<2*(npop-1) ;i=i+2){
			printf("\n  available populations:(");
			for(j=0; j<psize-1; j++)
				printf("%d ",avlpop[j]);
			printf("%d)\n",avlpop[j]);
			do{
				printf("    from - ");
				scanf("%s",&str);
				from = atoi(str);
				printf("    to - ");
				scanf("%s",&str);
				to = atoi(str);
			}
			while(!exists(avlpop,from,npop) || !exists(avlpop,to,npop) || from == to);
		 	pr_top.p[i] = from;
		 	pr_top.p[i+1] = to;
		 	avlpop = takeout(avlpop,from,psize);
		 	psize --;
		 }
	}
	else if(pr_top.type==3){
		pr_top.p = (double *)malloc(sizeof(double));
		if(npop <= 4){
			printf("\n");
			do{
				printf("  choose the marker to be used (>=0): ");
				scanf("%s",&str);
				pr_top.p[0] = atof(str);
			}
			while(pr_top.p[0]<0);
		}
	}
	else if(pr_top.type==4){
		pr_top.p = (double *)malloc(2*sizeof(double));
		if(npop == 3){
			printf("\n");
			do{
				printf("  choose the predifined topology [1 to 3 (See user-guide)]: ");
				scanf("%s",&str);
				pr_top.p[0] = atof(str);
			}
			while(pr_top.p[0]<1 || pr_top.p[0]>3);
			printf("\n");
			do{
				printf("  choose the marker to be used (>=0): ");
				scanf("%s",&str);
				pr_top.p[1] = atof(str);
			}
			while(pr_top.p[1]<0);
		}
		else if(npop==4){
			printf("\n");
			do{
				printf("  choose the predifined topology [1 to 18 (See user-guide)]: ");
				scanf("%s",&str);
				pr_top.p[0] = atoi(str);
			}
			while(pr_top.p[0]<1 || pr_top.p[0]>18);
			printf("\n");
			do{
				printf("  choose the marker to be used (>=0): ");
				scanf("%s",&str);
				pr_top.p[1] = atof(str);
			}
			while(pr_top.p[1]<0);
		}
		else if(npop==5){
			printf("\n");
			do{
				printf("  choose the predifined topology [1 to 180 (See user-guide)]: ");
				scanf("%s",&str);
				pr_top.p[0] = atoi(str);
			}
			while(pr_top.p[0]<1 || pr_top.p[0]>180);
			printf("\n");
			do{
				printf("  choose the marker to be used (>=0): ");
				scanf("%s",&str);
				pr_top.p[1] = atof(str);
			}
			while(pr_top.p[1]<0);
		}
	}
	else if(pr_top.type==5){
		pr_top.p = (double *)malloc((1+2*(npop+1))*sizeof(double));
		avlpop = (int*)malloc(npop*sizeof(int));
		for(i=0; i<npop; i++)
			avlpop[i] = i;
		psize = npop;
		printf("\n  choose the topology to be used (%d numbers)",2*(npop-1));
		for(i=0; i<2*(npop-1) ;i=i+2){
			printf("\n  available populations:(");
			for(j=0; j<psize-1; j++)
				printf("%d ",avlpop[j]);
			printf("%d)\n",avlpop[j]);
			do{
				printf("    from - ");
				scanf("%s",&str);
				from = atoi(str);
				printf("    to - ");
				scanf("%s",&str);
				to = atoi(str);
			}
			while(!exists(avlpop,from,npop) || !exists(avlpop,to,npop) || from == to);
		 	pr_top.p[i] = from;
		 	pr_top.p[i+1] = to;
		 	avlpop = takeout(avlpop,from,psize);
		 	psize --;
		 }
		printf("\n");
		do{
			printf("  choose the marker to be used (>=0): ");
			scanf("%s",&str);
			pr_top.p[i] = atof(str);
		}
		while(pr_top.p[i]<0);
	}
	/*Ne priors*/
	pr_Ne = (struct prior *)malloc((npop*2-1)*sizeof(struct prior));
	for(cpop=0; cpop<npop*2-1; cpop++){
		if(cpop<npop){
			printf("\n");
			do{
				printf("  choose the Ne%d prior [1 - uniform distribution; 2 - generalized gamma\n",cpop+1);
		        printf("  distribution]: ");
				scanf("%s",&str);
				pr_Ne[cpop].type = atoi(str);
			}
			while(pr_Ne[cpop].type!=1 && pr_Ne[cpop].type!=2 && pr_Ne[cpop].type!=3);
		}
		else{
			printf("\n");
			do{
				printf("  choose the NeAnc%d prior [1 - uniform distribution; 2 - generalized gamma\n",cpop+1-npop);
				printf("  distribution]: ");
				scanf("%s",&str);
				pr_Ne[cpop].type = atoi(str);
			}
			while(pr_Ne[cpop].type!=1 && pr_Ne[cpop].type!=2 && pr_Ne[cpop].type!=3);
		}
		if(pr_Ne[cpop].type==1){
			pr_Ne[cpop].p = (double *)malloc(2*sizeof(double));
			do{
				printf("  choose lower boundary of the prior(>=0): ");
				scanf("%s",&str);
				pr_Ne[cpop].p[0] = atof(str);
				printf("  choose upper boundary of the prior(>0): ");
				scanf("%s",&str);
				pr_Ne[cpop].p[1] = atof(str);
			}
			while(pr_Ne[cpop].p[0]>pr_Ne[cpop].p[1] || pr_Ne[cpop].p[0]<0 || pr_Ne[cpop].p[1]<=0);

		}
		else{
			pr_Ne[cpop].p = (double *)malloc(4*sizeof(double));
			do{
				printf("  choose location parameter (=>0): ");
				scanf("%s",&str);
				pr_Ne[cpop].p[0] = atof(str);
			}
			while(pr_Ne[cpop].p[0]<0);
			do{
				printf("  choose scale parameter (>0): ");
				scanf("%s",&str);
				pr_Ne[cpop].p[1] = atof(str);
			}
			while(pr_Ne[cpop].p[1]<=0);
			do{
				printf("  choose shape parameter (>0): ");
				scanf("%s",&str);
				pr_Ne[cpop].p[2] = atof(str);
			}
			while(pr_Ne[cpop].p[2]<=0);
			do{
				printf("  choose 2nd shape parameter (>0): ");
				scanf("%s",&str);
				pr_Ne[cpop].p[3] = atof(str);
			}
			while(pr_Ne[cpop].p[3]<=0);
		}
	}
	if(npop>1){
		/*tev priors*/
		ntev = npop-1;
		pr_tev = (struct prior *)malloc((ntev)*sizeof(struct prior));
		allTev = 0;
		for(ctev=0; ctev<ntev; ctev++){
			if(!allTev){
				printf("\n");
				if(ctev==0 && npop>2){
					do{
						printf("  choose the Tev%d prior [1 - uniform distribution; 2 - generalized gamma\n",ctev+1);
			    	    printf("  distribution; 3 - uniform distribution (for all tev) 4 - generalized\n");
			    	    printf("  gamma distribution (for all tev)]: ");
						scanf("%s",&str);
						pr_tev[ctev].type = atoi(str);
					}
					while(pr_tev[ctev].type!=1 && pr_tev[ctev].type!=2 && pr_tev[ctev].type!=3 && pr_tev[ctev].type!=4);
				}
				else{
					do{
						printf("  choose the Tev%d prior [1 - uniform distribution; 2 - generalized gamma\n",ctev+1);
			    	    printf("  distribution]: ");
						scanf("%s",&str);
						d1 = atoi(str);
		           		pr_tev[ctev].type= d1;
					}
					while(pr_tev[ctev].type!=1 && pr_tev[ctev].type!=2);
				}
				if(pr_tev[ctev].type==3||pr_tev[ctev].type==4){
					allTev=1;
				}
				if(pr_tev[ctev].type==1||pr_tev[ctev].type==3){
					pr_tev[ctev].p = (double *)malloc(2*sizeof(double));
					do{
						printf("  choose lower boundary of the prior (>=0): ");
						scanf("%s",&str);
						pr_tev[ctev].p[0] = atof(str);
						printf("  choose upper boundary of the prior (>0): ");
						scanf("%s",&str);
						pr_tev[ctev].p[1] = atof(str);
					}
					while(pr_tev[ctev].p[0]>pr_tev[ctev].p[1] || pr_tev[ctev].p[0]<0 || pr_tev[ctev].p[1]<=0);
				}
				else if(pr_tev[ctev].type==2||pr_tev[ctev].type==4){
					pr_tev[ctev].p = (double *)malloc(4*sizeof(double));
					do{
						printf("  choose location parameter (>=0): ");
						scanf("%s",&str);
						pr_tev[ctev].p[0] = atof(str);
					}
					while(pr_tev[ctev].p[0]<0);
					do{
						printf("  choose scale parameter (>0): ");
						scanf("%s",&str);
						pr_tev[ctev].p[1] = atof(str);
					}
					while(pr_tev[ctev].p[1]<=0);
					do{
						printf("  choose shape parameter (>0): ");
						scanf("%s",&str);
						pr_tev[ctev].p[2] = atof(str);
					}
					while(pr_tev[ctev].p[2]<=0);
					do{
						printf("  choose 2nd shape parameter (>0): ");
						scanf("%s",&str);
						pr_tev[ctev].p[3] = atof(str);
					}
					while(pr_tev[ctev].p[3]<=0);
				}
			}
		}
		/*migration priors*/
		pr_mig = (struct prior *)malloc((npop*2-2)*sizeof(struct prior));
		for(cpop=0; cpop<npop*2-2; cpop++){
			if(cpop<npop){
				printf("\n");
				do{
					printf("  choose the mig%d rate prior [0 - zero migration; 1 - uniform\n",cpop+1);
			        printf("  distribution; 2 - generalized gamma distribution; 3 - uniform\n");
			        printf("  distribution (on number of migrations); 4 - generalized gamma\n");
			        printf("  distribution(on number of migrations)]: ");
					scanf("%s",&str);
					pr_mig[cpop].type = atoi(str);
				}
				while(pr_mig[cpop].type!=0 && pr_mig[cpop].type!=1 && pr_mig[cpop].type!=2 && pr_mig[cpop].type!=3 && pr_mig[cpop].type!=4 && pr_mig[cpop].type!=5);
			}
			else{
				printf("\n");
				do{
					printf("  choose the migA%d rate prior [0 - zero migration; 1 - uniform\n",cpop+1-npop);
			        printf("  distribution; 2 - generalized gamma distribution; 3 - uniform\n");
			        printf("  distribution (on number of migrations); 4 - generalized gamma\n");
			        printf("  distribution(on number of migrations)]: ");
					scanf("%s",&str);
					pr_mig[cpop].type = atoi(str);
				}
				while(pr_mig[cpop].type!=0 && pr_mig[cpop].type!=1 && pr_mig[cpop].type!=2 && pr_mig[cpop].type!=3 && pr_mig[cpop].type!=4 && pr_mig[cpop].type!=5);
			}
	
			if(pr_mig[cpop].type==1||pr_mig[cpop].type==3){
				pr_mig[cpop].p = (double *)malloc(2*sizeof(double));
				do{
					printf("  choose lower boundary of the prior (>=0): ");
					scanf("%s",&str);
					pr_mig[cpop].p[0] = atof(str);
					printf("  choose upper boundary of the prior (>0): ");
					scanf("%s",&str);
					pr_mig[cpop].p[1] = atof(str);
				}
				while(pr_mig[cpop].p[0]>pr_mig[cpop].p[1] || pr_mig[cpop].p[0]<0 || pr_mig[cpop].p[1]<=0);
			}
			else if(pr_mig[cpop].type==2||pr_mig[cpop].type==4){
				pr_mig[cpop].p = (double *)malloc(4*sizeof(double));
				do{
					printf("  choose location parameter (=>0): ");
					scanf("%s",&str);
					pr_mig[cpop].p[0] = atof(str);
				}
				while(pr_mig[cpop].p[0]<0);
				do{
					printf("  choose scale parameter (>0): ");
					scanf("%s",&str);
					pr_mig[cpop].p[1] = atof(str);
				}
				while(pr_mig[cpop].p[1]<=0);
				do{
					printf("  choose shape parameter (>0): ");
					scanf("%s",&str);
					pr_mig[cpop].p[2] = atof(str);
				}
				while(pr_mig[cpop].p[2]<=0);
				do{
					printf("  choose 2nd shape parameter (>0): ");
					scanf("%s",&str);
					pr_mig[cpop].p[3] = atof(str);
				}
				while(pr_mig[cpop].p[3]<=0);
			}
		}
	}
	/*mutation priors*/
	printf("\n");
	if(nloc==1){
		do{
			printf("  choose STR mutation rate prior [0 - no mutation; 1 - lognormal distribution];\n");
			printf("  2 - normal distribution]: ");
			scanf("%s",&str);
			pr_mutSTR.type = atoi(str);
		}
		while(pr_mutSTR.type!=0 && pr_mutSTR.type!=1 && pr_mutSTR.type!=2);
	}
	else{
		do{
			printf("  choose STR mutation rate hiperprior [0 - no mutation; 1 - lognormal\n");
			printf("  distribution; 2 - normal distribution]: ");
			scanf("%s",&str);
			pr_mutSTR.type = atoi(str);
		}
		while(pr_mutSTR.type!=0 && pr_mutSTR.type!=1 && pr_mutSTR.type!=2);
	}
	if(pr_mutSTR.type==1){
		pr_mutSTR.p = (double *)malloc(4*sizeof(double));

		if(nloc==1){
			do{
				printf("  choose the mean of the prior [lognormal scale (<0)]: ");
				scanf("%s",&str);
				pr_mutSTR.p[0] = atof(str);
			}
			while(pr_mutSTR.p[0]>=0);

			pr_mutSTR.p[1] = 0;

			do{
				printf("  choose the stdev of the prior [lognormal scale(>=0)]: ");
				scanf("%s",&str);
				pr_mutSTR.p[2] = atof(str);
			}
			while(pr_mutSTR.p[2]<0);

			pr_mutSTR.p[3] = 0;
		}
		else{
			do{
				printf("  choose the mean of all means [lognormal scale (<0)]: ");
				scanf("%s",&str);
				pr_mutSTR.p[0] = atof(str);
			}
			while(pr_mutSTR.p[0]>=0);
			do{
				printf("  choose the stdev of all means (>=0): ");
				scanf("%s",&str);
				pr_mutSTR.p[1] = atof(str);
			}
			while(pr_mutSTR.p[1]<0);
			do{
				printf("  choose the mean of all stdevs [lognormal scale(>=0)]: ");
				scanf("%s",&str);
				pr_mutSTR.p[2] = atof(str);
			}
			while(pr_mutSTR.p[2]<0);
			do{
				printf("  choose the stdev of all stdevs (>=0): ");
				scanf("%s",&str);
				pr_mutSTR.p[3] = atof(str);
			}
			while(pr_mutSTR.p[3]<0);
		}
	}
	if(pr_mutSTR.type==2){
		pr_mutSTR.p = (double *)malloc(4*sizeof(double));

		if(nloc==1){
			do{
				printf("  choose the mean of the prior (>0)]: ");
				scanf("%s",&str);
				pr_mutSTR.p[0] = atof(str);
			}
			while(pr_mutSTR.p[0]<=0);

			pr_mutSTR.p[1] = 0;

			do{
				printf("  choose the stdev of the prior (>=0)]: ");
				scanf("%s",&str);
				pr_mutSTR.p[2] = atof(str);
			}
			while(pr_mutSTR.p[2]<0);

			pr_mutSTR.p[3] = 0;
		}
		else{
			do{
				printf("  choose the mean of all means (>0)]: ");
				scanf("%s",&str);
				pr_mutSTR.p[0] = atof(str);
			}
			while(pr_mutSTR.p[0]<=0);
			do{
				printf("  choose the stdev of all means (>=0): ");
				scanf("%s",&str);
				pr_mutSTR.p[1] = atof(str);
			}
			while(pr_mutSTR.p[1]<0);
			do{
				printf("  choose the mean of all stdevs (>=0)]: ");
				scanf("%s",&str);
				pr_mutSTR.p[2] = atof(str);
			}
			while(pr_mutSTR.p[2]<0);
			do{
				printf("  choose the stdev of all stdevs (>=0): ");
				scanf("%s",&str);
				pr_mutSTR.p[3] = atof(str);
			}
			while(pr_mutSTR.p[3]<0);
		}
	}
	printf("\n");
	if(nloc==1){
		do{
			printf("  choose SNP mutation rate prior [0 - no mutation; 1 - lognormal distribution];\n");
			printf("  2 - normal distribution]: ");
			scanf("%s",&str);
			pr_mutSNP.type = atoi(str);
		}
		while(pr_mutSNP.type!=0 && pr_mutSNP.type!=1 && pr_mutSNP.type!=2);
	}
	else{
		do{
			printf("  choose SNP mutation rate hiperprior [0 - no mutation; 1 - lognormal\n");
			printf("  distribution; 2 - normal distribution]: ");
			scanf("%s",&str);
			pr_mutSNP.type = atoi(str);
		}
		while(pr_mutSNP.type!=0 && pr_mutSNP.type!=1 && pr_mutSNP.type!=2);
	}
	if(pr_mutSNP.type==1){
		pr_mutSNP.p = (double *)malloc(4*sizeof(double));

		if(nloc==1){
			do{
				printf("  choose the mean of the prior [lognormal scale (<0)]: ");
				scanf("%s",&str);
				pr_mutSNP.p[0] = atof(str);
			}
			while(pr_mutSNP.p[0]>=0);

			pr_mutSNP.p[1] = 0;

			do{
				printf("  choose the stdev of the prior [lognormal scale(>=0)]: ");
				scanf("%s",&str);
				pr_mutSNP.p[2] = atof(str);
			}
			while(pr_mutSNP.p[2]<0);

			pr_mutSNP.p[3] = 0;
		}
		else{
			do{
				printf("  choose the mean of all means [lognormal scale (<0)]: ");
				scanf("%s",&str);
				pr_mutSNP.p[0] = atof(str);
			}
			while(pr_mutSNP.p[0]>=0);
			do{
				printf("  choose the stdev of all means (>=0): ");
				scanf("%s",&str);
				pr_mutSNP.p[1] = atof(str);
			}
			while(pr_mutSNP.p[1]<0);
			do{
				printf("  choose the mean of all stdevs [lognormal scale(>=0)]: ");
				scanf("%s",&str);
				pr_mutSNP.p[2] = atof(str);
			}
			while(pr_mutSNP.p[2]<0);
			do{
				printf("  choose the stdev of all stdevs (>=0): ");
				scanf("%s",&str);
				pr_mutSNP.p[3] = atof(str);
			}
			while(pr_mutSNP.p[3]<0);
		}
	}
	if(pr_mutSNP.type==2){
		pr_mutSNP.p = (double *)malloc(4*sizeof(double));

		if(nloc==1){
			do{
				printf("  choose the mean of the prior (>0)]: ");
				scanf("%s",&str);
				pr_mutSNP.p[0] = atof(str);
			}
			while(pr_mutSNP.p[0]<=0);

			pr_mutSNP.p[1] = 0;

			do{
				printf("  choose the stdev of the prior (>=0)]: ");
				scanf("%s",&str);
				pr_mutSNP.p[2] = atof(str);
			}
			while(pr_mutSNP.p[2]<0);

			pr_mutSNP.p[3] = 0;
		}
		else{
			do{
				printf("  choose the mean of all means (>0)]: ");
				scanf("%s",&str);
				pr_mutSNP.p[0] = atof(str);
			}
			while(pr_mutSNP.p[0]<=0);
			do{
				printf("  choose the stdev of all means (>=0): ");
				scanf("%s",&str);
				pr_mutSNP.p[1] = atof(str);
			}
			while(pr_mutSNP.p[1]<0);
			do{
				printf("  choose the mean of all stdevs (>=0)]: ");
				scanf("%s",&str);
				pr_mutSNP.p[2] = atof(str);
			}
			while(pr_mutSNP.p[2]<0);
			do{
				printf("  choose the stdev of all stdevs (>=0): ");
				scanf("%s",&str);
				pr_mutSNP.p[3] = atof(str);
			}
			while(pr_mutSNP.p[3]<0);
		}
	}
	/*recombination priors*/
	printf("\n");
	if(nloc==1){
		do{
			printf("  choose STR recombination prior [0 - no recombination; 1 - lognormal\n");
			printf("  distribution]; 2 - normal distribution]: ");
			scanf("%s",&str);
			pr_recSTR.type = atoi(str);
		}
		while(pr_recSTR.type!=0 && pr_recSTR.type!=1 && pr_recSTR.type!=2);
	}
	else{
		do{
			printf("  choose STR recombination rate hiperprior [0 - no recombination; 1 - lognormal\n");
			printf("  distribution; 2 - normal distribution]: ");
			scanf("%s",&str);
			pr_recSTR.type = atoi(str);
		}
		while(pr_recSTR.type!=0 && pr_recSTR.type!=1 && pr_recSTR.type!=2);
	}
	if(pr_recSTR.type==1){
		pr_recSTR.p = (double *)malloc(4*sizeof(double));

		if(nloc==1){
			do{
				printf("  choose the mean of the prior [lognormal scale (<0)]: ");
				scanf("%s",&str);
				pr_recSTR.p[0] = atof(str);
			}
			while(pr_recSTR.p[0]>=0);

			pr_recSTR.p[1] = 0;

			do{
				printf("  choose the stdev of the prior [lognormal scale(>=0)]: ");
				scanf("%s",&str);
				pr_recSTR.p[2] = atof(str);
			}
			while(pr_recSTR.p[2]<0);

			pr_recSTR.p[3] = 0;
		}
		else{
			do{
				printf("  choose the mean of all means [lognormal scale (<0)]: ");
				scanf("%s",&str);
				pr_recSTR.p[0] = atof(str);
			}
			while(pr_recSTR.p[0]>=0);
			do{
				printf("  choose the stdev of all means (>=0): ");
				scanf("%s",&str);
				pr_recSTR.p[1] = atof(str);
			}
			while(pr_recSTR.p[1]<0);
			do{
				printf("  choose the mean of all stdevs [lognormal scale(>=0)]: ");
				scanf("%s",&str);
				pr_recSTR.p[2] = atof(str);
			}
			while(pr_recSTR.p[2]<0);
			do{
				printf("  choose the stdev of all stdevs (>=0): ");
				scanf("%s",&str);
				pr_recSTR.p[3] = atof(str);
			}
			while(pr_recSTR.p[3]<0);
		}
	}
	if(pr_recSTR.type==2){
		pr_recSTR.p = (double *)malloc(4*sizeof(double));

		if(nloc==1){
			do{
				printf("  choose the mean of the prior (>0)]: ");
				scanf("%s",&str);
				pr_recSTR.p[0] = atof(str);
			}
			while(pr_recSTR.p[0]<=0);

			pr_recSTR.p[1] = 0;

			do{
				printf("  choose the stdev of the prior (>=0)]: ");
				scanf("%s",&str);
				pr_recSTR.p[2] = atof(str);
			}
			while(pr_recSTR.p[2]<0);

			pr_recSTR.p[3] = 0;
		}
		else{
			do{
				printf("  choose the mean of all means (>0)]: ");
				scanf("%s",&str);
				pr_recSTR.p[0] = atof(str);
			}
			while(pr_recSTR.p[0]<=0);
			do{
				printf("  choose the stdev of all means (>=0): ");
				scanf("%s",&str);
				pr_recSTR.p[1] = atof(str);
			}
			while(pr_recSTR.p[1]<0);
			do{
				printf("  choose the mean of all stdevs (>=0)]: ");
				scanf("%s",&str);
				pr_recSTR.p[2] = atof(str);
			}
			while(pr_recSTR.p[2]<0);
			do{
				printf("  choose the stdev of all stdevs (>=0): ");
				scanf("%s",&str);
				pr_recSTR.p[3] = atof(str);
			}
			while(pr_recSTR.p[3]<0);
		}
	}
	printf("\n");
	if(nloc==1){
		do{
			printf("  choose SNP recombination rate prior [0 - no recombination; 1 - lognormal\n");
			printf("  distribution]; 2 - normal distribution]: ");
			scanf("%s",&str);
			pr_recSNP.type = atoi(str);
		}
		while(pr_recSNP.type!=0 && pr_recSNP.type!=1 && pr_recSNP.type!=2);
	}
	else{
		do{
			printf("  choose SNP recombination rate hiperprior [0 - no recombination; 1 - lognormal\n");
			printf("  distribution; 2 - normal distribution]: ");
			scanf("%s",&str);
			pr_recSNP.type = atoi(str);
		}
		while(pr_recSNP.type!=0 && pr_recSNP.type!=1 && pr_recSNP.type!=2);
	}
	if(pr_recSNP.type==1){
		pr_recSNP.p = (double *)malloc(4*sizeof(double));

		if(nloc==1){
			do{
				printf("  choose the mean of the prior [lognormal scale (<0)]: ");
				scanf("%s",&str);
				pr_recSNP.p[0] = atof(str);
			}
			while(pr_recSNP.p[0]>=0);

			pr_recSNP.p[1] = 0;

			do{
				printf("  choose the stdev of the prior [lognormal scale(>=0)]: ");
				scanf("%s",&str);
				pr_recSNP.p[2] = atof(str);
			}
			while(pr_recSNP.p[2]<0);

			pr_recSNP.p[3] = 0;
		}
		else{
			do{
				printf("  choose the mean of all means [lognormal scale (<0)]: ");
				scanf("%s",&str);
				pr_recSNP.p[0] = atof(str);
			}
			while(pr_recSNP.p[0]>=0);
			do{
				printf("  choose the stdev of all means (>=0): ");
				scanf("%s",&str);
				pr_recSNP.p[1] = atof(str);
			}
			while(pr_recSNP.p[1]<0);
			do{
				printf("  choose the mean of all stdevs [lognormal scale(>=0)]: ");
				scanf("%s",&str);
				pr_recSNP.p[2] = atof(str);
			}
			while(pr_recSNP.p[2]<0);
			do{
				printf("  choose the stdev of all stdevs (>=0): ");
				scanf("%s",&str);
				pr_recSNP.p[3] = atof(str);
			}
			while(pr_recSNP.p[3]<0);
		}
	}
	if(pr_recSNP.type==2){
		pr_recSNP.p = (double *)malloc(4*sizeof(double));

		if(nloc==1){
			do{
				printf("  choose the mean of the prior (>0)]: ");
				scanf("%s",&str);
				pr_recSNP.p[0] = atof(str);
			}
			while(pr_recSNP.p[0]<=0);

			pr_recSNP.p[1] = 0;

			do{
				printf("  choose the stdev of the prior (>=0)]: ");
				scanf("%s",&str);
				pr_recSNP.p[2] = atof(str);
			}
			while(pr_recSNP.p[2]<0);

			pr_recSNP.p[3] = 0;
		}
		else{
			do{
				printf("  choose the mean of all means (>0)]: ");
				scanf("%s",&str);
				pr_recSNP.p[0] = atof(str);
			}
			while(pr_recSNP.p[0]<=0);
			do{
				printf("  choose the stdev of all means (>=0): ");
				scanf("%s",&str);
				pr_recSNP.p[1] = atof(str);
			}
			while(pr_recSNP.p[1]<0);
			do{
				printf("  choose the mean of all stdevs (>=0)]: ");
				scanf("%s",&str);
				pr_recSNP.p[2] = atof(str);
			}
			while(pr_recSNP.p[2]<0);
			do{
				printf("  choose the stdev of all stdevs (>=0): ");
				scanf("%s",&str);
				pr_recSNP.p[3] = atof(str);
			}
			while(pr_recSNP.p[3]<0);
		}
	}
	/*migration matrix*/
	if(npop>=3 && (pr_top.type==1 || pr_top.type==2 || pr_top.type==4 || pr_top.type==5)){
		printf("\n");
		do{
			printf("  choose to set or not migration weights [0 - do not use; 1 - use]: ");
			scanf("%s",&str);
			migw.type = atoi(str);
		}
		while(migw.type!=0 && migw.type!=1);
	
		if(migw.type==1){
			migw.m = (double ***)malloc(npop*sizeof(double**));
			for(cpop=0;cpop<npop;cpop++){
				migw.m[cpop] = (double **)malloc(ntev*sizeof(double*));
				for(ctev=0;ctev<ntev;ctev++)
					migw.m[cpop][ctev] = (double *)malloc(npop*sizeof(double));
			}
			printf("\n  choose the percentage of migrants:\n");
			for(cpop=0;cpop<npop;cpop++){
				for(ctev=0;ctev<ntev;ctev++){
					for(cpop2=0;cpop2<npop;cpop2++){
						if(cpop==cpop2)
							migw.m[cpop][ctev][cpop2] = 0;
						else{
							do{
								printf("    in pop %d from pop %d at time %d (0 <= per <= 1): ",cpop,cpop2,ctev);
								scanf("%s",&str);
								migw.m[cpop][ctev][cpop2] = atof(str);
							}
							while(migw.m[cpop][ctev][cpop2]<0 || migw.m[cpop][ctev][cpop2]>1);
						}
					}
				}
			}
		}
	}
	else
		migw.type=0;
	/*output filename*/
	printf("\n  insert name for prior file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",output);
	
	/*run makeprior()*/
	error = makeprior(output,niter,genet,npop,nloc,lplo,ltype,pr_top,pr_Ne,pr_tev,pr_mig,
					 pr_mutSTR,pr_mutSNP,pr_recSTR,pr_recSNP,migw);
	
	/*free stuff*/
	if(pr_top.type==2||pr_top.type==5){
		free(avlpop);
	}
	return error;

}  //ends of buildprior

int exists(int *avlpop,int pop,int size){
	int i,
		foundit;
	
	foundit = 0;	
	for(i=0; i<size && !foundit; i++){
		if(avlpop[i] == pop)
			foundit = 1;
	}
	
	return foundit;
		
} //end of exists

int *takeout(int *avlpop,int pop, int size){
	int i,			//iterator
		foundit,	//check if the pop was found
		*aftlist;	//updated list
	
	aftlist = (int *)malloc((size-1)*sizeof(int));
	
	foundit = 0;
	for(i=0; i<size; i++){
		if(foundit)
			aftlist[i-1] = avlpop[i];
		else{
			if(avlpop[i]==pop)
				foundit = 1;	
			else
				aftlist[i] = avlpop[i];
		}
	}
	
	//free stuff
	free(avlpop);
	
	return aftlist;
	
} //end of takeout

int buildsstats(){
	int cstat,					//iterator
		lsstats[MAXSSTATS];		//list of the summary statistics used
	char str[MAXCHAR],			//auxiliar to get the input from the user
		 output[MAXCHAR];		//output filename
		 	
	//summary statistics
	for(cstat=0; cstat<MAXSSTATS; cstat++)
		lsstats[cstat]=0;
	printf("  choose the summary statistics to be used (0 - absent; 1 - present):\n");
	for(cstat=0; cstat<MAXSSTATS; cstat++){
		do{
			switch(cstat){
			case 0:
			printf("\n  microsatellites data\n");
			printf("    heterozygosity: ");
			break;
			case 1:
			printf("    variance of alleles length: ");
			break;
			case 2:
			printf("    number of alleles: ");
			break;
			case 3:
			printf("    curtosis of alleles length: ");
			break;
			case 4:
			printf("    Shanon's index: ");
			break;
			case 5:
			printf("    Nm estimator based on H: ");
			break;
			case 6:
			printf("\n  sequence data\n");
			printf("    mean of pairwise differences: ");
			break;
			case 7:
			printf("    number of segregating sites: ");
			break;
			case 8:
			printf("    number of haplotypes: ");
			break;
			case 9:
			printf("    Shanon's index: ");
			break;
			case 10:
			printf("    mean of MFS: ");
			break;
			case 11:
			printf("    stdev of MFS: ");
			break;
			case 12:
			printf("    Nm estimator based on S: ");
			break;
			case 13:
			printf("    private segregating sites: ");
			break;
			case 14:
			printf("    S(1): ");
			break;
			}
			scanf("%s",&str);
			lsstats[cstat] = atoi(str);
		}
		while(lsstats[cstat]!=1 && lsstats[cstat]!=0);
	}
	/*output filename*/
	printf("\n  insert name for summary statistics set file (no extension)");
	printf("\n  (max %d character): ",MAXCHAR-1);
	scanf("%s",output);
	
	/*run makestats()*/
	return makestats(output,lsstats);

}  //ends of buildsstats

int createtab(){
	char str[MAXCHAR],		//auxiliar to get the input from the user
		 input[MAXCHAR],	//input file name
		 output[MAXCHAR];	//input file name

	//input filename
	printf("\n  choose sample file (.pop) (max %d character): ",MAXCHAR-1);
	scanf("%s",input);

	//output filename
	printf("\n  insert name for table file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",output);

	return createFreqTab(input,output);
	
} //end of createtab1

int createtab2(){
	char str[MAXCHAR],		//auxiliar to get the input from the user
		 input[MAXCHAR],	//input file name
		 output[MAXCHAR];	//input file name

	//input filename
	printf("\n  choose IMa sample file (max %d character): ",MAXCHAR-1);
	scanf("%s",input);

	//output filename
	printf("\n  insert name for table file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",output);

	return createFreqTab2(input,output);
	
} //end of createtab2

int createtab3(){
	char str[MAXCHAR],		//auxiliar to get the input from the user
		 input[MAXCHAR],	//input file name
		 output[MAXCHAR];	//input file name

	//input filename
	printf("\n  choose GenePop sample file (max %d character): ",MAXCHAR-1);
	scanf("%s",input);

	//output filename
	printf("\n  insert name for table file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",output);

	return createFreqTab3(input,output);
	
} //end of createtab3

int createtab4(){
	char str[MAXCHAR],		//auxiliar to get the input from the user
		 input[MAXCHAR],	//input file name
		 output[MAXCHAR];	//input file name

	//input filename
	printf("\n  choose Nexus file (.nex) (max %d character): ",MAXCHAR-1);
	scanf("%s",input);

	//output filename
	printf("\n  insert name for table file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",output);

	return createFreqTab4(input,output);
	
} //end of createtab4

int createpop(){
	char str[MAXCHAR],		//auxiliar to get the input from the user
		 input[MAXCHAR],	//input file name
		 output[MAXCHAR];	//input file name

	//input filename
	printf("\n  choose table file (.len) (max %d character): ",MAXCHAR-1);
	scanf("%s",input);

	//output filename
	printf("\n  insert name for sample file (no extension) (max %d character): ",MAXCHAR-1);
	scanf("%s",output);

	return makepop(input,output);
	
} //end of convertTab

int joinfiles(){
	int i,				//iterator
		error,			//saves the error type
		ninp;			//number of files to join
	char outp[MAXCHAR],	//output file name
		 str[MAXCHAR],	//auxiliar to get the input from the user
		 **linp;		//list of the files to join together
		 
	//number of files to join
	do{
		printf("  choose the number of files to join (>1): ");
		scanf("%s",&str);
		ninp = atoi(str);
	}
	while(ninp <=1);

	//path of the files to join
	linp = (char**)malloc(ninp*sizeof(char*));
	printf("\n  choose %d files to be joint (.dat)\n",ninp);
	for(i=0; i<ninp; i++){
		linp[i] = (char*)malloc(MAXCHAR*sizeof(char));
		printf("    file %d (max %d character): ",i+1,MAXCHAR-1);
		scanf("%s",linp[i]);
	}
	
	//output filename
	printf("\n  insert name for created file (.dat) (max %d character): ",MAXCHAR-1);
	scanf("%s",outp);
	
	//run joindata()
	error = joindata(ninp,linp,outp);
	
	//free stuff
	for(i=0; i<ninp; i++){
		free(linp[i]);
	}
	free(linp);
	
	return error;
	
} //end of joinfiles
The diff you're trying to view is too large. Only the first 1000 changed files have been loaded.
Showing with 0 additions and 0 deletions (0 / 0 diffs computed)
swh spinner

Computing file changes ...

back to top

Software Heritage — Copyright (C) 2015–2026, The Software Heritage developers. License: GNU AGPLv3+.
The source code of Software Heritage itself is available on our development forge.
The source code files archived by Software Heritage are available under their own copyright and licenses.
Terms of use: Archive access, API— Content policy— Contact— JavaScript license information— Web API