/* 2010 (C) Jussi Rintanen */ #include #include #include "interface.h" #include "clausedb.h" #include "main.h" #define noDEBUG int lineno; void nextline(FILE *f) { char c; do { c = getc(f); } while(c != '\n'); lineno += 1; } int numeric(char c) { return '0' <= c && c <= '9'; } int numvalue(char c) { return c-'0'; } int readnat(FILE *f) { char c; int i; do { c = getc(f); if(c == '%') nextline(f); if(c == '\n') lineno += 1; } while (c == ' ' || c == '\n' || c == '\t' || c == '%'); i = 0; if(! numeric(c)) { fprintf(stderr,"Found illegal character %c on line %i ... exiting.\n",c,lineno); exit(0); } i = numvalue(c); do { c = getc(f); if(numeric(c)) i = i*10+numvalue(c); } while(numeric(c)); ungetc(c,f); return i; } int readint(FILE *f) { char c; int i; int neg; neg = 0; do { c = getc(f); if(c == '%') nextline(f); if(c == '\n') lineno += 1; } while (c == ' ' || c == '\n' || c == '\t' || c == '%'); i = 0; if((! numeric(c)) && (c != '-')) { fprintf(stderr,"Found illegal character %c on line %i ... exiting.\n",c,lineno); exit(0); } if(c == '-') { neg = 1; i = 0; } else i = numvalue(c); do { c = getc(f); if(numeric(c)) i = i*10+numvalue(c); } while(numeric(c)); ungetc(c,f); return neg ? 0-i : i; } int dsatlit(int l) { if(l < 0) return ((-l-1) << 1)|1; return ((l-1) << 1); } int inputclause[100000]; satinstance DIMACSinput() { FILE *f; satinstance sati; int i,len,j,n; char c; int numberOfProps; int numberOfClauses; if(nOfInputFiles != 1) { fprintf(stderr,"ERROR: DIMACS input has to be exactly one file!\n"); exit(1); } f = fopen(inputfiles[0],"r"); if(f == NULL) { fprintf(stderr,"ERROR: could not open file '%s'\n",inputfiles[0]); exit(1); } lineno = 1; initclausedb(); numberOfProps = -1; numberOfClauses = -1; while(1 == 1) { c = getc(f); switch(c) { case 'c': nextline(f); break; case 'p': printf("Reading DIMACS header\n"); do { c = getc(f); } while(c != 'c'); do { c = getc(f); } while(c != 'n'); do { c = getc(f); } while(c != 'f'); numberOfProps = readnat(f); numberOfClauses = readnat(f); printf("%i variables %i clauses\n",numberOfProps,numberOfClauses); nextline(f); break; default: ungetc(c,f); goto preambleended; } } preambleended: sati = newinstance(1,1,numberOfProps,0,0); for(i=0;i