Diff for /rpl/src/instructions_r4.c between versions 1.7 and 1.8

version 1.7, 2010/03/08 08:34:15 version 1.8, 2010/03/08 16:44:10
Line 848  instruction_read(struct_processus *s_eta Line 848  instruction_read(struct_processus *s_eta
 {  {
     const char                      *queue;      const char                      *queue;
   
       int                             ios;
   
       integer8                        element;
       integer8                        id;
       integer8                        position_clef;
   
     logical1                        indicateur_48;      logical1                        indicateur_48;
     logical1                        presence_chaine;      logical1                        presence_chaine;
     logical1                        presence_indicateur;      logical1                        presence_indicateur;
Line 874  instruction_read(struct_processus *s_eta Line 880  instruction_read(struct_processus *s_eta
   
     struct_descripteur_fichier      *descripteur;      struct_descripteur_fichier      *descripteur;
   
       struct_liste_chainee            *l_element_courant;
       struct_liste_chainee            *l_element_inclus;
   
     struct_objet                    *s_objet_adresse;      struct_objet                    *s_objet_adresse;
     struct_objet                    *s_objet_argument_1;      struct_objet                    *s_objet_argument_1;
     struct_objet                    *s_objet_argument_2;      struct_objet                    *s_objet_argument_2;
Line 881  instruction_read(struct_processus *s_eta Line 890  instruction_read(struct_processus *s_eta
     struct_objet                    *s_objet_type;      struct_objet                    *s_objet_type;
   
     unsigned char                   caractere;      unsigned char                   caractere;
       unsigned char                   *clef_utf8;
     unsigned char                   *commande;      unsigned char                   *commande;
     unsigned char                   *tampon_lecture;      unsigned char                   *tampon_lecture;
     unsigned char                   *tampon;      unsigned char                   *tampon;
       unsigned char                   *tampon2;
   
     unsigned long                   i;      unsigned long                   i;
   
Line 907  instruction_read(struct_processus *s_eta Line 918  instruction_read(struct_processus *s_eta
   
         printf("    1: %s, %s\n\n", d_FCH, d_SCK);          printf("    1: %s, %s\n\n", d_FCH, d_SCK);
   
         printf("    1: %s, %s\n", d_INT, d_CHN);          printf("    2: %s, %s\n", d_INT, d_CHN);
         printf("    1: %s\n", d_FCH);          printf("    1: %s\n", d_FCH);
         return;          return;
     }      }
Line 1371  instruction_read(struct_processus *s_eta Line 1382  instruction_read(struct_processus *s_eta
                         cf(s_etat_processus, 48);                          cf(s_etat_processus, 48);
                     }                      }
   
                     (*s_etat_processus).instruction_courante = tampon;  
                       
                     liberation(s_etat_processus, s_objet_argument_1);                      liberation(s_etat_processus, s_objet_argument_1);
                     liberation(s_etat_processus, s_objet_argument_2);                      liberation(s_etat_processus, s_objet_argument_2);
   
                     free((*s_etat_processus).instruction_courante);                      free((*s_etat_processus).instruction_courante);
                     free(commande);                      free(commande);
   
                       (*s_etat_processus).instruction_courante = tampon;
                     return;                      return;
                 }                  }
   
Line 1410  instruction_read(struct_processus *s_eta Line 1421  instruction_read(struct_processus *s_eta
             }              }
             else              else
             {              {
                   BUG(((*descripteur).type != 'S'), uprintf("Bad filtype !\n"));
   
                   if (depilement(s_etat_processus, &((*s_etat_processus)
                           .l_base_pile), &s_objet_argument_2) == d_erreur)
                   {
                       (*s_etat_processus).erreur_execution = d_ex_manque_argument;
                       return;
                   }
   
                   if ((*s_objet_argument_2).type != CHN)
                   {
                       liberation(s_etat_processus, s_objet_argument_1);
                       liberation(s_etat_processus, s_objet_argument_2);
   
                       (*s_etat_processus).erreur_execution =
                               d_ex_erreur_type_argument;
                       return;
                   }
   
                   // Récupération de la position de la clef
   
                   if (alsprintf(&commande, "select key from control "
                           "where id = 1") < 0)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
                           commande, strlen(commande), &ppStmt, &queue)
                           != SQLITE_OK)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   if (sqlite3_step(ppStmt) != SQLITE_ROW)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   position_clef = sqlite3_column_int64(ppStmt, 0);
   
                   if (sqlite3_step(ppStmt) != SQLITE_DONE)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   free(commande);
   
                   if ((clef_utf8 = transliteration(s_etat_processus,
                           (unsigned char *) (*s_objet_argument_2).objet,
                           d_locale, "UTF-8")) == NULL)
                   {
                       liberation(s_etat_processus, s_objet_argument_1);
                       liberation(s_etat_processus, s_objet_argument_2);
   
                       return;
                   }
   
                   // Récupération de l'identifiant de la clef
   
                   if (alsprintf(&commande, "select id from key where key = "
                           "'{ \"%s\" }'", clef_utf8) < 0)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
                           commande, strlen(commande), &ppStmt, &queue)
                           != SQLITE_OK)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   switch(sqlite3_step(ppStmt))
                   {
                       case SQLITE_ROW:
                       {
                           // Résultat attendu : une clef correspond.
                           break;
                       }
   
                       case SQLITE_DONE:
                       {
                           // Aucun enregistrement
                           if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                           {
                               (*s_etat_processus).erreur_systeme =
                                       d_es_erreur_fichier;
                               return;
                           }
   
                           free(clef_utf8);
                           free(commande);
   
                           liberation(s_etat_processus, s_objet_argument_1);
                           liberation(s_etat_processus, s_objet_argument_2);
   
                           (*s_etat_processus).erreur_execution =
                                   d_ex_enregistrement_inexistant;
                           return;
                       }
   
                       default:
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_erreur_fichier;
                           return;
                       }
                   }
   
                   if (sqlite3_column_type(ppStmt, 0) != SQLITE_INTEGER)
                   {
                       free(clef_utf8);
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   id = sqlite3_column_int64(ppStmt, 0);
   
                   if (sqlite3_step(ppStmt) != SQLITE_DONE)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_erreur_fichier;
                       return;
                   }
   
                   free(commande);
   
                   if (alsprintf(&commande, "select data from data where "
                           "key_id = %lld order by sequence asc", id) < 0)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   if (sqlite3_prepare_v2((*descripteur).descripteur_sqlite,
                           commande, strlen(commande), &ppStmt, &queue)
                           != SQLITE_OK)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   element = 1;
   
                   do
                   {
                       switch(ios = sqlite3_step(ppStmt))
                       {
                           case SQLITE_ROW:
                           {
                               // Donnée supplémentaire
   
                               if (sqlite3_column_type(ppStmt, 0) != SQLITE_TEXT)
                               {
                                   (*s_etat_processus).erreur_systeme =
                                           d_es_erreur_fichier;
                                   return;
                               }
   
                               tampon = (*s_etat_processus).instruction_courante;
   
                               if ((tampon_lecture = (unsigned char *)
                                       sqlite3_column_text(ppStmt, 0)) == NULL)
                               {
                                   (*s_etat_processus).erreur_systeme =
                                           d_es_erreur_fichier;
                                   return;
                               }
   
                               if (((*s_etat_processus).instruction_courante =
                                       transliteration(s_etat_processus,
                                       tampon_lecture,
                                       "UTF-8", d_locale)) == NULL)
                               {
                                   (*s_etat_processus).instruction_courante =
                                           tampon;
   
                                   liberation(s_etat_processus,
                                           s_objet_argument_1);
                                   liberation(s_etat_processus,
                                           s_objet_argument_2);
   
                                   free(commande);
                                   free(clef_utf8);
                                   return;
                               }
   
                               indicateur_48 = test_cfsf(s_etat_processus, 48);
                               cf(s_etat_processus, 48);
   
                               recherche_type(s_etat_processus);
   
                               if ((*s_etat_processus).erreur_execution != d_ex)
                               {
                                   if (indicateur_48 == d_vrai)
                                   {
                                       sf(s_etat_processus, 48);
                                   }
                                   else
                                   {
                                       cf(s_etat_processus, 48);
                                   }
   
                                   liberation(s_etat_processus,
                                           s_objet_argument_1);
                                   liberation(s_etat_processus,
                                           s_objet_argument_2);
   
                                   free((*s_etat_processus).instruction_courante);
                                   free(commande);
                                   free(clef_utf8);
   
                                   (*s_etat_processus).instruction_courante =
                                           tampon;
                                   return;
                               }
   
                               if (indicateur_48 == d_vrai)
                               {
                                   sf(s_etat_processus, 48);
                               }
                               else
                               {
                                   cf(s_etat_processus, 48);
                               }
   
                               free((*s_etat_processus).instruction_courante);
                               (*s_etat_processus).instruction_courante = tampon;
   
                               element++;
   
                               // Inscription de la clef
   
                               if (element == position_clef)
                               {
                                   if (((*s_etat_processus).instruction_courante =
                                           transliteration(s_etat_processus,
                                           clef_utf8, "UTF-8", d_locale)) == NULL)
                                   {
                                       (*s_etat_processus).instruction_courante =
                                               tampon;
   
                                       liberation(s_etat_processus,
                                               s_objet_argument_1);
                                       liberation(s_etat_processus,
                                               s_objet_argument_2);
   
                                       free(commande);
                                       free(clef_utf8);
                                       return;
                                   }
   
                                   if (alsprintf(&tampon2, "{ \"%s\" }",
                                           (*s_etat_processus)
                                           .instruction_courante) < 0)
                                   {
                                       (*s_etat_processus).erreur_systeme =
                                               d_es_allocation_memoire;
                                       return;
                                   }
   
                                   free((*s_etat_processus).instruction_courante);
                                   (*s_etat_processus).instruction_courante
                                           = tampon2;
   
                                   indicateur_48 = test_cfsf(s_etat_processus, 48);
                                   cf(s_etat_processus, 48);
   
                                   recherche_type(s_etat_processus);
   
                                   if ((*s_etat_processus).erreur_execution
                                           != d_ex)
                                   {
                                       if (indicateur_48 == d_vrai)
                                       {
                                           sf(s_etat_processus, 48);
                                       }
                                       else
                                       {
                                           cf(s_etat_processus, 48);
                                       }
   
                                       liberation(s_etat_processus,
                                               s_objet_argument_1);
                                       liberation(s_etat_processus,
                                               s_objet_argument_2);
   
                                       free((*s_etat_processus)
                                               .instruction_courante);
                                       free(commande);
                                       free(clef_utf8);
   
                                       (*s_etat_processus).instruction_courante =
                                               tampon;
                                       return;
                                   }
   
                                   if (indicateur_48 == d_vrai)
                                   {
                                       sf(s_etat_processus, 48);
                                   }
                                   else
                                   {
                                       cf(s_etat_processus, 48);
                                   }
   
                                   free((*s_etat_processus).instruction_courante);
                                   (*s_etat_processus).instruction_courante =
                                           tampon;
   
                                   element++;
                               }
   
                               break;
                           }
   
                           case SQLITE_DONE:
                           {
                               // Fin de la liste
                               break;
                           }
   
                           default:
                           {
                               (*s_etat_processus).erreur_systeme =
                                       d_es_erreur_fichier;
                               return;
                           }
                       }
   
                   } while(ios != SQLITE_DONE);
   
                   if (sqlite3_finalize(ppStmt) != SQLITE_OK)
                   {
                       (*s_etat_processus).erreur_systeme = d_es_erreur_fichier;
                       return;
                   }
   
                   free(commande);
                   free(clef_utf8);
   
                   liberation(s_etat_processus, s_objet_argument_2);
   
                   if ((s_objet_resultat = allocation(s_etat_processus, LST))
                           == NULL)
                   {
                       (*s_etat_processus).erreur_systeme =
                               d_es_allocation_memoire;
                       return;
                   }
   
                   l_element_courant = NULL;
   
                   for(element--; element > 0; element--)
                   {
                       if (depilement(s_etat_processus, &((*s_etat_processus)
                               .l_base_pile), &s_objet_argument_2) == d_erreur)
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_erreur_fichier;
                           return;
                       }
   
                       if ((*s_objet_argument_2).type != LST)
                       {
                           (*s_etat_processus).erreur_systeme =
                                   d_es_erreur_fichier;
                           return;
                       }
   
                       l_element_inclus = (*s_objet_argument_2).objet;
   
                       if (l_element_inclus != NULL)
                       {
                           while(l_element_inclus != NULL)
                           {
                               if ((*l_element_inclus).suivant == NULL)
                               {
                                   (*l_element_inclus).suivant = l_element_courant;
                                   break;
                               }
   
                               l_element_inclus = (*l_element_inclus).suivant;
                           }
   
                           l_element_courant = (*s_objet_argument_2).objet;
                           (*s_objet_argument_2).objet = NULL;
                       }
   
                       liberation(s_etat_processus, s_objet_argument_2);
                   }
   
                   (*s_objet_resultat).objet = l_element_inclus;
   
                   if (empilement(s_etat_processus,
                           &((*s_etat_processus).l_base_pile),
                           s_objet_resultat) == d_erreur)
                   {
                       return;
                   }
             }              }
         }          }
         else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire          else if ((*((struct_fichier *) (*s_objet_argument_1).objet)).binaire

Removed from v.1.7  
changed lines
  Added in v.1.8


CVSweb interface <joel.bertrand@systella.fr>