--- rpl/src/instructions_s3.c 2011/06/22 13:27:02 1.23 +++ rpl/src/instructions_s3.c 2012/10/01 11:05:06 1.38 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.3 - Copyright (C) 1989-2011 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.11 + Copyright (C) 1989-2012 Dr. BERTRAND Joël This file is part of RPL/2. @@ -47,6 +47,9 @@ instruction_sub(struct_processus *s_etat struct_objet *s_objet_argument_3; struct_objet *s_objet_resultat; + unsigned char *ptr1; + unsigned char *ptr2; + unsigned long i; (*s_etat_processus).erreur_execution = d_ex; @@ -144,7 +147,8 @@ instruction_sub(struct_processus *s_etat if ((*s_objet_argument_3).type == CHN) { if ((*((integer8 *) (*s_objet_argument_1).objet)) > (integer8) - strlen((unsigned char *) (*s_objet_argument_3).objet)) + longueur_chaine(s_etat_processus, + (unsigned char *) (*s_objet_argument_3).objet)) { liberation(s_etat_processus, s_objet_argument_1); liberation(s_etat_processus, s_objet_argument_2); @@ -160,14 +164,39 @@ instruction_sub(struct_processus *s_etat return; } - if (((*s_objet_resultat).objet = extraction_chaine((unsigned char *) + if ((ptr1 = pointeur_ieme_caractere(s_etat_processus, (unsigned char *) (*s_objet_argument_3).objet, (*((integer8 *) - (*s_objet_argument_2).objet)), (*((integer8 *) - (*s_objet_argument_1).objet)))) == NULL) + (*s_objet_argument_2).objet)) - 1)) == NULL) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_3); + + (*s_etat_processus).erreur_execution = d_ex_argument_invalide; + return; + } + + if ((ptr2 = pointeur_ieme_caractere(s_etat_processus, ptr1, + (*((integer8 *) (*s_objet_argument_1).objet)) + - ((*((integer8 *) (*s_objet_argument_2).objet)) - 1))) == NULL) + { + liberation(s_etat_processus, s_objet_argument_1); + liberation(s_etat_processus, s_objet_argument_2); + liberation(s_etat_processus, s_objet_argument_3); + + (*s_etat_processus).erreur_execution = d_ex_argument_invalide; + return; + } + + if (((*s_objet_resultat).objet = malloc(((ptr2 - ptr1) + 1) * + sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; return; } + + strncpy((unsigned char *) (*s_objet_resultat).objet, ptr1, + ptr2 - ptr1)[ptr2 - ptr1] = d_code_fin_chaine; } /*