--- rpl/src/instructions_r3.c 2010/03/05 11:20:08 1.6 +++ rpl/src/instructions_r3.c 2010/03/07 18:33:02 1.7 @@ -961,12 +961,17 @@ instruction_recall(struct_processus *s_e int caractere; int ios; + logical1 drapeau_fin; + logical1 indicateur_48; + logical1 presence_chaine; + long i; long nombre_caracteres_source; struct_objet *s_objet; - struct_objet *s_objet_temporaire; + unsigned char autorisation_empilement_programme; + unsigned char *chaine; unsigned char *commande; unsigned char *executable_candidat; unsigned char *instructions = "%s/bin/rpliconv %s " @@ -976,6 +981,10 @@ instruction_recall(struct_processus *s_e "($2 != \"\") printf(\"-f %%s\", $2); }'` " "-t `locale charmap` | %s/bin/%s -o %s"; unsigned char *nom_fichier_temporaire; + unsigned char *tampon_definitions_chainees; + unsigned char *tampon_instruction_courante; + + unsigned long position_courante; (*s_etat_processus).erreur_execution = d_ex; @@ -1278,13 +1287,7 @@ instruction_recall(struct_processus *s_e return; } - if ((s_objet_temporaire = allocation(s_etat_processus, CHN)) == NULL) - { - (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; - return; - } - - if (((*s_objet_temporaire).objet = malloc((nombre_caracteres_source + 1) + if ((chaine = malloc((nombre_caracteres_source + 1) * sizeof(unsigned char))) == NULL) { (*s_etat_processus).erreur_systeme = d_es_allocation_memoire; @@ -1294,35 +1297,67 @@ instruction_recall(struct_processus *s_e rewind(pipe); i = 0; - while((caractere = getc(pipe)) != EOF) + drapeau_fin = d_faux; + presence_chaine = d_faux; + + while(drapeau_fin == d_faux) { - if ((caractere == d_code_retour_chariot) || - (caractere == d_code_tabulation)) + if ((caractere = getc(pipe)) != EOF) { - do + if ((caractere == d_code_retour_chariot) || + (caractere == d_code_tabulation) || + ((caractere == d_code_espace) && + (presence_chaine == d_faux))) { - caractere = getc(pipe); - } while(((caractere == d_code_retour_chariot) || - (caractere == d_code_tabulation)) && - (caractere != EOF)); + do + { + caractere = getc(pipe); + } while(((caractere == d_code_retour_chariot) || + (caractere == d_code_tabulation) || + ((caractere == d_code_espace) && + (presence_chaine == d_faux))) && + (caractere != EOF)); + + if (caractere != EOF) + { + chaine[i++] = d_code_espace; + } + else + { + drapeau_fin = d_vrai; + } + } - if (caractere != EOF) + if ((chaine[i] = caractere) == '\"') { - ((unsigned char *) (*s_objet_temporaire).objet)[i++] = - d_code_espace; + if (i > 0) + { + if (chaine[i - 1] != '\\') + { + presence_chaine = (presence_chaine == d_faux) + ? d_vrai : d_faux; + } + } + + i++; + } + else + { + i++; } } - - ((unsigned char *) (*s_objet_temporaire).objet)[i++] = - caractere; + else + { + drapeau_fin = d_vrai; + } } - if (caractere == EOF) + if ((caractere == EOF) && (i > 0)) { i--; } - ((unsigned char *) (*s_objet_temporaire).objet)[i] = d_code_fin_chaine; + chaine[i] = d_code_fin_chaine; if (fclose(pipe) != 0) { @@ -1330,14 +1365,157 @@ instruction_recall(struct_processus *s_e return; } - if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile), - s_objet_temporaire) == d_erreur) + indicateur_48 = test_cfsf(s_etat_processus, 48); + cf(s_etat_processus, 48); + + tampon_definitions_chainees = (*s_etat_processus).definitions_chainees; + tampon_instruction_courante = (*s_etat_processus).instruction_courante; + position_courante = (*s_etat_processus).position_courante; + autorisation_empilement_programme = (*s_etat_processus) + .autorisation_empilement_programme; + + (*s_etat_processus).instruction_courante = NULL; + + if (((*s_etat_processus).definitions_chainees = transliteration( + s_etat_processus, chaine, "UTF-8", d_locale)) == NULL) { + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + + if (destruction_fichier(nom_fichier_temporaire) == d_erreur) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + free(nom_fichier_temporaire); + free((*s_etat_processus).instruction_courante); + free(chaine); + + (*s_etat_processus).position_courante = position_courante; + (*s_etat_processus).instruction_courante = + tampon_instruction_courante; + (*s_etat_processus).definitions_chainees = + tampon_definitions_chainees; + (*s_etat_processus).autorisation_empilement_programme = + autorisation_empilement_programme; + + liberation(s_etat_processus, s_objet); return; } - instruction_str_fleche(s_etat_processus); + (*s_etat_processus).autorisation_empilement_programme = 'Y'; + (*s_etat_processus).position_courante = 0; + + if (analyse_syntaxique(s_etat_processus) == d_erreur) + { + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + + if (destruction_fichier(nom_fichier_temporaire) == d_erreur) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + free(nom_fichier_temporaire); + free((*s_etat_processus).instruction_courante); + free((*s_etat_processus).definitions_chainees); + free(chaine); + + (*s_etat_processus).position_courante = position_courante; + (*s_etat_processus).instruction_courante = + tampon_instruction_courante; + (*s_etat_processus).definitions_chainees = + tampon_definitions_chainees; + (*s_etat_processus).autorisation_empilement_programme = + autorisation_empilement_programme; + + liberation(s_etat_processus, s_objet); + return; + } + + (*s_etat_processus).position_courante = 0; + + if (recherche_instruction_suivante(s_etat_processus) != + d_absence_erreur) + { + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } + + if (destruction_fichier(nom_fichier_temporaire) == d_erreur) + { + (*s_etat_processus).erreur_systeme = d_es_erreur_fichier; + return; + } + + free(nom_fichier_temporaire); + free((*s_etat_processus).instruction_courante); + free((*s_etat_processus).definitions_chainees); + free(chaine); + + (*s_etat_processus).position_courante = position_courante; + (*s_etat_processus).instruction_courante = + tampon_instruction_courante; + (*s_etat_processus).definitions_chainees = + tampon_definitions_chainees; + (*s_etat_processus).autorisation_empilement_programme = + autorisation_empilement_programme; + + liberation(s_etat_processus, s_objet); + return; + } + + recherche_type(s_etat_processus); + + while((*s_etat_processus).definitions_chainees + [(*s_etat_processus).position_courante] != d_code_fin_chaine) + { + if ((*s_etat_processus).definitions_chainees + [(*s_etat_processus).position_courante++] != d_code_espace) + { + (*s_etat_processus).erreur_execution = d_ex_syntaxe; + } + } + + free((*s_etat_processus).instruction_courante); + free((*s_etat_processus).definitions_chainees); + free(chaine); + + (*s_etat_processus).position_courante = position_courante; + (*s_etat_processus).instruction_courante = + tampon_instruction_courante; + (*s_etat_processus).definitions_chainees = + tampon_definitions_chainees; + (*s_etat_processus).autorisation_empilement_programme = + autorisation_empilement_programme; + + if (indicateur_48 == d_vrai) + { + sf(s_etat_processus, 48); + } + else + { + cf(s_etat_processus, 48); + } if (destruction_fichier(nom_fichier_temporaire) == d_erreur) {