Diff for /rpl/src/instructions_b1.c between versions 1.3 and 1.13

version 1.3, 2010/02/10 10:14:20 version 1.13, 2010/08/06 15:26:46
Line 1 Line 1
 /*  /*
 ================================================================================  ================================================================================
   RPL/2 (R) version 4.0.11    RPL/2 (R) version 4.0.18
   Copyright (C) 1989-2010 Dr. BERTRAND Joël    Copyright (C) 1989-2010 Dr. BERTRAND Joël
   
   This file is part of RPL/2.    This file is part of RPL/2.
Line 20 Line 20
 */  */
   
   
 #include "rpl.conv.h"  #include "rpl-conv.h"
   
   
 /*  /*
Line 241  instruction_b_vers_r(struct_processus *s Line 241  instruction_b_vers_r(struct_processus *s
 void  void
 instruction_backspace(struct_processus *s_etat_processus)  instruction_backspace(struct_processus *s_etat_processus)
 {  {
     file                        *descripteur;      struct_descripteur_fichier  *descripteur;
   
     integer8                    position_finale;      integer8                    position_finale;
     integer8                    position_initiale;      integer8                    position_initiale;
Line 304  instruction_backspace(struct_processus * Line 304  instruction_backspace(struct_processus *
     if ((*s_objet_argument).type == FCH)      if ((*s_objet_argument).type == FCH)
     {      {
         /*          /*
          * Vérification des verrous           * Fichiers à accès séquentiel
          */           */
   
         lock.l_type = F_RDLCK;          if ((*((struct_fichier *) (*s_objet_argument).objet)).acces == 'S')
         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)  
         {          {
             liberation(s_etat_processus, s_objet_argument);              /*
             return;               * Vérification des verrous
         }               */
   
         if (fcntl(fileno(descripteur), F_GETLK, &lock) == -1)              lock.l_type = F_RDLCK;
         {              lock.l_whence = SEEK_SET;
             liberation(s_etat_processus, s_objet_argument);              lock.l_start = 0;
               lock.l_len = 0;
               lock.l_pid = getpid();
   
             (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;              if ((descripteur = descripteur_fichier(s_etat_processus,
             return;                      (struct_fichier *) (*s_objet_argument).objet)) == NULL)
         }              {
                   liberation(s_etat_processus, s_objet_argument);
                   return;
               }
   
         if (lock.l_type != F_UNLCK)              if (fcntl(fileno((*descripteur).descripteur_c), F_GETLK, &lock)
         {                      == -1)
             liberation(s_etat_processus, s_objet_argument);              {
                   liberation(s_etat_processus, s_objet_argument);
   
             (*s_etat_processus).erreur_execution =                  (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                     d_ex_fichier_verrouille;                  return;
             return;              }
         }  
   
         if ((*((struct_fichier *) (*s_objet_argument).objet)).acces == 'S')              if (lock.l_type != F_UNLCK)
         {              {
             /*                  liberation(s_etat_processus, s_objet_argument);
              * Fichiers à accès séquentiel  
              */                  (*s_etat_processus).erreur_execution =
                           d_ex_fichier_verrouille;
                   return;
               }
   
             if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire              if ((*((struct_fichier *) (*s_objet_argument).objet)).binaire
                     == 'N')                      == 'N')
Line 350  instruction_backspace(struct_processus * Line 351  instruction_backspace(struct_processus *
                  * Fichiers formatés                   * Fichiers formatés
                  */                   */
   
                 if ((position_finale = ftell(descripteur)) == -1)                  if ((position_finale = ftell((*descripteur).descripteur_c))
                           == -1)
                 {                  {
                     liberation(s_etat_processus, s_objet_argument);                      liberation(s_etat_processus, s_objet_argument);
   
Line 381  instruction_backspace(struct_processus * Line 383  instruction_backspace(struct_processus *
                         longueur_effective = longueur_questure;                          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 =                          (*s_etat_processus).erreur_systeme =
                                 d_es_erreur_fichier;                                  d_es_erreur_fichier;
Line 390  instruction_backspace(struct_processus * Line 393  instruction_backspace(struct_processus *
   
                     longueur_effective = fread(tampon_lecture,                      longueur_effective = fread(tampon_lecture,
                             (size_t) sizeof(unsigned char), longueur_effective,                              (size_t) sizeof(unsigned char), longueur_effective,
                             descripteur);                              (*descripteur).descripteur_c);
   
                     pointeur = longueur_effective - 1;                      pointeur = longueur_effective - 1;
                     presence_indicateur = d_faux;                      presence_indicateur = d_faux;
Line 416  instruction_backspace(struct_processus * Line 419  instruction_backspace(struct_processus *
                      * Le début du fichier est atteint.                       * 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);                          liberation(s_etat_processus, s_objet_argument);
                         free(tampon_lecture);                          free(tampon_lecture);
Line 463  instruction_backspace(struct_processus * Line 466  instruction_backspace(struct_processus *
                         position_finale--;                          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 =                          (*s_etat_processus).erreur_systeme =
                                 d_es_erreur_fichier;                                  d_es_erreur_fichier;
Line 472  instruction_backspace(struct_processus * Line 476  instruction_backspace(struct_processus *
   
                     longueur_effective = fread(tampon_lecture,                      longueur_effective = fread(tampon_lecture,
                             (size_t) sizeof(unsigned char), longueur_effective,                              (size_t) sizeof(unsigned char), longueur_effective,
                             descripteur);                              (*descripteur).descripteur_c);
   
                     pointeur = longueur_effective - 1;                      pointeur = longueur_effective - 1;
                     presence_indicateur = d_faux;                      presence_indicateur = d_faux;
Line 519  instruction_backspace(struct_processus * Line 523  instruction_backspace(struct_processus *
                     return;                      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);                      liberation(s_etat_processus, s_objet_argument);
                     free(tampon_lecture);                      free(tampon_lecture);
Line 1826  instruction_bessel(struct_processus *s_e Line 1831  instruction_bessel(struct_processus *s_e
   
     return;      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  // vim: ts=4

Removed from v.1.3  
changed lines
  Added in v.1.13


CVSweb interface <joel.bertrand@systella.fr>