Exemplo n.º 1
0
int main()
{
	igraph_t g;

	/* init the attributes in igraph */
	igraph_i_set_attribute_table(&igraph_cattribute_table);

	/* read a graph on stdin */
	assert(ggen_read_graph(&g,stdin) == 0);

	/* output it to stdout */
	assert(ggen_write_graph(&g,stdout) == 0);

	return 0;
}
Exemplo n.º 2
0
/* helper function for command flags */
int handle_need_input(void)
{
	int status;
	igraph_bool_t isdag;

	normal("Configuring input\n");
	if(infname)
	{
		info("Using %s as input file\n",infname);
		infile = fopen(infname,"r");
		if(!infile)
		{
			warning("failed to open file %s for graph input, using stdin instead\n",infname);
			infile = stdin;
			infname = NULL;
		}
	}
	else
		infile = stdin;

	status = ggen_read_graph(&g,infile);
	if(infname)
		fclose(infile);
	if(status)
	{
		error("Failed to read graph\n");
		return 1;
	}
	/* check that the graph is a DAG */
	status = igraph_is_dag(&g,&isdag);
	if(status || !isdag)
	{
		error("Input graph failed DAG verification\n");
		return 1;
	}
	normal("Input configured and graph read\n");
	return 0;
}
Exemplo n.º 3
0
int handle_second_lvl(int argc,char **argv,struct first_lvl_cmd *fl, struct second_lvl_cmd *sl)
{
	int status = 0;
	// check for help
	if(ask_help || (argc == 0 && sl->nargs != 0))
	{
		if(sl->help != NULL)
			print_help(sl->help);
		else
			print_first_lvl_help(fl);
		return 0;
	}
	// check number of arguments
	if(argc != sl->nargs)
	{
		info("Expected %u arguments, found %u\n",sl->nargs,argc);
		error("Wrong number of arguments\n");
		return 1;
	}
	// open input
	if(fl->flags & NEED_INPUT)
	{
		normal("Configuring input\n");
		if(infname)
		{
			info("Using %s as input file\n",infname);
			infile = fopen(infname,"r");
			if(!infile)
			{
				warning("failed to open file %s for graph input, using stdin instead\n",infname);
				infile = stdin;
				infname = NULL;
			}
		}
		else
			infile = stdin;

		status = ggen_read_graph(&g,infile);
		if(infname)
			fclose(infile);
		if(status)
		{
			error("Failed to read graph\n");
			goto free_ing;
		}
		normal("Input configured and graph read\n");
	}
	// load rng
	if(fl->flags & NEED_RNG)
	{
		normal("Configuring random number generator\n");
		// turn off automatic abort on gsl error
		gsl_set_error_handler_off();
		status = ggen_rng_init(&rng);
		if(status)
		{
			error("Failed to initialize RNG\n");
			goto free_ing;
		}
		if(rngfname)
		{
			info("Using %s as RNG state file\n",rngfname);
			status = ggen_rng_load(&rng,rngfname);
			if(status == 1)
				warning("RNG State file not found, will continue anyway\n");
			else if(status != 0)
			{
				error("Reading RNG State from file failed.\n");
				goto free_rng;
			}
		}
		normal("RNG configured\n");
	}
	// set name
	if((fl->flags & NEED_NAME) && name == NULL)
	{
		name = "newproperty";
		info("Property name needed, using %s as default\n",name);
	}
	// set type
	if((fl->flags & NEED_TYPE) && ptype == -1)
	{
		ptype = VERTEX_PROPERTY;
		info("Property type needed, using VERTEX as default\n");
	}

	// output is a bit different from input:
	// a command can have its output redirected even
	// if it does not generate a graph
	// need_output tells us if a resulting graph needs
	// to be wrote, not if the output can be redirected
	normal("Configuring output\n");
	if(outfname)
	{
		info("Opening %s for writing\n",outfname);
		outfile = fopen(outfname,"w");
		if(!outfile)
		{
			warning("Failed to open file %s for output, using stdout instead\n",outfname);
			outfile = stdout;
			outfname = NULL;
		}
	}
	else
		outfile = stdout;
	normal("Ouput configured\n");

	// launch cmd
	status = sl->fn(argc,argv);
	if(status)
	{
		error("Command Failed\n");
		goto err;
	}

	if(fl->flags & NEED_OUTPUT)
	{
		normal("Printing graph\n");
		if(fl->flags & IS_GRAPH_P)
			status = ggen_write_graph(g_p,outfile);
		else
			status = ggen_write_graph(&g,outfile);

		if(status)
		{
			error("Writing graph failed\n");
			goto free_outg;
		}
		else
			normal("Graph printed\n");
	}
	if((fl->flags & NEED_RNG) && rngfname)
	{
		normal("Saving RNG state\n");
		status = ggen_rng_save(&rng,rngfname);
		if(status)
		{
			error("RNG saving failed\n");
		}
		else
			normal("RNG Saved\n");
	}
free_outg:
	if(outfname)
		fclose(outfile);

	if(fl->flags & IS_GRAPH_P)
	{
		igraph_destroy(g_p);
		free(g_p);
	}
err:
free_rng:
	if(fl->flags & NEED_RNG)
		gsl_rng_free(rng);
free_ing:
	if(fl->flags & NEED_INPUT)
		igraph_destroy(&g);
	return status;
}