--- rpl/src/rpl.h 2015/01/08 14:29:52 1.257 +++ rpl/src/rpl.h 2015/04/14 11:26:47 1.269 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.20 - Copyright (C) 1989-2015 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.21 + Copyright (C) 1989-2015 Dr. BERTRAND Joël This file is part of RPL/2. @@ -38,6 +38,10 @@ # ifdef OpenBSD # define _BSD_SOURCE # endif + +# ifdef FreeBSD +# define __BSD_VISIBLE 1 +# endif #endif #ifdef OS2 @@ -212,7 +216,6 @@ # undef HAVE_STACK_OVERFLOW_RECOVERY # endif -# define HAVE_INLINE # define GSL_RANGE_CHECK_OFF # include "gsl/gsl_cdf.h" # include "gsl/gsl_cblas.h" @@ -228,7 +231,7 @@ # include #endif -// Définition spécifique à Hurd +// Définition spécifique à Hurd #ifndef PIPE_BUF # define fpathconf (".", _PC_PIPE_BUF) #endif @@ -266,11 +269,11 @@ /* ================================================================================ - Bugs spécifiques + Bugs spécifiques ================================================================================ */ -// Néant +// Néant /* ================================================================================ @@ -292,17 +295,17 @@ enum signaux_rpl rpl_signull = 0, rpl_sigint, rpl_sigterm, - rpl_sigstart, // Signal envoyé par un père pour lancer son fils. - rpl_sigcont, // Signal de redémarrage d'un processus arrêté par + rpl_sigstart, // Signal envoyé par un père pour lancer son fils. + rpl_sigcont, // Signal de redémarrage d'un processus arrêté par // SUSPEND - rpl_sigstop, // Signal d'arrêt envoyé par l'instruction STOP ou + rpl_sigstop, // Signal d'arrêt envoyé par l'instruction STOP ou // FUSE. (FSTOP) - rpl_sigabort, // Signal envoyé par l'instruction ABORT (à regrouper + rpl_sigabort, // Signal envoyé par l'instruction ABORT (à regrouper // avec FABORT) - rpl_sigurg, // Signal d'arrêt urgent - rpl_siginject, // Signal indiquant la présence d'une donnée à lire - // envoyée depuis le père - rpl_sigalrm, // Signal d'alarme (erreur système) depuis un fils + rpl_sigurg, // Signal d'arrêt urgent + rpl_siginject, // Signal indiquant la présence d'une donnée à lire + // envoyée depuis le père + rpl_sigalrm, // Signal d'alarme (erreur système) depuis un fils rpl_sighup, rpl_sigtstp, rpl_sigexcept, @@ -311,9 +314,9 @@ enum signaux_rpl #define LONGUEUR_QUEUE_SIGNAUX 1024 -// Une structure s_queue_signaux est créée par processus (et non par thread). -// Elle est projetée dans un segment de mémoire partagée pour qu'elle soit -// accessible à la fois du père et des fils. +// Une structure s_queue_signaux est créée par processus (et non par thread). +// Elle est projetée dans un segment de mémoire partagée pour qu'elle soit +// accessible à la fois du père et des fils. #ifndef RPLARGS typedef struct queue_signaux @@ -347,11 +350,6 @@ __EXTERN__ int f_queue_signaux; # endif #endif -#ifdef OS2 -# define readline(s) readline_wrapper(s) - unsigned char *readline_wrapper(unsigned char *s); -#endif - #if ! defined(UNION_SEMUN) && defined(IPCS_SYSV) union semun { @@ -370,9 +368,10 @@ union semun # define SIGSTKSZ 65536 #endif + /* ================================================================================ - SÉMAPHORES + SÉMAPHORES ================================================================================ */ @@ -441,12 +440,12 @@ union semun #ifndef RPLARGS -// Signaux utilisés par défaut : +// Signaux utilisés par défaut : // SIGINT // SIGTSTP // SIGCONT // SIGPIPE -// SIGUSR1 et SIGUSR2 sont utilisé par libsigsegv. +// SIGUSR1 et SIGUSR2 sont utilisé par libsigsegv. // SIGHUP // SIGALRM @@ -458,7 +457,7 @@ union semun /* ================================================================================ - Granularité temporelle + Granularité temporelle ================================================================================ */ @@ -538,8 +537,8 @@ union semun sem_t *sem_open2(pid_t pid, int ordre); #endif -// Le mutex est là uniquement pour pouvoir émuler le comportement -// de sem_getvalue() sur un système comme MacOS X qui ne possède pas +// Le mutex est là uniquement pour pouvoir émuler le comportement +// de sem_getvalue() sur un système comme MacOS X qui ne possède pas // cette fonction. #ifdef Darwin @@ -561,17 +560,15 @@ union semun ================================================================================ */ -// Par défaut, tout est redirigé vers stderr sauf indication explicite de +// Par défaut, tout est redirigé vers stderr sauf indication explicite de // stdout. #define printf(...) transliterated_fprintf(s_etat_processus, \ stderr, __VA_ARGS__) #define fprintf(flux, ...) transliterated_fprintf(s_etat_processus, \ flux, __VA_ARGS__) -#define uprintf(...) transliterated_fprintf(NULL, \ - stderr, __VA_ARGS__) -#define ufprintf(flux, ...) transliterated_fprintf(NULL, \ - flux, __VA_ARGS__) +#define uprintf(...) std_fprintf(stderr, __VA_ARGS__) +#define ufprintf(flux, ...) std_fprintf(flux, __VA_ARGS__) #ifdef SunOS # define fopen(...) ({ FILE *desc; \ @@ -593,8 +590,8 @@ union semun # define fflush(flux) fflush((flux == stdout) ? stderr : flux) #endif -// Ajout d'un timeout sur les fonctions pipe() pour éviter une erreur -// système dans le cas où l'on a atteint le nombre maximale de fichiers +// Ajout d'un timeout sur les fonctions pipe() pour éviter une erreur +// système dans le cas où l'on a atteint le nombre maximale de fichiers // ouverts. #define pipe(descripteurs) \ @@ -613,14 +610,14 @@ union semun erreur; \ }) -// Redéfinition de abs pour un fonctionnement en entier de type long long int +// Redéfinition de abs pour un fonctionnement en entier de type long long int #ifdef __GNUC__ # define abs(i) ({ typeof(i) _i; _i = (i); (_i >= 0) ? _i : -_i; }) -// typeof() est une extension de gcc, mais est présent sur d'autres compilateurs -// comme Sun Studio. Dans le cas où typeof() n'existe pas, il est possible -// d'utiliser la macro suivante, mais elle possède un effet de bord dû à -// l'évaluation multiple de l'argument. +// typeof() est une extension de gcc, mais est présent sur d'autres compilateurs +// comme Sun Studio. Dans le cas où typeof() n'existe pas, il est possible +// d'utiliser la macro suivante, mais elle possède un effet de bord dû à +// l'évaluation multiple de l'argument. #else # define abs(i) (((i) >= 0) ? (i) : (-i)) #endif @@ -653,7 +650,7 @@ union semun { \ for(i = 0; i < nb; i++) \ uprintf(" %s\n", appels[i]); \ - free(appels); \ + sys_free(appels); \ } \ else \ uprintf("Nullified backtrace\n"); \ @@ -778,7 +775,7 @@ pid_t debug_fork(); /* -------------------------------------------------------------------------------- - Paramètres du système + Paramètres du système -------------------------------------------------------------------------------- */ @@ -797,7 +794,7 @@ pid_t debug_fork(); /* -------------------------------------------------------------------------------- - Erreurs système + Erreurs système -------------------------------------------------------------------------------- */ @@ -823,7 +820,7 @@ pid_t debug_fork(); #endif -// -1 : erreur provoquée par une bibliothèque externe +// -1 : erreur provoquée par une bibliothèque externe #ifndef RPLARGS # define d_es 2000 # define d_es_allocation_memoire __erreur(2001) @@ -889,11 +886,11 @@ pid_t debug_fork(); /* -------------------------------------------------------------------------------- - Erreurs à l'exécution + Erreurs à l'exécution -------------------------------------------------------------------------------- */ -// -1 : erreur provoquée par une bibliothèque externe +// -1 : erreur provoquée par une bibliothèque externe #ifndef RPLARGS # define d_ex 0 # define d_ex_pile_vide __erreur(1) @@ -1045,19 +1042,19 @@ enum t_type { ADR = 0, ALG, BIN, CHN, C SLB, SPH, SQL, TBL, VCX, VIN, VRL }; /* - ADR : adresse sur 64 bits signés. - Adresse d'une définition à interpréter. + ADR : adresse sur 64 bits signés. + Adresse d'une définition à interpréter. - ALG : expression algébrique (struct_liste_chainee *) - La liste chaînée contient la définition convertie en notation - polonaise inversée. Ce type diffère du type 'RPN' au niveau - du format de sortie (notation algébrique). + ALG : expression algébrique (struct_liste_chainee *) + La liste chaînée contient la définition convertie en notation + polonaise inversée. Ce type diffère du type 'RPN' au niveau + du format de sortie (notation algébrique). BIN : entier binaire sur 64 bits (unsigned integer8 *) Sans objet. Type C/Fortran : unsigned integer8 - CHN : chaine de caracteres (character*(*), unsigned char *) + CHN : chaine de caracteres (unsigned char *) Sans objet. CPL : complexe sur 2*64 bits (complex*16, struct_complexe16 *) @@ -1066,8 +1063,8 @@ enum t_type { ADR = 0, ALG, BIN, CHN, C FCH : descripteur de fichier (struct_fichier *). - FCT : déclaration d'une fonction et de son nombre d'arguments - (struct_fonction *). Ce type n'est nécessaire que dans le + FCT : déclaration d'une fonction et de son nombre d'arguments + (struct_fonction *). Ce type n'est nécessaire que dans le traitement des types 'ALG' et 'RPN'. INT : entier sur 64 bits (integer*8, integer8 *) @@ -1075,10 +1072,10 @@ enum t_type { ADR = 0, ALG, BIN, CHN, C Type C/Fortran : integer8 LST : liste (struct_liste_chainee *) - Les objets sont enregistrés sous forme de liste chaînée récursive. - Cela permet de traiter des tableaux de données hétérogènes de - grandes dimensions. Le nombre de dimensions maximal est fixé par - la mémoire de la station. + Les objets sont enregistrés sous forme de liste chaînée récursive. + Cela permet de traiter des tableaux de données hétérogènes de + grandes dimensions. Le nombre de dimensions maximal est fixé par + la mémoire de la station. MCX : matrice de complexes (struct_matrice *) Sans objet. @@ -1102,17 +1099,17 @@ enum t_type { ADR = 0, ALG, BIN, CHN, C Sans objet. RPN : definition (struct_liste_chainee *) - Ce type diffère du type 'ALG' au niveau du format de sortie - (notation polonaise inversée). + Ce type diffère du type 'ALG' au niveau du format de sortie + (notation polonaise inversée). SCK : socket (struct_socket *) - SLB : bibliothèque dynamique partagée (struct_bibliotheque *) + SLB : bibliothèque dynamique partagée (struct_bibliotheque *) Sans objet. - SPH : sémaphore nommé (struct_semaphore *) + SPH : sémaphore nommé (struct_semaphore *) - SQL : connecteur sur une base de données SQL (struct_connecteur_sql *) + SQL : connecteur sur une base de données SQL (struct_connecteur_sql *) TBL : tableau multidimensionnel d'objets (struct_tableau *). @@ -1182,7 +1179,7 @@ typedef struct rpl_mutex /* -------------------------------------------------------------------------------- - Structure sémaphore + Structure sémaphore -------------------------------------------------------------------------------- */ @@ -1214,7 +1211,7 @@ typedef struct marque /* -------------------------------------------------------------------------------- - Structure bibliothèque + Structure bibliothèque -------------------------------------------------------------------------------- */ @@ -1339,7 +1336,7 @@ typedef struct socket /* -------------------------------------------------------------------------------- - Structure liste chaînee + Structure liste chaînee -------------------------------------------------------------------------------- */ @@ -1364,8 +1361,8 @@ typedef struct gestion_signaux unsigned char masque_signaux[d_NOMBRE_SIGNAUX]; /* - * 'I' : signal ignoré - * 'Q' : signal mis en queue pour un traitement ultérieur + * 'I' : signal ignoré + * 'Q' : signal mis en queue pour un traitement ultérieur * 'N' : traitement normal du signal */ @@ -1413,7 +1410,7 @@ typedef struct liste_profilage2 /* -------------------------------------------------------------------------------- - Structure contenant les fichiers graphiques (liste chaînée) + Structure contenant les fichiers graphiques (liste chaînée) -------------------------------------------------------------------------------- */ @@ -1445,7 +1442,7 @@ typedef struct nom { unsigned char *nom; logical1 symbole; /* d_vrai/d_faux */ - // symbole == d_vrai signifie que le nom a été introduit dans un + // symbole == d_vrai signifie que le nom a été introduit dans un // calcul sans les apostrophes. } struct_nom; @@ -1527,7 +1524,7 @@ typedef struct liste_pile_systeme clause : I : IF R : IFERR - X : IFERR indiquant la présence d'une erreur. + X : IFERR indiquant la présence d'une erreur. T : THEN E : ELSE Z : traitement en cours de ELSE @@ -1536,8 +1533,8 @@ typedef struct liste_pile_systeme W : WHILE M : WHILE avec une clause fausse. S : SELECT - K : aucun cas CASE n'a encore été traité. - C : au moins un cas de SELECT...CASE a été traité. + K : aucun cas CASE n'a encore été traité. + C : au moins un cas de SELECT...CASE a été traité. Q : traitement en cours d'un cas CASE. F : traitement du cas DEFAULT */ @@ -1548,7 +1545,7 @@ typedef struct liste_pile_systeme unsigned char type_cloture; /* - type clôture : + type clôture : C SELECT : END termine un test SELECT/DEFAULT/END. D DO : END termine une boucle DO/UNTIL/END. I IF : END termine un test IF/THEN (ELSE)/END. @@ -1559,8 +1556,8 @@ typedef struct liste_pile_systeme F FOR : NEXT ou STEP termine une boucle avec compteur. S START : NEXT ou STEP termine une boucle sans compteur. - L LOOP : boucle utilisé dans le traitement de l'instruction RETURN. - Elle correspond à une boucle FOR ou START mais sans son + L LOOP : boucle utilisé dans le traitement de l'instruction RETURN. + Elle correspond à une boucle FOR ou START mais sans son initialisation. A FORALL : NEXT termine une boucle sur un objet. */ @@ -1604,7 +1601,7 @@ typedef struct variable /* -------------------------------------------------------------------------------- - Structure variable partagée + Structure variable partagée -------------------------------------------------------------------------------- */ @@ -1639,7 +1636,7 @@ typedef struct variable_statique unsigned char *nom; unsigned char origine; - // Position de création de la variable statique dans le programme ou dans + // Position de création de la variable statique dans le programme ou dans // l'expression. 'origine' vaut 'P' pour programme ou 'E' pour expression. integer8 niveau; @@ -1747,8 +1744,8 @@ typedef struct rpl_arguments /* Traitement des erreurs */ unsigned char *message_erreur; - unsigned char type_erreur; /* S = système - E = exécution */ + unsigned char type_erreur; /* S = système + E = exécution */ integer8 erreur; /* Traitement des messages d'aide */ @@ -1772,7 +1769,7 @@ typedef struct rpl_arguments /* -------------------------------------------------------------------------------- - Structure d'arbre des instructions intrinsèques + Structure d'arbre des instructions intrinsèques -------------------------------------------------------------------------------- */ @@ -1794,11 +1791,11 @@ typedef struct instruction typedef struct arbre_variables { unsigned int noeuds_utilises; - // Nombre de noeuds utilisés dans le + // Nombre de noeuds utilisés dans le // tableau **noeuds signed int indice_tableau_pere; // Position de la structure dans le - // tableau **noeuds du père + // tableau **noeuds du père struct arbre_variables *noeud_pere; struct arbre_variables **noeuds; @@ -1810,11 +1807,11 @@ typedef struct arbre_variables typedef struct arbre_variables_partagees { unsigned int noeuds_utilises; - // Nombre de noeuds utilisés dans le + // Nombre de noeuds utilisés dans le // tableau **noeuds signed int indice_tableau_pere; // Position de la structure dans le - // tableau **noeuds du père + // tableau **noeuds du père struct arbre_variables_partagees *noeud_pere; struct arbre_variables_partagees **noeuds; @@ -1837,7 +1834,7 @@ typedef struct tableau_variables { unsigned char origine; unsigned char *nom; // pointeur sur la struct_variable - // réelle et non copie de la chaîne + // réelle et non copie de la chaîne integer8 niveau; struct_objet *objet; // pointeur sur l'objet et non copie @@ -1850,14 +1847,14 @@ typedef struct tableau_variables union_position_variable variable_partagee; } struct_tableau_variables; -// La liste des variables est une liste doublement chaînée et circulaire. +// La liste des variables est une liste doublement chaînée et circulaire. typedef struct liste_variables { union { // Utilisation dans la gestion des variables struct_variable *variable; - // Utilisation dans la pile système (variables par niveau) + // Utilisation dans la pile système (variables par niveau) struct_liste_chainee *liste; }; @@ -1867,7 +1864,7 @@ typedef struct liste_variables struct liste_variables *precedent; } struct_liste_variables; -// La liste des variables statiques et une liste double chaînée et non +// La liste des variables statiques et une liste double chaînée et non // circulaire. typedef struct liste_variables_statiques { @@ -1921,7 +1918,7 @@ typedef struct buffer { unsigned char *buffer; - integer8 longueur_requise; + size_t longueur_requise; int classe; } struct_buffer; @@ -2028,13 +2025,13 @@ typedef struct processus /* Variables */ - // La liste des variables par niveau est doublement chaînée. - // À tout moment, elle pointe sur le niveau le plus haut existant et + // La liste des variables par niveau est doublement chaînée. + // À tout moment, elle pointe sur le niveau le plus haut existant et // l_liste_variable_par_niveau->precedent renvoie la liste des - // définitions. l_liste_variable_par_niveau->precedent->precedent pointe + // définitions. l_liste_variable_par_niveau->precedent->precedent pointe // sur la liste des variables globales. // - // À l'initialisation : + // À l'initialisation : // l_liste_variables_par_niveau->suivant == l_liste_variables_par_niveau // l_liste_variables_par_niveau->precedent == l_liste_variables_par_niveau @@ -2073,11 +2070,11 @@ typedef struct processus struct_liste_chainee *s_sockets; -/* Connecteurs aux bases de données */ +/* Connecteurs aux bases de données */ struct_liste_chainee *s_connecteurs_sql; -/* Bibliothèques dynamiques */ +/* Bibliothèques dynamiques */ struct_liste_chainee *s_bibliotheques; struct_instruction_externe *s_instructions_externes; @@ -2279,8 +2276,8 @@ typedef struct processus unsigned char masque_interruptions[d_NOMBRE_INTERRUPTIONS]; /* - * 'I' : interruption ignorée - * 'Q' : interruption mise en queue pour un traitement ultérieur + * 'I' : interruption ignorée + * 'Q' : interruption mise en queue pour un traitement ultérieur * 'N' : traitement normal de l'interruption */ @@ -2302,7 +2299,7 @@ typedef struct processus /* Variables volatiles */ volatile sig_atomic_t var_volatile_alarme; - // Traitement de ctrl+C et des arrêts brutaux + // Traitement de ctrl+C et des arrêts brutaux volatile sig_atomic_t var_volatile_requete_arret; // Traitement de ctrl+Z volatile sig_atomic_t var_volatile_requete_arret2; @@ -2329,12 +2326,12 @@ typedef struct processus integer8 nombre_arguments; /* - * Il s'agit du nombre d'arguments utilisé pour l'évaluation - * des expressions algébriques. - * -1 : la fonction ne peut être dans un objet de type ALG. + * Il s'agit du nombre d'arguments utilisé pour l'évaluation + * des expressions algébriques. + * -1 : la fonction ne peut être dans un objet de type ALG. * -2 : nombre d'arguments inconnu - * 0 : la fonction doit apparaître en notation infixe - * >0 : la fonction apparaît comme une fonction normale + * 0 : la fonction doit apparaître en notation infixe + * >0 : la fonction apparaît comme une fonction normale */ logical1 lancement_interactif; @@ -2363,6 +2360,7 @@ typedef struct processus struct timeval horodatage_profilage; pthread_mutex_t mutex_allocation; + pthread_mutex_t mutex_allocation_buffer; pthread_mutex_t mutex_interruptions; pthread_mutex_t mutex_pile_processus; pthread_mutex_t mutex_signaux; @@ -2380,11 +2378,11 @@ typedef struct processus logical1 initialisation_scheduler; -/* Drapeau nécessaire à RESTART */ +/* Drapeau nécessaire à RESTART */ volatile logical1 requete_redemarrage; -/* Gestion optimisée de la mémoire */ +/* Gestion optimisée de la mémoire */ double estimation_taille_pile_tampon; integer8 taille_pile_tampon; @@ -2397,14 +2395,14 @@ typedef struct processus integer8 taille_pile_objets; struct_objet *pile_objets; -# define TAILLE_CACHE 1024 +# define TAILLE_CACHE 1024 # define CACHE(type, nom) \ type *objets_##nom[TAILLE_CACHE]; \ - int pointeur_##nom; + volatile int pointeur_##nom; # define CACHE2(type, nom) \ type *nom[TAILLE_CACHE]; \ - int pointeur_##nom; + volatile int pointeur_##nom; CACHE(integer8, adr) CACHE(logical8, bin) @@ -2435,13 +2433,40 @@ typedef struct processus /* ================================================================================ + MISE EN PLACE DE L'ALLOCATEUR SPÉCIFIQUE +================================================================================*/ + +#ifndef DEBUG_MEMOIRE +# define malloc(a) rpl_malloc(s_etat_processus, a) +# define realloc(a, b) rpl_realloc(s_etat_processus, a, b) +# define free(a) rpl_free(s_etat_processus, a) +#endif + +void *rpl_malloc(struct_processus *s_etat_processus, size_t s); +void *rpl_realloc(struct_processus *s_etat_processus, void *ptr, size_t s); +void rpl_free(struct_processus *s_etat_processus, void *ptr); +void *sys_malloc(size_t s); +void sys_free(void *ptr); + +/* + * Wrapper de readline() pour que la fonction renvoie un pointeur sur un + * buffer alloué par rpl_malloc(). + */ + +#define readline(s) readline_wrapper(s_etat_processus, s) +unsigned char *readline_wrapper(struct_processus *s_etat_processus, + unsigned char *s); + + +/* +================================================================================ PROTOTYPES ================================================================================ */ /* -------------------------------------------------------------------------------- - Procédures d'exécution des mots-clef du langage RPL/2 + Procédures d'exécution des mots-clef du langage RPL/2 -------------------------------------------------------------------------------- */ @@ -2979,7 +3004,7 @@ void instruction_yield(struct_processus /* -------------------------------------------------------------------------------- - Procédures + Procédures -------------------------------------------------------------------------------- */ @@ -3004,12 +3029,14 @@ void conversion_chaine(struct_processus unsigned char *chaine, unsigned char type); void conversion_decimal_vers_hms(real8 *angle); void conversion_degres_vers_radians(real8 *angle); -void conversion_element_tex(unsigned char **element, unsigned char *fonction); +void conversion_element_tex(struct_processus *s_etat_processus, + unsigned char **element, unsigned char *fonction); void conversion_format(struct_processus *s_etat_processus, unsigned char *chaine); void conversion_hms_vers_decimal(real8 *angle); -void conversion_majuscule_limitee(unsigned char *chaine_entree, - unsigned char *chaine_sortie, integer8 longueur); +void conversion_majuscule_limitee( + unsigned char *chaine_entree, unsigned char *chaine_sortie, + integer8 longueur); void conversion_radians_vers_degres(real8 *angle); void copie_arbre_variables(struct_processus *s_etat_processus, struct_processus *s_nouvel_etat_processus); @@ -3168,7 +3195,7 @@ int envoi_signal_thread(pthread_t tid, e /* -------------------------------------------------------------------------------- - Fonctions de sommation de vecteur dans perte de précision + Fonctions de sommation de vecteur dans perte de précision -------------------------------------------------------------------------------- */ @@ -3200,21 +3227,25 @@ real8 correlation_statistique(struct_mat real8 covariance_statistique(struct_matrice *s_matrice, integer8 colonne_1, integer8 colonne_2, unsigned char type, logical1 *erreur); -struct_vecteur *ecart_type_statistique(struct_matrice *s_matrice, - unsigned char type); -struct_vecteur *moyenne_statistique(struct_matrice *s_matrice); -struct_vecteur *sommation_colonne_statistique(struct_matrice *s_matrice, +struct_vecteur *ecart_type_statistique(struct_processus *s_etat_processus, + struct_matrice *s_matrice, unsigned char type); +struct_vecteur *moyenne_statistique(struct_processus *s_etat_processus, + struct_matrice *s_matrice); +struct_vecteur *sommation_colonne_statistique( + struct_processus *s_etat_processus, struct_matrice *s_matrice, integer8 colonne); -struct_vecteur *sommation_produits_colonnes_statistiques(struct_matrice +struct_vecteur *sommation_produits_colonnes_statistiques( + struct_processus *s_etat_processus, struct_matrice *s_matrice, integer8 colonne_1, integer8 colonne_2); -struct_vecteur *sommation_statistique(struct_matrice *s_matrice); -struct_vecteur *variance_statistique(struct_matrice *s_matrice, - unsigned char type); +struct_vecteur *sommation_statistique(struct_processus *s_etat_processus, + struct_matrice *s_matrice); +struct_vecteur *variance_statistique(struct_processus *s_etat_processus, + struct_matrice *s_matrice, unsigned char type); #endif /* -------------------------------------------------------------------------------- - Gestion des bibliothèques + Gestion des bibliothèques -------------------------------------------------------------------------------- */ @@ -3245,17 +3276,21 @@ unsigned char *analyse_algebrique(struct unsigned char *chaine_algebrique, struct_liste_chainee **l_base_liste); unsigned char *analyse_flux(struct_processus *s_etat_processus, unsigned char *flux, integer8 longueur); -unsigned char *chiffrement(const EVP_CIPHER *type_chiffrement, +unsigned char *chiffrement(struct_processus *s_etat_processus, + const EVP_CIPHER *type_chiffrement, logical1 encodage, unsigned char *message, integer8 longueur_message, unsigned char *clef, integer8 longueur_clef, unsigned char *vecteur_initialisation, integer8 *longueur_message_chiffre); -unsigned char *compactage(unsigned char *chaine); -unsigned char *conversion_majuscule(unsigned char *chaine); +unsigned char *compactage(struct_processus *s_etat_processus, + unsigned char *chaine); +unsigned char *conversion_majuscule(struct_processus *s_etat_processus, + unsigned char *chaine); unsigned char *creation_nom_fichier(struct_processus *s_etat_processus, unsigned char *chemin); -unsigned char *date_compilation(); -unsigned char *extraction_chaine(unsigned char *chaine, integer8 i, integer8 j); +unsigned char *date_compilation(struct_processus *s_etat_processus); +unsigned char *extraction_chaine(struct_processus *s_etat_processus, + unsigned char *chaine, integer8 i, integer8 j); unsigned char *formateur(struct_processus *s_etat_processus, long offset, struct_objet *s_objet); unsigned char *formateur_fichier(struct_processus *s_etat_processus, @@ -3281,7 +3316,8 @@ unsigned char *formateur_reel(struct_pro unsigned char *messages(struct_processus *s_etat_processus); unsigned char *pointeur_ieme_caractere(struct_processus *s_etat_processus, unsigned char *chaine, integer8 position); -unsigned char *purification_chaine(unsigned char *chaine); +unsigned char *purification_chaine(struct_processus *s_etat_processus, + unsigned char *chaine); unsigned char *recherche_chemin_fichiers_temporaires(struct_processus *s_etat_processus); unsigned char *reencodage(struct_processus *s_etat_processus, @@ -3395,20 +3431,28 @@ ssize_t write_atomic(struct_processus *s -------------------------------------------------------------------------------- */ -int alsprintf(unsigned char **strp, const char *fmt, ...); +int alsprintf(struct_processus *s_etat_processus, + unsigned char **strp, const char *fmt, ...); +#ifndef RPLARGS +int association_etat_processus_readline(); +#endif int interruption_violation_access(void *adresse_fautive, int gravite); #ifndef RPLARGS +int initialisation_etat_processus_readline(); +int liberation_etat_processus_readline(); integer8 liste_variables(struct_processus *s_etat_processus, struct_tableau_variables *tableau); integer8 nombre_variables(struct_processus *s_etat_processus); int readline_analyse_syntaxique(int count, int key); int readline_effacement(int count, int key); #endif +int std_fprintf(file *flux, const char *format, ...); 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 valsprintf(unsigned char **strp, const char *fmt, va_list ap); +int valsprintf(struct_processus *s_etat_processus, + unsigned char **strp, const char *fmt, va_list ap); int wrapper_instruction_intrinseque(void (*fonction)(), struct_rpl_arguments *rpl_arguments); @@ -3424,7 +3468,7 @@ unsigned char longueur_entiers_binaires( /* -------------------------------------------------------------------------------- - Fonctions retournant un INTEGER*8 (valeur binaire non signée) + Fonctions retournant un INTEGER*8 (valeur binaire non signée) -------------------------------------------------------------------------------- */ @@ -3448,7 +3492,7 @@ integer8 position_caractere_de_chaine(st /* -------------------------------------------------------------------------------- - Fonctions renvoyant une liste chaînée (pointeur sur *struct_liste_chainee) + Fonctions renvoyant une liste chaînée (pointeur sur *struct_liste_chainee) -------------------------------------------------------------------------------- */ @@ -3459,14 +3503,14 @@ struct_liste_chainee *analyse_rpn(struct /* -------------------------------------------------------------------------------- - Allocateur de buffers à cache + Allocateur de buffers à cache -------------------------------------------------------------------------------- */ void initialisation_allocateur_buffer(struct_processus *s_etat_processus); void liberation_allocateur_buffer(struct_processus *s_etat_pocessus); struct_buffer *allocation_buffer(struct_processus *s_etat_processus, - integer8 longueur); + size_t longueur); void liberation_buffer(struct_processus *s_etat_processus, struct_buffer *buffer); @@ -3534,7 +3578,7 @@ struct_liste_variables_partagees *recher /* -------------------------------------------------------------------------------- - Fonctions gérant la complétion automatique + Fonctions gérant la complétion automatique -------------------------------------------------------------------------------- */ @@ -3546,7 +3590,7 @@ char **completion_matches(); /* -------------------------------------------------------------------------------- - Arithmétique + Arithmétique -------------------------------------------------------------------------------- */ @@ -3590,7 +3634,7 @@ void f77soustractionrc_(real8 *ra, compl /* -------------------------------------------------------------------------------- - Trigonométrie complexe + Trigonométrie complexe -------------------------------------------------------------------------------- */ @@ -3687,7 +3731,7 @@ void zgeev_(unsigned char *calcul_vp_gau integer4 *erreur, integer4 longueur_1, integer4 longueur_2); /* - * Valeurs propres généralisées + * Valeurs propres généralisées */ void zggev_(unsigned char *calcul_vp_gauches, unsigned char *calcul_vp_droits, @@ -3700,7 +3744,7 @@ void zggev_(unsigned char *calcul_vp_gau integer4 *erreur, integer4 longueur_1, integer4 longueur_2); /* - * Moindres carrés + * Moindres carrés */ void dgelsd_(integer4 *nombre_lignes_a, integer4 *nombre_colonnes_a, @@ -3715,11 +3759,11 @@ void zgelsd_(integer4 *nombre_lignes_a, real8 *rwork, integer4 *iwork, integer4 *info); /* - * Moindres carrés généralisé + * Moindres carrés généralisé */ /* - * Décomposition en valeurs singulières + * Décomposition en valeurs singulières */ void dgesvd_(unsigned char *jobu, unsigned char *jobvh, @@ -3776,7 +3820,7 @@ void zgees_(unsigned char *calcul_vecteu real8 *rwork, logical4 *bwork, integer4 *info, integer4 l1, integer4 l2); - /* Déterminant et rang */ + /* Déterminant et rang */ void dgecon_(unsigned char *norm, integer4 *n, real8 *a, integer4 *lda, real8 *anorm, real8 *rcond, real8 *work, integer4 *iwork, integer4 *info, integer4 l1); @@ -3797,8 +3841,8 @@ void zgelsy_(integer4 *m, integer4 *n, i #endif /* - * Fonction testant la requête d'arrêt (nécessaire pour tester le - * drapeau depuis une bibliothèque). + * Fonction testant la requête d'arrêt (nécessaire pour tester le + * drapeau depuis une bibliothèque). */ int test_arret(struct_processus *s_etat_processus);