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>