--- rpl/src/instructions_c2.c 2012/09/29 17:53:02 1.37 +++ rpl/src/instructions_c2.c 2013/03/20 17:11:44 1.49 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.10 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.13 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -47,7 +47,7 @@ instruction_cycle(struct_processus *s_et unsigned char *instruction_majuscule; unsigned char *tampon; - unsigned long niveau; + integer8 niveau; void (*fonction)(); @@ -74,6 +74,12 @@ instruction_cycle(struct_processus *s_et printf(" ...\n"); printf(" NEXT/STEP\n\n"); + printf(" FORALL (variable)\n"); + printf(" ...\n"); + printf(" CYCLE\n"); + printf(" ...\n"); + printf(" NEXT\n\n"); + printf(" START\n"); printf(" ...\n"); printf(" CYCLE\n"); @@ -152,6 +158,7 @@ instruction_cycle(struct_processus *s_et (strcmp(instruction_majuscule, "DO") == 0) || (strcmp(instruction_majuscule, "WHILE") == 0) || (strcmp(instruction_majuscule, "FOR") == 0) || + (strcmp(instruction_majuscule, "FORALL") == 0) || (strcmp(instruction_majuscule, "START") == 0) || (strcmp(instruction_majuscule, "SELECT") == 0) || (strcmp(instruction_majuscule, "CRITICAL") == 0) @@ -165,6 +172,7 @@ instruction_cycle(struct_processus *s_et else { if ((strcmp(instruction_majuscule, "FOR") == 0) || + (strcmp(instruction_majuscule, "FORALL") == 0) || (strcmp(instruction_majuscule, "START") == 0)) { niveau++; @@ -292,6 +300,7 @@ instruction_cycle(struct_processus *s_et (fonction == instruction_do) || (fonction == instruction_while) || (fonction == instruction_for) || + (fonction == instruction_forall) || (fonction == instruction_start) || (fonction == instruction_select) || (fonction == instruction_case) || @@ -428,12 +437,13 @@ instruction_con(struct_processus *s_etat struct_objet *s_objet_resultat; logical1 argument_nom; + logical1 variable_partagee; - unsigned long i; - unsigned long j; - unsigned long nombre_colonnes; - unsigned long nombre_dimensions; - unsigned long nombre_lignes; + integer8 i; + integer8 j; + integer8 nombre_colonnes; + integer8 nombre_dimensions; + integer8 nombre_lignes; (*s_etat_processus).erreur_execution = d_ex; @@ -545,58 +555,40 @@ instruction_con(struct_processus *s_etat { // Variable partagée - if (pthread_mutex_lock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + variable_partagee = d_vrai; 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) + == NULL) { (*s_etat_processus).erreur_systeme = d_es; (*s_etat_processus).erreur_execution = d_ex_variable_non_definie; - 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); return; } - s_objet_2 = (*(*s_etat_processus).s_liste_variables_partagees) - .table[(*(*s_etat_processus).s_liste_variables_partagees) - .position_variable].objet; - - if (pthread_mutex_unlock(&((*(*s_etat_processus) - .s_liste_variables_partagees).mutex)) != 0) - { - (*s_etat_processus).erreur_systeme = d_es_processus; - return; - } + s_objet_2 = (*(*s_etat_processus) + .pointeur_variable_partagee_courante).objet; } else { // Variable privée s_objet_2 = (*(*s_etat_processus).pointeur_variable_courante).objet; + variable_partagee = d_faux; } } else { argument_nom = d_faux; + variable_partagee = d_faux; } /* @@ -624,6 +616,18 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } (*s_etat_processus).erreur_execution = d_ex_dimensions_invalides; return; @@ -644,6 +648,19 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument; @@ -658,6 +675,19 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) + != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } (*s_etat_processus).erreur_execution = d_ex_argument_invalide; return; @@ -715,6 +745,18 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } liberation(s_etat_processus, s_objet_1); @@ -736,6 +778,18 @@ instruction_con(struct_processus *s_etat { liberation(s_etat_processus, s_objet_2); } + else + { + if (variable_partagee == d_vrai) + { + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + } liberation(s_etat_processus, s_objet_1); @@ -762,7 +816,8 @@ instruction_con(struct_processus *s_etat nombre_lignes; if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau = - malloc(nombre_lignes * sizeof(integer8))) == NULL) + malloc(((size_t) nombre_lignes) * sizeof(integer8))) + == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -788,7 +843,7 @@ instruction_con(struct_processus *s_etat nombre_lignes; if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau = - malloc(nombre_lignes * sizeof(real8))) == NULL) + malloc(((size_t) nombre_lignes) * sizeof(real8))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -814,7 +869,8 @@ instruction_con(struct_processus *s_etat nombre_lignes; if (((*((struct_vecteur *) (*s_objet_resultat).objet)).tableau = - malloc(nombre_lignes * sizeof(struct_complexe16))) == NULL) + malloc(((size_t) nombre_lignes) * + sizeof(struct_complexe16))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -854,7 +910,8 @@ instruction_con(struct_processus *s_etat nombre_colonnes; if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau = - malloc(nombre_lignes * sizeof(integer8 *))) == NULL) + malloc(((size_t) nombre_lignes) * sizeof(integer8 *))) + == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -863,8 +920,8 @@ instruction_con(struct_processus *s_etat for(i = 0; i < nombre_lignes; i++) { if ((((integer8 **) (*((struct_matrice *) (*s_objet_resultat) - .objet)).tableau)[i] = malloc( - nombre_colonnes * sizeof(integer8))) == NULL) + .objet)).tableau)[i] = malloc(((size_t) + nombre_colonnes) * sizeof(integer8))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -894,7 +951,7 @@ instruction_con(struct_processus *s_etat nombre_colonnes; if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau = - malloc(nombre_lignes * sizeof(real8 *))) == NULL) + malloc(((size_t) nombre_lignes) * sizeof(real8 *))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -903,8 +960,8 @@ instruction_con(struct_processus *s_etat for(i = 0; i < nombre_lignes; i++) { if ((((real8 **) (*((struct_matrice *) (*s_objet_resultat) - .objet)).tableau)[i] = malloc( - nombre_colonnes * sizeof(real8))) == NULL) + .objet)).tableau)[i] = malloc(((size_t) + nombre_colonnes) * sizeof(real8))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -934,8 +991,8 @@ instruction_con(struct_processus *s_etat nombre_colonnes; if (((*((struct_matrice *) (*s_objet_resultat).objet)).tableau = - malloc(nombre_lignes * sizeof(struct_complexe16 *))) - == NULL) + malloc(((size_t) nombre_lignes) * + sizeof(struct_complexe16 *))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; @@ -945,7 +1002,7 @@ instruction_con(struct_processus *s_etat { if ((((struct_complexe16 **) (*((struct_matrice *) (*s_objet_resultat).objet)).tableau)[i] = - malloc(nombre_colonnes * + malloc(((size_t) nombre_colonnes) * sizeof(struct_complexe16))) == NULL) { (*s_etat_processus).erreur_systeme = @@ -981,8 +1038,23 @@ instruction_con(struct_processus *s_etat } else { - (*(*s_etat_processus).pointeur_variable_courante).objet = - s_objet_resultat; + if (variable_partagee == d_vrai) + { + (*(*s_etat_processus).pointeur_variable_partagee_courante).objet = + s_objet_resultat; + + if (pthread_mutex_unlock(&((*(*s_etat_processus) + .pointeur_variable_partagee_courante).mutex)) != 0) + { + (*s_etat_processus).erreur_systeme = d_es_processus; + return; + } + } + else + { + (*(*s_etat_processus).pointeur_variable_courante).objet = + s_objet_resultat; + } } return; @@ -1121,9 +1193,7 @@ instruction_cross(struct_processus *s_et .tableau)[2]), &(((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[1]), &(tampon_2)); - tampon_2 = -tampon_2; - - depassement |= depassement_addition(&(tampon_1), &(tampon_2), + depassement |= depassement_soustraction(&(tampon_1), &(tampon_2), &(((integer8 *) (*((struct_vecteur *) (*s_objet_resultat) .objet)).tableau)[0])); @@ -1137,9 +1207,7 @@ instruction_cross(struct_processus *s_et .tableau)[0]), &(((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[2]), &(tampon_2)); - tampon_2 = -tampon_2; - - depassement |= depassement_addition(&(tampon_1), &(tampon_2), + depassement |= depassement_soustraction(&(tampon_1), &(tampon_2), &(((integer8 *) (*((struct_vecteur *) (*s_objet_resultat) .objet)).tableau)[1])); @@ -1153,9 +1221,7 @@ instruction_cross(struct_processus *s_et .tableau)[1]), &(((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[0]), &(tampon_2)); - tampon_2 = -tampon_2; - - depassement |= depassement_addition(&(tampon_1), &(tampon_2), + depassement |= depassement_soustraction(&(tampon_1), &(tampon_2), &(((integer8 *) (*((struct_vecteur *) (*s_objet_resultat) .objet)).tableau)[2])); @@ -1237,25 +1303,28 @@ instruction_cross(struct_processus *s_et } ((real8 *) (*((struct_vecteur *) (*s_objet_resultat).objet)) - .tableau)[0] = (((integer8 *) (*((struct_vecteur *) + .tableau)[0] = ((real8) ((integer8 *) (*((struct_vecteur *) (*s_objet_argument_2).objet)).tableau)[1] * ((real8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[2]) - - (((integer8 *) (*((struct_vecteur *) (*s_objet_argument_2) - .objet)).tableau)[2] * ((real8 *) (*((struct_vecteur *) + - ((real8) ((integer8 *) (*((struct_vecteur *) + (*s_objet_argument_2).objet)).tableau)[2] * + ((real8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[1]); ((real8 *) (*((struct_vecteur *) (*s_objet_resultat).objet)) - .tableau)[1] = (((integer8 *) (*((struct_vecteur *) + .tableau)[1] = ((real8) ((integer8 *) (*((struct_vecteur *) (*s_objet_argument_2).objet)).tableau)[2] * ((real8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[0]) - - (((integer8 *) (*((struct_vecteur *) (*s_objet_argument_2) - .objet)).tableau)[0] * ((real8 *) (*((struct_vecteur *) + - ((real8) ((integer8 *) (*((struct_vecteur *) + (*s_objet_argument_2) .objet)).tableau)[0] * + ((real8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[2]); ((real8 *) (*((struct_vecteur *) (*s_objet_resultat).objet)) - .tableau)[2] = (((integer8 *) (*((struct_vecteur *) + .tableau)[2] = ((real8) ((integer8 *) (*((struct_vecteur *) (*s_objet_argument_2).objet)).tableau)[0] * ((real8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[1]) - - (((integer8 *) (*((struct_vecteur *) (*s_objet_argument_2) - .objet)).tableau)[1] * ((real8 *) (*((struct_vecteur *) + - ((real8) ((integer8 *) (*((struct_vecteur *) + (*s_objet_argument_2).objet)).tableau)[1] * + ((real8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[0]); } else if (((*s_objet_argument_1).type == VIN) && @@ -1290,24 +1359,28 @@ instruction_cross(struct_processus *s_et ((real8 *) (*((struct_vecteur *) (*s_objet_resultat).objet)) .tableau)[0] = (((real8 *) (*((struct_vecteur *) - (*s_objet_argument_2).objet)).tableau)[1] * ((integer8 *) - (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[2]) + (*s_objet_argument_2).objet)).tableau)[1] * (real8) + ((integer8 *) (*((struct_vecteur *) + (*s_objet_argument_1).objet)).tableau)[2]) - (((real8 *) (*((struct_vecteur *) (*s_objet_argument_2) - .objet)).tableau)[2] * ((integer8 *) (*((struct_vecteur *) + .objet)).tableau)[2] * (real8) ((integer8 *) + (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[1]); ((real8 *) (*((struct_vecteur *) (*s_objet_resultat).objet)) .tableau)[1] = (((real8 *) (*((struct_vecteur *) - (*s_objet_argument_2).objet)).tableau)[2] * ((integer8 *) - (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[0]) - - (((real8 *) (*((struct_vecteur *) (*s_objet_argument_2) - .objet)).tableau)[0] * ((integer8 *) (*((struct_vecteur *) + (*s_objet_argument_2).objet)).tableau)[2] * (real8) + ((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1) + .objet)).tableau)[0]) - (((real8 *) (*((struct_vecteur *) + (*s_objet_argument_2) .objet)).tableau)[0] * (real8) + ((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[2]); ((real8 *) (*((struct_vecteur *) (*s_objet_resultat).objet)) .tableau)[2] = (((real8 *) (*((struct_vecteur *) - (*s_objet_argument_2).objet)).tableau)[0] * ((integer8 *) - (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[1]) - - (((real8 *) (*((struct_vecteur *) (*s_objet_argument_2) - .objet)).tableau)[1] * ((integer8 *) (*((struct_vecteur *) + (*s_objet_argument_2).objet)).tableau)[0] * (real8) + ((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1) + .objet)).tableau)[1]) - (((real8 *) (*((struct_vecteur *) + (*s_objet_argument_2) .objet)).tableau)[1] * (real8) + ((integer8 *) (*((struct_vecteur *) (*s_objet_argument_1).objet)).tableau)[0]); } else if (((*s_objet_argument_1).type == VRL) &&