--- rpl/src/instructions_b1.c 2010/01/27 22:22:12 1.2 +++ rpl/src/instructions_b1.c 2011/07/22 07:38:36 1.27 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.1 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -20,7 +20,7 @@ */ -#include "rpl.conv.h" +#include "rpl-conv.h" /* @@ -241,7 +241,7 @@ instruction_b_vers_r(struct_processus *s void instruction_backspace(struct_processus *s_etat_processus) { - file *descripteur; + struct_descripteur_fichier *descripteur; integer8 position_finale; integer8 position_initiale; @@ -304,44 +304,45 @@ instruction_backspace(struct_processus * if ((*s_objet_argument).type == FCH) { /* - * Vérification des verrous + * Fichiers à accès séquentiel */ - lock.l_type = F_RDLCK; - lock.l_whence = SEEK_SET; - lock.l_start = 0; - lock.l_len = 0; - lock.l_pid = getpid(); - - if ((descripteur = descripteur_fichier(s_etat_processus, - (struct_fichier *) (*s_objet_argument).objet)) == NULL) + if ((*((struct_fichier *) (*s_objet_argument).objet)).acces == 'S') { - liberation(s_etat_processus, s_objet_argument); - return; - } + /* + * Vérification des verrous + */ - if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1) - { - liberation(s_etat_processus, s_objet_argument); + lock.l_type = F_RDLCK; + lock.l_whence = SEEK_SET; + lock.l_start = 0; + lock.l_len = 0; + lock.l_pid = getpid(); - (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; - return; - } + if ((descripteur = descripteur_fichier(s_etat_processus, + (struct_fichier *) (*s_objet_argument).objet)) == NULL) + { + liberation(s_etat_processus, s_objet_argument); + return; + } - if (lock.l_type != F_UNLCK) - { - liberation(s_etat_processus, s_objet_argument); + if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock) + == -1) + { + liberation(s_etat_processus, s_objet_argument); - (*s_etat_processus).erreur_execution = - d_ex_fichier_verrouille; - return; - } + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } - if ((*((struct_fichier *) (*s_objet_argument).objet)).acces == 'S') - { - /* - * Fichiers à accès séquentiel - */ + if (lock.l_type != F_UNLCK) + { + liberation(s_etat_processus, s_objet_argument); + + (*s_etat_processus).erreur_execution = + d_ex_fichier_verrouille; + return; + } if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire == 'N') @@ -350,7 +351,8 @@ instruction_backspace(struct_processus * * Fichiers formatés */ - if ((position_finale = ftell(descripteur)) == -1) + if ((position_finale = ftell((*descripteur).descripteur_c)) + == -1) { liberation(s_etat_processus, s_objet_argument); @@ -381,7 +383,8 @@ instruction_backspace(struct_processus * longueur_effective = longueur_questure; } - if (fseek(descripteur, position_initiale, SEEK_SET) != 0) + if (fseek((*descripteur).descripteur_c, position_initiale, + SEEK_SET) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -390,7 +393,7 @@ instruction_backspace(struct_processus * longueur_effective = fread(tampon_lecture, (size_t) sizeof(unsigned char), longueur_effective, - descripteur); + (*descripteur).descripteur_c); pointeur = longueur_effective - 1; presence_indicateur = d_faux; @@ -416,7 +419,7 @@ instruction_backspace(struct_processus * * Le début du fichier est atteint. */ - if (fseek(descripteur, 0, SEEK_SET) != 0) + if (fseek((*descripteur).descripteur_c, 0, SEEK_SET) != 0) { liberation(s_etat_processus, s_objet_argument); free(tampon_lecture); @@ -463,7 +466,8 @@ instruction_backspace(struct_processus * position_finale--; } - if (fseek(descripteur, position_initiale, SEEK_SET) != 0) + if (fseek((*descripteur).descripteur_c, position_initiale, + SEEK_SET) != 0) { (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; @@ -472,7 +476,7 @@ instruction_backspace(struct_processus * longueur_effective = fread(tampon_lecture, (size_t) sizeof(unsigned char), longueur_effective, - descripteur); + (*descripteur).descripteur_c); pointeur = longueur_effective - 1; presence_indicateur = d_faux; @@ -519,7 +523,8 @@ instruction_backspace(struct_processus * return; } - if (fseek(descripteur, position_finale, SEEK_SET) != 0) + if (fseek((*descripteur).descripteur_c, position_finale, + SEEK_SET) != 0) { liberation(s_etat_processus, s_objet_argument); free(tampon_lecture); @@ -1826,5 +1831,59 @@ instruction_bessel(struct_processus *s_e return; } + + +/* +================================================================================ + Fonction 'backtrace' +================================================================================ + Entrées : +-------------------------------------------------------------------------------- + Sorties : +-------------------------------------------------------------------------------- + Effets de bord : néant +================================================================================ +*/ + +void +instruction_backtrace(struct_processus *s_etat_processus) +{ + (*s_etat_processus).erreur_execution = d_ex; + + if ((*s_etat_processus).affichage_arguments == 'Y') + { + printf("\n BACKTRACE "); + + if ((*s_etat_processus).langue == 'F') + { + printf("(affichage de la pile système)\n\n"); + printf(" Aucun argument\n"); + } + else + { + printf("(print system stack)\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; + } + } + + trace(s_etat_processus, stdout); + + return; +} // vim: ts=4