--- rpl/src/rpl.h 2010/06/24 09:21:43 1.44 +++ rpl/src/rpl.h 2011/09/10 20:45:07 1.119 @@ -1,7 +1,7 @@ /* ================================================================================ - RPL/2 (R) version 4.0.16 - Copyright (C) 1989-2010 Dr. BERTRAND Joël + RPL/2 (R) version 4.1.3 + Copyright (C) 1989-2011 Dr. BERTRAND Joël This file is part of RPL/2. @@ -23,12 +23,38 @@ #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 +#ifndef __RPLCAS +# ifdef Darwin +# define _DARWIN_C_SOURCE +# endif + +# ifdef OpenBSD +# define _BSD_SOURCE +# endif +#endif + +#ifdef OS2 +# ifndef __RPLCAS +# define _BSD_SOURCE +# define _XOPEN_SOURCE 600 +# endif + +# include + enum { SHUT_RD = 0, SHUT_WR, SHUT_RDWR }; +# define SHUT_RD SHUT_RD +# define SHUT_WR SHUT_WR +# define SHUT_RDWR SHUT_RDWR + +# include "getaddrinfo-conv.h" + +# define sched_yield(arg) #endif @@ -49,11 +75,11 @@ #ifndef RPLARGS # include +# include # include # include # include # include -# include # include # include # include @@ -66,8 +92,62 @@ # include # include # include + +# ifdef OS2 +# undef pthread_mutexattr_settype +# define pthread_mutexattr_settype(a, b) +# endif + # include -# include + +# ifdef _BROKEN_SIGINFO +# include +# include +# endif + +# ifndef IPCS_SYSV +# include +# else +# include +# include + +# ifdef OS2 +# define INCL_DOSSEMAPHORES +# define INCL_DOSMEMMGR +# define INCL_DOSERRORS +# include + + typedef struct _OS2SEM + { + HMTX hmtx; + HEV hev; + ULONG shared; + ULONG *cnt; + ULONG *nopened; + ULONG allocated; + } sem_t; +# else + typedef struct + { + int sem; + unsigned char *path; + pid_t pid; + } sem_t; +# endif + +# define SEM_FAILED NULL + + sem_t *sem_open_SysV(const char *nom, int oflag, ...); + int sem_init_SysV(sem_t *sem, int shared, unsigned int value); + int sem_close_SysV(sem_t *sem); + int sem_wait_SysV(sem_t *sem); + int sem_trywait_SysV(sem_t *sem); + int sem_post_SysV(sem_t *sem); + int sem_getvalue_SysV(sem_t *sem, int *value); + int sem_unlink_SysV(const char *nom); + int sem_destroy_SysV(sem_t *sem); +# endif + # include # include # include @@ -120,6 +200,87 @@ #include "librplprototypes.h" +#ifndef RPLARGS +# ifndef UNIX_PATH_MAX + struct sockaddr_un sizecheck; +# define UNIX_PATH_MAX sizeof(sizecheck.sun_path) +# endif +#endif + +/* +================================================================================ + Bugs spécifiques +================================================================================ +*/ + +#ifdef _BROKEN_SIGINFO +# define SIGHANDLER_ARGS int signal +# ifdef SA_SIGINFO +# undef SA_SIGINFO +# endif +# define SA_SIGINFO 0 + +# ifndef __BROKEN_SIGINFO_ROUTINES__ + +// pthread_kill() est une macro sous OS/2. +# ifdef pthread_kill +# undef pthread_kill +# endif + +# define kill(a, b) kill_broken_siginfo(a, b) +# define pthread_kill(a, b) pthread_kill_broken_siginfo(a, b) +# endif + + int kill_broken_siginfo(pid_t pid, int signal); + int pthread_kill_broken_siginfo(pthread_t tid, int signal); + pid_t origine_signal(int signal); + int queue_in(pid_t pid, int signal); +#else +# define SIGHANDLER_ARGS int signal, siginfo_t *siginfo, void *context +#endif + +#ifdef OpenBSD +# ifdef PTHREAD_SCOPE_SYSTEM +# undef PTHREAD_SCOPE_SYSTEM +# endif +# define PTHREAD_SCOPE_SYSTEM 0 +#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 +{ + int val; + struct semid_ds *buf; + unsigned short *array; + struct seminfo *__buf; +}; +#endif + + +/* +================================================================================ + SÉMAPHORES +================================================================================ +*/ + +#ifdef IPCS_SYSV +# define sem_init(a, b, c) sem_init_SysV(a, b, c) +# define sem_destroy(a) sem_destroy_SysV(a) +# define sem_wait(a) sem_wait_SysV(a) +# define sem_trywait(a) sem_trywait_SysV(a) +# define sem_post(a) sem_post_SysV(a) +# define sem_getvalue(a, b) sem_getvalue_SysV(a, b) +# define sem_open(...) sem_open_SysV(__VA_ARGS__) +# define sem_close(a) sem_close_SysV(a) +# define sem_unlink(a) sem_unlink_SysV(a) +#endif + + /* ================================================================================ SIGNAUX @@ -127,9 +288,14 @@ */ #ifndef RPLARGS -# ifdef Darwin -# define SIGPOLL SIGINFO -# endif + +// Signaux utilisés par défaut : +// SIGINT +// SIGTSTP +// SIGCONT +// SIGURG +// SIGPIPE +// SIGALRM // Arrêt par STOP # define SIGFSTOP SIGUSR1 @@ -138,9 +304,21 @@ // Injection de données # define SIGINJECT SIGQUIT // Arrêt général -# define SIGABORT SIGPROF +# ifndef OpenBSD +// La libpthread d'OpenBSD utilise SIGPROF +# define SIGABORT SIGPROF +# else +# define SIGABORT SIGTHR +# endif // Arrêt d'un processus fils depuis autre chose que STOP -# define SIGFABORT SIGPOLL +# 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 @@ -190,7 +368,7 @@ typedef FILE file; typedef unsigned char t_8_bits; #ifndef RPLARGS -# include "rpltypes.conv.h" +# include "rpltypes-conv.h" #else # include "rpltypes.h" #endif @@ -205,9 +383,20 @@ typedef unsigned char t_8_bits; # ifdef SEMAPHORES_NOMMES # define LONGUEUR_NOM_SEMAPHORE 64 # endif + # ifndef MAIN_RPL +# ifdef _BROKEN_SIGINFO + extern int *fifos_signaux; +# endif + 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; @@ -242,8 +431,18 @@ typedef unsigned char t_8_bits; extern sem_t *semaphores_nommes[4]; # endif # else +# ifdef _BROKEN_SIGINFO + int *fifos_signaux; +# endif + 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; @@ -324,6 +523,9 @@ int sem_getvalue2(sem_t *semaphore, int # define fopen(...) ({ FILE *desc; \ while((desc = fopen(__VA_ARGS__)) == NULL) \ { if ((errno != EINTR) && (errno != 0)) break; } desc; }) +# define freopen(...) ({ FILE *desc; \ + while((desc = freopen(__VA_ARGS__)) == NULL) \ + { if ((errno != EINTR) && (errno != 0)) break; } desc; }) # define fclose(...) ({ int ios; \ while((ios = fclose(__VA_ARGS__)) != 0) \ { if ((errno != EINTR) && (errno != 0)) break; } ios; }) @@ -362,7 +564,7 @@ int sem_getvalue2(sem_t *semaphore, int // Redéfinition de abs pour un fonctionnement en entier de type long long int -#if 1 +#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 @@ -568,13 +770,22 @@ pid_t debug_fork(); #ifdef DEBUG_ERREURS # ifdef MESSAGES # define __erreur(i) i +# define __erreur_(i) i # else +# undef _ERREURS_VARIABLES +# ifdef _ERREURS_VARIABLES +# define __erreur_(i) __erreur(i) +# else +# define __erreur_(i) i +# endif # define __erreur(i) ({ if (strstr(__FUNCTION__, "recherche_variable") \ - == NULL) fprintf(stderr, "ERROR %d AT %s() LINE %d\n", \ - i, __FUNCTION__, __LINE__); i; }) + == NULL) ufprintf(stderr, \ + "ERROR %d AT %s() FROM %s LINE %d\n", \ + i, __FUNCTION__, __FILE__, __LINE__); i; }) # endif #else # define __erreur(i) i +# define __erreur_(i) i #endif @@ -582,7 +793,7 @@ pid_t debug_fork(); #ifndef RPLARGS # define d_es 2000 # define d_es_allocation_memoire __erreur(2001) -# define d_es_variable_introuvable __erreur(2002) +# define d_es_variable_introuvable __erreur_(2002) # define d_es_pile_vide __erreur(2003) # define d_es_end_incoherent __erreur(2004) # define d_es_peripherique_stdin __erreur(2005) @@ -595,6 +806,7 @@ pid_t debug_fork(); # define d_es_interruption_invalide __erreur(2012) # define d_es_contexte __erreur(2013) # define d_es_somme_controle __erreur(2014) +# define d_es_semaphore __erreur(2015) #endif /* @@ -660,7 +872,7 @@ pid_t debug_fork(); # define d_ex_absence_graphique_courant __erreur(9) # define d_ex_erreur_traitement_condition __erreur(10) # define d_ex_erreur_traitement_boucle __erreur(11) -# define d_ex_variable_non_definie __erreur(12) +# define d_ex_variable_non_definie __erreur_(12) # define d_ex_drapeau_inexistant __erreur(13) # define d_ex_nom_invalide __erreur(14) # define d_ex_element_inexistant __erreur(15) @@ -731,6 +943,8 @@ pid_t debug_fork(); # define d_ex_clef_inexistante __erreur(80) # 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 @@ -746,6 +960,43 @@ pid_t debug_fork(); -------------------------------------------------------------------------------- */ +#ifdef MIN +# undef MIN +#endif + +#ifdef MAX +# undef MAX +#endif + +#define ADR __RPL_ADR +#define ALG __RPL_ALG +#define BIN __RPL_BIN +#define CHN __RPL_CHN +#define CPL __RPL_CPL +#define FCH __RPL_FCH +#define FCT __RPL_FCT +#define INT __RPL_INT +#define LST __RPL_LST +#define MCX __RPL_MCX +#define MIN __RPL_MIN +#define MRL __RPL_MRL +#define MTX __RPL_MTX +#define NOM __RPL_NOM +#define NON __RPL_NON +#define PRC __RPL_PRC +#define REL __RPL_REL +#define RPN __RPL_RPN +#define SCK __RPL_SCK +#define SLB __RPL_SLB +#define SPH __RPL_SPH +#define SQL __RPL_SQL +#define TBL __RPL_TBL +#define VCX __RPL_VCX +#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, SLB, SPH, SQL, TBL, VCX, VIN, VRL }; @@ -1132,6 +1383,7 @@ typedef struct descripteur_thread pthread_t thread_pere; pthread_mutex_t mutex; + pthread_mutex_t mutex_nombre_references; volatile logical1 thread_actif; @@ -1213,21 +1465,23 @@ typedef struct liste_pile_systeme /* type clôture : - C CASE : END termine un test SELECT/CASE/THEN/END/DEFAULT/END. - D DO : END termine une boucle DO/UNTIL/END. - I IF : END termine un test IF/THEN (ELSE)/END. - J IFERR : END termine un test IFERR/THEN (ELSE)/END. - W WHILE : END termine une boucle WHILE/REPEAT/END. - - 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. + 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. + J IFERR : END termine un test IFERR/THEN (ELSE)/END. + K CASE : END termine un test CASE/THEN/END + W WHILE : END termine une boucle WHILE/REPEAT/END. + + 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 initialisation. */ unsigned long adresse_retour; unsigned long niveau_courant; + struct_objet *pointeur_adresse_retour; } struct_liste_pile_systeme; #endif @@ -1440,6 +1694,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 /* -------------------------------------------------------------------------------- @@ -1477,6 +1793,7 @@ typedef struct processus unsigned char mode_interactif; /*Y/N*/ unsigned char mode_evaluation_expression; /*Y/N*/ unsigned char traitement_cycle_exit; /*N/E/C*/ + unsigned char recherche_type; /*Y/N*/ unsigned long position_courante; unsigned long longueur_definitions_chainees; @@ -1485,7 +1802,7 @@ typedef struct processus int *pointeurs_caracteres; int nombre_caracteres; - struct instruction *arbre_instructions; + struct_instruction *arbre_instructions; /* Requetes */ @@ -1528,13 +1845,24 @@ typedef struct processus pthread_t thread_fusible; pthread_t thread_surveille_par_fusible; -# ifndef Cygwin - stack_t pile_signal; +# if !defined(Cygwin) +# if !(OpenBSD) + stack_t pile_signal; +# else +# ifdef SA_ONSTACK +# undef SA_ONSTACK +# endif +# define SA_ONSTACK 0 +# endif # else -# define SA_ONSTACK 0 -# define RTLD_LOCAL 0 +# define SA_ONSTACK 0 +# define RTLD_LOCAL 0 # endif + int signal; + pid_t origine_signal; + logical1 signal_a_traiter; + /* Contextes */ struct_liste_chainee *l_base_pile_contextes; @@ -1542,9 +1870,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; @@ -1555,7 +1899,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; @@ -1734,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; @@ -1791,8 +2135,10 @@ typedef struct processus unsigned char traitement_interruption; /* Y/N */ unsigned char traitement_interruptible; /* Y/N */ + unsigned char traitement_at_poke; /* Y/N */ struct_objet *at_exit; + struct_objet *at_poke; /* Variables volatiles */ @@ -1804,6 +2150,7 @@ typedef struct processus volatile sig_atomic_t var_volatile_traitement_retarde_stop; volatile sig_atomic_t var_volatile_traitement_sigint; + volatile sig_atomic_t var_volatile_processus_racine; volatile sig_atomic_t var_volatile_processus_pere; volatile sig_atomic_t var_volatile_recursivite; @@ -1818,6 +2165,8 @@ typedef struct processus gsl_rng *generateur_aleatoire; const gsl_rng_type *type_generateur_aleatoire; + void *contexte_cas; + integer8 nombre_arguments; /* @@ -1880,11 +2229,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; @@ -1918,23 +2263,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 /* -------------------------------------------------------------------------------- @@ -1971,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); @@ -1989,11 +2332,13 @@ void instruction_asr(struct_processus *s void instruction_atan(struct_processus *s_etat_processus); void instruction_atanh(struct_processus *s_etat_processus); void instruction_atexit(struct_processus *s_etat_processus); +void instruction_atpoke(struct_processus *s_etat_processus); void instruction_autoscale(struct_processus *s_etat_processus); void instruction_axes(struct_processus *s_etat_processus); void instruction_b_vers_r(struct_processus *s_etat_processus); void instruction_backspace(struct_processus *s_etat_processus); +void instruction_backtrace(struct_processus *s_etat_processus); void instruction_beep(struct_processus *s_etat_processus); void instruction_bessel(struct_processus *s_etat_processus); void instruction_bin(struct_processus *s_etat_processus); @@ -2009,6 +2354,7 @@ void instruction_cllcd(struct_processus void instruction_clmf(struct_processus *s_etat_processus); void instruction_close(struct_processus *s_etat_processus); void instruction_clratexit(struct_processus *s_etat_processus); +void instruction_clratpoke(struct_processus *s_etat_processus); void instruction_clrcntxt(struct_processus *s_etat_processus); void instruction_clrerr(struct_processus *s_etat_processus); void instruction_clrfuse(struct_processus *s_etat_processus); @@ -2164,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); @@ -2187,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); @@ -2200,6 +2548,7 @@ void instruction_lq(struct_processus *s_ void instruction_lsq(struct_processus *s_etat_processus); void instruction_lt(struct_processus *s_etat_processus); void instruction_lu(struct_processus *s_etat_processus); +void instruction_l_vers_t(struct_processus *s_etat_processus); void instruction_mant(struct_processus *s_etat_processus); void instruction_mark(struct_processus *s_etat_processus); @@ -2378,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); @@ -2435,10 +2785,10 @@ void instruction_trn(struct_processus *s void instruction_trnc(struct_processus *s_etat_processus); void instruction_true(struct_processus *s_etat_processus); void instruction_type(struct_processus *s_etat_processus); +void instruction_t_vers_l(struct_processus *s_etat_processus); 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); @@ -2493,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 @@ -2514,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); @@ -2553,10 +2904,12 @@ 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); void initialisation_instructions(struct_processus *s_etat_processus); +void initialisation_variables(struct_processus *s_etat_processus); #endif void initialisation_objet(struct_objet *s_objet); @@ -2569,17 +2922,19 @@ 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 interruption1(int signal, siginfo_t *siginfo, void *context); -void interruption2(int signal, siginfo_t *siginfo, void *context); -void interruption3(int signal, siginfo_t *siginfo, void *context); -void interruption4(int signal, siginfo_t *siginfo, void *context); -void interruption5(int signal, siginfo_t *siginfo, void *context); -void interruption6(int signal, siginfo_t *siginfo, void *context); -void interruption7(int signal, siginfo_t *siginfo, void *context); -void interruption8(int signal, siginfo_t *siginfo, void *context); -void interruption9(int signal, siginfo_t *siginfo, void *context); -void interruption10(int signal, siginfo_t *siginfo, void *context); -void interruption11(int signal, siginfo_t *siginfo, void *context); +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); +void interruption4(SIGHANDLER_ARGS); +void interruption5(SIGHANDLER_ARGS); +void interruption6(SIGHANDLER_ARGS); +void interruption7(SIGHANDLER_ARGS); +void interruption8(SIGHANDLER_ARGS); +void interruption9(SIGHANDLER_ARGS); +void interruption10(SIGHANDLER_ARGS); +void interruption11(SIGHANDLER_ARGS); void inversion_matrice(struct_processus *s_etat_processus, struct_matrice *s_matrice); void lancement_daemon(struct_processus *s_etat_processus); @@ -2594,6 +2949,9 @@ 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_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); @@ -2611,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); @@ -2638,6 +2997,14 @@ void valeurs_singulieres(struct_processu void verrouillage_threads_concurrents(struct_processus *s_etat_processus); #endif +#ifndef RPLARGS +#ifdef _BROKEN_SIGINFO +void creation_fifos_signaux(struct_processus *s_etat_processus); +void destruction_fifos_signaux(struct_processus *s_etat_processus); +void liberation_fifos_signaux(struct_processus *s_etat_processus); +#endif +#endif + /* -------------------------------------------------------------------------------- Fonctions de sommation de vecteur dans perte de précision @@ -2728,6 +3095,8 @@ unsigned char *formateur_fichier(struct_ struct_objet *s_objet, struct_objet *s_format, long longueur, long longueur_champ, unsigned char format, unsigned char type, long *longueur_effective, long *recursivite); +unsigned char *formateur_flux(struct_processus *s_etat_processus, + unsigned char *donnees, long *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); @@ -2812,6 +3181,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); @@ -2844,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, @@ -2926,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);