lingeling-ala-b02aa1a-121013/0000775000175000017500000000000012036254406014355 5ustar bierebierelingeling-ala-b02aa1a-121013/lglmain.c0000664000175000017500000004672512036252073016160 0ustar bierebiere/* Copyright 2010-2012 Armin Biere, Johannes Kepler University, Linz, Austria */ #include "lglib.h" #include #include #include #include #include #include #include #include static LGL * lgl4sigh; static int catchedsig, verbose, ignmissingheader, ignaddcls; static int * targets, sztargets, ntargets, multiple; static void (*sig_int_handler)(int); static void (*sig_segv_handler)(int); static void (*sig_abrt_handler)(int); static void (*sig_term_handler)(int); static void (*sig_bus_handler)(int); static void (*sig_alrm_handler)(int); static void resetsighandlers (void) { (void) signal (SIGINT, sig_int_handler); (void) signal (SIGSEGV, sig_segv_handler); (void) signal (SIGABRT, sig_abrt_handler); (void) signal (SIGTERM, sig_term_handler); (void) signal (SIGBUS, sig_bus_handler); } static void caughtsigmsg (int sig) { if (!verbose) return; printf ("c\nc CAUGHT SIGNAL %d", sig); switch (sig) { case SIGINT: printf (" SIGINT"); break; case SIGSEGV: printf (" SIGSEGV"); break; case SIGABRT: printf (" SIGABRT"); break; case SIGTERM: printf (" SIGTERM"); break; case SIGBUS: printf (" SIGBUS"); break; case SIGALRM: printf (" SIGALRM"); break; default: break; } printf ("\nc\n"); fflush (stdout); } static void catchsig (int sig) { if (!catchedsig) { catchedsig = 1; caughtsigmsg (sig); fputs ("s UNKNOWN\n", stdout); fflush (stdout); if (verbose) { lglflushtimers (lgl4sigh); lglstats (lgl4sigh); caughtsigmsg (sig); } } resetsighandlers (); if (!getenv ("LGLNABORT")) raise (sig); else exit (1); } static void setsighandlers (void) { sig_int_handler = signal (SIGINT, catchsig); sig_segv_handler = signal (SIGSEGV, catchsig); sig_abrt_handler = signal (SIGABRT, catchsig); sig_term_handler = signal (SIGTERM, catchsig); sig_bus_handler = signal (SIGBUS, catchsig); } static int timelimit = -1, caughtalarm = 0; static void catchalrm (int sig) { assert (sig == SIGALRM); if (!caughtalarm) { caughtalarm = 1; caughtsigmsg (sig); if (timelimit >= 0) { printf ("c time limit of %d reached after %.1f seconds\nc\n", timelimit, lglsec (lgl4sigh)); fflush (stdout); } } } static int checkalarm (void * ptr) { assert (ptr == (void*) &caughtalarm); return caughtalarm; } static int next (FILE * in, int *linenoptr) { int res = getc (in); if (res == '\n') *linenoptr += 1; return res; } static char isoptchartab[256]; static int isoptchartabinitialized; static int isoptchar (unsigned char uch) { int i; if (!isoptchartabinitialized) { for (i = 'a'; i <= 'z'; i++) isoptchartab[i] = 1; for (i = 'A'; i <= 'Z'; i++) isoptchartab[i] = 1; for (i = '0'; i <= '9'; i++) isoptchartab[i] = 1; isoptchartab['-'] = isoptchartab['_'] = 1; isoptchartabinitialized = 1; } return isoptchartab[uch]; } typedef struct Opt { char * name; int size, count; } Opt; static void pushoptch (Opt * opt, int ch) { if (opt->count + 1 >= opt->size) opt->name = realloc (opt->name, opt->size = opt->size ? 2*opt->size : 2); opt->name[opt->count++] = ch; opt->name[opt->count] = 0; } static const char * parse (LGL * lgl, FILE * in, int * lp) { int ch, prev, m, n, v, c, l, lit, sign, val, embedded = 0, header; Opt opt; memset (&opt, 0, sizeof opt); SKIP: ch = next (in, lp); if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') goto SKIP; if (ch == 'c') { ch = next (in, lp); while (ch != '\n') { if (ch == EOF) return "end of file in comment"; prev = ch; ch = next (in, lp); if (prev != '-') continue; if (ch != '-') continue; assert (!opt.count); ch = next (in, lp); while (isoptchar (ch)) { assert (ch != '\n'); pushoptch (&opt, ch); ch = next (in, lp); } opt.count = 0; if (ch != '=') continue; ch = next (in, lp); if (ch == '-') sign = -1, ch = next (in, lp); else sign = 1; if (!isdigit (ch)) continue; val = ch - '0'; while (isdigit (ch = next (in, lp))) val = 10 * val + (ch - '0'); if (!lglhasopt (lgl, opt.name)) { fprintf (stderr, "*** lingeling warning: " "parsed invalid embedded option '--%s'\n", opt.name); continue; } val *= sign; if (!embedded++ && verbose) printf ("c\nc embedded options:\nc\n"); if (!strcmp (opt.name, "verbose")) verbose = val; if (verbose) printf ("c --%s=%d\n", opt.name, val); lglsetopt (lgl, opt.name, val); } goto SKIP; } free (opt.name); if (verbose) { if (embedded) printf ("c\n"); else printf ("c no embedded options\n"); fflush (stdout); } header = m = n = v = l = c = 0; if (ignmissingheader) { if (ch == 'p') { if (verbose) printf ("will not read header"); while ((ch = next (in, lp)) != '\n' && ch != EOF) ; } else if (verbose) printf ("c skipping missing header\n"); goto BODY2; } if (ch != 'p') return "missing 'p ...' header"; if (next (in, lp) != ' ') return "invalid header: expected ' ' after 'p'"; while ((ch = next (in, lp)) == ' ') ; if (ch != 'c') return "invalid header: expected 'c' after ' '"; if (next (in, lp) != 'n') return "invalid header: expected 'n' after 'c'"; if (next (in, lp) != 'f') return "invalid header: expected 'f' after 'n'"; if (next (in, lp) != ' ') return "invalid header: expected ' ' after 'f'"; while ((ch = next (in, lp)) == ' ') ; if (!isdigit (ch)) return "invalid header: expected digit after 'p cnf '"; m = ch - '0'; while (isdigit (ch = next (in, lp))) m = 10 * m + (ch - '0'); if (ch != ' ') return "invalid header: expected ' ' after 'p cnf '"; while ((ch = next (in, lp)) == ' ') ; if (!isdigit (ch)) return "invalid header: expected digit after 'p cnf '"; n = ch - '0'; while (isdigit (ch = next (in, lp))) n = 10 * n + (ch - '0'); while (ch == ' ') ch = next (in, lp); if (ch != '\n') return "invalid header: expected new line after header"; if (verbose) printf ("c found 'p cnf %d %d' header\n", m, n); header = 1; BODY: ch = next (in, lp); BODY2: if (ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r') goto BODY; if (ch == 'c') { while ((ch = next (in, lp)) != '\n') if (ch == EOF) return "end of file in comment"; goto BODY; } if (ch == EOF) { if (header && c + 1 == n) return "clause missing"; if (header && c < n) return "clauses missing"; DONE: if (verbose) { printf ("c read %d variables, %d clauses, %d literals in %.1f seconds\n", v, c, l, lglsec (lgl)); printf ("c\n"); lglprintfeatures (lgl); printf ("c\n"); fflush (stdout); } return 0; } if (ch == '-') { ch = next (in, lp); if (ch == '0') return "expected positive digit after '-'"; sign = -1; } else sign = 1; if (!isdigit (ch)) return "expected digit"; if (header && c == n) return "too many clauses"; lit = ch - '0'; while (isdigit (ch = next (in, lp))) lit = 10 * lit + (ch - '0'); if (header && lit > m) return "maxium variable index exceeded"; if (lit > v) v = lit; if (lit) l++; else c++; lit *= sign; lgladd (lgl, lit); if (!lit && ignaddcls && c == n) goto DONE; goto BODY; } typedef struct OBuf { char line[81]; int pos; } OBuf; static void flushobuf (OBuf * obuf, FILE * file) { assert (0 < obuf->pos); assert (obuf->pos < 81); obuf->line[obuf->pos++] = '\n'; assert (obuf->pos < 81); obuf->line[obuf->pos++] = 0; fputc ('v', file); fputs (obuf->line, file); obuf->pos = 0; } static void print2obuf (OBuf * obuf, int i, FILE * file) { char str[20]; int len; sprintf (str, " %d", i); len = strlen (str); assert (len > 1); if (obuf->pos + len > 79) flushobuf (obuf, file); strcpy (obuf->line + obuf->pos, str); obuf->pos += len; assert (obuf->pos <= 79); } static FILE * writefile (const char * name, int * clptr) { int len = strlen (name); char * tmp; FILE * res; if (len >= 3 && !strcmp (name + len - 3, ".gz")) { tmp = malloc (len + 20); unlink (name); sprintf (tmp, "gzip -c > %s", name); res = popen (tmp, "w"); if (res) *clptr = 2; free (tmp); } else { res = fopen (name, "w"); if (res) *clptr = 1; } if (!res) fprintf (stderr, "*** lingeling error: can not write %s\n", name); return res; } static void closefile (FILE * file, int type) { if (type == 1) fclose (file); if (type == 2) pclose (file); } static void lgltravcounter (void * voidptr, int lit) { int * cntptr = voidptr; if (!lit) *cntptr += 1; } static void lglpushtarget (int target) { if (ntargets == sztargets) targets = realloc (targets, sizeof *targets * (sztargets = sztargets ? 2*sztargets : 1)); targets[ntargets++] = target; } static int lglmonotifiy (void * lgl, int target, int val) { printf ("t %d %d after %.3f seconds\n", target, val, lglsec (lgl)); fflush (stdout); return 1; } int main (int argc, char ** argv) { int res, i, j, clin, clout, val, len, lineno, simponly, count, target; const char * iname, * oname, * pname, * match, * p, * err; FILE * in, * out, * pfile; int maxvar, lit, nopts; char * tmp; LGL * lgl; OBuf obuf; lineno = 1; in = out = 0; res = clin = clout = simponly = 0; iname = oname = pname = 0; lgl4sigh = lgl = lglinit (); setsighandlers (); for (i = 1; i < argc; i++) { if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help")) { printf ("usage: lingeling [