212 lines
5.0 KiB
Diff
212 lines
5.0 KiB
Diff
Description: implement zlib support to blisstog utility
|
|
zlib is implemented to handle directly flate and compress files
|
|
for the blisstog nauty tool.
|
|
Origin: debian
|
|
Author: Jerome Benoit <calculus@rezozer.net>
|
|
Last-Update: 2016-03-18
|
|
|
|
--- a/blisstog.c
|
|
+++ b/blisstog.c
|
|
@@ -9,45 +9,37 @@
|
|
-n#:# Specify a range of n values for output\n\
|
|
Input files with name *.gz are ungzipped\n"
|
|
|
|
-#define ZCAT "gunzip -c" /* name of zcat command (might be "gunzip -c") */
|
|
-
|
|
/*************************************************************************/
|
|
|
|
+#include <zlib.h>
|
|
#include "gtools.h"
|
|
|
|
+#define BUFSIZE 256
|
|
+
|
|
typedef struct
|
|
{
|
|
int v,w;
|
|
} vpair;
|
|
|
|
-static int
|
|
-nextchar(FILE *f)
|
|
-{
|
|
- char s[2];
|
|
-
|
|
- if (fscanf(f,"%1s",s) != 1) return EOF;
|
|
- else return s[0];
|
|
-}
|
|
-
|
|
static boolean
|
|
-readblissgraph(FILE *f, sparsegraph *g)
|
|
+readblissgraph(gzFile f, sparsegraph *g)
|
|
/* Reads a graph from Bliss format into a sparse graph */
|
|
{
|
|
- int n,c;
|
|
+ int n;
|
|
unsigned long ne,j;
|
|
int haven;
|
|
int i,v,w;
|
|
- int haveptn;
|
|
DYNALLSTAT(vpair,elist,elist_sz);
|
|
+ char buffer[BUFSIZE];
|
|
|
|
+ memset(buffer, '\0', BUFSIZE);
|
|
haven = 0;
|
|
j = 0;
|
|
- while ((c = nextchar(f)) >= 0)
|
|
+ while (gzgets(f, buffer, BUFSIZE) != NULL && strlen(buffer) < BUFSIZE - 1)
|
|
{
|
|
- switch (c)
|
|
+ switch (*buffer)
|
|
{
|
|
case 'c':
|
|
- while ((c = getc(f)) != '\n' && c != EOF) {}
|
|
break;
|
|
|
|
case 'p':
|
|
@@ -56,7 +48,7 @@
|
|
fprintf(stderr,"Duplicate p line\n");
|
|
exit(1);
|
|
}
|
|
- if (fscanf(f," edge %d %lu",&n,&ne) != 2)
|
|
+ if (sscanf(buffer,"p edge %d %lu",&n,&ne) != 2)
|
|
{
|
|
fprintf(stderr,"Bad p line\n");
|
|
return FALSE;
|
|
@@ -71,7 +63,7 @@
|
|
fprintf(stderr,"Missing p line\n");
|
|
return FALSE;
|
|
}
|
|
- if (fscanf(f,"%d%d",&w,&v) != 2 || w < 1 || w > n)
|
|
+ if (sscanf(buffer,"n %d%d",&w,&v) != 2 || w < 1 || w > n)
|
|
{
|
|
fprintf(stderr,"Bad n line\n");
|
|
return FALSE;
|
|
@@ -84,7 +76,7 @@
|
|
fprintf(stderr,"Missing p line or too many e lines\n");
|
|
return FALSE;
|
|
}
|
|
- if (fscanf(f,"%d%d",&v,&w) != 2 || v < 1 || w < 1 || v > n || w > n)
|
|
+ if (sscanf(buffer,"e %d%d",&v,&w) != 2 || v < 1 || w < 1 || v > n || w > n)
|
|
{
|
|
fprintf(stderr,"Bad e line\n");
|
|
return FALSE;
|
|
@@ -94,11 +86,22 @@
|
|
break;
|
|
|
|
default:
|
|
- fprintf(stderr,"Unknown line %c\n",c);
|
|
+ fprintf(stderr,"Unknown line\n");
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
+ if (errno)
|
|
+ {
|
|
+ fputs("Corrupted data file\n", stderr);
|
|
+ return FALSE;
|
|
+ }
|
|
+ else if (strlen(buffer) == BUFSIZE - 1)
|
|
+ {
|
|
+ fputs("Corruped data line\n", stderr);
|
|
+ return FALSE;
|
|
+ }
|
|
+
|
|
if (j != ne)
|
|
{
|
|
fprintf(stderr,"Wrong number of e lines\n");
|
|
@@ -135,13 +138,10 @@
|
|
int
|
|
main(int argc, char *argv[])
|
|
{
|
|
- FILE *infile;
|
|
+ gzFile infile;
|
|
int j,firstarg;
|
|
SG_DECL(g);
|
|
- size_t flen;
|
|
- boolean ispipe;
|
|
int nmin,nmax;
|
|
- char zcmd[515];
|
|
|
|
HELP; PUTVERSION;
|
|
|
|
@@ -160,53 +160,46 @@
|
|
|
|
if (argc == firstarg)
|
|
{
|
|
- if (!readblissgraph(stdin,&g))
|
|
+ if ((infile = gzdopen(STDIN_FILENO,"r")) == NULL)
|
|
{
|
|
- fprintf(stderr,">E Bliss error in file %s\n","stdin");
|
|
+ fputs(">E Can't open stdin\n", stderr);
|
|
gt_abort(NULL);
|
|
}
|
|
else
|
|
- writes6_sg(stdout,&g);
|
|
+ {
|
|
+ if (!readblissgraph(stdin,&g))
|
|
+ {
|
|
+ fprintf(stderr,">E Bliss error in file %s\n","stdin");
|
|
+ gt_abort(NULL);
|
|
+ }
|
|
+ else
|
|
+ writes6_sg(stdout,&g);
|
|
+ gzclose(infile);
|
|
+ }
|
|
}
|
|
else
|
|
{
|
|
for (j = firstarg; j < argc; ++j)
|
|
{
|
|
- flen = strlen(argv[j]);
|
|
- if (flen >= 3 && strcmp(argv[j]+flen-3,".gz") == 0)
|
|
- {
|
|
- sprintf(zcmd,"%s \"%s\"",ZCAT,argv[j]);
|
|
- if ((infile = popen(zcmd,"r")) == NULL)
|
|
- {
|
|
- fprintf(stderr,
|
|
- ">E blisstog: cannot open zcat pipe for \"%s\"\n",
|
|
- argv[j]);
|
|
- gt_abort(NULL);
|
|
- }
|
|
- ispipe = TRUE;
|
|
- }
|
|
- else
|
|
- {
|
|
- if ((infile = fopen(argv[j],"r")) == NULL)
|
|
- {
|
|
- fprintf(stderr,">E Can't open file %s\n",argv[j]);
|
|
- gt_abort(NULL);
|
|
- }
|
|
- ispipe = FALSE;
|
|
- }
|
|
-
|
|
- if (!readblissgraph(infile,&g))
|
|
+ if ((infile = gzopen(argv[j],"r")) == NULL)
|
|
{
|
|
- fprintf(stderr,">E Bliss error in file %s\n",argv[j]);
|
|
+ fprintf(stderr,">E Can't open file %s\n",argv[j]);
|
|
gt_abort(NULL);
|
|
}
|
|
- else if (nmax < 0 || (g.nv >= nmin && g.nv <= nmax))
|
|
- {
|
|
- sortlists_sg(&g);
|
|
- writes6_sg(stdout,&g);
|
|
+ else
|
|
+ {
|
|
+ if (!readblissgraph(infile,&g))
|
|
+ {
|
|
+ fprintf(stderr,">E Bliss error in file %s\n",argv[j]);
|
|
+ gt_abort(NULL);
|
|
+ }
|
|
+ else if (nmax < 0 || (g.nv >= nmin && g.nv <= nmax))
|
|
+ {
|
|
+ sortlists_sg(&g);
|
|
+ writes6_sg(stdout,&g);
|
|
+ }
|
|
+ gzclose(infile);
|
|
}
|
|
-
|
|
- if (ispipe) pclose(infile); else fclose(infile);
|
|
}
|
|
}
|
|
|