--- rpl/src/rpl.h 2011/06/09 14:48:36 1.87 +++ rpl/src/rpl.h 2011/09/10 20:45:07 1.119 @@ -1,6 +1,6 @@ /* ================================================================================ - RPL/2 (R) version 4.1.0.prerelease.0 + RPL/2 (R) version 4.1.3 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 _XOPEN_SOURCE 700 +#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 }; @@ -304,12 +311,14 @@ union semun # define SIGABORT SIGTHR # endif // Arrêt d'un processus fils depuis autre chose que STOP -# if defined(Darwin) || defined(OpenBSD) +# if defined(Darwin) || defined(OpenBSD) || defined(NetBSD) # define SIGFABORT SIGINFO # else # define SIGFABORT SIGPOLL # endif +# define SIGTEST SIGILL + // Nombre d'interruptions disponibles # define d_NOMBRE_INTERRUPTIONS 64 #endif @@ -382,6 +391,12 @@ typedef unsigned char t_8_bits; extern jmp_buf contexte; extern jmp_buf contexte_initial; + extern jmp_buf contexte_processus; + extern jmp_buf contexte_thread; + + extern int signal_test; + + extern pid_t pid_processus_pere; # ifdef SEMAPHORES_NOMMES extern pthread_mutex_t mutex_sem; @@ -422,6 +437,12 @@ typedef unsigned char t_8_bits; jmp_buf contexte; jmp_buf contexte_initial; + jmp_buf contexte_processus; + jmp_buf contexte_thread; + + int signal_test; + + pid_t pid_processus_pere; # ifdef SEMAPHORES_NOMMES pthread_mutex_t mutex_sem = PTHREAD_MUTEX_INITIALIZER; @@ -923,6 +944,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 +995,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, @@ -1680,7 +1703,7 @@ typedef struct rpl_arguments #ifndef RPLARGS typedef struct instruction { - struct instruction **noeud; + struct instruction **noeuds; void (*feuille)(struct processus *); } struct_instruction; #endif @@ -1695,11 +1718,27 @@ typedef struct instruction 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 @@ -1711,6 +1750,7 @@ typedef struct liste_variables }; struct arbre_variables *noeud_pere; + struct arbre_variables *noeud; struct liste_variables *suivant; struct liste_variables *precedent; } struct_liste_variables; @@ -1819,6 +1859,10 @@ typedef struct processus # define RTLD_LOCAL 0 # endif + int signal; + pid_t origine_signal; + logical1 signal_a_traiter; + /* Contextes */ struct_liste_chainee *l_base_pile_contextes; @@ -1838,6 +1882,7 @@ typedef struct processus 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; @@ -2032,6 +2077,7 @@ typedef struct processus /* Traitement des erreurs */ + unsigned int compteur_violation_d_acces; unsigned int erreur_compilation; unsigned int erreur_execution; unsigned int erreur_systeme; @@ -2119,6 +2165,8 @@ typedef struct processus gsl_rng *generateur_aleatoire; const gsl_rng_type *type_generateur_aleatoire; + void *contexte_cas; + integer8 nombre_arguments; /* @@ -2215,6 +2263,18 @@ typedef struct processus struct_liste_chainee *maillons[TAILLE_CACHE]; int pointeur_maillons; + + struct_arbre_variables *variables_noeud[TAILLE_CACHE]; + int pointeur_variables_noeud; + + 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 @@ -2253,6 +2313,7 @@ typedef struct fonction // BEGIN C PROTOTYPES void instruction_sensible_e(struct_processus *s_etat_processus); void instruction_sensible_i(struct_processus *s_etat_processus); +void instruction_sensible_infinity(struct_processus *s_etat_processus); void instruction_abort(struct_processus *s_etat_processus); void instruction_abs(struct_processus *s_etat_processus); @@ -2449,6 +2510,7 @@ void instruction_in(struct_processus *s_ void instruction_incr(struct_processus *s_etat_processus); void instruction_indep(struct_processus *s_etat_processus); void instruction_input(struct_processus *s_etat_processus); +void instruction_infinity(struct_processus *s_etat_processus); void instruction_inquire(struct_processus *s_etat_processus); void instruction_int(struct_processus *s_etat_processus); void instruction_interrupt(struct_processus *s_etat_processus); @@ -2472,6 +2534,7 @@ void instruction_lcd_fleche(struct_proce void instruction_lchol(struct_processus *s_etat_processus); void instruction_le(struct_processus *s_etat_processus); void instruction_legv(struct_processus *s_etat_processus); +void instruction_limit(struct_processus *s_etat_processus); void instruction_line(struct_processus *s_etat_processus); void instruction_list_fleche(struct_processus *s_etat_processus); void instruction_ln(struct_processus *s_etat_processus); @@ -2664,6 +2727,7 @@ void instruction_sqlquery(struct_process void instruction_sqrt(struct_processus *s_etat_processus); void instruction_sr(struct_processus *s_etat_processus); void instruction_srb(struct_processus *s_etat_processus); +void instruction_srev(struct_processus *s_etat_processus); void instruction_sst(struct_processus *s_etat_processus); void instruction_star_d(struct_processus *s_etat_processus); void instruction_star_h(struct_processus *s_etat_processus); @@ -2725,7 +2789,6 @@ 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_undo(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); @@ -2780,7 +2843,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 @@ -2801,6 +2863,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); @@ -2840,6 +2904,7 @@ void impression_tex(struct_processus *s_ void informations(struct_processus *s_etat_processus); void initialisation_allocateur(struct_processus *s_etat_processus); 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); @@ -2857,6 +2922,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); @@ -2884,6 +2951,7 @@ 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_contexte_cas(struct_processus *s_etat_processus); 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); @@ -2901,6 +2969,7 @@ void retrait_thread_surveillance(struct_ struct_descripteur_thread *s_argument_thread); void rplcore(struct_processus *s_etat_processus); void scrutation_injection(struct_processus *s_etat_processus); +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); @@ -3094,9 +3163,6 @@ logical1 retrait_variable_statique(struc unsigned char *nom_variable, union_position_variable position); logical1 sequenceur(struct_processus *s_etat_processus); logical1 sequenceur_optimise(struct_processus *s_etat_processus); - -struct_arbre_variables *copie_arbre_variables( - struct_processus *s_etat_processus); #endif /* @@ -3149,6 +3215,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, @@ -3231,6 +3302,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);