--- rpl/src/rpl.h 2012/09/29 17:53:02 1.176 +++ rpl/src/rpl.h 2013/03/21 14:13:55 1.214 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.1.10 - Copyright (C) 1989-2012 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.13 + Copyright (C) 1989-2013 Dr. BERTRAND Joël This file is part of RPL/2. @@ -65,6 +65,7 @@ #include #include +#include #include #include #include @@ -163,8 +164,43 @@ # include "readline.h" # include "termcap.h" # include "iconv.h" +# include "zlib.h" # include "openssl/evp.h" +# ifndef OPENSSL_NO_MD2 +# include "openssl/md2.h" +# endif +# ifndef OPENSSL_NO_MD4 +# include "openssl/md4.h" +# endif +# ifndef OPENSSL_NO_MD5 +# include "openssl/md5.h" +# endif +# ifndef OPENSSL_NO_MDC2 +# include "openssl/mdc2.h" +# endif +# ifndef OPENSSL_NO_RIPEMD +# include "openssl/ripemd.h" +# endif +# ifndef OPENSSL_NO_SHA +# include "openssl/sha.h" +# endif +# ifndef OPENSSL_NO_WHIRLPOOL +# include "openssl/whrlpool.h" +# endif +# ifndef OPENSSL_NO_AES +# include "openssl/aes.h" +# endif +# ifndef OPENSSL_NO_CAMELLIA +# include "openssl/camellia.h" +# endif +# ifndef OPENSSL_NO_RC2 +# include "openssl/rc2.h" +# endif +# ifndef OPENSSL_NO_IDEA +# include "openssl/idea.h" +# endif + # include "sqlite3.h" # include "sigsegv.h" # ifdef OS2 @@ -188,7 +224,7 @@ # include #endif -// Définition spécifique à Hurd +// Définition spécifique à Hurd #ifndef PIPE_BUF # define fpathconf (".", _PC_PIPE_BUF) #endif @@ -226,11 +262,11 @@ /* ================================================================================ - Bugs spécifiques + Bugs spécifiques ================================================================================ */ -// Néant +// Néant /* ================================================================================ @@ -252,17 +288,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, @@ -271,9 +307,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 @@ -334,7 +370,7 @@ union semun /* ================================================================================ - SÉMAPHORES + SÉMAPHORES ================================================================================ */ @@ -360,12 +396,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 @@ -377,7 +413,7 @@ union semun /* ================================================================================ - Granularité temporelle + Granularité temporelle ================================================================================ */ @@ -445,7 +481,10 @@ union semun __STATIC_MUTEX_INITIALIZATION__; __EXTERN__ pthread_mutex_t mutex_gestionnaires_signaux_atomique __STATIC_MUTEX_INITIALIZATION__; + __EXTERN__ pthread_mutex_t mutex_creation_variable_partagee + __STATIC_MUTEX_INITIALIZATION__; __EXTERN__ pthread_mutex_t mutex_sections_critiques; + __EXTERN__ pthread_mutex_t mutex_liste_variables_partagees; __EXTERN__ sem_t __PTR__ semaphore_gestionnaires_signaux; @@ -464,8 +503,8 @@ int sem_destroy3(sem_t *semaphore_p, pid int sem_getvalue2(sem_t *semaphore, int *valeur); sem_t *sem_open2(pid_t pid, int ordre); -// 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. #define sem_getvalue(semaphore, value) sem_getvalue2(semaphore, value) @@ -486,7 +525,7 @@ sem_t *sem_open2(pid_t pid, int ordre); ================================================================================ */ -// 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, \ @@ -518,8 +557,8 @@ sem_t *sem_open2(pid_t pid, int ordre); # 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) \ @@ -538,14 +577,14 @@ sem_t *sem_open2(pid_t pid, int ordre); 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 @@ -720,7 +759,7 @@ pid_t debug_fork(); /* -------------------------------------------------------------------------------- - Paramètres du système + Paramètres du système -------------------------------------------------------------------------------- */ @@ -739,7 +778,7 @@ pid_t debug_fork(); /* -------------------------------------------------------------------------------- - Erreurs système + Erreurs système -------------------------------------------------------------------------------- */ @@ -765,7 +804,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) @@ -831,11 +870,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) @@ -926,6 +965,10 @@ pid_t debug_fork(); # define d_ex_mutex_acquis_autre_thread __erreur(86) # define d_ex_expression_reguliere __erreur(87) # define d_ex_instruction_indisponible __erreur(88) +# define d_ex_chiffrement __erreur(89) +# define d_ex_chiffrement_indisponible __erreur(90) +# define d_ex_longueur_clef_chiffrement __erreur(91) +# define d_ex_taille_message __erreur(92) #endif @@ -983,13 +1026,13 @@ enum t_type { ADR = 0, ALG, BIN, CHN, C SLB, SPH, SQL, TBL, VCX, VIN, VRL }; /* - ADR : adresse sur 32 bits (au moins) non signés (unsigned long) - 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. @@ -1004,8 +1047,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 *) @@ -1013,10 +1056,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. @@ -1040,17 +1083,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 *). @@ -1085,7 +1128,7 @@ typedef struct objet #ifndef RPLARGS typedef struct fichier { - unsigned long descripteur; + int descripteur; unsigned char acces; /* S/D/I */ unsigned char binaire; /* Y/N/F */ @@ -1120,7 +1163,7 @@ typedef struct rpl_mutex /* -------------------------------------------------------------------------------- - Structure sémaphore + Structure sémaphore -------------------------------------------------------------------------------- */ @@ -1152,7 +1195,7 @@ typedef struct marque /* -------------------------------------------------------------------------------- - Structure bibliothèque + Structure bibliothèque -------------------------------------------------------------------------------- */ @@ -1178,7 +1221,7 @@ typedef struct bibliotheque #ifndef RPLARGS typedef struct descripteur_fichier { - unsigned long identifiant; + int identifiant; unsigned char effacement; unsigned char type; // C (file *) ou S (sqlite *) @@ -1224,6 +1267,7 @@ typedef struct connecteur_sql # ifdef POSTGRESQL_SUPPORT PGconn *postgresql; # endif + sqlite3 *sqlite; } descripteur; } struct_connecteur_sql; #endif @@ -1237,6 +1281,10 @@ typedef struct connecteur_sql "POSTGRESQL") == 0) \ postgresqlclose((*((struct_connecteur_sql *) (*s_objet).objet)) \ .descripteur); \ + else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type, \ + "SQLITE") == 0) \ + sqlite3_close((*((struct_connecteur_sql *) (*s_objet).objet)) \ + .descripteur.sqlite); \ else \ BUG(1, uprintf("SQL type '%s' not allowed!", \ (*((struct_connecteur_sql *) (*s_objet).objet)).type)); @@ -1272,7 +1320,7 @@ typedef struct socket /* -------------------------------------------------------------------------------- - Structure liste chaînee + Structure liste chaînee -------------------------------------------------------------------------------- */ @@ -1297,8 +1345,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 */ @@ -1346,7 +1394,7 @@ typedef struct liste_profilage2 /* -------------------------------------------------------------------------------- - Structure contenant les fichiers graphiques (liste chaînée) + Structure contenant les fichiers graphiques (liste chaînée) -------------------------------------------------------------------------------- */ @@ -1378,7 +1426,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; @@ -1443,8 +1491,6 @@ typedef struct liste_pile_systeme { struct liste_pile_systeme *suivant; - struct_liste_chainee *pointeur_objet_retour; - struct_objet *indice_boucle; struct_objet *limite_indice_boucle; struct_objet *objet_de_test; @@ -1460,7 +1506,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 @@ -1469,8 +1515,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 */ @@ -1481,7 +1527,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. @@ -1492,15 +1538,15 @@ 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. */ - unsigned long adresse_retour; - unsigned long niveau_courant; - struct_objet *pointeur_adresse_retour; + integer8 adresse_retour; + integer8 niveau_courant; + struct_liste_chainee *pointeur_objet_retour; } struct_liste_pile_systeme; #endif @@ -1514,16 +1560,16 @@ typedef struct liste_pile_systeme #ifndef RPLARGS typedef union position_variable { - unsigned long adresse; + integer8 adresse; struct_objet *pointeur; } union_position_variable; typedef struct variable { unsigned char *nom; - unsigned char origine; + unsigned char origine; // P(rogramme) ou E(valuation) - unsigned long niveau; + integer8 niveau; union_position_variable variable_statique; union_position_variable variable_partagee; @@ -1537,7 +1583,7 @@ typedef struct variable /* -------------------------------------------------------------------------------- - Structure variable partagée + Structure variable partagée -------------------------------------------------------------------------------- */ @@ -1548,24 +1594,14 @@ typedef struct variable_partage unsigned char *nom; unsigned char origine; - unsigned long niveau; + integer8 niveau; union_position_variable variable_partagee; struct_objet *objet; -} struct_variable_partagee; - -typedef struct table_variables_partagees -{ - pthread_mutex_t mutex; - volatile struct_variable_partagee *table; - - volatile unsigned long nombre_variables; - volatile unsigned long nombre_variables_allouees; - - unsigned long position_variable; -} struct_table_variables_partagees; + pthread_mutex_t mutex; +} struct_variable_partagee; #endif @@ -1582,10 +1618,10 @@ 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. - unsigned long niveau; + integer8 niveau; union_position_variable variable_statique; @@ -1602,7 +1638,7 @@ typedef struct variable_statique typedef struct vecteur { - unsigned long taille; + integer8 taille; unsigned char type; /* C (complex*16), R (real*8), I (integer*8) */ @@ -1618,8 +1654,8 @@ typedef struct vecteur typedef struct matrice { - unsigned long nombre_lignes; - unsigned long nombre_colonnes; + integer8 nombre_lignes; + integer8 nombre_colonnes; unsigned char type; /* C (complex*16), R (real*8), I (integer*8) */ @@ -1635,7 +1671,7 @@ typedef struct matrice typedef struct tableau { - unsigned long nombre_elements; + integer8 nombre_elements; struct_objet **elements; } struct_tableau; @@ -1690,8 +1726,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 */ @@ -1715,7 +1751,7 @@ typedef struct rpl_arguments /* -------------------------------------------------------------------------------- - Structure d'arbre des instructions intrinsèques + Structure d'arbre des instructions intrinsèques -------------------------------------------------------------------------------- */ @@ -1729,42 +1765,77 @@ typedef struct instruction /* -------------------------------------------------------------------------------- - Structure d'arbre des variables variable globales et locales + Structure d'arbre des variables globales et locales -------------------------------------------------------------------------------- */ #ifndef RPLARGS typedef struct arbre_variables { - unsigned int noeuds_utilises; - signed int indice_tableau_pere; - struct arbre_variables *noeud_pere; - struct arbre_variables **noeuds; - struct liste_variables *feuille; + unsigned int noeuds_utilises; + // 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 + + struct arbre_variables *noeud_pere; + struct arbre_variables **noeuds; + + struct liste_variables *feuille; + struct liste_variables_statiques *feuille_statique; } struct_arbre_variables; +typedef struct arbre_variables_partagees +{ + unsigned int noeuds_utilises; + // 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 + + struct arbre_variables_partagees *noeud_pere; + struct arbre_variables_partagees **noeuds; + + struct liste_variables_partagees *feuille; + + pthread_mutex_t mutex_feuille; +} struct_arbre_variables_partagees; + +#define INITIALISATION_MUTEX(mutex) \ + do { \ + pthread_mutexattr_t attributs_mutex; \ + pthread_mutexattr_init(&attributs_mutex); \ + pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_NORMAL); \ + pthread_mutex_init(&(mutex), &attributs_mutex); \ + pthread_mutexattr_destroy(&attributs_mutex); \ + } while(0) + typedef struct tableau_variables { unsigned char origine; unsigned char *nom; // pointeur sur la struct_variable - // réelle et non copie de la chaîne - unsigned long niveau; + // réelle et non copie de la chaîne + integer8 niveau; struct_objet *objet; // pointeur sur l'objet et non copie // de l'objet. logical1 variable_verrouillee; + logical1 variable_masquee; union_position_variable variable_statique; union_position_variable variable_partagee; } struct_tableau_variables; +// 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; }; @@ -1774,6 +1845,27 @@ 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 +// circulaire. +typedef struct liste_variables_statiques +{ + struct liste_variables_statiques *suivant; + struct liste_variables_statiques *precedent; + struct liste_variables_statiques *reference; + struct_arbre_variables *feuille; + struct_variable_statique *variable; +} struct_liste_variables_statiques; + +typedef struct liste_variables_partagees +{ + struct liste_variables_partagees *suivant; + struct liste_variables_partagees *precedent; + struct liste_variables_partagees *reference; + struct_arbre_variables_partagees *feuille; + struct_variable_partagee *variable; + pthread_t tid; + pid_t pid; +} struct_liste_variables_partagees; #endif /* @@ -1814,8 +1906,8 @@ typedef struct processus unsigned char traitement_cycle_exit; /*N/E/C*/ unsigned char recherche_type; /*Y/N*/ - unsigned long position_courante; - unsigned long longueur_definitions_chainees; + integer8 position_courante; + integer8 longueur_definitions_chainees; /* Pointeurs sur les instructions */ @@ -1832,13 +1924,13 @@ typedef struct processus struct_liste_chainee *l_base_pile; struct_liste_chainee *l_base_pile_last; - unsigned long hauteur_pile_operationnelle; + integer8 hauteur_pile_operationnelle; /* Piles systemes */ struct_liste_pile_systeme *l_base_pile_systeme; - unsigned long hauteur_pile_systeme; + integer8 hauteur_pile_systeme; /* Gestion des processus */ @@ -1863,6 +1955,8 @@ typedef struct processus logical1 presence_fusible; pthread_t thread_fusible; pthread_t thread_surveille_par_fusible; + pthread_t thread_signaux; + int pipe_signaux[2]; volatile int pointeur_signal_ecriture; volatile int pointeur_signal_lecture; @@ -1877,36 +1971,38 @@ 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 struct_arbre_variables *s_arbre_variables; struct_liste_variables *l_liste_variables_par_niveau; + struct_liste_variables_statiques + *l_liste_variables_statiques; + + struct_arbre_variables_partagees + **s_arbre_variables_partagees; + struct_liste_variables_partagees + **l_liste_variables_partagees; + logical1 niveau_supprime; struct_variable *pointeur_variable_courante; struct_liste_variables *pointeur_feuille_courante; + struct_variable_statique *pointeur_variable_statique_courante; + struct_variable_partagee *pointeur_variable_partagee_courante; int *pointeurs_caracteres_variables; int nombre_caracteres_variables; - struct_variable_statique *s_liste_variables_statiques; - unsigned long nombre_variables_statiques; - unsigned long nombre_variables_statiques_allouees; - - struct_table_variables_partagees - *s_liste_variables_partagees; - - unsigned long niveau_courant; - unsigned long niveau_initial; - unsigned long position_variable_statique_courante; + integer8 niveau_courant; + integer8 niveau_initial; logical1 creation_variables_statiques; logical1 creation_variables_partagees; @@ -1920,15 +2016,15 @@ 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; - unsigned long nombre_instructions_externes; + integer8 nombre_instructions_externes; /* Fichier d'impression */ @@ -2078,23 +2174,23 @@ typedef struct processus /* Traitement des exceptions */ logical1 arret_si_exception; - unsigned int exception; - unsigned int derniere_exception; - unsigned int exception_processus_fils; + int exception; + int derniere_exception; + int exception_processus_fils; /* Traitement des erreurs */ - unsigned int erreur_compilation; - unsigned int erreur_execution; - unsigned int erreur_systeme; + int erreur_compilation; + int erreur_execution; + int erreur_systeme; struct_objet *s_objet_errone; struct_objet *s_objet_erreur; logical1 erreur_scrutation; - volatile unsigned int erreur_systeme_processus_fils; - unsigned int erreur_execution_processus_fils; + volatile int erreur_systeme_processus_fils; + int erreur_execution_processus_fils; pid_t pid_erreur_processus_fils; @@ -2102,13 +2198,13 @@ typedef struct processus integer8 derniere_erreur_fonction_externe; - unsigned int derniere_erreur_systeme; - unsigned int derniere_erreur_execution; - unsigned int derniere_erreur_evaluation; + int derniere_erreur_systeme; + int derniere_erreur_execution; + int derniere_erreur_evaluation; unsigned char *instruction_derniere_erreur; - unsigned long niveau_derniere_erreur; + integer8 niveau_derniere_erreur; logical1 core; logical1 invalidation_message_erreur; @@ -2116,7 +2212,7 @@ typedef struct processus /* Debug */ logical1 debug; - integer8 type_debug; + logical8 type_debug; logical1 debug_programme; logical1 execution_pas_suivant; logical1 traitement_instruction_halt; @@ -2126,8 +2222,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 */ @@ -2149,7 +2245,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; @@ -2176,12 +2272,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; @@ -2191,7 +2287,7 @@ typedef struct processus unsigned char retour_routine_evaluation; unsigned char *localisation; - unsigned long niveau_recursivite; + integer8 niveau_recursivite; pid_t pid_processus_pere; pthread_t tid_processus_pere; @@ -2207,7 +2303,7 @@ typedef struct processus struct_liste_profilage2 *pile_profilage_fonctions; struct timeval horodatage_profilage; - // Mutex spécifique au processus et donnant accès à la pile des processus + // Mutex spécifique au processus et donnant accès à la pile des processus pthread_mutex_t mutex; pthread_mutex_t mutex_allocation; @@ -2220,26 +2316,26 @@ typedef struct processus pthread_mutex_t protection_liste_mutexes; unsigned int sections_critiques; -/* 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; - unsigned long taille_pile_tampon; + integer8 taille_pile_tampon; struct_liste_chainee *pile_tampon; double estimation_taille_pile_systeme_tampon; - unsigned long taille_pile_systeme_tampon; + integer8 taille_pile_systeme_tampon; struct_liste_pile_systeme *pile_systeme_tampon; - unsigned long taille_pile_objets; + integer8 taille_pile_objets; struct_objet *pile_objets; -# define TAILLE_CACHE 16384 +# define TAILLE_CACHE 1024 - unsigned long *objets_adr[TAILLE_CACHE]; + integer8 *objets_adr[TAILLE_CACHE]; int pointeur_adr; logical8 *objets_bin[TAILLE_CACHE]; @@ -2275,6 +2371,10 @@ typedef struct processus struct_arbre_variables *variables_noeud[TAILLE_CACHE]; int pointeur_variables_noeud; + struct_arbre_variables_partagees + *variables_partagees_noeud[TAILLE_CACHE]; + int pointeur_variables_partagees_noeud; + struct_liste_variables *variables_feuille[TAILLE_CACHE]; int pointeur_variables_feuille; @@ -2283,6 +2383,11 @@ typedef struct processus struct_arbre_variables **variables_tableau_noeuds[TAILLE_CACHE]; int pointeur_variables_tableau_noeuds; + + struct_arbre_variables_partagees + **variables_tableau_noeuds_partages + [TAILLE_CACHE]; + int pointeur_variables_tableau_noeuds_partages; } struct_processus; #endif @@ -2296,7 +2401,7 @@ typedef struct processus typedef struct fonction { unsigned char *nom_fonction; - unsigned long nombre_arguments; + integer8 nombre_arguments; void (*fonction)(struct_processus *); @@ -2314,7 +2419,7 @@ typedef struct fonction /* -------------------------------------------------------------------------------- - Procédures d'exécution des mots-clef du langage RPL/2 + Procédures d'exécution des mots-clef du langage RPL/2 -------------------------------------------------------------------------------- */ @@ -2357,6 +2462,7 @@ void instruction_ceil(struct_processus * void instruction_centr(struct_processus *s_etat_processus); void instruction_cf(struct_processus *s_etat_processus); void instruction_chr(struct_processus *s_etat_processus); +void instruction_cipher(struct_processus *s_etat_processus); void instruction_clear(struct_processus *s_etat_processus); void instruction_cllcd(struct_processus *s_etat_processus); void instruction_clmf(struct_processus *s_etat_processus); @@ -2377,6 +2483,7 @@ void instruction_col_fleche(struct_proce void instruction_col_moins(struct_processus *s_etat_processus); void instruction_col_plus(struct_processus *s_etat_processus); void instruction_comb(struct_processus *s_etat_processus); +void instruction_compress(struct_processus *s_etat_processus); void instruction_con(struct_processus *s_etat_processus); void instruction_cond(struct_processus *s_etat_processus); void instruction_cont(struct_processus *s_etat_processus); @@ -2417,6 +2524,7 @@ void instruction_detach(struct_processus void instruction_dft(struct_processus *s_etat_processus); void instruction_dgtiz(struct_processus *s_etat_processus); void instruction_diag_fleche(struct_processus *s_etat_processus); +void instruction_digest(struct_processus *s_etat_processus); void instruction_disp(struct_processus *s_etat_processus); void instruction_division(struct_processus *s_etat_processus); void instruction_do(struct_processus *s_etat_processus); @@ -2802,6 +2910,7 @@ void instruction_t_vers_l(struct_process void instruction_ucase(struct_processus *s_etat_processus); void instruction_uchol(struct_processus *s_etat_processus); +void instruction_uncompress(struct_processus *s_etat_processus); void instruction_unlock(struct_processus *s_etat_processus); void instruction_unprotect(struct_processus *s_etat_processus); void instruction_until(struct_processus *s_etat_processus); @@ -2845,15 +2954,14 @@ void instruction_yield(struct_processus /* -------------------------------------------------------------------------------- - Procédures + Procédures -------------------------------------------------------------------------------- */ #ifndef RPLARGS void affectation_interruptions_logicielles(struct_processus *s_etat_processus); void affichage_pile(struct_processus *s_etat_processus, - struct_liste_chainee *l_element_courant, unsigned long - niveau_courant); + struct_liste_chainee *l_element_courant, integer8 niveau_courant); #endif void *allocation_maillon(struct_processus *s_etat_processus); @@ -2876,7 +2984,7 @@ void conversion_format(struct_processus unsigned char *chaine); void conversion_hms_vers_decimal(real8 *angle); void conversion_majuscule_limitee(unsigned char *chaine_entree, - unsigned char *chaine_sortie, unsigned long longueur); + 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); @@ -2889,11 +2997,11 @@ void determinant(struct_processus *s_eta void *valeur); void deverrouillage_threads_concurrents(struct_processus *s_etat_processus); void ecriture_pile(struct_processus *s_etat_processus, file *flux, - struct_liste_chainee *l_element_courant, unsigned long niveau_courant); + struct_liste_chainee *l_element_courant, integer8 niveau_courant); void ecriture_profil(struct_processus *s_etat_processus); void effacement_pile_systeme(struct_processus *s_etat_processus); void empilement_pile_systeme(struct_processus *s_etat_processus); -void encart(struct_processus *s_etat_processus, unsigned long duree); +void encart(struct_processus *s_etat_processus, integer8 duree); void evaluation_romberg(struct_processus *s_etat_processus, struct_objet *s_expression, unsigned char *variable, real8 *point, real8 *valeur, logical1 *validite); @@ -2914,7 +3022,7 @@ void formateur_elementaire_tex(struct_pr file *fichier, struct_objet *s_objet, unsigned char environnement); void impression_pile(struct_processus *s_etat_processus, struct_liste_chainee *l_element_courant, - unsigned char methode, unsigned long niveau_courant); + unsigned char methode, integer8 niveau_courant); void impression_tex(struct_processus *s_etat_processus); void informations(struct_processus *s_etat_processus); void initialisation_allocateur(struct_processus *s_etat_processus); @@ -2922,7 +3030,7 @@ void initialisation_completion(void); void initialisation_contexte_cas(struct_processus *s_etat_processus); void initialisation_drapeaux(struct_processus *s_etat_processus); void initialisation_generateur_aleatoire(struct_processus *s_etat_processus, - logical1 initialisation_automatique, unsigned long int racine); + logical1 initialisation_automatique, integer8 racine); void initialisation_instructions(struct_processus *s_etat_processus); void initialisation_variables(struct_processus *s_etat_processus); #endif @@ -2962,8 +3070,12 @@ void liberation_arbre_instructions(struc struct_instruction *arbre); void liberation_arbre_variables(struct_processus *s_etat_processus, struct_arbre_variables *arbre, logical1 definitions); +void liberation_arbre_variables_partagees(struct_processus *s_etat_processus, + struct_arbre_variables_partagees *arbre); void liberation_contexte_cas(struct_processus *s_etat_processus); void liberation_generateur_aleatoire(struct_processus *s_etat_processus); +void liberation_mutexes_arbre_variables_partagees(struct_processus + *s_etat_processus, struct_arbre_variables_partagees *l_element_courant); void liberation_threads(struct_processus *s_etat_processus); void liberation_profil(struct_processus *s_etat_processus); void localisation_courante(struct_processus *s_etat_processus); @@ -2987,14 +3099,15 @@ void scrutation_injection(struct_process void scrutation_interruptions(struct_processus *s_etat_processus); void sf(struct_processus *s_etat_processus, unsigned char indice_drapeau); void *surveillance_processus(void *argument); -void swap(void *variable_1, void *variable_2, unsigned long taille_octets); +void swap(void *variable_1, void *variable_2, integer8 taille_octets); +void *thread_signaux(void *argument); void trace(struct_processus *s_etat_processus, FILE *flux); void traitement_asynchrone_exceptions_gsl(struct_processus *s_etat_processus); void traitement_exceptions_gsl(const char *reason, const char *file, int line, int gsl_errno); void traitement_interruptions_logicielles(struct_processus *s_etat_processus); void tri_base_symboles_externes(struct_processus *s_etat_processus); -void tri_vecteur(real8 *vecteur, unsigned long taille); +void tri_vecteur(real8 *vecteur, integer8 taille); void valeurs_propres(struct_processus *s_etat_processus, struct_matrice *s_matrice, struct_vecteur *s_valeurs_propres, @@ -3030,13 +3143,13 @@ 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 -------------------------------------------------------------------------------- */ -real8 sommation_vecteur_reel(real8 *vecteur, unsigned long *taille, +real8 sommation_vecteur_reel(real8 *vecteur, integer8 *taille, logical1 *erreur_memoire); -complex16 sommation_vecteur_complexe(complex16 *vecteur, unsigned long *taille, +complex16 sommation_vecteur_complexe(complex16 *vecteur, integer8 *taille, logical1 *erreur_memoire); /* @@ -3058,17 +3171,17 @@ int rplinit(int argc, char *argv[], char #ifndef RPLARGS real8 correlation_statistique(struct_matrice *s_matrice, - unsigned long colonne_1, unsigned long colonne_2, logical1 *erreur); + integer8 colonne_1, integer8 colonne_2, logical1 *erreur); real8 covariance_statistique(struct_matrice *s_matrice, - unsigned long colonne_1, unsigned long colonne_2, + 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, - unsigned long colonne); + integer8 colonne); struct_vecteur *sommation_produits_colonnes_statistiques(struct_matrice - *s_matrice, unsigned long colonne_1, unsigned long colonne_2); + *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); @@ -3076,7 +3189,7 @@ struct_vecteur *variance_statistique(str /* -------------------------------------------------------------------------------- - Gestion des bibliothèques + Gestion des bibliothèques -------------------------------------------------------------------------------- */ @@ -3094,7 +3207,7 @@ struct_liste_chainee *depilement_pile_op struct_liste_chainee *empilement_pile_operationnelle(struct_rpl_arguments *s_rpl_arguments, struct_objet *s_objet); struct_liste_chainee *sauvegarde_arguments(struct_rpl_arguments - *s_rpl_arguments, unsigned long nombre_arguments); + *s_rpl_arguments, integer8 nombre_arguments); /* -------------------------------------------------------------------------------- @@ -3106,33 +3219,36 @@ struct_liste_chainee *sauvegarde_argumen unsigned char *analyse_algebrique(struct_processus *s_etat_processus, unsigned char *chaine_algebrique, struct_liste_chainee **l_base_liste); unsigned char *analyse_flux(struct_processus *s_etat_processus, - unsigned char *flux, long longueur); -unsigned char *recherche_chemin_fichiers_temporaires(struct_processus - *s_etat_processus); + unsigned char *flux, integer8 longueur); +unsigned char *chiffrement(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 *creation_nom_fichier(struct_processus *s_etat_processus, unsigned char *chemin); unsigned char *date_compilation(); -unsigned char *extraction_chaine(unsigned char *chaine, unsigned long i, - unsigned long j); +unsigned char *extraction_chaine(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, struct_objet *s_objet, struct_objet *s_format, - long longueur, long longueur_champ, unsigned char format, - unsigned char type, long *longueur_effective, long *recursivite); + integer8 longueur, integer8 longueur_champ, unsigned char format, + unsigned char type, integer8 *longueur_effective, integer8 *recursivite, + logical1 export_fichier); unsigned char *formateur_flux(struct_processus *s_etat_processus, - unsigned char *donnees, long *longueur); + unsigned char *donnees, integer8 *longueur); unsigned char *formateur_fichier_nombre(struct_processus *s_etat_processus, void *valeur_numerique, unsigned char type, - long longueur, long longueur_champ, unsigned char format); + integer8 longueur, integer8 longueur_champ, unsigned char format); unsigned char *formateur_fichier_binaire_nombre(struct_processus - *s_etat_processus, void *valeur_numerique, unsigned char type, - long longueur, long *longueur_conversion); + *s_etat_processus, void *valeur_numerique, unsigned char type_entree, + unsigned char type, integer8 longueur, integer8 *longueur_conversion); unsigned char *formateur_fichier_reel(struct_processus *s_etat_processus, void *valeur_numerique, unsigned char type, - long longueur, long longueur_champ, unsigned char format); + integer8 longueur, integer8 longueur_champ, unsigned char format); unsigned char *formateur_nombre(struct_processus *s_etat_processus, void *valeur_numerique, unsigned char type); unsigned char *formateur_reel(struct_processus *s_etat_processus, @@ -3141,6 +3257,8 @@ unsigned char *messages(struct_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 *recherche_chemin_fichiers_temporaires(struct_processus + *s_etat_processus); unsigned char *reencodage(struct_processus *s_etat_processus, unsigned char *chaine_entree, unsigned char *codage_entree, unsigned char *codage_sortie); @@ -3157,6 +3275,7 @@ unsigned char *transliteration(struct_pr #ifndef RPLARGS logical1 analyse_syntaxique(struct_processus *s_etat_processus); +logical1 arret_thread_signaux(struct_processus *s_etat_processus); logical1 caracteristiques_fichier(struct_processus *s_etat_processus, unsigned char *nom, logical1 *existence, logical1 *ouverture, unsigned long *unite); @@ -3180,21 +3299,26 @@ logical1 destruction_fichier(unsigned ch logical1 empilement(struct_processus *s_etat_processus, struct_liste_chainee **l_base_liste, struct_objet *s_objet); logical1 empilement_pile_last(struct_processus *s_etat_processus, - unsigned long nombre_arguments); + integer8 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 lancement_thread_signaux(struct_processus *s_etat_processus); logical1 recherche_instruction_suivante(struct_processus *s_etat_processus); logical1 retrait_variable(struct_processus *s_etat_processus, unsigned char *nom_variable, unsigned char type); -logical1 retrait_variable_par_niveau(struct_processus *s_etat_processus); +logical1 retrait_variables_par_niveau(struct_processus *s_etat_processus); logical1 retrait_variable_partagee(struct_processus *s_etat_processus, unsigned char *nom_variable, union_position_variable position); +logical1 retrait_variables_partagees_locales( + struct_processus *s_etat_processus); logical1 retrait_variable_statique(struct_processus *s_etat_processus, unsigned char *nom_variable, union_position_variable position); +logical1 retrait_variables_statiques_locales( + struct_processus *s_etat_processus); logical1 sequenceur(struct_processus *s_etat_processus); logical1 sequenceur_optimise(struct_processus *s_etat_processus); #endif @@ -3208,6 +3332,7 @@ logical1 sequenceur_optimise(struct_proc logical1 depassement_addition(integer8 *a, integer8 *b, integer8 *resultat); logical1 depassement_multiplication(integer8 *a, integer8 *b, integer8 *resultat); +logical1 depassement_soustraction(integer8 *a, integer8 *b, integer8 *resultat); logical1 depassement_puissance(integer8 *a, integer8 *b, integer8 *resultat); #ifndef RPLARGS @@ -3217,12 +3342,6 @@ logical1 recherche_variable(struct_proce unsigned char *nom_variable); logical1 recherche_variable_globale(struct_processus *s_etat_processus, unsigned char *nom_variable); -logical1 recherche_variable_partagee(struct_processus *s_etat_processus, - unsigned char *nom_variable, union_position_variable position, - unsigned char origine); -logical1 recherche_variable_statique(struct_processus *s_etat_processus, - unsigned char *nom_variable, union_position_variable position, - unsigned char origine); logical1 test_cfsf(struct_processus *s_etat_processus, unsigned char indice_drapeau); logical1 test_expression_rpn(unsigned char *chaine); @@ -3252,11 +3371,9 @@ ssize_t write_atomic(struct_processus *s int alsprintf(unsigned char **strp, const char *fmt, ...); int interruption_violation_access(void *adresse_fautive, int gravite); #ifndef RPLARGS -int liste_variables(struct_processus *s_etat_processus, - struct_tableau_variables *tableau, int position, - struct_arbre_variables *l_element_courant); -int nombre_variables(struct_processus *s_etat_processus, - struct_arbre_variables *l_element_courant); +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 @@ -3280,7 +3397,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) -------------------------------------------------------------------------------- */ @@ -3304,7 +3421,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) -------------------------------------------------------------------------------- */ @@ -3348,23 +3465,42 @@ struct_objet *allocation(struct_processu #ifndef RPLARGS struct_objet *formateur_date(struct_processus *s_etat_processus, struct timeval *temps); +struct_objet *lecture_fichier_non_formate(struct_processus *s_etat_processus, + void *argument, integer8 longueur_buffer, logical1 recursivite); struct_objet *lecture_pipe(struct_processus *s_etat_processus, int pipe); struct_objet *parametres_sql(struct_processus *s_etat_processus, struct_objet *s_parametres); struct_objet *simplification(struct_processus *s_etat_processus, struct_objet *s_objet); + +struct_arbre_variables *allocation_noeud(struct_processus *s_etat_processus); +struct_arbre_variables **allocation_tableau_noeuds( + struct_processus *s_etat_processus); + +/* +-------------------------------------------------------------------------------- + Fonctions renvoyant un pointeur sur une *struct_liste_variables_statiques + ou *struct_liste_variables_partagees +-------------------------------------------------------------------------------- +*/ + +struct_liste_variables_statiques *recherche_variable_statique(struct_processus + *s_etat_processus, unsigned char *nom_variable, + union_position_variable position, unsigned char origine); +struct_liste_variables_partagees *recherche_variable_partagee(struct_processus + *s_etat_processus, unsigned char *nom_variable, + union_position_variable position, unsigned char origine); #endif /* -------------------------------------------------------------------------------- - Fonctions gérant les arbres de simplification + Fonctions gérant les arbres de simplification -------------------------------------------------------------------------------- */ #ifndef RPLARGS struct_arbre *creation_arbre(struct_processus *s_etat_processus, - struct_objet **t_objets, unsigned long indice, - unsigned long indice_maximal); + struct_objet **t_objets, integer8 indice, integer8 indice_maximal); void liberation_arbre(struct_processus *s_etat_processus, struct_arbre *s_noeud); void parcours_arbre(struct_processus *s_etat_processus, struct_arbre *s_noeud); @@ -3374,7 +3510,7 @@ void simplification_arbre(struct_process /* -------------------------------------------------------------------------------- - Fonctions gérant la complétion automatique + Fonctions gérant la complétion automatique -------------------------------------------------------------------------------- */ @@ -3386,7 +3522,7 @@ char **completion_matches(); /* -------------------------------------------------------------------------------- - Arithmétique + Arithmétique -------------------------------------------------------------------------------- */ @@ -3407,15 +3543,13 @@ void f77multiplicationci_(complex16 *ca, void f77multiplicationcr_(complex16 *ca, real8 *rb, complex16 *resultat); void f77puissancecc_(complex16 *ca, complex16 *cb, complex16 *resultat); -void f77puissanceci_(complex16 *ca, integer8 *ib, complex16 *resultat, - integer4 *troncature); +void f77puissanceci_(complex16 *ca, integer8 *ib, complex16 *resultat); void f77puissancecr_(complex16 *ca, real8 *rb, complex16 *resultat); void f77puissanceic_(integer8 *ia, complex16 *cb, complex16 *resultat); void f77puissanceii_(integer8 *ia, integer8 *ib, integer8 *resultat); void f77puissanceir_(integer8 *ia, real8 *rb, real8 *resultat); void f77puissancerc_(real8 *ra, complex16 *cb, complex16 *resultat); -void f77puissanceri_(real8 *ra, integer8 *ib, real8 *resultat, - integer4 *troncature); +void f77puissanceri_(real8 *ra, integer8 *ib, real8 *resultat); void f77puissancerr_(real8 *ra, real8 *rb, real8 *resultat); void f77racinecarreec_(complex16 *ca, complex16 *resultat); @@ -3432,7 +3566,7 @@ void f77soustractionrc_(real8 *ra, compl /* -------------------------------------------------------------------------------- - Trigonométrie complexe + Trigonométrie complexe -------------------------------------------------------------------------------- */ @@ -3529,7 +3663,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, @@ -3542,7 +3676,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, @@ -3557,11 +3691,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, @@ -3618,7 +3752,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); @@ -3639,8 +3773,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);