version 1.28, 2011/07/25 07:44:55
|
version 1.43, 2013/03/10 22:15:48
|
Line 1
|
Line 1
|
/* |
/* |
================================================================================ |
================================================================================ |
RPL/2 (R) version 4.1.2 |
RPL/2 (R) version 4.1.13 |
Copyright (C) 1989-2011 Dr. BERTRAND Joël |
Copyright (C) 1989-2013 Dr. BERTRAND Joël |
|
|
This file is part of RPL/2. |
This file is part of RPL/2. |
|
|
Line 243 instruction_backspace(struct_processus *
|
Line 243 instruction_backspace(struct_processus *
|
{ |
{ |
struct_descripteur_fichier *descripteur; |
struct_descripteur_fichier *descripteur; |
|
|
|
int i; |
|
int nombre_octets; |
|
|
integer8 position_finale; |
integer8 position_finale; |
integer8 position_initiale; |
integer8 position_initiale; |
|
integer8 saut; |
|
|
|
logical1 guillemets_a_cheval; |
logical1 presence_chaine; |
logical1 presence_chaine; |
logical1 presence_indicateur; |
logical1 presence_indicateur; |
|
|
Line 260 instruction_backspace(struct_processus *
|
Line 265 instruction_backspace(struct_processus *
|
struct_objet *s_objet_argument; |
struct_objet *s_objet_argument; |
|
|
unsigned char *tampon_lecture; |
unsigned char *tampon_lecture; |
|
unsigned char tampon[9]; |
|
|
(*s_etat_processus).erreur_execution = d_ex; |
(*s_etat_processus).erreur_execution = d_ex; |
|
|
Line 480 instruction_backspace(struct_processus *
|
Line 486 instruction_backspace(struct_processus *
|
|
|
pointeur = longueur_effective - 1; |
pointeur = longueur_effective - 1; |
presence_indicateur = d_faux; |
presence_indicateur = d_faux; |
|
guillemets_a_cheval = d_faux; |
|
|
while((pointeur >= 0) && (presence_indicateur == d_faux)) |
while((pointeur >= 0) && (presence_indicateur == d_faux) |
|
&& (guillemets_a_cheval == d_faux)) |
{ |
{ |
if (tampon_lecture[pointeur] == '"') |
if (tampon_lecture[pointeur] == '"') |
{ |
{ |
presence_chaine = (presence_chaine == d_vrai) |
if (pointeur > 0) |
? d_faux : d_vrai; |
{ |
|
// On n'est pas au début du buffer, on regarde |
|
// si les guillemets sont échappés. |
|
|
|
if (tampon_lecture[pointeur - 1] != '\\') |
|
{ |
|
presence_chaine = (presence_chaine |
|
== d_vrai) ? d_faux : d_vrai; |
|
} |
|
} |
|
else |
|
{ |
|
// On est au début du buffer. Un guillemet |
|
// peut-être échappé par le dernier caractère |
|
// du buffer précédent. |
|
|
|
guillemets_a_cheval = d_vrai; |
|
} |
} |
} |
else |
else |
{ |
{ |
Line 500 instruction_backspace(struct_processus *
|
Line 525 instruction_backspace(struct_processus *
|
} |
} |
} |
} |
|
|
if (niveau == 0) |
if (guillemets_a_cheval == d_faux) |
{ |
|
presence_indicateur = d_vrai; |
|
} |
|
else |
|
{ |
{ |
position_finale--; |
if (niveau == 0) |
pointeur--; |
{ |
|
presence_indicateur = d_vrai; |
|
} |
|
else |
|
{ |
|
position_finale--; |
|
pointeur--; |
|
} |
} |
} |
} |
} |
} while((longueur_effective == longueur_questure) && |
} while((longueur_effective == longueur_questure) && |
Line 540 instruction_backspace(struct_processus *
|
Line 568 instruction_backspace(struct_processus *
|
/* |
/* |
* Fichiers non formatés |
* Fichiers non formatés |
*/ |
*/ |
|
|
|
/* |
|
Chaque enregistrement est terminé par un champ |
|
* indiquant la longueur totale de cet enregistrement. |
|
* |
|
* XXXXXXX0 longueur sur 7 bits |
|
* XXXX0011 XXXXXXXX XXXX0011 longueur sur 16 bits |
|
* LSB(1/2) MSB LSB(2/2) |
|
* XXXX0101 XXXXXXXX XXXXXXXX XXXX0101 longueur sur 24 bits |
|
* XXXX0111 XXXXXXXX XXXXXXXX XXXXXXXX |
|
* XXXX0111 longueur sur 32 bits |
|
* XXXX1001 XXXXXXXX XXXXXXXX XXXXXXXX |
|
* XXXXXXXX XXXX1001 longueur sur 40 bits |
|
* XXXX1011 XXXXXXXX XXXXXXXX XXXXXXXX |
|
* XXXXXXXX XXXXXXXX XXXX1011 longueur sur 48 bits |
|
* XXXX1101 XXXXXXXX XXXXXXXX XXXXXXXX |
|
* XXXXXXXX XXXXXXXX XXXXXXXX |
|
* XXXX1101 longueur sur 56 bits |
|
* XXXX1111 XXXXXXXX XXXXXXXX XXXXXXXX |
|
* XXXXXXXX XXXXXXXX XXXXXXXX |
|
* XXXXXXXX XXXX1111 longueur sur 64 bits |
|
*/ |
|
|
|
if ((position_finale = ftell((*descripteur).descripteur_c)) |
|
== -1) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
|
|
(*s_etat_processus).erreur_systeme = d_es_erreur_fichier; |
|
return; |
|
} |
|
|
|
// Lecture du premier octet. Le pointeur de lecture se |
|
// trouve après l'opération à sa position initiale. |
|
|
|
if (position_finale == 0) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_debut_de_fichier_atteint; |
|
return; |
|
} |
|
|
|
if (fseek((*descripteur).descripteur_c, position_finale - 1, |
|
SEEK_SET) != 0) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
|
|
(*s_etat_processus).erreur_systeme = d_es_erreur_fichier; |
|
return; |
|
} |
|
|
|
if (fread(tampon, (size_t) sizeof(unsigned char), 1, |
|
(*descripteur).descripteur_c) != 1) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
|
|
(*s_etat_processus).erreur_systeme = d_es_erreur_fichier; |
|
return; |
|
} |
|
|
|
if ((tampon[0] & 0x01) == 0) |
|
{ |
|
// Longueur sur sept bits |
|
saut = tampon[0] >> 1; |
|
} |
|
else |
|
{ |
|
// Longueurs supérieures |
|
nombre_octets = 2 + ((tampon[0] >> 1) & 0x07); |
|
|
|
if ((position_finale - nombre_octets) < 0) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
|
|
(*s_etat_processus).erreur_systeme = d_ex_syntaxe; |
|
return; |
|
} |
|
|
|
if (fseek((*descripteur).descripteur_c, position_finale |
|
- nombre_octets, SEEK_SET) != 0) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
|
|
(*s_etat_processus).erreur_systeme = |
|
d_es_erreur_fichier; |
|
return; |
|
} |
|
|
|
if (fread(tampon, (size_t) sizeof(unsigned char), |
|
nombre_octets, (*descripteur).descripteur_c) |
|
!= (size_t) nombre_octets) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
|
|
(*s_etat_processus).erreur_systeme = |
|
d_es_erreur_fichier; |
|
return; |
|
} |
|
|
|
// Récupération du LSB |
|
|
|
saut = (tampon[0] & 0xF0) |
|
| ((tampon[nombre_octets - 1] & 0x0F) >> 4); |
|
|
|
// Autres octets |
|
|
|
for(i = 1; i < (nombre_octets - 1); i++) |
|
{ |
|
saut |= tampon[i] << (((nombre_octets - 1) - i) * 8); |
|
} |
|
} |
|
|
|
if (position_finale - saut >= 0) |
|
{ |
|
if (fseek((*descripteur).descripteur_c, |
|
position_finale - saut, SEEK_SET) != 0) |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
|
|
(*s_etat_processus).erreur_systeme = |
|
d_es_erreur_fichier; |
|
return; |
|
} |
|
} |
|
else |
|
{ |
|
liberation(s_etat_processus, s_objet_argument); |
|
|
|
(*s_etat_processus).erreur_execution = |
|
d_ex_debut_de_fichier_atteint; |
|
return; |
|
} |
} |
} |
} |
} |
else |
else |