/* ================================================================================ RPL/2 (R) version 4.1.1 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. RPL/2 is free software; you can redistribute it and/or modify it under the terms of the CeCILL V2 License as published by the french CEA, CNRS and INRIA. RPL/2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the CeCILL V2 License for more details. You should have received a copy of the CeCILL License along with RPL/2. If not, write to info@cecill.info. ================================================================================ */ #include "rpl-conv.h" /* ================================================================================ Fonction 'get' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_get(struct_processus *s_etat_processus) { logical1 variable_partagee; struct_liste_chainee *l_element_courant; struct_objet *s_objet_1; struct_objet *s_objet_2; struct_objet *s_objet_3; struct_objet *s_objet_element; struct_objet *s_objet_resultat; unsigned long indice_i; unsigned long indice_j; unsigned long nombre_dimensions; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n GET "); if ((*s_etat_processus).langue == 'F') { printf("(prend un élément)\n\n"); } else { printf("(get element)\n\n"); } printf(" 2: %s, %s, %s, %s\n", d_VIN, d_VRL, d_VCX, d_NOM); printf(" 1: %s\n", d_LST); printf("-> 1: %s, %s, %s\n\n", d_INT, d_REL, d_CPL); printf(" 2: %s, %s, %s, %s\n", d_MIN, d_MRL, d_MCX, d_NOM); printf(" 1: %s\n", d_LST); printf("-> 1: %s, %s, %s\n\n", d_INT, d_REL, d_CPL); printf(" 2: %s, %s\n", d_TAB, d_NOM); printf(" 1: %s\n", d_LST); printf("-> 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" " %s, %s\n\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, d_SQL, d_SLB, d_PRC, d_MTX); printf(" 2: %s, %s\n", d_LST, d_NOM); printf(" 1: %s\n", d_INT); printf("-> 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" " %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, d_SQL, d_SLB, d_PRC, d_MTX); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_2) == d_erreur) { liberation(s_etat_processus, s_objet_1); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } /* -------------------------------------------------------------------------------- Traitement des éléments des vecteurs -------------------------------------------------------------------------------- */ if (((*s_objet_2).type == VIN) || ((*s_objet_2).type == VRL) || ((*s_objet_2).type == VCX)) { if ((*s_objet_1).type != LST) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } l_element_courant = (*s_objet_1).objet; nombre_dimensions = 0; while(l_element_courant != NULL) { nombre_dimensions++; l_element_courant = (*l_element_courant).suivant; } if (nombre_dimensions != 1) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; } l_element_courant = (*s_objet_1).objet; if ((*(*l_element_courant).donnee).type != INT) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((*((integer8 *) (*(*l_element_courant).donnee).objet)) <= 0) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } else if ((*((integer8 *) (*(*l_element_courant).donnee).objet)) > (integer8) (*((struct_vecteur *) (*s_objet_2).objet)).taille) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } indice_i = (*((integer8 *) (*(*l_element_courant).donnee).objet)); if ((*s_objet_2).type == VIN) { /* * Vecteur d'entiers */ if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((integer8 *) (*s_objet_resultat).objet)) = ((integer8 *) (*((struct_vecteur *) (*s_objet_2).objet)) .tableau)[indice_i - 1]; } else if ((*s_objet_2).type == VRL) { /* * Vecteur de réels */ if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((real8 *) (*s_objet_resultat).objet)) = ((real8 *) (*((struct_vecteur *) (*s_objet_2).objet)) .tableau)[indice_i - 1]; } else { /* * Vecteur de complexes */ if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_reelle = ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_2).objet)).tableau)[indice_i - 1].partie_reelle; (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_imaginaire = ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_2).objet)).tableau) [indice_i - 1].partie_imaginaire; } } /* -------------------------------------------------------------------------------- Traitement des éléments des matrices -------------------------------------------------------------------------------- */ else if (((*s_objet_2).type == MIN) || ((*s_objet_2).type == MRL) || ((*s_objet_2).type == MCX)) { if ((*s_objet_1).type != LST) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } l_element_courant = (*s_objet_1).objet; nombre_dimensions = 0; while(l_element_courant != NULL) { nombre_dimensions++; l_element_courant = (*l_element_courant).suivant; } if (nombre_dimensions != 2) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; } l_element_courant = (*s_objet_1).objet; indice_i = 0; indice_j = 0; while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type != INT) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((*((integer8 *) (*(*l_element_courant).donnee).objet)) <= 0) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } if (indice_i == 0) { indice_i = (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else { indice_j = (*((integer8 *) (*(*l_element_courant).donnee).objet)); } l_element_courant = (*l_element_courant).suivant; } if ((indice_i > (*((struct_matrice *) (*s_objet_2).objet)) .nombre_lignes) || (indice_j > (*((struct_matrice *) (*s_objet_2).objet)).nombre_colonnes)) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } if ((*s_objet_2).type == MIN) { /* * Matrice d'entiers */ if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((integer8 *) (*s_objet_resultat).objet)) = ((integer8 **) (*((struct_matrice *) (*s_objet_2).objet)) .tableau)[indice_i - 1][indice_j - 1]; } else if ((*s_objet_2).type == MRL) { /* * Matrice de réels */ if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((real8 *) (*s_objet_resultat).objet)) = ((real8 **) (*((struct_matrice *) (*s_objet_2).objet)) .tableau)[indice_i - 1][indice_j - 1]; } else { /* * Matrices de complexes */ if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_reelle = ((struct_complexe16 **) (*((struct_matrice *) (*s_objet_2).objet)).tableau)[indice_i - 1] [indice_j - 1].partie_reelle; (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_imaginaire = ((struct_complexe16 **) (*((struct_matrice *) (*s_objet_2).objet)).tableau) [indice_i - 1][indice_j - 1].partie_imaginaire; } } /* -------------------------------------------------------------------------------- Traitement des listes -------------------------------------------------------------------------------- */ else if ((*s_objet_2).type == LST) { if ((*s_objet_1).type != INT) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } indice_i = (*((integer8 *) (*s_objet_1).objet)); indice_j = 1; l_element_courant = (*s_objet_2).objet; while((l_element_courant != NULL) && (indice_j != indice_i)) { l_element_courant = (*l_element_courant).suivant; indice_j++; } if (l_element_courant != NULL) { if ((s_objet_resultat = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } else { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } } /* -------------------------------------------------------------------------------- Traitement des tables -------------------------------------------------------------------------------- */ else if ((*s_objet_2).type == TBL) { if ((*s_objet_1).type != LST) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } l_element_courant = (*s_objet_1).objet; s_objet_element = s_objet_2; while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type != INT) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((*s_objet_element).type != TBL) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } indice_i = (*((integer8 *) (*(*l_element_courant).donnee).objet)); if ((indice_i < 1) || (indice_i > (*((struct_tableau *) (*s_objet_element).objet)).nombre_elements)) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } s_objet_element = (*((struct_tableau *) (*s_objet_element) .objet)).elements[indice_i - 1]; l_element_courant = (*l_element_courant).suivant; } if ((s_objet_resultat = copie_objet(s_etat_processus, s_objet_element, 'P')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } /* -------------------------------------------------------------------------------- Traitement des variables -------------------------------------------------------------------------------- */ else if ((*s_objet_2).type == NOM) { variable_partagee = d_faux; if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_2).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } s_objet_3 = (*(*s_etat_processus).pointeur_variable_courante).objet; if (s_objet_3 == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } s_objet_3 = (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet; variable_partagee = d_vrai; } if (((*s_objet_3).type == VIN) || ((*s_objet_3).type == VRL) || ((*s_objet_3).type == VCX)) { if ((*s_objet_1).type != LST) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } l_element_courant = (*s_objet_1).objet; nombre_dimensions = 0; while(l_element_courant != NULL) { nombre_dimensions++; l_element_courant = (*l_element_courant).suivant; } if (nombre_dimensions != 1) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; } l_element_courant = (*s_objet_1).objet; if ((*(*l_element_courant).donnee).type != INT) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((*((integer8 *) (*(*l_element_courant).donnee).objet)) <= 0) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } else if ((*((integer8 *) (*(*l_element_courant).donnee).objet)) > (integer8) (*((struct_vecteur *) (*s_objet_3).objet)) .taille) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } indice_i = (*((integer8 *) (*(*l_element_courant).donnee).objet)); if ((*s_objet_3).type == VIN) { /* * Vecteur d'entiers */ if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((integer8 *) (*s_objet_resultat).objet)) = ((integer8 *) (*((struct_vecteur *) (*s_objet_3).objet)).tableau)[indice_i - 1]; } else if ((*s_objet_3).type == VRL) { /* * Vecteur de réels */ if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((real8 *) (*s_objet_resultat).objet)) = ((real8 *) (*((struct_vecteur *) (*s_objet_3).objet)) .tableau)[indice_i - 1]; } else { /* * Vecteur de complexes */ if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_reelle = ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_3).objet)) .tableau)[indice_i - 1].partie_reelle; (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_imaginaire = ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_3).objet)).tableau) [indice_i - 1].partie_imaginaire; } } else if (((*s_objet_3).type == MIN) || ((*s_objet_3).type == MRL) || ((*s_objet_3).type == MCX)) { if ((*s_objet_1).type != LST) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } l_element_courant = (*s_objet_1).objet; nombre_dimensions = 0; while(l_element_courant != NULL) { nombre_dimensions++; l_element_courant = (*l_element_courant).suivant; } if (nombre_dimensions != 2) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; } l_element_courant = (*s_objet_1).objet; indice_i = 0; indice_j = 0; while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type != INT) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((*((integer8 *) (*(*l_element_courant) .donnee).objet)) <= 0) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } if (indice_i == 0) { indice_i = (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else { indice_j = (*((integer8 *) (*(*l_element_courant).donnee).objet)); } l_element_courant = (*l_element_courant).suivant; } if ((indice_i > (*((struct_matrice *) (*s_objet_3).objet)) .nombre_lignes) || (indice_j > (*((struct_matrice *) (*s_objet_3).objet)).nombre_colonnes)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } if ((*s_objet_3).type == MIN) { /* * Matrice d'entiers */ if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((integer8 *) (*s_objet_resultat).objet)) = ((integer8 **) (*((struct_matrice *) (*s_objet_3).objet)) .tableau)[indice_i - 1][indice_j - 1]; } else if ((*s_objet_3).type == MRL) { /* * Matrice de réels */ if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((real8 *) (*s_objet_resultat).objet)) = ((real8 **) (*((struct_matrice *) (*s_objet_3).objet)) .tableau)[indice_i - 1][indice_j - 1]; } else { /* * Matrices de complexes */ if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_reelle = ((struct_complexe16 **) (*((struct_matrice *) (*s_objet_3).objet)).tableau)[indice_i - 1] [indice_j - 1].partie_reelle; (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_imaginaire = ((struct_complexe16 **) (*((struct_matrice *) (*s_objet_3).objet)).tableau) [indice_i - 1][indice_j - 1].partie_imaginaire; } } else if ((*s_objet_3).type == LST) { if ((*s_objet_1).type != INT) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } indice_i = (*((integer8 *) (*s_objet_1).objet)); indice_j = 1; l_element_courant = (*s_objet_3).objet; while((l_element_courant != NULL) && (indice_j != indice_i)) { l_element_courant = (*l_element_courant).suivant; indice_j++; } if (l_element_courant != NULL) { if ((s_objet_resultat = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'P')) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } else { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } } else if ((*s_objet_3).type == TBL) { if ((*s_objet_1).type != LST) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } l_element_courant = (*s_objet_1).objet; s_objet_element = s_objet_3; while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type != INT) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((*s_objet_element).type != TBL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } indice_i = (*((integer8 *) (*(*l_element_courant) .donnee).objet)); if ((indice_i < 1) || (indice_i > (*((struct_tableau *) (*s_objet_element).objet)).nombre_elements)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } s_objet_element = (*((struct_tableau *) (*s_objet_element) .objet)).elements[indice_i - 1]; l_element_courant = (*l_element_courant).suivant; } if ((s_objet_resultat = copie_objet(s_etat_processus, s_objet_element, 'P')) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } else { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } /* -------------------------------------------------------------------------------- Type incompatible avec la fonction GET -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { return; } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } /* ================================================================================ Fonction 'geti' ================================================================================ Entrées : -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_geti(struct_processus *s_etat_processus) { logical1 variable_partagee; struct_liste_chainee *l_element_courant; struct_objet *s_copie_1; struct_objet *s_objet_1; struct_objet *s_objet_2; struct_objet *s_objet_3; struct_objet *s_objet_resultat; unsigned long indice_i; unsigned long indice_j; unsigned long nombre_dimensions; unsigned long nombre_elements; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n GETI "); if ((*s_etat_processus).langue == 'F') { printf("(prend un élément)\n\n"); } else { printf("(get element)\n\n"); } printf(" 2: %s, %s, %s, %s\n", d_VIN, d_VRL, d_VCX, d_NOM); printf(" 1: %s\n", d_LST); printf("-> 3: %s, %s, %s, %s\n", d_VIN, d_VRL, d_VCX, d_NOM); printf(" 2: %s\n", d_LST); printf(" 1: %s, %s, %s\n\n", d_INT, d_REL, d_CPL); printf(" 2: %s, %s, %s, %s\n", d_MIN, d_MRL, d_MCX, d_NOM); printf(" 1: %s\n", d_LST); printf("-> 3: %s, %s, %s, %s\n", d_MIN, d_MRL, d_MCX, d_NOM); printf(" 2: %s\n", d_LST); printf(" 1: %s, %s, %s\n\n", d_INT, d_REL, d_CPL); printf(" 2: %s, %s\n", d_LST, d_NOM); printf(" 1: %s\n", d_INT); printf("-> 3: %s, %s\n", d_LST, d_NOM); printf(" 2: %s\n", d_INT); printf(" 1: %s, %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s, %s,\n" " %s, %s, %s, %s,\n" " %s, %s\n", d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX, d_TAB, d_BIN, d_NOM, d_CHN, d_LST, d_ALG, d_RPN, d_FCH, d_SCK, d_SQL, d_SLB, d_PRC, d_MTX); return; } else if ((*s_etat_processus).test_instruction == 'Y') { (*s_etat_processus).nombre_arguments = -1; return; } if (test_cfsf(s_etat_processus, 31) == d_vrai) { if (empilement_pile_last(s_etat_processus, 2) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_1) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_2) == d_erreur) { liberation(s_etat_processus, s_objet_1); (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } if ((s_copie_1 = copie_objet(s_etat_processus, s_objet_1, 'O')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } liberation(s_etat_processus, s_objet_1); s_objet_1 = s_copie_1; /* -------------------------------------------------------------------------------- Traitement des éléments des vecteurs -------------------------------------------------------------------------------- */ if (((*s_objet_2).type == VIN) || ((*s_objet_2).type == VRL) || ((*s_objet_2).type == VCX)) { if ((*s_objet_1).type != LST) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } l_element_courant = (*s_objet_1).objet; nombre_dimensions = 0; while(l_element_courant != NULL) { nombre_dimensions++; l_element_courant = (*l_element_courant).suivant; } if (nombre_dimensions != 1) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; } l_element_courant = (*s_objet_1).objet; if ((*(*l_element_courant).donnee).type != INT) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((*((integer8 *) (*(*l_element_courant).donnee).objet)) <= 0) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } else if ((*((integer8 *) (*(*l_element_courant).donnee).objet)) > (integer8) (*((struct_vecteur *) (*s_objet_2).objet)).taille) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } indice_i = (*((integer8 *) (*(*l_element_courant).donnee).objet)); if ((*s_objet_2).type == VIN) { /* * Vecteur d'entiers */ if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((integer8 *) (*s_objet_resultat).objet)) = ((integer8 *) (*((struct_vecteur *) (*s_objet_2).objet)) .tableau)[indice_i - 1]; } else if ((*s_objet_2).type == VRL) { /* * Vecteur de réels */ if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((real8 *) (*s_objet_resultat).objet)) = ((real8 *) (*((struct_vecteur *) (*s_objet_2).objet)) .tableau)[indice_i - 1]; } else { /* * Vecteur de complexes */ if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_reelle = ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_2).objet)).tableau)[indice_i - 1].partie_reelle; (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_imaginaire = ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_2).objet)).tableau) [indice_i - 1].partie_imaginaire; } (*((integer8 *) (*(*l_element_courant).donnee).objet)) = (indice_i % (*((struct_vecteur *) (*s_objet_2).objet)).taille) + 1; } /* -------------------------------------------------------------------------------- Traitement des éléments des matrices -------------------------------------------------------------------------------- */ else if (((*s_objet_2).type == MIN) || ((*s_objet_2).type == MRL) || ((*s_objet_2).type == MCX)) { if ((*s_objet_1).type != LST) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } l_element_courant = (*s_objet_1).objet; nombre_dimensions = 0; while(l_element_courant != NULL) { nombre_dimensions++; l_element_courant = (*l_element_courant).suivant; } if (nombre_dimensions != 2) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; } l_element_courant = (*s_objet_1).objet; indice_i = 0; indice_j = 0; while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type != INT) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((*((integer8 *) (*(*l_element_courant).donnee).objet)) <= 0) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } if (indice_i == 0) { indice_i = (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else { indice_j = (*((integer8 *) (*(*l_element_courant).donnee).objet)); } l_element_courant = (*l_element_courant).suivant; } if ((indice_i > (*((struct_matrice *) (*s_objet_2).objet)) .nombre_lignes) || (indice_j > (*((struct_matrice *) (*s_objet_2).objet)).nombre_colonnes)) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } if ((*s_objet_2).type == MIN) { /* * Matrice d'entiers */ if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((integer8 *) (*s_objet_resultat).objet)) = ((integer8 **) (*((struct_matrice *) (*s_objet_2).objet)) .tableau)[indice_i - 1][indice_j - 1]; } else if ((*s_objet_2).type == MRL) { /* * Matrice de réels */ if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((real8 *) (*s_objet_resultat).objet)) = ((real8 **) (*((struct_matrice *) (*s_objet_2).objet)) .tableau)[indice_i - 1][indice_j - 1]; } else { /* * Matrices de complexes */ if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_complexe16 *) (*s_objet_resultat).objet)).partie_reelle = ((struct_complexe16 **) (*((struct_matrice *) (*s_objet_2).objet)).tableau)[indice_i - 1] [indice_j - 1].partie_reelle; (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_imaginaire = ((struct_complexe16 **) (*((struct_matrice *) (*s_objet_2).objet)).tableau) [indice_i - 1][indice_j - 1].partie_imaginaire; } if ((++(*((integer8 *) (*(*(*((struct_liste_chainee *) (*s_objet_1).objet)).suivant).donnee).objet))) > (integer8) (*((struct_matrice *) (*s_objet_2).objet)) .nombre_colonnes) { (*((integer8 *) (*(*(*((struct_liste_chainee *) (*s_objet_1) .objet)).suivant).donnee).objet)) = 1; if ((++(*((integer8 *) (*(*((struct_liste_chainee *) (*s_objet_1).objet)).donnee).objet))) > (integer8) (*((struct_matrice *) (*s_objet_2).objet)) .nombre_lignes) { (*((integer8 *) (*(*((struct_liste_chainee *) (*s_objet_1).objet)).donnee).objet)) = 1; } } } /* -------------------------------------------------------------------------------- Traitement des listes -------------------------------------------------------------------------------- */ else if ((*s_objet_2).type == LST) { if ((*s_objet_1).type != INT) { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } nombre_elements = 0; l_element_courant = (*s_objet_2).objet; while(l_element_courant != NULL) { l_element_courant = (*l_element_courant).suivant; nombre_elements++; } indice_i = (*((integer8 *) (*s_objet_1).objet)); indice_j = 1; l_element_courant = (*s_objet_2).objet; while((l_element_courant != NULL) && (indice_j != indice_i)) { l_element_courant = (*l_element_courant).suivant; indice_j++; } if (l_element_courant != NULL) { if ((s_objet_resultat = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'O')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } else { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } (*((integer8 *) (*s_objet_1).objet)) = (indice_i % nombre_elements) + 1; } /* -------------------------------------------------------------------------------- Traitement des variables -------------------------------------------------------------------------------- */ else if ((*s_objet_2).type == NOM) { variable_partagee = d_faux; if (recherche_variable(s_etat_processus, (*((struct_nom *) (*s_objet_2).objet)).nom) == d_faux) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } s_objet_3 = (*(*s_etat_processus).pointeur_variable_courante).objet; if (s_objet_3 == NULL) { if (pthread_mutex_lock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } if (recherche_variable_partagee(s_etat_processus, (*(*s_etat_processus).pointeur_variable_courante).nom, (*(*s_etat_processus).pointeur_variable_courante) .variable_partagee, (*(*s_etat_processus) .pointeur_variable_courante).origine) == d_faux) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); return; } s_objet_3 = (*(*s_etat_processus).s_liste_variables_partagees) .table[(*(*s_etat_processus).s_liste_variables_partagees) .position_variable].objet; variable_partagee = d_vrai; } if (((*s_objet_3).type == VIN) || ((*s_objet_3).type == VRL) || ((*s_objet_3).type == VCX)) { if ((*s_objet_1).type != LST) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } l_element_courant = (*s_objet_1).objet; nombre_dimensions = 0; while(l_element_courant != NULL) { nombre_dimensions++; l_element_courant = (*l_element_courant).suivant; } if (nombre_dimensions != 1) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; } l_element_courant = (*s_objet_1).objet; if ((*(*l_element_courant).donnee).type != INT) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((*((integer8 *) (*(*l_element_courant).donnee).objet)) <= 0) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } else if ((*((integer8 *) (*(*l_element_courant).donnee).objet)) > (integer8) (*((struct_vecteur *) (*s_objet_3).objet)) .taille) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } indice_i = (*((integer8 *) (*(*l_element_courant).donnee).objet)); if ((*s_objet_3).type == VIN) { /* * Vecteur d'entiers */ if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((integer8 *) (*s_objet_resultat).objet)) = ((integer8 *) (*((struct_vecteur *) (*s_objet_3).objet)).tableau)[indice_i - 1]; } else if ((*s_objet_3).type == VRL) { /* * Vecteur de réels */ if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((real8 *) (*s_objet_resultat).objet)) = ((real8 *) (*((struct_vecteur *) (*s_objet_3).objet)) .tableau)[indice_i - 1]; } else { /* * Vecteur de complexes */ if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_reelle = ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_3).objet)) .tableau)[indice_i - 1].partie_reelle; (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_imaginaire = ((struct_complexe16 *) (*((struct_vecteur *) (*s_objet_3).objet)).tableau) [indice_i - 1].partie_imaginaire; } (*((integer8 *) (*(*l_element_courant).donnee).objet)) = (indice_i % (*((struct_vecteur *) (*s_objet_3).objet)) .taille) + 1; } else if (((*s_objet_3).type == MIN) || ((*s_objet_3).type == MRL) || ((*s_objet_3).type == MCX)) { if ((*s_objet_1).type != LST) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } l_element_courant = (*s_objet_1).objet; nombre_dimensions = 0; while(l_element_courant != NULL) { nombre_dimensions++; l_element_courant = (*l_element_courant).suivant; } if (nombre_dimensions != 2) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; } l_element_courant = (*s_objet_1).objet; indice_i = 0; indice_j = 0; while(l_element_courant != NULL) { if ((*(*l_element_courant).donnee).type != INT) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if ((*((integer8 *) (*(*l_element_courant) .donnee).objet)) <= 0) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; } if (indice_i == 0) { indice_i = (*((integer8 *) (*(*l_element_courant).donnee).objet)); } else { indice_j = (*((integer8 *) (*(*l_element_courant).donnee).objet)); } l_element_courant = (*l_element_courant).suivant; } if ((indice_i > (*((struct_matrice *) (*s_objet_3).objet)) .nombre_lignes) || (indice_j > (*((struct_matrice *) (*s_objet_3).objet)).nombre_colonnes)) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } if ((*s_objet_3).type == MIN) { /* * Matrice d'entiers */ if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((integer8 *) (*s_objet_resultat).objet)) = ((integer8 **) (*((struct_matrice *) (*s_objet_3).objet)) .tableau)[indice_i - 1][indice_j - 1]; } else if ((*s_objet_3).type == MRL) { /* * Matrice de réels */ if ((s_objet_resultat = allocation(s_etat_processus, REL)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((real8 *) (*s_objet_resultat).objet)) = ((real8 **) (*((struct_matrice *) (*s_objet_3).objet)) .tableau)[indice_i - 1][indice_j - 1]; } else { /* * Matrices de complexes */ if ((s_objet_resultat = allocation(s_etat_processus, CPL)) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_reelle = ((struct_complexe16 **) (*((struct_matrice *) (*s_objet_3).objet)).tableau)[indice_i - 1] [indice_j - 1].partie_reelle; (*((struct_complexe16 *) (*s_objet_resultat).objet)) .partie_imaginaire = ((struct_complexe16 **) (*((struct_matrice *) (*s_objet_3).objet)).tableau) [indice_i - 1][indice_j - 1].partie_imaginaire; } if ((++(*((integer8 *) (*(*(*((struct_liste_chainee *) (*s_objet_1).objet)).suivant).donnee).objet))) > (integer8) (*((struct_matrice *) (*s_objet_3).objet)) .nombre_colonnes) { (*((integer8 *) (*(*(*((struct_liste_chainee *) (*s_objet_1) .objet)).suivant).donnee).objet)) = 1; if ((++(*((integer8 *) (*(*((struct_liste_chainee *) (*s_objet_1).objet)).donnee).objet))) > (integer8) (*((struct_matrice *) (*s_objet_3).objet)) .nombre_lignes) { (*((integer8 *) (*(*((struct_liste_chainee *) (*s_objet_1).objet)).donnee).objet)) = 1; } } } else if ((*s_objet_3).type == LST) { if ((*s_objet_1).type != INT) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } nombre_elements = 0; l_element_courant = (*s_objet_3).objet; while(l_element_courant != NULL) { l_element_courant = (*l_element_courant).suivant; nombre_elements++; } indice_i = (*((integer8 *) (*s_objet_1).objet)); indice_j = 1; l_element_courant = (*s_objet_3).objet; while((l_element_courant != NULL) && (indice_j != indice_i)) { l_element_courant = (*l_element_courant).suivant; indice_j++; } if (l_element_courant != NULL) { if ((s_objet_resultat = copie_objet(s_etat_processus, (*l_element_courant).donnee, 'O')) == NULL) { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } } else { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_element_inexistant; return; } (*((integer8 *) (*s_objet_1).objet)) = (indice_i % nombre_elements) + 1; } else { if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (variable_partagee == d_vrai) { if (pthread_mutex_unlock(&((*(*s_etat_processus) .s_liste_variables_partagees).mutex)) != 0) { (*s_etat_processus).erreur_systeme = d_es_processus; return; } } } /* -------------------------------------------------------------------------------- Type incompatible avec la fonction GETI -------------------------------------------------------------------------------- */ else { liberation(s_etat_processus, s_objet_1); liberation(s_etat_processus, s_objet_2); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_2) == d_erreur) { return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_1) == d_erreur) { return; } if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { return; } return; } // vim: ts=4