%{
#include <string.h>
char *name, *srcname, *depname;
int missing;
%}
%%
^report:\n {}
^output-version:\ 1.0\n {}
^\ -\n {
	free(name);
	name = NULL;
	free(srcname);
	srcname = NULL;
}
^\ \ version:\ [^\n]*\n {}
^\ \ architecture:\ [^\n]*\n {}
^\ \ essential:\ [^\n]*\n {}
^\ \ status:\ [^\n]*\n {}
^\ \ reasons:\n {}
^\ \ \ -\n {}
^\ \ \ \ missing:\n { missing = 1; }
^\ \ \ \ conflict:\n { missing = 0; }
^\ \ \ \ \ pkg:\n {}
^\ \ \ \ \ pkg[0-9]*:\n {}
^\ \ \ \ \ \ version:\ [^\n]*\n {}
^\ \ \ \ \ \ source:\ [^\n]*\n {}
^\ \ \ \ \ \ architecture:\ [^\n]*\n {}
^\ \ \ \ \ \ essential:\ [^\n]*\n {}
^\ \ \ \ \ \ unsat-conflict:\ [^\n]*\n {}
^\ \ \ \ \ depchains:\n {}
^\ \ \ \ \ depchain[0-9]*:\n {}
^\ \ \ \ \ \ -\n {}
^\ \ \ \ \ \ \ depchain:\n {}
^\ \ \ \ \ \ \ \ -\n {}
^\ \ \ \ \ \ \ \ \ version:\ [^\n]*\n {}
^\ \ \ \ \ \ \ \ \ architecture:\ [^\n]*\n {}
^\ \ \ \ \ \ \ \ \ essential:\ [^\n]*\n {}
^background-packages:\ [0-9]*\n {}
^foreground-packages:\ [0-9]*\n {}
^total-packages:\ [0-9]*\n {}
^broken-packages:\ [0-9]*\n {}

^\ \ package:\ [^\n]*\n {
	char *c = yytext;
	char *d = strchr(c, '\n');
	*d = 0;
	c += 11;
	if (strncmp(c, "hurd-i386:", 10) == 0)
		c += 10;
	if (d - 10 > c && strncmp(d-10, ":hurd-i386", 10) == 0)
	{
		d -= 10;
		*d = 0;
	}
	name = strdup(c);
	printf("\"%s\" [fillcolor=purple,fontcolor=black,style=filled]\n",name);
}

^\ \ source:\ [^\n]*\n {
	char *c = yytext + 10;
	char *d = strchr(c, '\n');
	char *e = strchr(c, ' ');
	*d = 0;
	if (e)
		*e = 0;
	srcname = strdup(c);
	printf("\"%s\" [shape=ellipse]\n",srcname);
	if (strcmp(srcname, name))
		printf("\"%s\" -> \"%s\" [style=solid]\n",srcname,name);
}

^\ \ \ \ \ \ package:\ [^\n]*\n {
	if (missing) {
	  char *c = yytext;
	  char *d = strchr(c, '\n');
	  *d = 0;
	  free(depname);
	  c += 15;
	  if (strncmp(c, "hurd-i386:", 10) == 0)
		  c += 10;
	  if (d - 10 > c && strncmp(d-10, ":hurd-i386", 10) == 0)
	  {
	  	d -= 10;
	  	*d = 0;
	  }
	  depname = strdup(c);
	}
}

^\ \ \ \ \ \ unsat-dependency:\ [^\n]*\n {
	if (missing) {
	  char *c = yytext + 24;
	  char *d = strchr(c, '\n');
	  char *e = strchr(c, ' ');
	  *d = 0;
	  if (e)
	  {
	    d = e;
	    *e = 0;
	  }
	  if (strncmp(c, "hurd-i386:", 10) == 0)
		  c += 10;
	  if (d - 10 > c && strncmp(d-10, ":hurd-i386", 10) == 0)
	  {
	  	d -= 10;
	  	*d = 0;
	  }
	  printf("\"%s\" -> \"%s\" [style=solid]\n",c,depname);
	}
}

^\ \ \ \ \ \ \ \ \ package:\ [^\n]*\n {
	if (missing) {
	  char *c = strchr(yytext, '\n');
	  *c = 0;
	  free(depname);
	  depname = strdup(yytext + 18);
	}
}
^\ \ \ \ \ \ \ \ \ depends:\ [^\n]*\n {
	if (missing) {
	  char *c = yytext + 18;
	  char *d = strchr(c, '\n');
	  char *e = strchr(c, ' ');
	  *d = 0;
	  if (e)
	  {
	    d = e;
	    *e = 0;
	  }
	  if (strncmp(c, "hurd-i386:", 10) == 0)
		  c += 10;
	  if (d - 10 > c && strncmp(d-10, ":hurd-i386", 10) == 0)
	  {
	  	d -= 10;
	  	*d = 0;
	  }
	  printf("\"%s\" -> \"%s\" [style=solid]\n", c, depname);
	}
}

^\ *\n { }
^output-version:\ *[0-9.]*\n { }

^.*\n {
	fprintf(stderr,"unrecognized '%s'\n",yytext);
}
