PIPS
pnome-alloc.c
Go to the documentation of this file.
1 /*
2 
3  $Id: pnome-alloc.c 1671 2019-06-26 19:14:11Z coelho $
4 
5  Copyright 1989-2016 MINES ParisTech
6 
7  This file is part of Linear/C3 Library.
8 
9  Linear/C3 Library is free software: you can redistribute it and/or modify it
10  under the terms of the GNU Lesser General Public License as published by
11  the Free Software Foundation, either version 3 of the License, or
12  any later version.
13 
14  Linear/C3 Library 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 Lesser General Public License for more details.
19 
20  You should have received a copy of the GNU Lesser General Public License
21  along with Linear/C3 Library. If not, see <http://www.gnu.org/licenses/>.
22 
23 */
24 
25 /***************************************************************** pnome-alloc.c
26  *
27  * CREATING, DUPLICATING AND FREEING A POLYNOME
28  *
29  */
30 
31 /*LINTLIBRARY*/
32 
33 #ifdef HAVE_CONFIG_H
34  #include "config.h"
35 #endif
36 #include <stdio.h>
37 #include <stdlib.h>
38 #include "linear_assert.h"
39 
40 #include "boolean.h"
41 #include "arithmetique.h"
42 #include "vecteur.h"
43 #include "polynome.h"
44 
45 /* allocation of an unitialized monome (to avoid various direct
46  * unchecked call to malloc)
47  */
49 {
50  Pmonome pm = (Pmonome) malloc(sizeof(Smonome));
51  if (pm == NULL) {
52  (void) fprintf(stderr,"new_monome: Out of memory space\n");
53  /* (void) fprintf(stderr, "%10.3f MB",
54  (sbrk(0) - etext)/(double)(1 << 20)); */
55  abort();
56  /*exit(-1);*/
57  }
58  return pm;
59 }
60 
61 /* allocation of an unitialized polynome (to avoid various direct
62  * unchecked call to malloc)
63  */
65 {
66  Ppolynome pp = (Ppolynome) malloc(sizeof(Spolynome));
67  if (pp == NULL) {
68  (void) fprintf(stderr,"new_polynome: Out of memory space\n");
69  /* (void) fprintf(stderr, "%10.3f MB",
70  (sbrk(0) - etext)/(double)(1 << 20)); */
71  abort();
72  /*exit(-1);*/
73  }
74  return pp;
75 }
76 
77 /* Pmonome make_monome(float coeff, Variable var, Value expo)
78  * PRIVATE
79  * allocates space for, and creates, the monome "coeff*var^expo"
80  */
81 Pmonome make_monome(float coeff, Variable var, Value expo)
82 {
83  if (coeff == 0)
84  return MONOME_NUL;
85 
86  Pmonome pm = new_monome();
87  monome_coeff(pm) = coeff;
88  if (value_zero_p(expo))
90  else
91  monome_term(pm) = vect_new(var, expo);
92 
93  return pm;
94 }
95 
96 /* Ppolynome make_polynome(float coeff, Variable var, Value expo)
97  * PRIVATE
98  * allocates space for, and creates, the polynome "coeff*var^expo"
99  */
100 Ppolynome make_polynome(float coeff, Variable var, Value expo)
101 {
102  Pmonome m = make_monome(coeff, var, expo);
105  return p;
106 }
107 
108 
109 /* Ppolynome monome_to_new_polynome(Pmonome pm)
110  * PRIVATE
111  * allocates space for, and creates the polynomial containing
112  * the monomial pointed by pm, which is NOT duplicated
113  * but attached to the polynomial.
114  */
116 {
117  if (MONOME_NUL_P(pm))
118  return POLYNOME_NUL;
119  else if (MONOME_UNDEFINED_P(pm))
120  return POLYNOME_UNDEFINED;
121 
122  Ppolynome pp = new_polynome();
123  polynome_monome(pp) = pm;
125  return pp;
126 }
127 
128 /* Pmonome monome_dup(Pmonome pm)
129  * PRIVATE
130  * creates and returns a copy of pm
131  */
133 Pmonome pm;
134 {
135  if (MONOME_NUL_P(pm))
136  return (MONOME_NUL);
137  else if (MONOME_UNDEFINED_P(pm))
138  return (MONOME_UNDEFINED);
139  else {
140  Pmonome pmd = new_monome();
141  monome_coeff(pmd) = monome_coeff(pm);
142  monome_term(pmd) = vect_dup(monome_term(pm));
143  return(pmd);
144  }
145 }
146 
147 
148 /* void monome_rm(Pmonome* ppm)
149  * PRIVATE
150  * frees space occupied by monomial *ppm
151  * returns *ppm pointing to MONOME_NUL
152  * !usage: monome_rm(&pm);
153  */
154 void monome_rm(ppm)
155 Pmonome *ppm;
156 {
157  if ((!MONOME_NUL_P(*ppm)) && (!MONOME_UNDEFINED_P(*ppm))) {
158  vect_rm((Pvecteur) monome_term(*ppm));
159  free((char *) *ppm);
160  }
161  *ppm = MONOME_NUL;
162 }
163 
164 
165 /* void polynome_rm(Ppolynome* ppp)
166  * frees space occupied by polynomial *ppp
167  * returns *ppp pointing to POLYNOME_NUL
168  * !usage: polynome_rm(&pp);
169  */
170 void polynome_rm(ppp)
171 Ppolynome *ppp;
172 {
173  Ppolynome pp1 = *ppp, pp2;
174 
175  if (!POLYNOME_UNDEFINED_P(*ppp)) {
176  while (pp1 != POLYNOME_NUL) {
177  pp2 = polynome_succ(pp1);
178  monome_rm(&polynome_monome(pp1));
179  free((char *) pp1); /* correct? */
180  pp1 = pp2;
181  }
182  *ppp = POLYNOME_NUL;
183  }
184 }
185 
186 /* Ppolynome polynome_free(Ppolynome pp)
187  * frees space occupied by polynomial pp
188  * returns pp == POLYNOME_NUL
189  * !usage: polynome_rm(pp);
190  */
192 Ppolynome pp;
193 {
194  Ppolynome pp1 = pp, pp2;
195 
196  if (!POLYNOME_UNDEFINED_P(pp)) {
197  while (pp1 != POLYNOME_NUL) {
198  pp2 = polynome_succ(pp1);
199  monome_rm(&polynome_monome(pp1));
200  free((char *) pp1); /* correct? */
201  pp1 = pp2;
202  }
203  }
204  return POLYNOME_NUL;
205 }
206 
207 
208 /* Ppolynome polynome_dup(Ppolynome pp)
209  * creates and returns a copy of pp
210  */
212 Ppolynome pp;
213 {
214  Ppolynome ppdup, curpp;
215 
216  if (POLYNOME_NUL_P(pp))
217  return (POLYNOME_NUL);
218  else if (POLYNOME_UNDEFINED_P(pp))
219  return (POLYNOME_UNDEFINED);
220  else {
222  curpp = ppdup;
223  while ((pp = polynome_succ(pp)) != POLYNOME_NUL) {
224  polynome_succ(curpp) =
226  curpp = polynome_succ(curpp);
227  }
228  return (ppdup);
229  }
230 }
#define value_zero_p(val)
int Value
#define VALUE_ONE
void * malloc(YYSIZE_T)
void free(void *)
#define abort()
Definition: misc-local.h:53
#define assert(ex)
Definition: newgen_assert.h:41
Ppolynome monome_to_new_polynome(Pmonome pm)
Ppolynome monome_to_new_polynome(Pmonome pm) PRIVATE allocates space for, and creates the polynomial ...
Definition: pnome-alloc.c:115
Pmonome make_monome(float coeff, Variable var, Value expo)
Pmonome make_monome(float coeff, Variable var, Value expo) PRIVATE allocates space for,...
Definition: pnome-alloc.c:81
Ppolynome make_polynome(float coeff, Variable var, Value expo)
Ppolynome make_polynome(float coeff, Variable var, Value expo) PRIVATE allocates space for,...
Definition: pnome-alloc.c:100
void monome_rm(Pmonome *ppm)
void monome_rm(Pmonome* ppm) PRIVATE frees space occupied by monomial *ppm returns *ppm pointing to M...
Definition: pnome-alloc.c:154
Pmonome new_monome()
INTLIBRARY.
Definition: pnome-alloc.c:48
Ppolynome polynome_dup(Ppolynome pp)
Ppolynome polynome_dup(Ppolynome pp) creates and returns a copy of pp.
Definition: pnome-alloc.c:211
void polynome_rm(Ppolynome *ppp)
void polynome_rm(Ppolynome* ppp) frees space occupied by polynomial *ppp returns *ppp pointing to POL...
Definition: pnome-alloc.c:170
Ppolynome polynome_free(Ppolynome pp)
Ppolynome polynome_free(Ppolynome pp) frees space occupied by polynomial pp returns pp == POLYNOME_NU...
Definition: pnome-alloc.c:191
Ppolynome new_polynome()
allocation of an unitialized polynome (to avoid various direct unchecked call to malloc)
Definition: pnome-alloc.c:64
Pmonome monome_dup(Pmonome pm)
Pmonome monome_dup(Pmonome pm) PRIVATE creates and returns a copy of pm.
Definition: pnome-alloc.c:132
#define POLYNOME_NUL
#define POLYNOME_UNDEFINED
#define POLYNOME_UNDEFINED_P(pp)
#define monome_term(pm)
#define MONOME_UNDEFINED_P(pm)
#define polynome_monome(pp)
#define monome_coeff(pm)
Macros definitions.
#define POLYNOME_NUL_P(pp)
#define MONOME_NUL_P(pm)
#define polynome_succ(pp)
struct Spolynome * Ppolynome
#define MONOME_UNDEFINED
struct Smonome * Pmonome
#define MONOME_NUL
Null/undefined, monomial/polynomial definitions.
int fprintf()
test sc_min : ce test s'appelle par : programme fichier1.data fichier2.data ...
le type des coefficients dans les vecteurs: Value est defini dans le package arithmetique
Definition: vecteur-local.h:89
#define TCST
VARIABLE REPRESENTANT LE TERME CONSTANT.
void * Variable
arithmetique is a requirement for vecteur, but I do not want to inforce it in all pips files....
Definition: vecteur-local.h:60
Pvecteur vect_dup(Pvecteur v_in)
Pvecteur vect_dup(Pvecteur v_in): duplication du vecteur v_in; allocation de et copie dans v_out;.
Definition: alloc.c:51
Pvecteur vect_new(Variable var, Value coeff)
Pvecteur vect_new(Variable var,Value coeff): allocation d'un vecteur colineaire au vecteur de base va...
Definition: alloc.c:110
void vect_rm(Pvecteur v)
void vect_rm(Pvecteur v): desallocation des couples de v;
Definition: alloc.c:78