PIPS
sol.c
Go to the documentation of this file.
1 /*
2 
3  $Id: sol.c 23065 2016-03-02 09:05:50Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of PIPS.
8 
9  PIPS is free software: you can redistribute it and/or modify it
10  under the terms of the GNU General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  PIPS is distributed in the hope that it will be useful, but WITHOUT ANY
15  WARRANTY; without even the implied warranty of MERCHANTABILITY or
16  FITNESS FOR A PARTICULAR PURPOSE.
17 
18  See the GNU General Public License for more details.
19 
20  You should have received a copy of the GNU General Public License
21  along with PIPS. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 #ifdef HAVE_CONFIG_H
25  #include "pips_config.h"
26 #endif
27 #include "pip__type.h"
28 
29 #include <stdio.h>
30 
31 extern long int cross_product, limit;
32 extern int verbose;
33 extern FILE *dump;
34 
35 struct S
36  {int flags;
38  };
39 
40 #define Nil 1
41 #define If 2
42 #define List 3
43 #define Form 4
44 #define New 5
45 #define Div 6
46 #define Val 7
47 
48 struct S sol_space[SOL_SIZE];
49 static int sol_free;
50 
52 
54 Entier x, y;
55 {Entier r;
56  while(y)
57  {r = sol_mod(x, y);
58  x = y;
59  y = r;
60  }
61  return(x>= 0? x : -x);
62 }
63 
65 {
66  Entier gcd = sol_pgcd(x, y), lcm = x * (y/gcd);
67  return lcm>=0 ? lcm: -lcm;
68 }
69 
70 void sol_init()
71 {
72  sol_free = 0;
73 }
74 
75 int sol_hwm()
76 {
77  return(sol_free);
78 }
79 
80 void sol_reset(p)
81 int p;
82 {
83  if(p<0 || p>=SOL_SIZE)
84  {fprintf(stderr, "salades de saison .... : sol\n");
85  exit(40);
86  }
87  sol_free = p;
88 }
89 
90 struct S *sol_alloc()
91 {struct S *r;
92  r = sol_space + sol_free;
93  sol_free++;
94  if(sol_free >= SOL_SIZE)
95  {fprintf(stderr, "grosse solution!!! : sol\n");
96  exit(26);
97  }
98  return(r);
99 }
100 
101 void sol_nil()
102 {
103  struct S * r;
104  r = sol_alloc();
105  r -> flags = Nil;
106  if(verbose > 0)
107  {fprintf(dump, "sol_nil\n");
108  fflush(dump);
109  }
110 }
111 
113 int p;
114 {
115  return(sol_space[p].flags != Nil);
116 }
117 
118 void sol_if()
119 {
120  struct S *r;
121  r = sol_alloc();
122  r -> flags = If;
123 }
124 
125 void sol_list(n)
126 int n;
127 {struct S * r;
128  r = sol_alloc();
129  r->flags = List;
130  r->param1 = n;
131 }
132 
133 void sol_forme(l)
134 int l;
135 {
136  struct S *r;
137  r = sol_alloc();
138  r -> flags = Form;
139  r -> param1 = l;
140 }
141 
142 void sol_new(k)
143 int k;
144 {
145  struct S *r;
146  r = sol_alloc();
147  r -> flags = New;
148  r -> param1 = k;
149 }
150 
151 void sol_div()
152 {
153  struct S *r;
154  r = sol_alloc();
155  r -> flags = Div;
156 }
157 
158 void sol_val(n, d)
159 Entier n, d;
160 {
161  struct S *r;
162  r = sol_alloc();
163  r -> flags = Val;
164  r -> param1 = n;
165  r -> param2 = d;
166 }
167 
168 int sol_edit(foo, i)
169 FILE *foo;
170 int i;
171 {int j, n;
172  struct S *p;
173  Entier N, D, d;
174  debut : p = sol_space + i;
175  switch(p->flags)
176  {case Nil : fprintf(foo, "()\n");
177  if(verbose>0)fprintf(dump, "()\n");
178  i++; break;
179  case If : fprintf(foo, "(if ");
180  if(verbose>0)fprintf(dump, "(if ");
181  i = sol_edit(foo, ++i);
182  i = sol_edit(foo, i);
183  i = sol_edit(foo, i);
184  fprintf(foo, ")\n");
185  if(verbose>0)fprintf(dump, ")\n");
186  break;
187  case List: fprintf(foo, "(list ");
188  if(verbose>0)fprintf(dump, "(list ");
189  n = p->param1;
190  i++;
191  while(n--) i = sol_edit(foo, i);
192  fprintf(foo, ")\n");
193  if(verbose>0)fprintf(dump, ")\n");
194  break;
195  case Form: fprintf(foo, "#[");
196  if(verbose>0)fprintf(dump, "#[");
197  n = p->param1;
198  for(j = 0; j<n; j++)
199  {i++; p++;
200  N = p->param1; D = p->param2;
201  d = sol_pgcd(N, D);
202  if(d == D){putc(' ', foo);
203  fprintf(foo, FORMAT, N/d);
204  if(verbose>0){
205  putc(' ', dump);
206  fprintf(dump, FORMAT, N/d);
207  }
208  }
209  else{putc(' ', foo);
210  fprintf(foo,FORMAT,N/d);
211  fprintf(foo,"/");
212  fprintf(foo,FORMAT, D/d);
213  if(verbose>0)
214  {putc(' ', dump);
215  fprintf(dump,FORMAT,N/d);
216  fprintf(dump,"/");
217  fprintf(dump,FORMAT, D/d);
218  }
219  }
220  }
221  fprintf(foo, "]\n");
222  if(verbose>0)fprintf(dump, "]\n");
223  i++;
224  break;
225  case New : n = p->param1;
226  fprintf(foo, "(newparm %d ", n);
227  if(verbose>0)fprintf(dump, "(newparm %d ", n);
228  i = sol_edit(foo, ++i);
229  fprintf(foo, ")\n");
230  if(verbose>0)fprintf(dump, ")\n");
231  goto debut;
232  case Div : fprintf(foo, "(div ");
233  if(verbose>0)fprintf(dump, "(div ");
234  i = sol_edit(foo, ++i);
235  i = sol_edit(foo, i);
236  fprintf(foo, ")\n");
237  if(verbose>0)fprintf(dump, ")\n");
238  break;
239  case Val : N = p->param1; D = p->param2;
240  d = sol_pgcd(N, D);
241  if(d == D){putc(' ', foo);
242  fprintf(foo, FORMAT, N/d);
243  if(verbose>0)
244  {putc(' ', dump);
245  fprintf(dump, FORMAT, N/d);
246  }
247  }
248  else{putc(' ', foo);
249  fprintf(foo, FORMAT, N/d);
250  fprintf(foo, "/");
251  fprintf(foo, FORMAT, D/d);
252  if(verbose>0)
253  {putc(' ', dump);
254  fprintf(dump, FORMAT, N/d);
255  fprintf(dump, "/");
256  fprintf(dump, FORMAT, D/d);
257  }
258  }
259  i++;
260  break;
261  default : fprintf(foo, "Inconnu : sol\n");
262  if(verbose>0)fprintf(dump, "Inconnu : sol\n");
263  }
264  return(i);
265 }
#define D(A)
Definition: iabrev.h:56
#define exit(code)
Definition: misc-local.h:54
#define Entier
Definition: pip__type.h:24
#define FORMAT
Definition: pip__type.h:25
#define SOL_SIZE
Modification by Alexis Platonoff: we need a greater solution size.
Definition: pip__type.h:30
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
int verbose
Definition: maind.c:45
#define If
Definition: sol.c:41
int sol_hwm()
Definition: sol.c:75
Entier sol_ppcm(Entier x, Entier y)
Definition: sol.c:64
void sol_forme(int l)
Definition: sol.c:133
struct S sol_space[SOL_SIZE]
Definition: sol.c:48
Entier sol_pgcd(Entier x, Entier y)
Definition: sol.c:53
long int limit
Definition: sol.c:31
void sol_if()
Definition: sol.c:118
#define Form
Definition: sol.c:43
void sol_new(int k)
Definition: sol.c:142
#define Div
Definition: sol.c:45
static int sol_free
Definition: sol.c:49
int sol_edit(FILE *foo, int i)
Definition: sol.c:168
void sol_val(Entier n, Entier d)
Definition: sol.c:158
void sol_reset(int p)
Definition: sol.c:80
struct S * sol_alloc()
Definition: sol.c:90
Entier sol_mod()
void sol_div()
Definition: sol.c:151
void sol_list(int n)
Definition: sol.c:125
#define New
Definition: sol.c:44
FILE * dump
Should not be used : put here for Pip copatibility.
Definition: pip.c:97
void sol_init()
Definition: sol.c:70
#define Nil
Definition: sol.c:40
void sol_nil()
Definition: sol.c:101
#define Val
Definition: sol.c:46
int is_not_Nil(int p)
Definition: sol.c:112
long int cross_product
Definition: pip.c:91
#define List
Definition: sol.c:42
static char * x
Definition: split_file.c:159
Base of the parameters.
Definition: pip_interface.c:89
Entier param1
Definition: pip_interface.c:91
int flags
Definition: pip_interface.c:90
Entier param2
Definition: pip_interface.c:91