/* Dimacs graph format translator to and from a binary, more efficient
   format. Written by Tamas Badics (badics@rutcor.rutgers.edu), 
   using the technique of Marcus Peinado. */
/*
   Modified September 13, 1993 to change type of oc,c from char to int
   avoiding infinite loop on EOF for some compilers: MT */

/* Marcus Peinado
   Department of Computer Science
   Boston University
   */


#include <stdio.h>


#define MAX_NR_VERTICES		10000
#define BOOL	char

int Nr_vert, Nr_edges;

#define MAX_PREAMBLE 10000
static char Preamble[MAX_PREAMBLE];


int get_params();
/* ====================================================== */

void set_edge(i, j, x)
     register int i;
     register int j;
     char x;
{
  //do something
}


void read_graph_DIMACS_ascii(file)
     char *file;
{

	int c, oc;
	char * pp = Preamble;
	int i,j;
	FILE *fp;
	
	if ( (fp=fopen(file,"r"))==NULL )
	  { printf("ERROR: Cannot open infile\n"); exit(10); }

	for(oc = '\0' ;(c = fgetc(fp)) != EOF && (oc != '\n' || c != 'e')
		; oc = *pp++ = c);
 
	ungetc(c, fp); 
	*pp = '\0';
	get_params();

	while ((c = fgetc(fp)) != EOF){
		switch (c)
		  {
			case 'e':
			  if (!fscanf(fp, "%d %d", &i, &j))
				{ printf("ERROR: corrupted inputfile\n"); exit(10); }
			  
			  if (i > j) 
				set_edge(i-1, j-1, 1);
			  else
				set_edge(j-1, i-1, 1);
			  break;
			  
			case '\n':
			  
			default:
			  break;
		  }
	}
	
	fclose(fp);
}

int get_params()
                      /* getting Nr_vert and Nr_edge from the preamble string, 
						 containing Dimacs format "p ??? num num" */
{
	char c, *tmp;
	char * pp = Preamble;
	int stop = 0;
	tmp = (char *)calloc(100, sizeof(char));
	
	Nr_vert = Nr_edges = 0;
	
	while (!stop && (c = *pp++) != '\0'){
		switch (c)
		  {
			case 'c':
			  while ((c = *pp++) != '\n' && c != '\0');
			  break;
			  
			case 'p':
			  sscanf(pp, "%s %d %d\n", tmp, &Nr_vert, &Nr_edges);
			  stop = 1;
			  break;
			  
			default:
			  break;
		  }
	}
	
	free(tmp);
	
	if (Nr_vert == 0 || Nr_edges == 0)
	  return 0;  /* error */
	else
	  return 1;
	
}

/* ============================================= */
main(argc, argv)
     int argc;
     char **argv;
{
	int i;
	char name[255];
	
	if ( argc > 3 || argc < 2) 
	  {printf("Usage: %s infile [outfile]\n",argv[0]);  exit(10); }
	
	read_graph_DIMACS_ascii( argv[1] );

	if (argc == 2)
	  sprintf(name, "%s.b", argv[1]);
	else 
	  sprintf(name, "%s", argv[2]);
	
}

