Annotation of ADD_ver_10/Source Code/Source Files/Matrices.c, revision 1.2
1.2 ! rico 1: /********************************************************************/
! 2: /* Matrices.c */
! 3: /* */
! 4: /* */
! 5: /* Copyright (c) 1997-2006 Rafael Rico (rafael.rico@uah.es) */
! 6: /* */
! 7: /* Este fichero forma parte de ADD */
! 8: /* (Analizador de Dependencias de Datos) */
! 9: /* Version 5.10. */
! 10: /* */
! 11: /* */
! 12: /* ADD es software libre. Puede redistribuirlo y/o modificarlo */
! 13: /* bajo los términos de la Licencia Pública General de GNU */
! 14: /* según es publicada por la Free Software Foundation, bien bajo */
! 15: /* la versión 2 de dicha Licencia o bien (según su elección) */
! 16: /* bajo cualquier versión posterior. */
! 17: /* */
! 18: /* ADD se distribuye con la esperanza de que sea útil, */
! 19: /* pero SIN NINGUNA GARANTÍA, incluso sin la garantía MERCANTIL */
! 20: /* implícita y sin garantizar la CONVENIENCIA PARA UN PROPÓSITO */
! 21: /* PARTICULAR. Véase la Licencia Pública General de GNU para */
! 22: /* más detalles. */
! 23: /* */
! 24: /* Debería haber recibido una copia de la Licencia Pública General */
! 25: /* junto con ADD. Si no ha sido así, escriba a la Free Software */
! 26: /* Foundation, Inc., 51 Franklin St, Fifth Floor, */
! 27: /* Boston, MA 02110-1301 EEUU. */
! 28: /* */
! 29: /* -------------------------- Historia --------------------------- */
! 30: /* */
! 31: /* $Id$ */
! 32: /* */
! 33: /* Revisión 1.2. 01/2006 */
! 34: /* Se añade la licencia GPL y documentación en estilo Javadoc */
! 35: /* */
! 36: /* Revisión 1.1. 09/2005 */
! 37: /* Versión inicial */
! 38: /* */
! 39: /********************************************************************/
! 40:
1.1 rico 41: /******************************************************************************/
42: /* MÓDULO: Matrices.c */
43: /* */
44: /* Este módulo contiene las funciones de manejo de las matrices de */
45: /* dependencias de datos. */
46: /******************************************************************************/
47: /* Fecha: 16 de septiembre de 2005 */
48: /******************************************************************************/
49:
50: #include <stdio.h>
51: #include <stdlib.h>
52:
53: #include "defines.h"
54: #include "tipos.h"
55:
56: #include "matrices.h"
57:
58: /* configuracion */
59: extern struct argumentos configuracion;
60:
61: /* análisis de dependencias de datos */
62: extern struct punterosD matriz;
63:
64:
65:
66: /* inicia a NULL todos los punteros de las matrices */
67:
68: void IniciarPunterosMatrices()
69: {
70: matriz.Ddatoexp = NULL;
71: matriz.Ddir_exp = NULL;
72: matriz.Dpilaexp = NULL;
73: matriz.Destadoexp = NULL;
74: matriz.Ddatoimp = NULL;
75: matriz.Ddir_imp = NULL;
76: matriz.Dpilaimp = NULL;
77: matriz.Destadoimp = NULL;
78:
79: matriz.ADdatoexp = NULL;
80: matriz.ADdir_exp = NULL;
81: matriz.ADpilaexp = NULL;
82: matriz.ADestadoexp = NULL;
83: matriz.ADdatoimp = NULL;
84: matriz.ADdir_imp = NULL;
85: matriz.ADpilaimp = NULL;
86: matriz.ADestadoimp = NULL;
87:
88: matriz.Sdatoexp = NULL;
89: matriz.Sdir_exp = NULL;
90: matriz.Spilaexp = NULL;
91: matriz.Sestadoexp = NULL;
92: matriz.Sdatoimp = NULL;
93: matriz.Sdir_imp = NULL;
94: matriz.Spilaimp = NULL;
95: matriz.Sestadoimp = NULL;
96:
97: matriz.D = NULL;
98: }
99:
100:
101: /* reserva espacio para una matriz determinada y lo inicia a 0*/
102: /* devuelve el puntero */
103:
104: unsigned char ** CrearMatriz()
105: {
106: char mensaje[MAX_LINE];
107: unsigned int i;
108: unsigned char **matrizD;
109:
110: /* 1º un puntero por cada fila */
111: matrizD = calloc(configuracion.ventana, sizeof(unsigned char *));
112: if (matrizD == NULL)
113: {
114: sprintf(mensaje, "[CrearMatriz] Memoria insuficiente");
115: Notificar(mensaje, ERROR_SALIR, ECO_NO);
116: /* el programa finaliza si no hay memoria suficiente */
117: }
118: /* 2º un 'char' por cada columna */
119: for(i=0; i<configuracion.ventana; i++)
120: {
121: matrizD[i] = calloc(configuracion.ventana, sizeof(unsigned char));
122: if (matrizD[i] == NULL)
123: {
124: sprintf(mensaje, "[CrearMatriz] Memoria insuficiente");
125: Notificar(mensaje, ERROR_SALIR, ECO_NO);
126: /* el programa finaliza si no hay memoria suficiente */
127: }
128: }
129: return matrizD;
130: }
131:
132:
133: /* otro modo de hacer lo mismo */
134:
135: /* llamada en main() --> CrearMatriz(&matriz.Ddatoexp); */
136:
137: /* CrearMatriz(unsigned char ***matrizD)
138: {
139:
140:
141: *matrizD = calloc(configuracion.ventana , sizeof(unsigned char *));
142:
143:
144: return *matrizD;
145: }*/
146:
147:
148: /* crea todas las matrices de dependencias necesarias en función de la configuración */
149:
150: void CrearMatricesDependencias()
151: {
152: /* creo las matrices de dependencias que sean necesarias */
153: /* mapa de posibles matrices por desacoplos */
154: /* tipo origen fuente */
155: /* SI SI SI */
156: /* SI SI NO */
157: /* SI NO NO */
158: /* NO NO NO */ /* -> por defecto no se desacopla nada */
159:
160: if(configuracion.desacoplarfuentes == SI)
161: {
162: if(configuracion.datos == SI) matriz.Ddatoexp = CrearMatriz();
163: if(configuracion.direcciones == SI) matriz.Ddir_exp = CrearMatriz();
164: if(configuracion.pila == SI) matriz.Dpilaexp = CrearMatriz();
165: if(configuracion.cc == SI) matriz.Destadoexp = CrearMatriz();
166:
167: if(configuracion.datos == SI) matriz.Ddatoimp = CrearMatriz();
168: if(configuracion.direcciones == SI) matriz.Ddir_imp = CrearMatriz();
169: if(configuracion.pila == SI) matriz.Dpilaimp = CrearMatriz();
170: if(configuracion.cc == SI) matriz.Destadoimp = CrearMatriz();
171:
172: if(configuracion.datos == SI) matriz.ADdatoexp = CrearMatriz();
173: if(configuracion.direcciones == SI) matriz.ADdir_exp = CrearMatriz();
174: if(configuracion.pila == SI) matriz.ADpilaexp = CrearMatriz();
175: if(configuracion.cc == SI) matriz.ADestadoexp = CrearMatriz();
176:
177: if(configuracion.datos == SI) matriz.ADdatoimp = CrearMatriz();
178: if(configuracion.direcciones == SI) matriz.ADdir_imp = CrearMatriz();
179: if(configuracion.pila == SI) matriz.ADpilaimp = CrearMatriz();
180: if(configuracion.cc == SI) matriz.ADestadoimp = CrearMatriz();
181:
182: if(configuracion.datos == SI) matriz.Sdatoexp = CrearMatriz();
183: if(configuracion.direcciones == SI) matriz.Sdir_exp = CrearMatriz();
184: if(configuracion.pila == SI) matriz.Spilaexp = CrearMatriz();
185: if(configuracion.cc == SI) matriz.Sestadoexp = CrearMatriz();
186:
187: if(configuracion.datos == SI) matriz.Sdatoimp = CrearMatriz();
188: if(configuracion.direcciones == SI) matriz.Sdir_imp = CrearMatriz();
189: if(configuracion.pila == SI) matriz.Spilaimp = CrearMatriz();
190: if(configuracion.cc == SI) matriz.Sestadoimp = CrearMatriz();
191: }
192:
193: else if(configuracion.desacoplarorigen == SI)
194: {
195: if(configuracion.explicitos == SI) matriz.Ddatoexp = CrearMatriz();
196: if(configuracion.implicitos == SI) matriz.Ddatoimp = CrearMatriz();
197:
198: if(configuracion.explicitos == SI) matriz.ADdatoexp = CrearMatriz();
199: if(configuracion.implicitos == SI) matriz.ADdatoimp = CrearMatriz();
200:
201: if(configuracion.explicitos == SI) matriz.Sdatoexp = CrearMatriz();
202: if(configuracion.implicitos == SI) matriz.Sdatoimp = CrearMatriz();
203: }
204:
205: else if(configuracion.desacoplartipos == SI)
206: {
207: if(configuracion.verdaderas == SI) matriz.Ddatoexp = CrearMatriz();
208: if(configuracion.antidependencias == SI) matriz.ADdatoexp = CrearMatriz();
209: if(configuracion.salida == SI) matriz.Sdatoexp = CrearMatriz();
210: }
211:
212: matriz.D = CrearMatriz();
213: }
214:
215:
216: /* inicia una matriz poniendo sus componentes a 0 */
217:
218: void IniciarMatriz(unsigned char **matriz)
219: {
220: unsigned int i, j;
221:
222: if(matriz != NULL) for(i=0; i<configuracion.ventana; i++) for(j=0; j<configuracion.ventana; j++) matriz[i][j] = 0;
223: }
224:
225:
226: /* inicia las matrices abiertas poniendo a 0 todas sus componentes */
227: /* utilizando la función anterior es más compacto aunque quizá algo más lento */
228:
229: void IniciarMatricesDependencias()
230: {
231: unsigned int i, j, dim;
232:
233: dim = configuracion.ventana;
234:
235: if(matriz.Ddatoexp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Ddatoexp[i][j] = 0;
236: if(matriz.Ddir_exp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Ddir_exp[i][j] = 0;
237: if(matriz.Dpilaexp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Dpilaexp[i][j] = 0;
238: if(matriz.Destadoexp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Destadoexp[i][j] = 0;
239:
240: if(matriz.Ddatoimp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Ddatoimp[i][j] = 0;
241: if(matriz.Ddir_imp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Ddir_imp[i][j] = 0;
242: if(matriz.Dpilaimp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Dpilaimp[i][j] = 0;
243: if(matriz.Destadoimp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Destadoimp[i][j] = 0;
244:
245: if(matriz.ADdatoexp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.ADdatoexp[i][j] = 0;
246: if(matriz.ADdir_exp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.ADdir_exp[i][j] = 0;
247: if(matriz.ADpilaexp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.ADpilaexp[i][j] = 0;
248: if(matriz.ADestadoexp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.ADestadoexp[i][j] = 0;
249:
250: if(matriz.ADdatoimp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.ADdatoimp[i][j] = 0;
251: if(matriz.ADdir_imp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.ADdir_imp[i][j] = 0;
252: if(matriz.ADpilaimp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.ADpilaimp[i][j] = 0;
253: if(matriz.ADestadoimp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.ADestadoimp[i][j] = 0;
254:
255: if(matriz.Sdatoexp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Sdatoexp[i][j] = 0;
256: if(matriz.Sdir_exp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Sdir_exp[i][j] = 0;
257: if(matriz.Spilaexp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Spilaexp[i][j] = 0;
258: if(matriz.Sestadoexp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Sestadoexp[i][j] = 0;
259:
260: if(matriz.Sdatoimp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Sdatoimp[i][j] = 0;
261: if(matriz.Sdir_imp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Sdir_imp[i][j] = 0;
262: if(matriz.Spilaimp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Spilaimp[i][j] = 0;
263: if(matriz.Sestadoimp != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.Sestadoimp[i][j] = 0;
264:
265: if(matriz.D != NULL) for(i=0; i<dim; i++) for(j=0; j<dim; j++) matriz.D[i][j] = 0;
266: }
267:
268:
269: /* libera la memoria reservada para una matriz */
270:
271: void LiberarMemoriaMatriz(unsigned char **matriz)
272: {
273: unsigned int i;
274:
275: if(matriz != NULL) {for(i=0; i<configuracion.ventana; i++) free(matriz[i]); free(matriz);}
276: }
277:
278:
279: /* libera la memoria reservada para las matrices abiertas */
280: /* utilizando la función anterior es más compacto aunque quizá algo más lento */
281:
282: void LiberarMemoriaMatricesDependencias()
283: {
284: unsigned int i,dim;
285:
286: dim = configuracion.ventana;
287:
288: if(matriz.Ddatoexp != NULL) {for(i=0; i<dim; i++) free(matriz.Ddatoexp[i]); free(matriz.Ddatoexp);}
289: if(matriz.Ddir_exp != NULL) {for(i=0; i<dim; i++) free(matriz.Ddir_exp[i]); free(matriz.Ddir_exp);}
290: if(matriz.Dpilaexp != NULL) {for(i=0; i<dim; i++) free(matriz.Dpilaexp[i]); free(matriz.Dpilaexp);}
291: if(matriz.Destadoexp != NULL) {for(i=0; i<dim; i++) free(matriz.Destadoexp[i]); free(matriz.Destadoexp);}
292:
293: if(matriz.Ddatoimp != NULL) {for(i=0; i<dim; i++) free(matriz.Ddatoimp[i]); free(matriz.Ddatoimp);}
294: if(matriz.Ddir_imp != NULL) {for(i=0; i<dim; i++) free(matriz.Ddir_imp[i]); free(matriz.Ddir_imp);}
295: if(matriz.Dpilaimp != NULL) {for(i=0; i<dim; i++) free(matriz.Dpilaimp[i]); free(matriz.Dpilaimp);}
296: if(matriz.Destadoimp != NULL) {for(i=0; i<dim; i++) free(matriz.Destadoimp[i]); free(matriz.Destadoimp);}
297:
298: if(matriz.ADdatoexp != NULL) {for(i=0; i<dim; i++) free(matriz.ADdatoexp[i]); free(matriz.ADdatoexp);}
299: if(matriz.ADdir_exp != NULL) {for(i=0; i<dim; i++) free(matriz.ADdir_exp[i]); free(matriz.ADdir_exp);}
300: if(matriz.ADpilaexp != NULL) {for(i=0; i<dim; i++) free(matriz.ADpilaexp[i]); free(matriz.ADpilaexp);}
301: if(matriz.ADestadoexp != NULL) {for(i=0; i<dim; i++) free(matriz.ADestadoexp[i]); free(matriz.ADestadoexp);}
302:
303: if(matriz.ADdatoimp != NULL) {for(i=0; i<dim; i++) free(matriz.ADdatoimp[i]); free(matriz.ADdatoimp);}
304: if(matriz.ADdir_imp != NULL) {for(i=0; i<dim; i++) free(matriz.ADdir_imp[i]); free(matriz.ADdir_imp);}
305: if(matriz.ADpilaimp != NULL) {for(i=0; i<dim; i++) free(matriz.ADpilaimp[i]); free(matriz.ADpilaimp);}
306: if(matriz.ADestadoimp != NULL) {for(i=0; i<dim; i++) free(matriz.ADestadoimp[i]); free(matriz.ADestadoimp);}
307:
308: if(matriz.Sdatoexp != NULL) {for(i=0; i<dim; i++) free(matriz.Sdatoexp[i]); free(matriz.Sdatoexp);}
309: if(matriz.Sdir_exp != NULL) {for(i=0; i<dim; i++) free(matriz.Sdir_exp[i]); free(matriz.Sdir_exp);}
310: if(matriz.Spilaexp != NULL) {for(i=0; i<dim; i++) free(matriz.Spilaexp[i]); free(matriz.Spilaexp);}
311: if(matriz.Sestadoexp != NULL) {for(i=0; i<dim; i++) free(matriz.Sestadoexp[i]); free(matriz.Sestadoexp);}
312:
313: if(matriz.Sdatoimp != NULL) {for(i=0; i<dim; i++) free(matriz.Sdatoimp[i]); free(matriz.Sdatoimp);}
314: if(matriz.Sdir_imp != NULL) {for(i=0; i<dim; i++) free(matriz.Sdir_imp[i]); free(matriz.Sdir_imp);}
315: if(matriz.Spilaimp != NULL) {for(i=0; i<dim; i++) free(matriz.Spilaimp[i]); free(matriz.Spilaimp);}
316: if(matriz.Sestadoimp != NULL) {for(i=0; i<dim; i++) free(matriz.Sestadoimp[i]); free(matriz.Sestadoimp);}
317:
318: if(matriz.D != NULL) {for(i=0; i<dim; i++) free(matriz.D[i]); free(matriz.D);}
319: }
320:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>