-
Notifications
You must be signed in to change notification settings - Fork 2
/
lrs.c
102 lines (76 loc) · 2.39 KB
/
lrs.c
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
#include <stdio.h>
#include <string.h>
#include <setjmp.h>
#include <stdlib.h>
#include <limits.h>
#include "lrsdriver.h"
int
main (int argc, char *argv[])
{
#ifndef MA
lrs_main(argc,argv); /* legacy lrs */
return 0;
#endif
/* hybrid arithmetic version of lrs */
lrs_restart_dat *R;
lrs_dic *P;
lrs_dat *Q;
char* tmp; /* when overflow occurs a new input file name is returned */
char** newargv;
long overfl=0; /* =0 no overflow =1 restart overwrite =2 restart append */
long overfl2=0; /* for B128 */
long b128=0; /* =1 if _int128 available */
int lrs_stdin=0;
int i;
#ifdef B128
b128=1;
#endif
P=NULL;
Q=NULL;
tmp=NULL;
R = lrs_alloc_restart();
if (R == NULL)
exit(1);
if(argc == 1)
lrs_stdin=1;
tmp = malloc(PATH_MAX * sizeof (char));
if ( (overfl=lrs1_main(argc,argv,&P,&Q,0,0,tmp,R)) == 0) /* set up, read input, no run */
if ( (overfl=lrs1_main(argc,argv,&P,&Q,0,1,tmp,R)) == 0) /* run reverse search */
if ( (overfl=lrs1_main(argc,argv,&P,&Q,0,2,tmp,R)) == 0) /* free memory and close */
goto byebye;
if (overfl==-1) /* unrecoverable input error */
{
printf("\n");
exit(1);
}
/* overflow condition triggered: a temporary file was created for restart */
/* create new argv for the remaining calls */
newargv = makenewargv(&argc,argv,tmp);
if(b128)
{
fprintf(stderr,"\n*lrs:overflow possible: restarting with 128 bit arithmetic\n");
if ( (overfl2=lrs2_main(argc,newargv,&P,&Q,overfl,0,tmp,R)) == 0)
if ( (overfl2=lrs2_main(argc,newargv,&P,&Q,overfl,1,tmp,R)) == 0)
if ( (overfl2=lrs2_main(argc,newargv,&P,&Q,overfl,2,tmp,R)) == 0)
goto done;
overfl=overfl2;
}
/* if you change tmp file name update newargv[1] */
fprintf(stderr,"\n*lrs:overflow possible: restarting with GMP arithmetic\n");
lrsgmp_main(argc,newargv,&P,&Q,overfl,0,tmp,R);
lrsgmp_main(argc,newargv,&P,&Q,overfl,1,tmp,R);
lrsgmp_main(argc,newargv,&P,&Q,overfl,2,tmp,R);
done:
for(i = 0; i < argc; ++i)
free(newargv[i]);
free(newargv);
byebye:
free(R->redineq);
free(R->facet);
free(R);
fprintf(stderr,"\n");
if(lrs_stdin==1) /* get rid of temporary file for stdin */
remove(tmp);
free(tmp);
return 0;
} /* lrs.c */