-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.cpp
127 lines (104 loc) · 2.96 KB
/
parser.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
/*********************************************************************
================
CNF Parsing code
================
**********************************************************************/
#include "parser.h"
#include <iostream>
using std::ifstream;
//#include <zlib.h>
#include <cstdlib>
#include <cstdio>
//=====================================================================
// DIMACS Parser:
#define CHUNK_LIMIT 1048576
class StreamBuffer {
//gzFile in;
FILE *in;
char buf[CHUNK_LIMIT];
int pos;
int size;
void assureLookahead() {
if (pos >= size) {
pos = 0;
//size = gzread(in, buf, sizeof(buf)); } }
size = fread(buf, 1, sizeof(buf), in); } }
public:
//StreamBuffer(gzFile i) : in(i), pos(0), size(0) {
StreamBuffer(FILE *i) : in(i), pos(0), size(0) {
assureLookahead(); }
int operator * () { return (pos >= size) ? EOF : buf[pos]; }
void operator ++ () { pos++; assureLookahead(); }
};
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
void skipWhitespace(StreamBuffer &in) {
while ((*in >= 9 && *in <= 13) || *in == 32)
++in;
}
void skipLine(StreamBuffer &in) {
while (true) {
if (*in == EOF) return;
if (*in == '\n') { ++in; return; }
++in;
}
}
int parseInt(StreamBuffer &in) {
int val = 0;
bool neg = false;
skipWhitespace(in);
if (*in == '-') neg = true, ++in;
else if (*in == '+') ++in;
if (*in < '0' || *in > '9')
fprintf(stderr, "PARSE ERROR! Unexpected char: %c\n", *in), exit(3);
while (*in >= '0' && *in <= '9') {
val = val*10 + (*in - '0');
++in;
}
return neg ? -val : val;
}
void readClause(StreamBuffer &in, vector<vector<int> > &clauses) {
int parsed_lit;
vector<int> newClause;
while (true) {
parsed_lit = parseInt(in);
if (parsed_lit == 0) break;
newClause.push_back(parsed_lit);
}
clauses.push_back(newClause);
}
void parse_DIMACS_main(StreamBuffer &in, vector<vector<int> > &clauses) {
while (true) {
skipWhitespace(in);
if (*in == EOF) break;
else if (*in == 'c' || *in == 'p') skipLine(in);
else readClause(in, clauses);
}
}
//void parse_DIMACS(gzFile input_stream, vector<vector<int> > &clauses)
void parse_DIMACS(FILE *input_stream, vector<vector<int> > &clauses)
{
StreamBuffer in(input_stream);
parse_DIMACS_main(in, clauses);
}
void parse_DIMACS_CNF(vector<vector<int> > &clauses,
int &maxVarIndex,
const char *DIMACS_cnf_file) {
unsigned int i, j;
int candidate;
//gzFile in = gzopen(DIMACS_cnf_file, "rb");
FILE *in = fopen(DIMACS_cnf_file, "r");
if (in == NULL) {
fprintf(stderr, "ERROR! Could not open file: %s\n",
DIMACS_cnf_file);
exit(1);
}
parse_DIMACS(in, clauses);
//gzclose(in);
fclose(in);
maxVarIndex = 0;
for (i = 0; i < clauses.size(); ++i)
for (j = 0; j < clauses[i].size(); ++j) {
candidate = abs(clauses[i][j]);
if (candidate > maxVarIndex) maxVarIndex = candidate;
}
}