--- rpl/src/rpl.h 2010/01/29 11:38:15 1.3 +++ rpl/src/rpl.h 2010/04/07 13:33:23 1.20 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.10 + RPL/2 (R) version 4.0.13 Copyright (C) 1989-2010 Dr. BERTRAND Joël This file is part of RPL/2. @@ -22,7 +22,10 @@ #ifndef INCLUSION_RPL #define INCLUSION_RPL + #define _GNU_SOURCE +#define _REENTRANT + /* ================================================================================ @@ -37,6 +40,7 @@ #include #include #include +#include #ifndef RPLARGS # include @@ -70,6 +74,9 @@ # include "termcap.h" # include "iconv.h" +# include "openssl/evp.h" +# include "sqlite3.h" + # define HAVE_INLINE # define GSL_RANGE_CHECK_OFF # include "gsl/gsl_cdf.h" @@ -276,6 +283,17 @@ typedef unsigned char t_8_bits; __VA_ARGS__; fflush(stdout); \ pthread_kill(pthread_self(), SIGBUS); }} while(0) +#define NOTICE(m) \ + do \ + { \ + ufprintf(stderr, "[%d-%llu] %s() from %s at line %d: %s\n", \ + getpid(), (unsigned long long) pthread_self(), \ + __FUNCTION__, __FILE__, __LINE__, m); \ + fflush(stderr); \ + } while(0) + +#ifdef __GLIBC__ +#include #define BACKTRACE(n) \ do \ { \ @@ -300,15 +318,9 @@ typedef unsigned char t_8_bits; fflush(stdout); \ pthread_mutex_unlock(&mutex); \ } while(0) - -#define NOTICE(m) \ - do \ - { \ - ufprintf(stderr, "[%d-%llu] %s() from %s at line %d: %s\n", \ - getpid(), pthread_self(), __FUNCTION__, __FILE__, __LINE__, \ - m); \ - fflush(stderr); \ - } while(0) +#else +#define BACKTRACE(n) NOTICE("BACKTRACE only defined in glibc") +#endif /* @@ -317,10 +329,24 @@ typedef unsigned char t_8_bits; ================================================================================ */ +#ifdef DEBUG_MEMOIRE +void *debug_memoire_ajout(size_t taille, const unsigned char *fonction, + unsigned long ligne, const unsigned char *argument); +void *debug_memoire_modification(void *pointeur, size_t taille, + const unsigned char *fonction, unsigned long ligne, + const unsigned char *argument); +void debug_memoire_retrait(void *ptr); + +#define malloc(s) debug_memoire_ajout(s, __FUNCTION__, __LINE__, #s) +#define free(s) debug_memoire_retrait(s) +#define realloc(s, t) debug_memoire_modification(s, t, \ + __FUNCTION__, __LINE__, #t) +#endif + #ifdef DEBUG_RETURN #define return uprintf("[%d] Return from <%s()> at line #%d " \ "(%s [%d])\n", (int) getpid(), __FUNCTION__, \ - __LINE__, strerror(errno), errno); fflush(stdout); errno=0; return + __LINE__, strerror(errno), errno); fflush(stdout); errno = 0; return #endif #ifdef DEBUG_MUTEX @@ -460,6 +486,8 @@ typedef unsigned char t_8_bits; # define d_es_nombre_max_descripteurs 2011 # define d_es_interruption_invalide 2012 # define d_es_contexte 2013 +# define d_es_somme_controle 2014 +# define d_es_nom_implicite 2015 #endif /* @@ -592,19 +620,10 @@ typedef unsigned char t_8_bits; # define d_ex_locales 76 # define d_ex_representation 77 # define d_ex_erreur_profilage 78 +# define d_ex_enregistrement_inexistant 79 +# define d_ex_clef_inexistante 80 #endif -/* --------------------------------------------------------------------------------- - Erreurs de la ligne de commande --------------------------------------------------------------------------------- -*/ - -#ifndef RPLARGS -# define d_os 4000 -# define d_os_ligne_de_commande 4001 -# define d_os_fichier_introuvable 4002 -#endif /* ================================================================================ @@ -820,12 +839,14 @@ typedef struct descripteur_fichier unsigned long identifiant; unsigned char effacement; + unsigned char type; // C (file *) ou S (sqlite *) unsigned char *nom; pid_t pid; pthread_t tid; - file *descripteur; + file *descripteur_c; + sqlite3 *descripteur_sqlite; } struct_descripteur_fichier; #endif @@ -996,8 +1017,8 @@ typedef struct descripteur_thread struct_objet *argument; - pid_t pid; - volatile pthread_t tid; + pid_t pid; + volatile pthread_t tid; pthread_t thread_pere; @@ -1331,8 +1352,11 @@ typedef struct processus unsigned char *nom_fichier_source; unsigned char *nom_fichier_historique; + unsigned char autorisation_conversion_chaine; /*Y/N*/ unsigned char autorisation_empilement_programme; /*Y/N*/ unsigned char autorisation_evaluation_nom; /*Y/N*/ + unsigned char autorisation_nom_implicite; /*Y/N*/ + unsigned char evaluation_forcee; /*Y/N*/ unsigned char instruction_valide; /*Y/N*/ unsigned char instruction_intrinseque; /*Y/I/N*/ unsigned char test_instruction; /*Y/N*/ @@ -1343,7 +1367,6 @@ typedef struct processus unsigned char mode_interactif; /*Y/N*/ unsigned char mode_evaluation_expression; /*Y/N*/ unsigned char traitement_cycle_exit; /*N/E/C*/ - unsigned char recherche_types_speciaux; /*Y/N*/ unsigned long position_courante; unsigned long longueur_definitions_chainees; @@ -1395,7 +1418,12 @@ typedef struct processus pthread_t thread_fusible; pthread_t thread_surveille_par_fusible; +# ifndef Cygwin stack_t pile_signal; +# else +# define SA_ONSTACK 0 +# define RTLD_LOCAL 0 +# endif /* Contextes */ @@ -1671,6 +1699,8 @@ typedef struct processus /* Autres */ + char *rpl_home; + gsl_rng *generateur_aleatoire; const gsl_rng_type *type_generateur_aleatoire; @@ -2004,6 +2034,7 @@ void instruction_ifft(struct_processus * void instruction_ift(struct_processus *s_etat_processus); void instruction_ifte(struct_processus *s_etat_processus); void instruction_im(struct_processus *s_etat_processus); +void instruction_implicit(struct_processus *s_etat_processus); void instruction_in(struct_processus *s_etat_processus); void instruction_incr(struct_processus *s_etat_processus); void instruction_indep(struct_processus *s_etat_processus); @@ -2355,6 +2386,7 @@ void conversion_hms_vers_decimal(real8 * void conversion_radians_vers_degres(real8 *angle); void correction_formateur_tex(struct_processus *s_etat_processus, unsigned char **ligne); +void debug_memoire_verification(struct_processus *s_etat_processus); void depilement_pile_systeme(struct_processus *s_etat_processus); void derivation(struct_processus *s_etat_processus, struct_objet **s_expression); @@ -2492,7 +2524,7 @@ complex16 sommation_vecteur_complexe(com */ #ifndef RPLARGS -int rplinit(int argc, char *argv[], unsigned char ***resultats); +int rplinit(int argc, char *argv[], unsigned char ***resultats, char *rpl_home); #endif /* @@ -2595,6 +2627,8 @@ logical1 analyse_syntaxique(struct_proce logical1 caracteristiques_fichier(struct_processus *s_etat_processus, unsigned char *nom, logical1 *existence, logical1 *ouverture, unsigned long *unite); +logical1 controle(struct_processus *s_etat_processus, unsigned char *fichier, + unsigned char *type, unsigned char *somme_candidate); logical1 creation_variable(struct_processus *s_etat_processus, struct_variable *s_variable, unsigned char autorisation_creation_variable_statique, @@ -2614,6 +2648,10 @@ logical1 empilement_pile_last(struct_pro unsigned long nombre_arguments); logical1 evaluation(struct_processus *s_etat_processus, struct_objet *s_objet, unsigned char type_evaluation); +logical1 initialisation_fichier_acces_direct(struct_processus *s_etat_processus, + sqlite3 *sqlite, logical1 binaire); +logical1 initialisation_fichier_acces_indexe(struct_processus *s_etat_processus, + sqlite3 *sqlite, integer8 position_clef, logical1 binaire); logical1 recherche_instruction_suivante(struct_processus *s_etat_processus); logical1 retrait_variable(struct_processus *s_etat_processus, unsigned char *nom_variable, unsigned char type); @@ -2673,10 +2711,12 @@ inline ssize_t write_atomic(struct_proce -------------------------------------------------------------------------------- */ -int asprintf(char **strp, const char *fmt, ...); +int alsprintf(unsigned char **strp, const char *fmt, ...); +int tex_fprintf(struct_processus *s_etat_processus, + file *flux, const char *format, ...); int transliterated_fprintf(struct_processus *s_etat_processus, file *flux, const char *format, ...); -int vasprintf(char **strp, const char *fmt, va_list ap); +int valsprintf(unsigned char **strp, const char *fmt, va_list ap); int wrapper_instruction_intrinseque(void (*fonction)(), struct_rpl_arguments *rpl_arguments); @@ -2734,14 +2774,14 @@ struct_processus *copie_etat_processus(s /* -------------------------------------------------------------------------------- - Fonctions renvoyant un pointeur sur un fichier (file *) + Fonctions renvoyant un pointeur sur un fichier (file *) ou un descripteur -------------------------------------------------------------------------------- */ #ifndef RPLARGS file *creation_fichier_tex(struct_processus *s_etat_processus); -file *descripteur_fichier(struct_processus *s_etat_processus, - struct_fichier *s_fichier); +struct_descripteur_fichier *descripteur_fichier(struct_processus + *s_etat_processus, struct_fichier *s_fichier); #endif /*