--- rpl/src/instructions_r7.c 2018/06/01 09:57:28 1.39 +++ rpl/src/instructions_r7.c 2018/12/21 10:56:18 1.40 @@ -703,4 +703,145 @@ instruction_rgdr(struct_processus *s_eta return; } + +/* +================================================================================ + Fonction 'record' +================================================================================ + Entrées : pointeur sur une structure struct_processus +-------------------------------------------------------------------------------- + Sorties : +-------------------------------------------------------------------------------- + Effets de bord : néant +================================================================================ +*/ + +void +instruction_record(struct_processus *s_etat_processus) +{ + integer8 i; + + struct_objet *s_objet_argument_1; + struct_objet *s_objet_argument_2; + struct_objet *s_objet_resultat; + + (*s_etat_processus).erreur_execution = d_ex; + + if ((*s_etat_processus).affichage_arguments == 'Y') + { + printf("\n RECORD "); + + if ((*s_etat_processus).langue == 'F') + { + printf("(création d'un enregistrement)\n\n"); + } + else + { + printf("(create record)\n\n"); + } + + printf(" 1: %s\n", d_TAB); + printf("-> 1: %s\n", d_REC); + + 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_1) == d_erreur) + { + (*s_etat_processus).erreur_execution = d_ex_manque_argument; + return; + } + + if ((*s_objet_argument_1).type == TBL) + { + // Vérification des noms + + for(i = 0; i < (*((struct_tableau *) (*s_objet_argument_1).objet)) + .nombre_elements; i++) + { + if ((*(*((struct_tableau *) (*s_objet_argument_1).objet)) + .elements[i]).type != NOM) + { + (*s_etat_processus).erreur_execution = + d_ex_erreur_type_argument; + + liberation(s_etat_processus, s_objet_argument_1); + return; + } + } + + // Allocation de la table des données. + + if ((s_objet_argument_2 = allocation(s_etat_processus, TBL)) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + (*((struct_tableau *) (*s_objet_argument_2).objet)).nombre_elements = + (*((struct_tableau *) (*s_objet_argument_1).objet)) + .nombre_elements; + + if (((*((struct_tableau *) (*s_objet_argument_2).objet)).elements = + malloc(((size_t) (*((struct_tableau *) + (*s_objet_argument_2).objet)).nombre_elements) * + sizeof(struct_objet *))) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + for(i = 0; i < (*((struct_tableau *) (*s_objet_argument_2).objet)) + .nombre_elements; i++) + + { + if (((*((struct_tableau *) (*s_objet_argument_2).objet)).elements[i] + = allocation(s_etat_processus, LST)) == NULL) + { + return; + } + } + + if ((s_objet_resultat = allocation(s_etat_processus, REC)) == NULL) + { + (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; + return; + } + + (*((struct_record *) (*s_objet_resultat).objet)).noms = + s_objet_argument_1; + (*((struct_record *) (*s_objet_resultat).objet)).donnees = + s_objet_argument_2; + } + else + { + liberation(s_etat_processus, s_objet_argument_1); + + (*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; + } + + return; +} + // vim: ts=4