--- rpl/src/rpl.h 2011/04/14 08:46:50 1.77.2.3 +++ rpl/src/rpl.h 2011/07/22 07:38:41 1.106 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.0.23 + RPL/2 (R) version 4.1.1 Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -23,21 +23,28 @@ #ifndef INCLUSION_RPL #define INCLUSION_RPL -#define _GNU_SOURCE -#define _POSIX_C_SOURCE 200112L +#ifndef __RPLCAS +# define _GNU_SOURCE +# define _POSIX_C_SOURCE 200112L +#endif + #define _REENTRANT -#ifdef Darwin -# define _DARWIN_C_SOURCE -#endif +#ifndef __RPLCAS +# ifdef Darwin +# define _DARWIN_C_SOURCE +# endif -#ifdef OpenBSD -# define _BSD_SOURCE +# ifdef OpenBSD +# define _BSD_SOURCE +# endif #endif #ifdef OS2 -# define _BSD_SOURCE -# define _XOPEN_SOURCE 600 +# ifndef __RPLCAS +# define _BSD_SOURCE +# define _XOPEN_SOURCE 600 +# endif # include enum { SHUT_RD = 0, SHUT_WR, SHUT_RDWR }; @@ -923,6 +930,7 @@ pid_t debug_fork(); # define d_ex_nom_implicite __erreur(81) # define d_ex_version_bibliotheque __erreur(82) # define d_ex_creation_variable_globale __erreur(83) +# define d_ex_erreur_interne_rplcas __erreur(84) #endif @@ -973,6 +981,7 @@ pid_t debug_fork(); #define VIN __RPL_VIN #define VRL __RPL_VRL +enum t_rplcas_commandes { RPLCAS_INTEGRATION = 0, RPLCAS_LIMITE }; enum t_type { ADR = 0, ALG, BIN, CHN, CPL, FCH, FCT, INT, LST, MCX, MIN, MRL, MTX, NOM, NON, PRC, REL, RPN, SCK, @@ -1671,6 +1680,68 @@ typedef struct rpl_arguments void *s_etat_processus; } struct_rpl_arguments; +/* +-------------------------------------------------------------------------------- + Structure d'arbre des instructions intrinsèques +-------------------------------------------------------------------------------- +*/ + +#ifndef RPLARGS +typedef struct instruction +{ + struct instruction **noeuds; + void (*feuille)(struct processus *); +} struct_instruction; +#endif + +/* +-------------------------------------------------------------------------------- + Structure d'arbre des variables variable 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; +} struct_arbre_variables; + +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; + + struct_objet *objet; // pointeur sur l'objet et non copie + // de l'objet. + + logical1 variable_verrouillee; + union_position_variable variable_statique; + union_position_variable variable_partagee; +} struct_tableau_variables; + +typedef struct liste_variables +{ + union + { + // Utilisation dans la gestion des variables + struct_variable *variable; + // Utilisation dans la pile système (variables par niveau) + struct_liste_chainee *liste; + }; + + struct arbre_variables *noeud_pere; + struct arbre_variables *noeud; + struct liste_variables *suivant; + struct liste_variables *precedent; +} struct_liste_variables; + +#endif /* -------------------------------------------------------------------------------- @@ -1717,7 +1788,7 @@ typedef struct processus int *pointeurs_caracteres; int nombre_caracteres; - struct instruction *arbre_instructions; + struct_instruction *arbre_instructions; /* Requetes */ @@ -1781,9 +1852,25 @@ typedef struct processus /* Variables */ - struct_variable *s_liste_variables; - unsigned long nombre_variables; - unsigned long nombre_variables_allouees; + // 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 + // sur la liste des variables globales. + // + // À 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; + logical1 niveau_supprime; + + struct_variable *pointeur_variable_courante; + struct_liste_variables *pointeur_feuille_courante; + + int *pointeurs_caracteres_variables; + int nombre_caracteres_variables; struct_variable_statique *s_liste_variables_statiques; unsigned long nombre_variables_statiques; @@ -1794,7 +1881,6 @@ typedef struct processus unsigned long niveau_courant; unsigned long niveau_initial; - unsigned long position_variable_courante; unsigned long position_variable_statique_courante; logical1 creation_variables_statiques; @@ -2122,11 +2208,7 @@ typedef struct processus unsigned long taille_pile_objets; struct_objet *pile_objets; -# ifndef DEBUG_MALLOC -# define TAILLE_CACHE 16384 -# else -# define TAILLE_CACHE 4 -# endif +# define TAILLE_CACHE 16384 unsigned long *objets_adr[TAILLE_CACHE]; int pointeur_adr; @@ -2160,23 +2242,20 @@ typedef struct processus struct_liste_chainee *maillons[TAILLE_CACHE]; int pointeur_maillons; -} struct_processus; -#endif -/* --------------------------------------------------------------------------------- - Structures instruction intrinsèque --------------------------------------------------------------------------------- -*/ + struct_arbre_variables *variables_noeud[TAILLE_CACHE]; + int pointeur_variables_noeud; -#ifndef RPLARGS -typedef struct instruction -{ - struct instruction **noeud; - void (*feuille)(struct_processus *); -} struct_instruction; -#endif + struct_liste_variables *variables_feuille[TAILLE_CACHE]; + int pointeur_variables_feuille; + struct_variable *variables_variable[TAILLE_CACHE]; + int pointeur_variables_variable; + + struct_arbre_variables **variables_tableau_noeuds[TAILLE_CACHE]; + int pointeur_variables_tableau_noeuds; +} struct_processus; +#endif /* -------------------------------------------------------------------------------- @@ -2740,7 +2819,6 @@ void affichage_pile(struct_processus *s_ niveau_courant); #endif -void *allocation(struct_processus *s_etat_processus, enum t_type type); void *allocation_maillon(struct_processus *s_etat_processus); #ifndef RPLARGS @@ -2761,6 +2839,8 @@ void conversion_hms_vers_decimal(real8 * void conversion_majuscule_limitee(unsigned char *chaine_entree, unsigned char *chaine_sortie, unsigned long longueur); void conversion_radians_vers_degres(real8 *angle); +void copie_arbre_variables(struct_processus *s_etat_processus, + struct_processus *s_nouvel_etat_processus); void correction_formateur_tex(struct_processus *s_etat_processus, unsigned char **ligne); void depilement_pile_systeme(struct_processus *s_etat_processus); @@ -2804,6 +2884,7 @@ void initialisation_drapeaux(struct_proc void initialisation_generateur_aleatoire(struct_processus *s_etat_processus, logical1 initialisation_automatique, unsigned long int racine); void initialisation_instructions(struct_processus *s_etat_processus); +void initialisation_variables(struct_processus *s_etat_processus); #endif void initialisation_objet(struct_objet *s_objet); @@ -2816,6 +2897,8 @@ void insertion_thread_surveillance(struc void integrale_romberg(struct_processus *s_etat_processus, struct_objet *s_expression, unsigned char *variable, real8 a, real8 b, real8 precision); +void interface_cas(struct_processus *s_etat_processus, + enum t_rplcas_commandes commande); void interruption1(SIGHANDLER_ARGS); void interruption2(SIGHANDLER_ARGS); void interruption3(SIGHANDLER_ARGS); @@ -2841,6 +2924,8 @@ void liberation_maillon(struct_processus void liberation_allocateur(struct_processus *s_etat_processus); void liberation_arbre_instructions(struct_processus *s_etat_processus, struct_instruction *arbre); +void liberation_arbre_variables(struct_processus *s_etat_processus, + struct_arbre_variables *arbre, logical1 definitions); void liberation_generateur_aleatoire(struct_processus *s_etat_processus); void liberation_threads(struct_processus *s_etat_processus); void liberation_profil(struct_processus *s_etat_processus); @@ -3069,6 +3154,8 @@ logical1 ecriture_pipe(struct_processus struct_objet *s_objet); logical1 recherche_variable(struct_processus *s_etat_processus, 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); @@ -3101,6 +3188,11 @@ ssize_t write_atomic(struct_processus *s */ int alsprintf(unsigned char **strp, const char *fmt, ...); +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); int tex_fprintf(struct_processus *s_etat_processus, file *flux, const char *format, ...); int transliterated_fprintf(struct_processus *s_etat_processus, file *flux, @@ -3183,6 +3275,7 @@ struct_objet *copie_objet(struct_process struct_objet *s_objet, unsigned char type); #ifndef RPLARGS +struct_objet *allocation(struct_processus *s_etat_processus, enum t_type type); struct_objet *formateur_date(struct_processus *s_etat_processus, struct timeval *temps); struct_objet *lecture_pipe(struct_processus *s_etat_processus, int pipe);