/* ================================================================================ RPL/2 (R) version 4.0.9 Copyright (C) 1989-2010 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 'dupcntxt' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_dupcntxt(struct_processus *s_etat_processus) { struct_objet *s_objet; struct_objet *s_pile; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n DUPCNTXT "); if ((*s_etat_processus).langue == 'F') { printf("(duplication du contexte)\n\n"); printf(" Aucun argument\n"); } else { printf("(context duplication)\n\n"); printf(" No argument\n"); } 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, 0) == d_erreur) { return; } } if ((s_objet = allocation(s_etat_processus, LST)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*s_objet).objet = (*s_etat_processus).l_base_pile; if ((s_pile = copie_objet(s_etat_processus, s_objet, 'N')) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } if (empilement(s_etat_processus, &((*s_etat_processus). l_base_pile_contextes), s_objet) == d_erreur) { return; } if ((s_objet = allocation(s_etat_processus, INT)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((integer8 *) (*s_objet).objet)) = (*s_etat_processus) .hauteur_pile_operationnelle; if (empilement(s_etat_processus, &((*s_etat_processus) .l_base_pile_taille_contextes), s_objet) == d_erreur) { return; } /* * Copie de la pile opérationnelle */ (*s_etat_processus).l_base_pile = (*s_pile).objet; (*s_pile).objet = NULL; liberation(s_etat_processus, s_pile); return; } /* ================================================================================ Fonction 'dropcntxt' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_dropcntxt(struct_processus *s_etat_processus) { struct_objet *s_objet; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n DROPCNTXT "); if ((*s_etat_processus).langue == 'F') { printf("(effacement d'un contexte)\n\n"); printf(" Aucun argument\n"); } else { printf("(drops context)\n\n"); printf(" No argument\n"); } 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, 0) == d_erreur) { return; } } if (((*s_etat_processus).l_base_pile_contextes == NULL) || ((*s_etat_processus).l_base_pile_taille_contextes == NULL)) { (*s_etat_processus).erreur_execution = d_ex_contexte; return; } if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile_contextes), &s_objet) == d_erreur) { return; } liberation(s_etat_processus, s_objet); if (depilement(s_etat_processus, &((*s_etat_processus) .l_base_pile_taille_contextes), &s_objet) == d_erreur) { return; } liberation(s_etat_processus, s_objet); return; } /* ================================================================================ Fonction 'dgtiz' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_dgtiz(struct_processus *s_etat_processus) { (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n DGTIZ "); if ((*s_etat_processus).langue == 'F') { printf("(mouse support in plot functions)\n\n"); printf(" Aucun argument\n"); } else { printf("(support de la souris dans les fonctions graphiques)\n\n"); printf(" No argument\n"); } 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, 0) == d_erreur) { return; } } if ((*s_etat_processus).fichiers_graphiques != NULL) { (*s_etat_processus).souris_active = d_vrai; appel_gnuplot(s_etat_processus, 'N'); (*s_etat_processus).souris_active = d_faux; } return; } /* ================================================================================ Fonction 'daemonize' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_daemonize(struct_processus *s_etat_processus) { (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n DAEMONIZE "); if ((*s_etat_processus).langue == 'F') { printf("(basculement en mode daemon)\n\n"); printf(" Aucun argument\n"); } else { printf("(convert to daemon)\n\n"); printf(" No argument\n"); } 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, 0) == d_erreur) { return; } } if (((*s_etat_processus).var_volatile_processus_pere == -1) && ((*s_etat_processus).l_base_pile_processus == NULL)) { lancement_daemon(s_etat_processus); } else { (*s_etat_processus).erreur_execution = d_ex_daemon; return; } return; } /* ================================================================================ Fonction 'diag->' ================================================================================ Entrées : pointeur sur une structure struct_processus -------------------------------------------------------------------------------- Sorties : -------------------------------------------------------------------------------- Effets de bord : néant ================================================================================ */ void instruction_diag_fleche(struct_processus *s_etat_processus) { struct_objet *s_objet_argument; struct_objet *s_objet_resultat; unsigned long i; unsigned long j; (*s_etat_processus).erreur_execution = d_ex; if ((*s_etat_processus).affichage_arguments == 'Y') { printf("\n DIAG-> "); if ((*s_etat_processus).langue == 'F') { printf("(conversion d'une matrice diagonale en vecteur)\n\n"); } else { printf("(diagonal matrix to vector conversion)\n\n"); } printf(" 1: %s, %s, %s\n", d_MIN, d_MRL, d_MCX); printf("-> 1: %s, %s, %s\n", d_VIN, d_VRL, d_VCX); 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, 1) == d_erreur) { return; } } if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile), &s_objet_argument) == d_erreur) { (*s_etat_processus).erreur_execution = d_ex_manque_argument; return; } /* * Conversion d'une matrice */ if ((*s_objet_argument).type == MIN) { if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes != (*((struct_matrice *) (*s_objet_argument).objet)) .nombre_colonnes) { (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; liberation(s_etat_processus, s_objet_argument); return; } if ((s_objet_resultat = allocation(s_etat_processus, VIN)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_vecteur *) (*s_objet_resultat).objet)).taille = (*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes; if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau = malloc((*((struct_vecteur *) (*s_objet_resultat).objet)) .taille * sizeof(integer8))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet)) .nombre_lignes; i++) { for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet)) .nombre_colonnes; j++) { if (i != j) { if (((integer8 **) (*((struct_matrice *) (*s_objet_argument) .objet)).tableau)[i][j] != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_matrice_non_diagonale; return; } } else { ((integer8 *) (*((struct_vecteur *) (*s_objet_resultat) .objet)).tableau)[i] = ((integer8 **) (*((struct_matrice *) (*s_objet_argument) .objet)).tableau)[i][j]; } } } } else if ((*s_objet_argument).type == MRL) { if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes != (*((struct_matrice *) (*s_objet_argument).objet)) .nombre_colonnes) { (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; liberation(s_etat_processus, s_objet_argument); return; } if ((s_objet_resultat = allocation(s_etat_processus, VRL)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_vecteur *) (*s_objet_resultat).objet)).taille = (*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes; if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau = malloc((*((struct_vecteur *) (*s_objet_resultat).objet)) .taille * sizeof(real8))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet)) .nombre_lignes; i++) { for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet)) .nombre_colonnes; j++) { if (i != j) { if (((real8 **) (*((struct_matrice *) (*s_objet_argument) .objet)).tableau)[i][j] != 0) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_matrice_non_diagonale; return; } } else { ((real8 *) (*((struct_vecteur *) (*s_objet_resultat) .objet)).tableau)[i] = ((real8 **) (*((struct_matrice *) (*s_objet_argument) .objet)).tableau)[i][j]; } } } } else if ((*s_objet_argument).type == MCX) { if ((*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes != (*((struct_matrice *) (*s_objet_argument).objet)) .nombre_colonnes) { (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; liberation(s_etat_processus, s_objet_argument); return; } if ((s_objet_resultat = allocation(s_etat_processus, VCX)) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } (*((struct_vecteur *) (*s_objet_resultat).objet)).taille = (*((struct_matrice *) (*s_objet_argument).objet)).nombre_lignes; if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau = malloc((*((struct_vecteur *) (*s_objet_resultat).objet)) .taille * sizeof(complex16))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } for(i = 0; i < (*((struct_matrice *) (*s_objet_argument).objet)) .nombre_lignes; i++) { for(j = 0; j < (*((struct_matrice *) (*s_objet_argument).objet)) .nombre_colonnes; j++) { if (i != j) { if ((((complex16 **) (*((struct_matrice *) (*s_objet_argument).objet)).tableau)[i][j] .partie_reelle != 0) || (((complex16 **) (*((struct_matrice *) (*s_objet_argument).objet)).tableau)[i][j] .partie_imaginaire != 0)) { liberation(s_etat_processus, s_objet_argument); liberation(s_etat_processus, s_objet_resultat); (*s_etat_processus).erreur_execution = d_ex_matrice_non_diagonale; return; } } else { ((complex16 *) (*((struct_vecteur *) (*s_objet_resultat) .objet)).tableau)[i] = ((complex16 **) (*((struct_matrice *) (*s_objet_argument) .objet)).tableau)[i][j]; } } } } /* * Conversion impossible impossible */ else { liberation(s_etat_processus, s_objet_argument); (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; return; } liberation(s_etat_processus, s_objet_argument); if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), s_objet_resultat) == d_erreur) { return; } return; } // vim: ts=4