File:  [local] / rpl / src / rpl.h
Revision 1.284: download - view: text, annotated - select for diffs - revision graph
Wed Mar 9 17:49:13 2016 UTC (8 years, 1 month ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Correction d'un bug sournois dans la gestion des processus détachés.
Ce patch ne résout pas le problème (rafale de SIGALRM qui bloque
le lancement du processus fils) mais corrige des problèmes mineurs connexes,
typiquement des race conditions.

    1: #define DEBUG_ERREURS
    2: /*
    3: ================================================================================
    4:   RPL/2 (R) version 4.1.25
    5:   Copyright (C) 1989-2016 Dr. BERTRAND Joël
    6: 
    7:   This file is part of RPL/2.
    8: 
    9:   RPL/2 is free software; you can redistribute it and/or modify it
   10:   under the terms of the CeCILL V2 License as published by the french
   11:   CEA, CNRS and INRIA.
   12:  
   13:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   14:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   15:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   16:   for more details.
   17:  
   18:   You should have received a copy of the CeCILL License
   19:   along with RPL/2. If not, write to info@cecill.info.
   20: ================================================================================
   21: */
   22: 
   23: 
   24: #ifndef INCLUSION_RPL
   25: #define INCLUSION_RPL
   26: 
   27: #ifndef __RPLCAS
   28: #   define _GNU_SOURCE
   29: #   define _XOPEN_SOURCE        700
   30: #endif
   31: 
   32: #define _REENTRANT
   33: 
   34: #ifndef __RPLCAS
   35: #   ifdef Darwin
   36: #       define  _DARWIN_C_SOURCE
   37: #   endif
   38: 
   39: #   ifdef OpenBSD
   40: #       define _BSD_SOURCE
   41: #   endif
   42: 
   43: #   ifdef FreeBSD
   44: #       define __BSD_VISIBLE    1
   45: #   endif
   46: #endif
   47: 
   48: #ifdef OS2
   49: #   ifndef __RPLCAS
   50: #       define _BSD_SOURCE
   51: #   endif
   52: 
   53: #   include <types.h>
   54:     enum { SHUT_RD = 0, SHUT_WR, SHUT_RDWR };
   55: #   define SHUT_RD      SHUT_RD
   56: #   define SHUT_WR      SHUT_WR
   57: #   define SHUT_RDWR    SHUT_RDWR
   58: 
   59: #   include "getaddrinfo-conv.h"
   60: 
   61: #   define sched_yield(arg)
   62: #endif
   63: 
   64: #ifdef CYGWIN
   65: #   define SA_ONSTACK   0
   66: #endif
   67: 
   68: 
   69: /*
   70: ================================================================================
   71:   INCLUSIONS
   72: ================================================================================
   73: */
   74: 
   75: #include <stdio.h>
   76: #include <stdlib.h>
   77: #include <stdint.h>
   78: #include <math.h>
   79: #include <string.h>
   80: #include <strings.h>
   81: #include <syslog.h>
   82: #include <errno.h>
   83: #include <stdarg.h>
   84: #include <poll.h>
   85: #include <signal.h>
   86: 
   87: #ifndef RPLARGS
   88: #   include <sys/mman.h>
   89: #   include <sys/time.h>
   90: #   include <sys/resource.h>
   91: #   include <sys/select.h>
   92: #   include <sys/socket.h>
   93: #   include <sys/stat.h>
   94: #   include <sys/timeb.h>
   95: #   include <sys/types.h>
   96: #   include <sys/un.h>
   97: #   include <sys/wait.h>
   98: 
   99: #   include <arpa/inet.h>
  100: #   include <netinet/in.h>
  101: #   include <netdb.h>
  102: 
  103: #   include <dlfcn.h>
  104: #   include <fcntl.h>
  105: #   include <pthread.h>
  106: #   include <regex.h>
  107: 
  108: #   ifdef OS2
  109: #       undef pthread_mutexattr_settype
  110: #       define pthread_mutexattr_settype(a, b)
  111: #   endif
  112: 
  113: #   include <pwd.h>
  114: #   ifdef SHARED_MEMORY
  115: #       include <sys/shm.h>
  116: #   endif
  117: 
  118: #   ifndef IPCS_SYSV
  119: #       include <semaphore.h>
  120: #   else
  121: #       include <sys/ipc.h>
  122: #       include <sys/sem.h>
  123: 
  124: #       ifdef OS2
  125: #           define INCL_DOSSEMAPHORES
  126: #           define INCL_DOSMEMMGR
  127: #           define INCL_DOSERRORS
  128: #           include <os2.h>
  129: 
  130:             typedef struct _OS2SEM
  131:             {
  132:                 HMTX    hmtx;
  133:                 HEV     hev;
  134:                 ULONG   shared;
  135:                 ULONG   *cnt;
  136:                 ULONG   *nopened;
  137:                 ULONG   allocated;
  138:             } sem_t;
  139: #       else // IPCS_SYSV
  140:             typedef struct
  141:             {
  142:                 int             sem;
  143:                 int             alloue;
  144:                 unsigned char   *path;
  145:                 pid_t           pid;
  146:                 pthread_t       tid;
  147:             } sem_t;
  148: #       endif
  149: 
  150: #       ifndef SEM_FAILED
  151: #           define SEM_FAILED   NULL
  152: #       endif
  153: 
  154:         sem_t *sem_open_SysV(const char *nom, int oflag, ...);
  155:         int sem_init_SysV(sem_t *sem, int shared, unsigned int value);
  156:         int sem_close_SysV(sem_t *sem);
  157:         int sem_wait_SysV(sem_t *sem);
  158:         int sem_trywait_SysV(sem_t *sem);
  159:         int sem_timedwait_SysV(sem_t *sem, struct timespec *ts);
  160:         int sem_post_SysV(sem_t *sem);
  161:         int sem_getvalue_SysV(sem_t *sem, int *value);
  162:         int sem_unlink_SysV(char *nom);
  163:         int sem_destroy_SysV(sem_t *sem);
  164: #   endif
  165: 
  166: #   include <setjmp.h>
  167: #   include <termios.h>
  168: #   include <time.h>
  169: #   include <unistd.h>
  170: #   include <locale.h>
  171: 
  172: #   include "history.h"
  173: #   include "readline.h"
  174: #   include "termcap.h"
  175: #   include "iconv.h"
  176: #   include "zlib.h"
  177: 
  178: #   include "openssl/evp.h"
  179: #   ifndef OPENSSL_NO_MD2
  180: #       include "openssl/md2.h"
  181: #   endif
  182: #   ifndef OPENSSL_NO_MD4
  183: #       include "openssl/md4.h"
  184: #   endif
  185: #   ifndef OPENSSL_NO_MD5
  186: #       include "openssl/md5.h"
  187: #   endif
  188: #   ifndef OPENSSL_NO_MDC2
  189: #       include "openssl/mdc2.h"
  190: #   endif
  191: #   ifndef OPENSSL_NO_RIPEMD
  192: #       include "openssl/ripemd.h"
  193: #   endif
  194: #   ifndef OPENSSL_NO_SHA
  195: #       include "openssl/sha.h"
  196: #   endif
  197: #   ifndef OPENSSL_NO_WHIRLPOOL
  198: #       include "openssl/whrlpool.h"
  199: #   endif
  200: #   ifndef OPENSSL_NO_AES
  201: #       include "openssl/aes.h"
  202: #   endif
  203: #   ifndef OPENSSL_NO_CAMELLIA
  204: #       include "openssl/camellia.h"
  205: #   endif
  206: #   ifndef OPENSSL_NO_RC2
  207: #       include "openssl/rc2.h"
  208: #   endif
  209: #   ifndef OPENSSL_NO_IDEA
  210: #       include "openssl/idea.h"
  211: #   endif
  212: 
  213: #   include "sqlite3.h"
  214: #   include "sigsegv.h"
  215: #   ifdef OS2
  216:         // Bug de libsigsegv
  217: #       undef HAVE_STACK_OVERFLOW_RECOVERY
  218: #   endif
  219: 
  220: #   define GSL_RANGE_CHECK_OFF
  221: #   include "gsl/gsl_cdf.h"
  222: #   include "gsl/gsl_cblas.h"
  223: #   include "gsl/gsl_errno.h"
  224: #   include "gsl/gsl_fft_complex.h"
  225: #   include "gsl/gsl_permutation.h"
  226: #   include "gsl/gsl_randist.h"
  227: #   include "gsl/gsl_rng.h"
  228: #   include "gsl/gsl_sf.h"
  229: #endif
  230: 
  231: #ifdef SunOS
  232: #   include <ieeefp.h>
  233: #endif
  234: 
  235: // Définition spécifique à Hurd
  236: #ifndef PIPE_BUF
  237: #   define fpathconf (".", _PC_PIPE_BUF)
  238: #endif
  239: 
  240: #ifdef MYSQL_SUPPORT
  241: #   include <mysql.h>
  242: #   define mysqlclose(arg)      mysql_close(arg.mysql)
  243: #else
  244: #   define mysqlclose(arg)
  245: #endif
  246: 
  247: #ifdef POSTGRESQL_SUPPORT
  248: #   include <libpq-fe.h>
  249: #   define postgresqlclose(arg) PQfinish(arg.postgresql)
  250: #else
  251: #   define postgresqlclose(arg)
  252: #endif
  253: 
  254: #include "librplprototypes.h"
  255: 
  256: #ifndef RPLARGS
  257: #   ifndef UNIX_PATH_MAX
  258:         struct sockaddr_un sizecheck;
  259: #       define UNIX_PATH_MAX sizeof(sizecheck.sun_path)
  260: #   endif
  261: #endif
  262: 
  263: #ifdef MAIN_RPL
  264: #   define __EXTERN__
  265: #   define __STATIC_MUTEX_INITIALIZATION__ = PTHREAD_MUTEX_INITIALIZER
  266: #else
  267: #   define __EXTERN__                       extern
  268: #   define __STATIC_MUTEX_INITIALIZATION__
  269: #endif
  270: 
  271: /*
  272: ================================================================================
  273:   Bugs spécifiques
  274: ================================================================================
  275: */
  276: 
  277: // Néant
  278: 
  279: /*
  280: ================================================================================
  281:   TYPES
  282: ================================================================================
  283: */
  284: 
  285: typedef FILE                    file;
  286: typedef unsigned char           t_8_bits;
  287: 
  288: #ifndef RPLARGS
  289: #   include "rpltypes-conv.h"
  290: #else
  291: #   include "rpltypes.h"
  292: #endif
  293: 
  294: enum signaux_rpl
  295: {
  296:     rpl_signull = 0,
  297:     rpl_sigint,
  298:     rpl_sigterm,
  299:     rpl_sigstart,       // Signal envoyé par un père pour lancer son fils.
  300:     rpl_sigcont,        // Signal de redémarrage d'un processus arrêté par
  301:                         // SUSPEND
  302:     rpl_sigstop,        // Signal d'arrêt envoyé par l'instruction STOP ou
  303:                         // FUSE. (FSTOP)
  304:     rpl_sigabort,       // Signal envoyé par l'instruction ABORT (à regrouper
  305:                         // avec FABORT)
  306:     rpl_sigurg,         // Signal d'arrêt urgent
  307:     rpl_siginject,      // Signal indiquant la présence d'une donnée à lire
  308:                         // envoyée depuis le père
  309:     rpl_sigalrm,        // Signal d'alarme (erreur système) depuis un fils
  310:     rpl_sighup,
  311:     rpl_sigtstp,
  312:     rpl_sigexcept,
  313:     rpl_sigmax
  314: };
  315: 
  316: #define LONGUEUR_QUEUE_SIGNAUX          1024
  317: 
  318: // Une structure s_queue_signaux est créée par processus (et non par thread).
  319: // Elle est projetée dans un segment de mémoire partagée pour qu'elle soit
  320: // accessible à la fois du père et des fils.
  321: 
  322: #ifndef RPLARGS
  323: typedef struct queue_signaux
  324: {
  325:     volatile int                pointeur_lecture;
  326:     volatile int                pointeur_ecriture;
  327:     volatile logical1           requete_arret;
  328: 
  329:     pthread_t                   thread_signaux;
  330:     pid_t                       controle;
  331: 
  332:     volatile struct
  333:     {
  334:         pid_t                   pid;
  335:         enum signaux_rpl        signal;
  336:     }                           queue[LONGUEUR_QUEUE_SIGNAUX];
  337: 
  338: #   ifdef OS2
  339:     sem_t                       semaphore;
  340:     sem_t                       signalisation;
  341:     sem_t                       arret_signalisation;
  342: #   endif
  343: } struct_queue_signaux;
  344: 
  345: __EXTERN__ struct_queue_signaux *s_queue_signaux;
  346: __EXTERN__ int                  f_queue_signaux;
  347: 
  348: #   ifndef OS2
  349:     __EXTERN__ sem_t            *semaphore_queue_signaux;
  350:     __EXTERN__ sem_t            *semaphore_signalisation;
  351:     __EXTERN__ sem_t            *semaphore_arret_signalisation;
  352: #   endif
  353: #endif
  354: 
  355: #if ! defined(UNION_SEMUN) && defined(IPCS_SYSV)
  356: union semun
  357: {
  358:     int                 val;
  359:     struct semid_ds     *buf;
  360:     unsigned short      *array;
  361:     struct seminfo      *__buf;
  362: };
  363: #endif
  364: 
  365: #ifndef RTLD_LOCAL
  366: #   define RTLD_LOCAL       0
  367: #endif
  368: 
  369: #ifndef SIGSTKSZ
  370: #   define SIGSTKSZ         65536
  371: #endif
  372: 
  373: 
  374: /*
  375: ================================================================================
  376:   SÉMAPHORES
  377: ================================================================================
  378: */
  379: 
  380: #ifdef IPCS_SYSV
  381: #   ifdef DEBUG_SEMAPHORES
  382: #       define sem_wait(a) ({ int value; sem_getvalue(a, &value); \
  383:                 uprintf("[%d-%llu] Semaphore %s (%p) "\
  384:                 "waiting at %s() " \
  385:                 "line #%d\n", (int) getpid(), (unsigned long long) i\
  386:                         pthread_self(), \
  387:                 #a, a, __FUNCTION__, __LINE__), fflush(stdout); \
  388:                 if (value > 1) BUG(1, uprintf("Value %d\n", value)); \
  389:                 sem_wait_SysV(a); })
  390: #   define sem_post(a) ({ int value; sem_getvalue(a, &value); \
  391:                 uprintf("[%d-%llu] Semaphore %s (%p) "\
  392:                 "posting at %s() " \
  393:                 "line #%d\n", (int) getpid(), (unsigned long long) \
  394:                         pthread_self(), \
  395:                 #a, a, __FUNCTION__, __LINE__), fflush(stdout); \
  396:                 if (value > 0) BUG(1, uprintf("Value %d\n", value)); \
  397:                 sem_post_SysV(a); })
  398: #   define sem_destroy(a) ({ int value; sem_getvalue(a, &value); \
  399:                 if (value == 0) BUG(1, uprintf("Value %d\n", value)); \
  400:                 sem_destroy_SysV(a); })
  401: #   else
  402: #       define sem_destroy(a)       sem_destroy_SysV(a)
  403: #       define sem_wait(a)          sem_wait_SysV(a)
  404: #       define sem_post(a)          sem_post_SysV(a)
  405: #   endif
  406: 
  407: #   define sem_init(a, b, c)    sem_init_SysV(a, b, c)
  408: #   define sem_trywait(a)       sem_trywait_SysV(a)
  409: #   define sem_timedwait(a, b)  sem_timedwait_SysV(a, b)
  410: #   define sem_getvalue(a, b)   sem_getvalue_SysV(a, b)
  411: #   define sem_open(...)        sem_open_SysV(__VA_ARGS__)
  412: #   define sem_close(a)         sem_close_SysV(a)
  413: #   define sem_unlink(a)        sem_unlink_SysV(a)
  414: #else
  415: #   ifdef DEBUG_SEMAPHORES
  416: #       define sem_wait(a) ({ int value; sem_getvalue(a, &value); \
  417:                 uprintf("[%d-%llu] Semaphore %s (%p) "\
  418:                 "waiting at %s() " \
  419:                 "line #%d\n", (int) getpid(), (unsigned long long) \
  420:                         pthread_self(), \
  421:                 #a, a, __FUNCTION__, __LINE__), fflush(stdout); \
  422:                 if (value > 1) BUG(1, uprintf("Value %d\n", value)); sem_wait(a); })
  423: #       define sem_post(a) ({ int value; sem_getvalue(a, &value); \
  424:                 uprintf("[%d-%llu] Semaphore %s (%p) "\
  425:                 "posting at %s() " \
  426:                 "line #%d\n", (int) getpid(), (unsigned long long) \
  427:                         pthread_self(), \
  428:                 #a, a, __FUNCTION__, __LINE__), fflush(stdout); \
  429:                 if (value > 0) BUG(1, uprintf("Value %d\n", value)); sem_post(a); })
  430: #       define sem_destroy(a) ({ int value; sem_getvalue(a, &value); \
  431:                 if (value == 0) BUG(1, uprintf("Value %d\n", value)); \
  432:                 sem_destroy(a); })
  433: #   endif
  434: #endif
  435: 
  436: 
  437: /*
  438: ================================================================================
  439:   SIGNAUX
  440: ================================================================================
  441: */
  442: 
  443: #ifndef RPLARGS
  444: 
  445: // Signaux utilisés par défaut :
  446: //  SIGINT
  447: //  SIGTSTP
  448: //  SIGCONT
  449: //  SIGPIPE
  450: //  SIGUSR1 et SIGUSR2 sont utilisé par libsigsegv.
  451: //  SIGHUP
  452: //  SIGALRM
  453: 
  454: #   define SIGTEST                  255
  455: 
  456: //  Nombre d'interruptions disponibles
  457: #   define d_NOMBRE_INTERRUPTIONS   64
  458: #endif
  459: 
  460: /*
  461: ================================================================================
  462:   Granularité temporelle
  463: ================================================================================
  464: */
  465: 
  466: #ifndef RPLARGS
  467: #   define GRANULARITE_us           10
  468: #   define GRANULARITE_us_max       100000
  469: #   define INCR_GRANULARITE(g) \
  470:     do  g = 1000 * ((g >= (GRANULARITE_us_max * 1000)) \
  471:             ? GRANULARITE_us_max : ((g / 1000) + GRANULARITE_us)); while(0)
  472: #endif
  473: 
  474: /*
  475: ================================================================================
  476:   Options de debug
  477: ================================================================================
  478: */
  479: 
  480: #ifndef RPLARGS
  481: #   define d_debug_pile_utilisateur         ((integer8) 0x1)
  482: #   define d_debug_pile_systeme             ((integer8) 0x2)
  483: #   define d_debug_appels_fonctions         ((integer8) 0x4)
  484: #   define d_debug_processus                ((integer8) 0x8)
  485: #   define d_debug_analyse                  ((integer8) 0x10)
  486: #   define d_debug_fusible                  ((integer8) 0x20)
  487: #   define d_debug_variables                ((integer8) 0x40)
  488: #   define d_debug_fonctions_intrinseques   ((integer8) 0x80)
  489: #   define d_debug_niveaux                  ((integer8) 0x100)
  490: #   define d_conversion_RPN                 ((integer8) 0x200)
  491: #   define d_traitement_interruption        ((integer8) 0x400)
  492: #   define d_debug_signaux                  ((integer8) 0x800)
  493: #endif
  494: 
  495: /*
  496: ================================================================================
  497:   Variables globales
  498: ================================================================================
  499: */
  500: 
  501: #ifndef RPLARGS
  502: #   ifdef SEMAPHORES_NOMMES
  503: #       define LONGUEUR_NOM_SEMAPHORE   64
  504: #       define __PTR__      *
  505: #   else
  506: #       define __PTR__
  507: #   endif
  508: 
  509:     __EXTERN__ jmp_buf              contexte_ecriture;
  510:     __EXTERN__ jmp_buf              contexte_impression;
  511:     __EXTERN__ jmp_buf              contexte_initial;
  512:     __EXTERN__ jmp_buf              contexte_processus;
  513:     __EXTERN__ jmp_buf              contexte_thread;
  514: 
  515:     __EXTERN__ volatile int         signal_test;
  516: 
  517:     __EXTERN__ pid_t                pid_processus_pere;
  518: 
  519:     __EXTERN__ pthread_mutex_t      mutex_liste_threads;
  520:     __EXTERN__ pthread_mutex_t      mutex_creation_variable_partagee
  521:                                             __STATIC_MUTEX_INITIALIZATION__;
  522:     __EXTERN__ pthread_mutex_t      mutex_sections_critiques;
  523:     __EXTERN__ pthread_mutex_t      mutex_liste_variables_partagees;
  524:     __EXTERN__ pthread_mutex_t      mutex_sem __STATIC_MUTEX_INITIALIZATION__;
  525: 
  526:     __EXTERN__ volatile int         routine_recursive;
  527: 
  528: #   define SEM_FORK                 0
  529: #   define SEM_QUEUE                1
  530: #   define SEM_SIGNALISATION        2
  531: #   define SEM_ARRET_SIGNALISATION  3
  532: 
  533:     sem_t *sem_init2(unsigned int valeur, pid_t pid, int ordre);
  534:     sem_t *sem_init3(unsigned int valeur, pid_t pid, pthread_t tid, int ordre);
  535:     int sem_destroy2(sem_t *semaphore_p, pid_t pid, int ordre);
  536:     int sem_destroy3(sem_t *semaphore_p, pid_t pid, pthread_t tid, int ordre);
  537:     int sem_getvalue2(sem_t *semaphore, int *valeur);
  538:     sem_t *sem_open2(pid_t pid, int ordre);
  539: #endif
  540: 
  541: // Le mutex est là uniquement pour pouvoir émuler le comportement
  542: // de sem_getvalue() sur un système comme MacOS X qui ne possède pas
  543: // cette fonction.
  544: 
  545: #ifdef Darwin
  546: #define sem_getvalue(semaphore, value) sem_getvalue2(semaphore, value)
  547: #define sem_post(semaphore) \
  548:         ({ int r; pthread_mutex_lock(&mutex_sem); \
  549:         r = sem_post(semaphore), pthread_mutex_unlock(&mutex_sem); r; })
  550: #define sem_wait(semaphore) \
  551:         ({ int r; pthread_mutex_lock(&mutex_sem); \
  552:         r = sem_wait(semaphore), pthread_mutex_unlock(&mutex_sem); r; })
  553: #define sem_trywait(semaphore) \
  554:         ({ int r; pthread_mutex_lock(&mutex_sem); \
  555:         r = sem_trywait(semaphore), pthread_mutex_unlock(&mutex_sem); r; })
  556: #endif
  557: 
  558: /*
  559: ================================================================================
  560:   Macros
  561: ================================================================================
  562: */
  563: 
  564: // Par défaut, tout est redirigé vers stderr sauf indication explicite de
  565: // stdout.
  566: 
  567: #define printf(...) transliterated_fprintf(s_etat_processus, \
  568:             stderr, __VA_ARGS__)
  569: #define fprintf(flux, ...) transliterated_fprintf(s_etat_processus, \
  570:             flux, __VA_ARGS__)
  571: #define uprintf(...) std_fprintf(stderr, __VA_ARGS__)
  572: #define ufprintf(flux, ...) std_fprintf(flux, __VA_ARGS__)
  573: 
  574: #ifdef SunOS
  575: #   define fopen(...) ({ FILE *desc; \
  576:             while((desc = fopen(__VA_ARGS__)) == NULL) \
  577:             { if ((errno != EINTR) && (errno != 0)) break; } desc; })
  578: #   define freopen(...) ({ FILE *desc; \
  579:             while((desc = freopen(__VA_ARGS__)) == NULL) \
  580:             { if ((errno != EINTR) && (errno != 0)) break; } desc; })
  581: #   define fclose(...) ({ int ios; \
  582:             while((ios = fclose(__VA_ARGS__)) != 0) \
  583:             { if ((errno != EINTR) && (errno != 0)) break; } ios; })
  584: #   define fflush(flux) ({ int ios; \
  585:             while((ios = fflush((flux == stdout) ? stderr : flux)) != 0) \
  586:             { if ((errno != EINTR) && (errno != 0)) break; } ios; })
  587: #   define sem_open(...) ({ sem_t *semaphore; \
  588:             while((semaphore = sem_open(__VA_ARGS__)) == SEM_FAILED) \
  589:             { if (errno != EINTR) break; }  semaphore; })
  590: #else // !SunOS
  591: #   define fflush(flux) fflush((flux == stdout) ? stderr : flux)
  592: #endif
  593: 
  594: // Ajout d'un timeout sur les fonctions pipe() pour éviter une erreur
  595: // système dans le cas où l'on a atteint le nombre maximale de fichiers
  596: // ouverts.
  597: 
  598: #define pipe(descripteurs) \
  599:     ({ \
  600:         struct timespec temporisation; \
  601:         int erreur, nombre_echecs; \
  602:         nombre_echecs = 0; \
  603:         do \
  604:         { \
  605:             if ((erreur = pipe(descripteurs)) == 0) break; \
  606:             nombre_echecs++; \
  607:             temporisation.tv_sec = 0; \
  608:             temporisation.tv_nsec = ((long) 1000000000) * rand(); \
  609:             nanosleep(&temporisation, NULL); \
  610:         } while(nombre_echecs < 100); \
  611:         erreur; \
  612:      })
  613: 
  614: // Redéfinition de abs pour un fonctionnement en entier de type long long int
  615: 
  616: #ifdef __GNUC__
  617: #   define abs(i) ({ typeof(i) _i; _i = (i); (_i >= 0) ? _i : -_i; })
  618: // typeof() est une extension de gcc, mais est présent sur d'autres compilateurs
  619: // comme Sun Studio. Dans le cas où typeof() n'existe pas, il est possible
  620: // d'utiliser la macro suivante, mais elle possède un effet de bord dû à
  621: // l'évaluation multiple de l'argument.
  622: #else
  623: #   define abs(i) (((i) >= 0) ? (i) : (-i))
  624: #endif
  625: 
  626: #define NOTICE(m) \
  627:     do \
  628:     { \
  629:         ufprintf(stderr, "[%d-%llu] %s() from %s at line %d: %s\n", \
  630:                 getpid(), (unsigned long long) pthread_self(), \
  631:                 __FUNCTION__, __FILE__, __LINE__, m); \
  632:         fflush(stderr); \
  633:     } while(0)
  634: 
  635: #ifdef __GLIBC__
  636: #include <execinfo.h>
  637: #define __BACKTRACE
  638: #define BACKTRACE(n) \
  639:     do \
  640:     { \
  641:         void            *buffer[n]; \
  642:         int             nb, i; \
  643:         char            **appels; \
  644:         pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; \
  645:         nb = backtrace(buffer, n); \
  646:         appels = backtrace_symbols(buffer, nb); \
  647:         pthread_mutex_lock(&mutex); \
  648:         uprintf("[%d-%llu] BACKTRACE <%s()> at line #%d\n", \
  649:                 getpid(), pthread_self(), __FUNCTION__, __LINE__); \
  650:         if (appels != NULL) \
  651:         { \
  652:             for(i = 0; i < nb; i++) \
  653:                 uprintf("    %s\n", appels[i]); \
  654:             sys_free(appels); \
  655:         } \
  656:         else \
  657:             uprintf("Nullified backtrace\n"); \
  658:         uprintf("[%d-%llu] END OF BACKTRACE\n", getpid(), pthread_self()); \
  659:         fflush(stdout); \
  660:         pthread_mutex_unlock(&mutex); \
  661:     } while(0)
  662: #else
  663: #define BACKTRACE(n) NOTICE("BACKTRACE only defined in glibc")
  664: #endif
  665: 
  666: #ifdef __BACKTRACE
  667: #   define BUG(b, ...) \
  668:             do { if (b) { uprintf("[%d] BUG! <%s()> at line #%d of %s\n", \
  669:             (int) getpid(), __FUNCTION__, __LINE__, __FILE__); \
  670:             __VA_ARGS__; fflush(stdout); \
  671:             BACKTRACE(64); \
  672:             pthread_kill(pthread_self(), SIGBUS); }} while(0)
  673: #else
  674: #   define BUG(b, ...) \
  675:             do { if (b) { uprintf("[%d] BUG! <%s()> at line #%d of %s\n", \
  676:             (int) getpid(), __FUNCTION__, __LINE__, __FILE__); \
  677:             __VA_ARGS__; fflush(stdout); \
  678:             pthread_kill(pthread_self(), SIGBUS); }} while(0)
  679: #endif
  680: 
  681: 
  682: /*
  683: ================================================================================
  684:   Affichage des points de retour des fonctions
  685: ================================================================================
  686: */
  687: 
  688: #ifdef DEBUG_MEMOIRE
  689: void analyse_post_mortem();
  690: void *debug_memoire_ajout(size_t taille, const unsigned char *fonction,
  691:         unsigned long ligne, const unsigned char *argument);
  692: void debug_memoire_initialisation();
  693: void *debug_memoire_modification(void *pointeur, size_t taille,
  694:         const unsigned char *fonction, unsigned long ligne,
  695:         const unsigned char *argument);
  696: void debug_memoire_retrait(void *ptr);
  697: void debug_memoire_verification();
  698: 
  699: pid_t debug_fork();
  700: 
  701: #define malloc(s) debug_memoire_ajout(s, __FUNCTION__, __LINE__, #s)
  702: #define free(s) debug_memoire_retrait(s)
  703: #define realloc(s, t) debug_memoire_modification(s, t, \
  704:             __FUNCTION__, __LINE__, #t)
  705: #define fork() debug_fork()
  706: #endif
  707: 
  708: #ifdef DEBUG_RETURN
  709: #define return uprintf("[%d] Return from <%s()> at line #%d " \
  710:         "(%s [%d])\n", (int) getpid(), __FUNCTION__, \
  711:         __LINE__, strerror(errno), errno); fflush(stdout); errno = 0; return
  712: #endif
  713: 
  714: #ifdef DEBUG_MUTEX
  715: #define pthread_mutex_lock(mutex) uprintf("[%d-%llu] Mutex %s (%p) " \
  716:         "locking at %s() " \
  717:         "line #%d\n", (int) getpid(), (unsigned long long) pthread_self(), \
  718:         #mutex, mutex, __FUNCTION__, __LINE__), fflush(stdout), \
  719:         pthread_mutex_lock(mutex)
  720: #define pthread_mutex_unlock(mutex) uprintf("[%d-%llu] Mutex %s (%p) " \
  721:         "unlocking at " \
  722:         "%s() line #%d\n", (int) getpid(), (unsigned long long) \
  723:         pthread_self(), #mutex, mutex, __FUNCTION__, __LINE__), \
  724:         fflush(stdout), \
  725:         pthread_mutex_unlock(mutex)
  726: #endif
  727: 
  728: 
  729: /*
  730: ================================================================================
  731:   DEFINIONS
  732: ================================================================================
  733: */
  734: 
  735: /*
  736: --------------------------------------------------------------------------------
  737:   Valeurs
  738: --------------------------------------------------------------------------------
  739: */
  740: 
  741: #define d_faux                  ((logical1) 0L)
  742: #define d_vrai                  ((logical1) -1L)
  743: 
  744: #define d_absence_erreur        ((logical1) d_faux)
  745: #define d_erreur                ((logical1) d_vrai)
  746: 
  747: #define d_code_fin_chaine                   '\0'
  748: #define d_code_espace                       ' '
  749: #define d_code_retour_chariot               '\n'
  750: #define d_code_tabulation                   '\t'
  751: #define d_longueur_maximale_instruction     16
  752: 
  753: #define d_INT                   "integer"
  754: #define d_REL                   "real"
  755: #define d_CPL                   "complex"
  756: #define d_VIN                   "[ integer ]"
  757: #define d_VRL                   "[ real ]"
  758: #define d_VCX                   "[ complex ]"
  759: #define d_MIN                   "[[ integer ]]"
  760: #define d_MRL                   "[[ real ]]"
  761: #define d_MCX                   "[[ complex ]]"
  762: #define d_BIN                   "# binary[bodh]"
  763: #define d_NOM                   "'name'"
  764: #define d_CHN                   "\"string\""
  765: #define d_LST                   "{ list }"
  766: #define d_ALG                   "'algebraic'"
  767: #define d_RPN                   "<< RPN >>"
  768: #define d_FCH                   "File $n { format }"
  769: #define d_SLB                   "Library $n"
  770: #define d_SQL                   "Sql $n (type)"
  771: #define d_PRC                   "Process $n"
  772: #define d_SCK                   "Socket $n { format }"
  773: #define d_SPH                   "Semaphore $n 'name'"
  774: #define d_TAB                   "<[ table ]>"
  775: #define d_MTX                   "Mutex $n"
  776: #define d_REC                   "Record /'name_1', ..., 'name_n'/"
  777: 
  778: /*
  779: --------------------------------------------------------------------------------
  780:   Paramètres du système
  781: --------------------------------------------------------------------------------
  782: */
  783: 
  784: #ifndef RPLARGS
  785: #   define ds_beep                              ""
  786: #   define ds_fichier_historique                ".RPL2_history"
  787: #   define ds_imposition_separateur_decimal     d_vrai
  788: #   define ds_longueur_historique               256
  789: #   define ds_nombre_maximum_fichiers_ouverts   65536
  790: #   define ds_preprocesseur                     "rplpp " \
  791:                                                     "--nostdinc -C 2> /dev/null"
  792: #   define ds_rplcore                           "rpl-core"
  793: #   define ds_rplprofile                        "rpl-profile"
  794: #   define ds_sdat                              "SDAT"
  795: #endif
  796: 
  797: /*
  798: --------------------------------------------------------------------------------
  799:   Erreurs système
  800: --------------------------------------------------------------------------------
  801: */
  802: 
  803: #ifdef DEBUG_ERREURS
  804: #   ifdef MESSAGES
  805: #       define __erreur(i)  i
  806: #       define __erreur_(i) i
  807: #   else
  808: #       undef _ERREURS_VARIABLES
  809: #       ifdef _ERREURS_VARIABLES
  810: #           define __erreur_(i) __erreur(i)
  811: #       else
  812: #           define __erreur_(i) i
  813: #       endif
  814: #       define __erreur(i)  ({ if (strstr(__FUNCTION__, "recherche_variable") \
  815:                 == NULL) ufprintf(stderr, \
  816:                 "ERROR %d AT %s() FROM %s LINE %d\n", \
  817:                 i, __FUNCTION__, __FILE__, __LINE__); i; })
  818: #   endif
  819: #else
  820: #   define __erreur(i)  i
  821: #   define __erreur_(i) i
  822: #endif
  823: 
  824: 
  825: // -1 : erreur provoquée par une bibliothèque externe
  826: #ifndef RPLARGS
  827: #   define d_es                                 2000
  828: #   define d_es_allocation_memoire              __erreur(2001)
  829: #   define d_es_variable_introuvable            __erreur_(2002)
  830: #   define d_es_pile_vide                       __erreur(2003)
  831: #   define d_es_end_incoherent                  __erreur(2004)
  832: #   define d_es_peripherique_stdin              __erreur(2005)
  833: #   define d_es_erreur_fichier                  __erreur(2006)
  834: #   define d_es_execution_bibliotheque          __erreur(2007)
  835: #   define d_es_signal                          __erreur(2008)
  836: #   define d_es_processus                       __erreur(2009)
  837: #   define d_es_pile_operationnelle_vide        __erreur(2010)
  838: #   define d_es_nombre_max_descripteurs         __erreur(2011)
  839: #   define d_es_interruption_invalide           __erreur(2012)
  840: #   define d_es_contexte                        __erreur(2013)
  841: #   define d_es_somme_controle                  __erreur(2014)
  842: #   define d_es_semaphore                       __erreur(2015)
  843: #   define d_es_mutex_acquis_autre_thread       __erreur(2016)
  844: #endif
  845: 
  846: /*
  847: --------------------------------------------------------------------------------
  848:   Exceptions
  849: --------------------------------------------------------------------------------
  850: */
  851: 
  852: #ifndef RPLARGS
  853: #   define d_ep                                 1000
  854: #   define d_ep_division_par_zero               __erreur(1001)
  855: #   define d_ep_matrice_non_inversible          __erreur(1002)
  856: #   define d_ep_resultat_indefini               __erreur(1003)
  857: #   define d_ep_underflow                       __erreur(1004)
  858: #   define d_ep_overflow                        __erreur(1005)
  859: #   define d_ep_domaine_definition              __erreur(1006)
  860: #   define d_ep_perte_precision                 __erreur(1007)
  861: #   define d_ep_decomposition_QR                __erreur(1008)
  862: #   define d_ep_matrice_non_definie_positive    __erreur(1009)
  863: #   define d_ep_decomposition_QZ                __erreur(1010)
  864: #   define d_ep_decomposition_SVD               __erreur(1011)
  865: #endif
  866: 
  867: /*
  868: --------------------------------------------------------------------------------
  869:   Erreurs de compilation
  870: --------------------------------------------------------------------------------
  871: */
  872: 
  873: #ifndef RPLARGS
  874: #   define d_ec                                 3000
  875: #   define d_ec_niveau_definition_negatif       __erreur(3001)
  876: #   define d_ec_nom_definition_invalide         __erreur(3002)
  877: #   define d_ec_erreur_boucle_definie           __erreur(3003)
  878: #   define d_ec_erreur_instruction_end          __erreur(3004)
  879: #   define d_ec_erreur_instruction_until        __erreur(3005)
  880: #   define d_ec_source_incoherent               __erreur(3006)
  881: #   define d_ec_erreur_instruction_while        __erreur(3007)
  882: #   define d_ec_erreur_instruction_then         __erreur(3008)
  883: #   define d_ec_erreur_instruction_else         __erreur(3009)
  884: #   define d_ec_erreur_instruction_elseif       __erreur(3010)
  885: #   define d_ec_erreur_instruction_select       __erreur(3011)
  886: #   define d_ec_erreur_instruction_case         __erreur(3012)
  887: #endif
  888: 
  889: /*
  890: --------------------------------------------------------------------------------
  891:   Erreurs à l'exécution
  892: --------------------------------------------------------------------------------
  893: */
  894: 
  895: // -1 : erreur provoquée par une bibliothèque externe
  896: #ifndef RPLARGS
  897: #   define d_ex                                 0
  898: #   define d_ex_pile_vide                       __erreur(1)
  899: #   define d_ex_manque_argument                 __erreur(2)
  900: #   define d_ex_argument_invalide               __erreur(3)
  901: #   define d_ex_erreur_type_argument            __erreur(4)
  902: #   define d_ex_nom_reserve                     __erreur(5)
  903: #   define d_ex_nombre_arguments                __erreur(6)
  904: #   define d_ex_dimensions_invalides            __erreur(7)
  905: #   define d_ex_expression_invalide             __erreur(8)
  906: #   define d_ex_absence_graphique_courant       __erreur(9)
  907: #   define d_ex_erreur_traitement_condition     __erreur(10)
  908: #   define d_ex_erreur_traitement_boucle        __erreur(11)
  909: #   define d_ex_variable_non_definie            __erreur_(12)
  910: #   define d_ex_drapeau_inexistant              __erreur(13)
  911: #   define d_ex_nom_invalide                    __erreur(14)
  912: #   define d_ex_element_inexistant              __erreur(15)
  913: #   define d_ex_absence_variable                __erreur(16)
  914: #   define d_ex_erreur_evaluation               __erreur(17)
  915: #   define d_ex_semaphore                       __erreur(18)
  916: #   define d_ex_longueur_fft                    __erreur(19)
  917: #   define d_ex_queue_impression                __erreur(20)
  918: #   define d_ex_type_trace_invalide             __erreur(21)
  919: #   define d_ex_erreur_fichier                  __erreur(22)
  920: #   define d_ex_absence_equation                __erreur(23)
  921: #   define d_ex_erreur_bibliotheque             __erreur(24)
  922: #   define d_ex_execution_bibliotheque          __erreur(25)
  923: #   define d_ex_stop                            __erreur(26)
  924: #   define d_ex_matrice_statistique_invalide    __erreur(27)
  925: #   define d_ex_dimensions_matrice_statistique  __erreur(28)
  926: #   define d_ex_absence_observations            __erreur(29)
  927: #   define d_ex_statistiques_echantillon        __erreur(30)
  928: #   define d_ex_observations_inexistantes       __erreur(31)
  929: #   define d_ex_syntaxe                         __erreur(32)
  930: #   define d_ex_cycle_hors_boucle               __erreur(33)
  931: #   define d_ex_conversion_unite                __erreur(34)
  932: #   define d_ex_erreur_parametre_fichier        __erreur(35)
  933: #   define d_ex_erreur_acces_fichier            __erreur(36)
  934: #   define d_ex_erreur_requete_fichier          __erreur(37)
  935: #   define d_ex_erreur_format_fichier           __erreur(38)
  936: #   define d_ex_fichier_verrouille              __erreur(39)
  937: #   define d_ex_verrou_indefini                 __erreur(40)
  938: #   define d_ex_fin_de_fichier_atteinte         __erreur(41)
  939: #   define d_ex_debut_de_fichier_atteint        __erreur(42)
  940: #   define d_ex_erreur_type_fichier             __erreur(43)
  941: #   define d_ex_fichier_vide                    __erreur(44)
  942: #   define d_ex_dimensions_differentes          __erreur(45)
  943: #   define d_ex_routines_mathematiques          __erreur(46)
  944: #   define d_ex_exit_hors_boucle                __erreur(47)
  945: #   define d_ex_longueur_dft                    __erreur(48)
  946: #   define d_ex_contexte                        __erreur(49)
  947: #   define d_ex_processus                       __erreur(50)
  948: #   define d_ex_image_processus                 __erreur(51)
  949: #   define d_ex_erreur_sql                      __erreur(52)
  950: #   define d_ex_variable_verrouillee            __erreur(53)
  951: #   define d_ex_variable_volatile               __erreur(54)
  952: #   define d_ex_erreur_processus                __erreur(55)
  953: #   define d_ex_erreur_impression               __erreur(56)
  954: #   define d_ex_nombre_arguments_fonction       __erreur(57)
  955: #   define d_ex_fonction_indisponible           __erreur(58)
  956: #   define d_ex_bibliotheque_chargee            __erreur(59)
  957: #   define d_ex_aucun_symbole                   __erreur(60)
  958: #   define d_ex_definition_ambigue              __erreur(61)
  959: #   define d_ex_fichier_hors_contexte           __erreur(62)
  960: #   define d_ex_socket_en_ecoute                __erreur(63)
  961: #   define d_ex_interruption_invalide           __erreur(64)
  962: #   define d_ex_erreur_transcodage              __erreur(65)
  963: #   define d_ex_absence_processus_pere          __erreur(66)
  964: #   define d_ex_creation_variable               __erreur(67)
  965: #   define d_ex_fusible                         __erreur(68)
  966: #   define d_ex_iswi_hors_interruption          __erreur(69)
  967: #   define d_ex_daemon                          __erreur(70)
  968: #   define d_ex_mutex                           __erreur(71)
  969: #   define d_ex_variable_statique_partagee      __erreur(72)
  970: #   define d_ex_variable_partagee               __erreur(73)
  971: #   define d_ex_graphique_memorise              __erreur(74)
  972: #   define d_ex_matrice_non_diagonale           __erreur(75)
  973: #   define d_ex_locales                         __erreur(76)
  974: #   define d_ex_representation                  __erreur(77)
  975: #   define d_ex_erreur_profilage                __erreur(78)
  976: #   define d_ex_enregistrement_inexistant       __erreur(79)
  977: #   define d_ex_clef_inexistante                __erreur(80)
  978: #   define d_ex_nom_implicite                   __erreur(81)
  979: #   define d_ex_version_bibliotheque            __erreur(82)
  980: #   define d_ex_creation_variable_globale       __erreur(83)
  981: #   define d_ex_erreur_interne_rplcas           __erreur(84)
  982: #   define d_ex_fichier_corrompu                __erreur(85)
  983: #   define d_ex_mutex_acquis_autre_thread       __erreur(86)
  984: #   define d_ex_expression_reguliere            __erreur(87)
  985: #   define d_ex_instruction_indisponible        __erreur(88)
  986: #   define d_ex_chiffrement                     __erreur(89)
  987: #   define d_ex_chiffrement_indisponible        __erreur(90)
  988: #   define d_ex_longueur_clef_chiffrement       __erreur(91)
  989: #   define d_ex_taille_message                  __erreur(92)
  990: #endif
  991: 
  992: 
  993: /*
  994: ================================================================================
  995:   STRUCTURES
  996: ================================================================================
  997: */
  998: 
  999: /*
 1000: --------------------------------------------------------------------------------
 1001:   Structure objet
 1002: --------------------------------------------------------------------------------
 1003: */
 1004: 
 1005: #ifdef MIN
 1006: #   undef MIN
 1007: #endif
 1008: 
 1009: #ifdef MAX
 1010: #   undef MAX
 1011: #endif
 1012: 
 1013: #define ADR __RPL_ADR
 1014: #define ALG __RPL_ALG
 1015: #define BIN __RPL_BIN
 1016: #define CHN __RPL_CHN
 1017: #define CPL __RPL_CPL
 1018: #define FCH __RPL_FCH
 1019: #define FCT __RPL_FCT
 1020: #define INT __RPL_INT
 1021: #define LST __RPL_LST
 1022: #define MCX __RPL_MCX
 1023: #define MIN __RPL_MIN
 1024: #define MRL __RPL_MRL
 1025: #define MTX __RPL_MTX
 1026: #define NOM __RPL_NOM
 1027: #define NON __RPL_NON
 1028: #define PRC __RPL_PRC
 1029: #define REC __RPL_REC
 1030: #define REL __RPL_REL
 1031: #define RPN __RPL_RPN
 1032: #define SCK __RPL_SCK
 1033: #define SLB __RPL_SLB
 1034: #define SPH __RPL_SPH
 1035: #define SQL __RPL_SQL
 1036: #define TBL __RPL_TBL
 1037: #define VCX __RPL_VCX
 1038: #define VIN __RPL_VIN
 1039: #define VRL __RPL_VRL
 1040: 
 1041: enum t_rplcas_commandes     { RPLCAS_INTEGRATION = 0, RPLCAS_LIMITE };
 1042: 
 1043: enum t_type     { ADR = 0, ALG, BIN, CHN, CPL, FCH, FCT, INT, LST,
 1044:                 MCX, MIN, MRL, MTX, NOM, NON, PRC, REC, REL, RPN, SCK,
 1045:                 SLB, SPH, SQL, TBL, VCX, VIN, VRL };
 1046: 
 1047:     /*
 1048:     ADR : adresse sur 64 bits signés.
 1049:             Adresse d'une définition à interpréter.
 1050: 
 1051:     ALG : expression algébrique (struct_liste_chainee *)
 1052:             La liste chaînée contient la définition convertie en notation
 1053:             polonaise inversée. Ce type diffère du type 'RPN' au niveau
 1054:             du format de sortie (notation algébrique).
 1055: 
 1056:     BIN : entier binaire sur 64 bits (unsigned integer8 *)
 1057:             Sans objet.
 1058:             Type C/Fortran : unsigned integer8
 1059: 
 1060:     CHN : chaine de caracteres (unsigned char *)
 1061:             Sans objet.
 1062: 
 1063:     CPL : complexe sur 2*64 bits (complex*16, struct_complexe16 *)
 1064:             Sans objet.
 1065:             Type C/Fortran : complex16
 1066: 
 1067:     FCH : descripteur de fichier (struct_fichier *).
 1068: 
 1069:     FCT : déclaration d'une fonction et de son nombre d'arguments
 1070:             (struct_fonction *). Ce type n'est nécessaire que dans le
 1071:             traitement des types 'ALG' et 'RPN'.
 1072: 
 1073:     INT : entier sur 64 bits (integer*8, integer8 *)
 1074:             Sans objet.
 1075:             Type C/Fortran : integer8
 1076: 
 1077:     LST : liste (struct_liste_chainee *)
 1078:             Les objets sont enregistrés sous forme de liste chaînée récursive.
 1079:             Cela permet de traiter des tableaux de données hétérogènes de
 1080:             grandes dimensions. Le nombre de dimensions maximal est fixé par
 1081:             la mémoire de la station.
 1082: 
 1083:     MCX : matrice de complexes (struct_matrice *)
 1084:             Sans objet.
 1085: 
 1086:     MIN : matrice d'entiers (struct_matrice *)
 1087:             Sans objet.
 1088: 
 1089:     MRL : matrice de reels (struct_matrice *)
 1090:             Sans objet.
 1091: 
 1092:     MTX : mutex (struct_mutex *)
 1093:             Sans objet.
 1094: 
 1095:     NOM : nom de variable (struct_nom *)
 1096:             Sans objet.
 1097: 
 1098:     PRC : processus (struct_processus_fils *)
 1099:             Sans objet.
 1100: 
 1101:     REL : reel sur 64 bits (real*8, real8 *)
 1102:             Sans objet.
 1103: 
 1104:     RPN : definition (struct_liste_chainee *)
 1105:             Ce type diffère du type 'ALG' au niveau du format de sortie
 1106:             (notation polonaise inversée).
 1107: 
 1108:     SCK : socket (struct_socket *)
 1109: 
 1110:     SLB : bibliothèque dynamique partagée (struct_bibliotheque *) 
 1111:             Sans objet.
 1112: 
 1113:     SPH : sémaphore nommé (struct_semaphore *)
 1114: 
 1115:     SQL : connecteur sur une base de données SQL (struct_connecteur_sql *)
 1116: 
 1117:     TBL : tableau multidimensionnel d'objets (struct_tableau *).
 1118: 
 1119:     VCX : vecteur de complexes (struct_vecteur *)
 1120:             Sans objet.
 1121: 
 1122:     VIN : vecteur d'entiers (struct_vecteur *)
 1123:             Sans objet.
 1124: 
 1125:     VRL : vecteur de reels (struct_vecteur *)
 1126:             Sans objet.
 1127:     */
 1128: 
 1129: typedef struct objet
 1130: {
 1131:     enum t_type         type;
 1132: 
 1133:     volatile long       nombre_occurrences;
 1134: 
 1135:     pthread_mutex_t     mutex;
 1136: 
 1137:     void                *objet;
 1138: } struct_objet;
 1139: 
 1140: 
 1141: /*
 1142: --------------------------------------------------------------------------------
 1143:   Structure fichier
 1144: --------------------------------------------------------------------------------
 1145: */
 1146: 
 1147: #ifndef RPLARGS
 1148: typedef struct fichier
 1149: {
 1150:     int                         descripteur;
 1151: 
 1152:     unsigned char               acces;          /* S/D/I */
 1153:     unsigned char               binaire;        /* Y/N/F */
 1154:     unsigned char               ouverture;
 1155:     unsigned char               protection;
 1156:     unsigned char               *nom;
 1157: 
 1158:     struct_objet                *format;
 1159: 
 1160:     pid_t                       pid;
 1161:     pthread_t                   tid;
 1162: 
 1163:     integer8                    position_clef;
 1164: } struct_fichier;
 1165: #endif
 1166: 
 1167: 
 1168: /*
 1169: --------------------------------------------------------------------------------
 1170:   Structure mutex
 1171: --------------------------------------------------------------------------------
 1172: */
 1173: 
 1174: #ifndef RPLARGS
 1175: typedef struct rpl_mutex
 1176: {
 1177:     pthread_mutex_t     mutex;
 1178:     pthread_t           tid;
 1179: } struct_mutex;
 1180: #endif
 1181: 
 1182: 
 1183: /*
 1184: --------------------------------------------------------------------------------
 1185:   Structure sémaphore
 1186: --------------------------------------------------------------------------------
 1187: */
 1188: 
 1189: #ifndef RPLARGS
 1190: typedef struct semaphore
 1191: {
 1192:     unsigned char   *nom;
 1193:     sem_t           *semaphore;
 1194: } struct_semaphore;
 1195: #endif
 1196: 
 1197: 
 1198: /*
 1199: --------------------------------------------------------------------------------
 1200:   Structure marque
 1201: --------------------------------------------------------------------------------
 1202: */
 1203: 
 1204: #ifndef RPLARGS
 1205: typedef struct marque
 1206: {
 1207:     unsigned char       *label;
 1208:     unsigned char       *position;
 1209: 
 1210:     struct marque       *suivant;
 1211: } struct_marque;
 1212: #endif
 1213: 
 1214: 
 1215: /*
 1216: --------------------------------------------------------------------------------
 1217:   Structure bibliothèque
 1218: --------------------------------------------------------------------------------
 1219: */
 1220: 
 1221: #ifndef RPLARGS
 1222: typedef struct bibliotheque
 1223: {
 1224:     void                        *descripteur;
 1225: 
 1226:     pid_t                       pid;
 1227:     pthread_t                   tid;
 1228: 
 1229:     unsigned char               *nom;
 1230: } struct_bibliotheque;
 1231: #endif
 1232: 
 1233: 
 1234: /*
 1235: --------------------------------------------------------------------------------
 1236:   Structure descripteur fichier
 1237: --------------------------------------------------------------------------------
 1238: */
 1239: 
 1240: #ifndef RPLARGS
 1241: typedef struct descripteur_fichier
 1242: {
 1243:     int                         identifiant;
 1244: 
 1245:     unsigned char               effacement;
 1246:     unsigned char               type; // C (file *) ou S (sqlite *)
 1247:     unsigned char               *nom;
 1248: 
 1249:     pid_t                       pid;
 1250:     pthread_t                   tid;
 1251: 
 1252:     union
 1253:     {
 1254:         file                    *descripteur_c;
 1255:         sqlite3                 *descripteur_sqlite;
 1256:     };
 1257: } struct_descripteur_fichier;
 1258: #endif
 1259: 
 1260: 
 1261: /*
 1262: --------------------------------------------------------------------------------
 1263:   Structure connecteur SQL
 1264: --------------------------------------------------------------------------------
 1265: */
 1266: 
 1267: #ifndef RPLARGS
 1268: typedef struct connecteur_sql
 1269: {
 1270:     pid_t                       pid;
 1271:     pthread_t                   tid;
 1272: 
 1273:     /*
 1274:      * "MYSQL"
 1275:      * "POSTGRESQL"
 1276:      */
 1277: 
 1278:     unsigned char               *type;
 1279:     unsigned char               *locale;
 1280: 
 1281:     union
 1282:     {
 1283: #       ifdef MYSQL_SUPPORT
 1284:             MYSQL               *mysql;
 1285: #       endif
 1286: #       ifdef POSTGRESQL_SUPPORT
 1287:             PGconn              *postgresql;
 1288: #       endif
 1289:         sqlite3                 *sqlite;
 1290:     } descripteur;
 1291: } struct_connecteur_sql;
 1292: #endif
 1293: 
 1294: #define sqlclose(s_objet) \
 1295:     if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type, "MYSQL") \
 1296:             == 0) \
 1297:         mysqlclose((*((struct_connecteur_sql *) (*s_objet).objet)) \
 1298:                 .descripteur); \
 1299:     else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type, \
 1300:             "POSTGRESQL") == 0) \
 1301:         postgresqlclose((*((struct_connecteur_sql *) (*s_objet).objet)) \
 1302:                 .descripteur); \
 1303:     else if (strcmp((*((struct_connecteur_sql *) (*s_objet).objet)).type, \
 1304:             "SQLITE") == 0) \
 1305:         sqlite3_close((*((struct_connecteur_sql *) (*s_objet).objet)) \
 1306:                 .descripteur.sqlite); \
 1307:     else \
 1308:         BUG(1, uprintf("SQL type '%s' not allowed!", \
 1309:                 (*((struct_connecteur_sql *) (*s_objet).objet)).type));
 1310: 
 1311: /*
 1312: --------------------------------------------------------------------------------
 1313:   Structure socket
 1314: --------------------------------------------------------------------------------
 1315: */
 1316: 
 1317: #ifndef RPLARGS
 1318: 
 1319: #   define                      d_BIND_TO_DEVICE        0
 1320: #   define                      d_BROADCAST             1
 1321: #   define                      d_DONT_ROUTE            2
 1322: #   define                      d_KEEP_ALIVE            3
 1323: #   define                      d_PRIORITY              4
 1324: #   define                      d_RECEIVE_BUFFER        5
 1325: #   define                      d_FORCE_RECEIVE_BUFFER  6
 1326: #   define                      d_SEND_BUFFER           7
 1327: #   define                      d_FORCE_SEND_BUFFER     8
 1328: #   define                      d_RECEIVING_TIMEOUT     9
 1329: #   define                      d_SENDING_TIMEOUT       10
 1330: #   define                      d_REUSE_ADDRESS         11
 1331: 
 1332: typedef struct socket
 1333: {
 1334:     int                         domaine;
 1335:     int                         socket;
 1336: 
 1337:     pid_t                       pid;
 1338:     pthread_t                   tid;
 1339: 
 1340:     unsigned char               *adresse;
 1341:     unsigned char               *adresse_distante;
 1342:     unsigned char               binaire;
 1343:     unsigned char               socket_en_ecoute;
 1344:     logical1                    socket_connectee;
 1345:     unsigned char               effacement;
 1346:     unsigned char               localisation;
 1347:     unsigned char               protection;
 1348:     unsigned char               type[19 + 1];
 1349: 
 1350:     integer8                    options;
 1351:     int                         priorite;
 1352:     int                         buffer_reception;
 1353:     int                         buffer_emission;
 1354:     int                         timeout_emission;
 1355:     int                         timeout_reception;
 1356: 
 1357:     struct_objet                *format;
 1358: } struct_socket;
 1359: #endif
 1360: 
 1361: /*
 1362: --------------------------------------------------------------------------------
 1363:   Structure liste chaînee
 1364: --------------------------------------------------------------------------------
 1365: */
 1366: 
 1367: typedef struct liste_chainee
 1368: {
 1369:     struct liste_chainee        *suivant;
 1370: 
 1371:     struct_objet                *donnee;
 1372: } struct_liste_chainee; 
 1373: 
 1374: 
 1375: /*
 1376: --------------------------------------------------------------------------------
 1377:   Structure de gestion des signaux en provenance de rplsignal
 1378: --------------------------------------------------------------------------------
 1379: */
 1380: 
 1381: #define d_NOMBRE_SIGNAUX                64
 1382: 
 1383: typedef struct gestion_signaux
 1384: {
 1385:     unsigned char               masque_signaux[d_NOMBRE_SIGNAUX];
 1386: 
 1387:     /*
 1388:      * 'I' : signal ignoré
 1389:      * 'Q' : signal mis en queue pour un traitement ultérieur
 1390:      * 'N' : traitement normal du signal
 1391:      */
 1392: 
 1393:     integer8                    queue_signaux[d_NOMBRE_SIGNAUX];
 1394:     integer8                    nombre_signaux_en_queue;
 1395:     struct_objet                *corps_signaux[d_NOMBRE_SIGNAUX];
 1396: 
 1397:     pthread_mutex_t             mutex;
 1398: } struct_gestion_signaux;
 1399: 
 1400: #ifndef MAIN_RPL
 1401: #   define __STATIC_GESTION_SIGNAUX__
 1402: #else
 1403: #   define __STATIC_GESTION_SIGNAUX__ = { .mutex = PTHREAD_MUTEX_INITIALIZER }
 1404: #endif
 1405: 
 1406: __EXTERN__ volatile struct_gestion_signaux signaux_externes
 1407:         __STATIC_GESTION_SIGNAUX__;
 1408: 
 1409: 
 1410: /*
 1411: --------------------------------------------------------------------------------
 1412:   Structure liste profilage
 1413: --------------------------------------------------------------------------------
 1414: */
 1415: 
 1416: typedef struct liste_profilage
 1417: {
 1418:     struct liste_profilage      *suivant;
 1419: 
 1420:     unsigned char               *fonction;
 1421: 
 1422:     struct timeval              dernier_appel;
 1423:     struct timeval              cumul;
 1424: 
 1425:     integer8                    nombre_appels;
 1426: } struct_liste_profilage; 
 1427: 
 1428: typedef struct liste_profilage2
 1429: {
 1430:     struct liste_profilage2     *suivant;
 1431: 
 1432:     unsigned char               *fonction;
 1433: } struct_liste_profilage2; 
 1434: 
 1435: /*
 1436: --------------------------------------------------------------------------------
 1437:   Structure contenant les fichiers graphiques (liste chaînée)
 1438: --------------------------------------------------------------------------------
 1439: */
 1440: 
 1441: #ifndef RPLARLS
 1442: typedef struct fichier_graphique
 1443: {
 1444:     struct fichier_graphique    *suivant;
 1445: 
 1446:     logical1                    presence_axes;
 1447: 
 1448:     unsigned char               *nom;
 1449:     unsigned char               type[21];
 1450: 
 1451:     unsigned char               *legende;
 1452: 
 1453:     int                         dimensions;
 1454: 
 1455:     integer8                    systeme_axes;
 1456: } struct_fichier_graphique;
 1457: #endif
 1458: 
 1459: /*
 1460: --------------------------------------------------------------------------------
 1461:   Structure nom
 1462: --------------------------------------------------------------------------------
 1463: */
 1464: 
 1465: typedef struct nom
 1466: {
 1467:     unsigned char               *nom;
 1468:     logical1                    symbole;    /* d_vrai/d_faux */
 1469:     // symbole == d_vrai signifie que le nom a été introduit dans un
 1470:     // calcul sans les apostrophes.
 1471: } struct_nom;
 1472: 
 1473: 
 1474: /*
 1475: --------------------------------------------------------------------------------
 1476:   Structure processus fils
 1477: --------------------------------------------------------------------------------
 1478: */
 1479: 
 1480: #ifndef RPLARGS
 1481: typedef struct descripteur_thread
 1482: {
 1483:     struct processus            *s_etat_processus;
 1484:     struct processus            *s_nouvel_etat_processus;
 1485: 
 1486:     struct_objet                *argument;
 1487: 
 1488:     pid_t                       pid;
 1489:     volatile pthread_t          tid;
 1490: 
 1491:     pthread_t                   thread_pere;
 1492: 
 1493:     pthread_mutex_t             mutex;
 1494:     pthread_mutex_t             mutex_nombre_references;
 1495: 
 1496:     volatile logical1           thread_actif;
 1497: 
 1498:     int                         pipe_erreurs[2];
 1499:     int                         pipe_objets[2];
 1500:     int                         pipe_injections[2];
 1501:     int                         pipe_nombre_injections[2];
 1502:     int                         pipe_interruptions[2];
 1503:     //  pipe_nombre_elements_attente == 0 => initialisation ou terminaison
 1504:     //  pipe_nombre_elements_attente == 1 => objet en attente
 1505:     //  pipe_nombre_elements_attente == 2 => interruption en attente
 1506:     int                         pipe_nombre_elements_attente[2];
 1507:     int                         pipe_acquittement[2];
 1508: 
 1509:     volatile integer8           nombre_objets_dans_pipe;
 1510:     volatile integer8           nombre_interruptions_dans_pipe;
 1511: 
 1512:     logical1                    processus_detache;
 1513:     logical1                    destruction_objet;
 1514: 
 1515:     volatile signed long        nombre_references;
 1516: } struct_descripteur_thread;
 1517: 
 1518: typedef struct processus_fils
 1519: {
 1520:     struct_descripteur_thread       *thread;
 1521: } struct_processus_fils;
 1522: #endif
 1523: 
 1524: 
 1525: /*
 1526: --------------------------------------------------------------------------------
 1527:   Structure liste pile systeme
 1528: --------------------------------------------------------------------------------
 1529: */
 1530: 
 1531: #ifndef RPLARGS
 1532: typedef struct liste_pile_systeme
 1533: {
 1534:     struct liste_pile_systeme   *suivant;
 1535: 
 1536:     struct_objet                *indice_boucle;
 1537:     struct_objet                *limite_indice_boucle;
 1538:     struct_objet                *objet_de_test;
 1539: 
 1540:     logical1                    arret_si_exception;
 1541:     logical1                    creation_variables_statiques;
 1542:     logical1                    creation_variables_partagees;
 1543:     logical1                    evaluation_expression;
 1544: 
 1545:     unsigned char               clause;
 1546: 
 1547:     /*
 1548:     clause :
 1549:     I : IF
 1550:     R : IFERR
 1551:     X : IFERR indiquant la présence d'une erreur.
 1552:     T : THEN
 1553:     E : ELSE
 1554:     Z : traitement en cours de ELSE
 1555:     D : DO
 1556:     U : UNTIL
 1557:     W : WHILE
 1558:     M : WHILE avec une clause fausse.
 1559:     S : SELECT
 1560:     K : aucun cas CASE n'a encore été traité.
 1561:     C : au moins un cas de SELECT...CASE a été traité.
 1562:     Q : traitement en cours d'un cas CASE.
 1563:     F : traitement du cas DEFAULT
 1564:     */
 1565: 
 1566:     unsigned char               retour_definition;
 1567:     unsigned char               *nom_variable;
 1568:     unsigned char               origine_routine_evaluation;
 1569:     unsigned char               type_cloture;
 1570: 
 1571:     /*
 1572:     type clôture :
 1573:     C     SELECT   : END termine un test SELECT/DEFAULT/END.
 1574:     D     DO       : END termine une boucle DO/UNTIL/END.
 1575:     I     IF       : END termine un test IF/THEN (ELSE)/END.
 1576:     J     IFERR    : END termine un test IFERR/THEN (ELSE)/END.
 1577:     K     CASE     : END termine un test CASE/THEN/END
 1578:     W     WHILE    : END termine une boucle WHILE/REPEAT/END.
 1579:     Q     CRITICAL : END termine une section critique CRITICAL/END
 1580: 
 1581:     F     FOR     : NEXT ou STEP termine une boucle avec compteur.
 1582:     S     START   : NEXT ou STEP termine une boucle sans compteur.
 1583:     L     LOOP    : boucle utilisé dans le traitement de l'instruction RETURN.
 1584:             Elle correspond à une boucle FOR ou START mais sans son
 1585:             initialisation.
 1586:     A     FORALL  : NEXT termine une boucle sur un objet.
 1587:     */
 1588: 
 1589:     integer8                    adresse_retour;
 1590:     integer8                    niveau_courant;
 1591:     struct_liste_chainee        *pointeur_objet_retour;
 1592: } struct_liste_pile_systeme;
 1593: #endif
 1594: 
 1595: 
 1596: /*
 1597: --------------------------------------------------------------------------------
 1598:   Structure variable
 1599: --------------------------------------------------------------------------------
 1600: */
 1601: 
 1602: #ifndef RPLARGS
 1603: typedef union position_variable
 1604: {
 1605:     integer8            adresse;
 1606:     struct_objet        *pointeur;
 1607: } union_position_variable;
 1608: 
 1609: typedef struct variable
 1610: {
 1611:     unsigned char           *nom;
 1612:     unsigned char           origine; // P(rogramme) ou E(valuation)
 1613: 
 1614:     integer8                niveau;
 1615: 
 1616:     union_position_variable variable_statique;
 1617:     union_position_variable variable_partagee;
 1618: 
 1619:     struct_objet            *objet;
 1620: 
 1621:     logical1                variable_verrouillee;
 1622: } struct_variable;
 1623: 
 1624: #endif
 1625: 
 1626: /*
 1627: --------------------------------------------------------------------------------
 1628:   Structure variable partagée
 1629: --------------------------------------------------------------------------------
 1630: */
 1631: 
 1632: #ifndef RPLARGS
 1633: 
 1634: typedef struct variable_partage
 1635: {
 1636:     unsigned char               *nom;
 1637:     unsigned char               origine;
 1638: 
 1639:     integer8                    niveau;
 1640: 
 1641:     union_position_variable     variable_partagee;
 1642: 
 1643:     struct_objet                *objet;
 1644: 
 1645:     pthread_mutex_t             mutex;
 1646: } struct_variable_partagee;
 1647: 
 1648: #endif
 1649: 
 1650: 
 1651: /*
 1652: --------------------------------------------------------------------------------
 1653:   Structure variable statique
 1654: --------------------------------------------------------------------------------
 1655: */
 1656: 
 1657: #ifndef RPLARGS
 1658: typedef struct variable_statique
 1659: {
 1660:     unsigned char           *nom;
 1661:     unsigned char           origine;
 1662: 
 1663:     // Position de création de la variable statique dans le programme ou dans
 1664:     // l'expression. 'origine' vaut 'P' pour programme ou 'E' pour expression.
 1665: 
 1666:     integer8                niveau;
 1667: 
 1668:     union_position_variable variable_statique;
 1669: 
 1670:     struct_objet            *objet;
 1671: } struct_variable_statique;
 1672: #endif
 1673: 
 1674: 
 1675: /*
 1676: --------------------------------------------------------------------------------
 1677:   Structure vecteur
 1678: --------------------------------------------------------------------------------
 1679: */
 1680: 
 1681: typedef struct vecteur
 1682: {
 1683:     integer8            taille;
 1684: 
 1685:     unsigned char       type; /* C (complex*16), R (real*8), I (integer*8) */
 1686: 
 1687:     void                *tableau;
 1688: } struct_vecteur;
 1689: 
 1690: 
 1691: /*
 1692: --------------------------------------------------------------------------------
 1693:   Structure matrice
 1694: --------------------------------------------------------------------------------
 1695: */
 1696: 
 1697: typedef struct matrice
 1698: {
 1699:     integer8            nombre_lignes;
 1700:     integer8            nombre_colonnes;
 1701: 
 1702:     unsigned char       type; /* C (complex*16), R (real*8), I (integer*8) */
 1703: 
 1704:     void                **tableau;
 1705: } struct_matrice;
 1706: 
 1707: 
 1708: /*
 1709: --------------------------------------------------------------------------------
 1710:   Structure tableau
 1711: --------------------------------------------------------------------------------
 1712: */
 1713: 
 1714: typedef struct tableau
 1715: {
 1716:     integer8            nombre_elements;
 1717: 
 1718:     struct_objet        **elements;
 1719: } struct_tableau;
 1720: 
 1721: 
 1722: /*
 1723: --------------------------------------------------------------------------------
 1724:   Structure arbre
 1725: --------------------------------------------------------------------------------
 1726: */
 1727: 
 1728: typedef struct arbre
 1729: {
 1730:     struct_liste_chainee        *feuille;
 1731: 
 1732:     integer8                    nombre_branches;
 1733:     struct arbre                **branches;
 1734: } struct_arbre;
 1735: 
 1736: 
 1737: /*
 1738: --------------------------------------------------------------------------------
 1739:   Structures de gestion des instructions externes
 1740: --------------------------------------------------------------------------------
 1741: */
 1742: 
 1743: typedef struct instruction_externe
 1744: {
 1745:     unsigned char       *nom;
 1746:     unsigned char       *nom_bibliotheque;
 1747:     void                *descripteur_bibliotheque;
 1748: } struct_instruction_externe;
 1749: 
 1750: 
 1751: /*
 1752: --------------------------------------------------------------------------------
 1753:   Structure argument (pour les fonctions dynamiques)
 1754: --------------------------------------------------------------------------------
 1755: */
 1756: 
 1757: typedef struct rpl_arguments
 1758: {
 1759: /* Piles operationnelles                                */
 1760: 
 1761:     struct_liste_chainee        *l_base_pile;
 1762:     struct_liste_chainee        *l_base_pile_last;
 1763: 
 1764: /* Etat du calculateur                                  */
 1765: 
 1766:     t_8_bits                    drapeaux_etat[8];
 1767: 
 1768: /* Traitement des erreurs                               */
 1769: 
 1770:     unsigned char               *message_erreur;
 1771:     unsigned char               type_erreur;            /* S = système
 1772:                                                            E = exécution */
 1773:     integer8                    erreur;
 1774: 
 1775: /* Traitement des messages d'aide                       */
 1776: 
 1777:     logical1                    aide;                   /* Affichage d'un
 1778:                                                            message d'aide
 1779:                                                            par la routine */
 1780: 
 1781: /* Nombre d'arguments                                   */
 1782: 
 1783:     unsigned char               affichage_arguments;
 1784:     unsigned char               constante_symbolique;
 1785:     unsigned char               instruction_valide;
 1786:     unsigned char               test_instruction;
 1787: 
 1788:     integer8                    nombre_arguments;
 1789:     // Nombre d'arguments de la fonction, positif ou nul.
 1790: 
 1791:     void                        *s_etat_processus;
 1792: } struct_rpl_arguments;
 1793: 
 1794: /*
 1795: --------------------------------------------------------------------------------
 1796:   Structure d'arbre des instructions intrinsèques
 1797: --------------------------------------------------------------------------------
 1798: */
 1799: 
 1800: #ifndef RPLARGS
 1801: typedef struct instruction
 1802: {
 1803:     struct instruction      **noeuds;
 1804:     void                    (*feuille)(struct processus *);
 1805: } struct_instruction;
 1806: #endif
 1807: 
 1808: /*
 1809: --------------------------------------------------------------------------------
 1810:   Structure d'arbre des variables globales et locales
 1811: --------------------------------------------------------------------------------
 1812: */
 1813: 
 1814: #ifndef RPLARGS
 1815: typedef struct arbre_variables
 1816: {
 1817:     unsigned int                        noeuds_utilises;
 1818:                                         // Nombre de noeuds utilisés dans le
 1819:                                         // tableau **noeuds
 1820:     signed int                          indice_tableau_pere;
 1821:                                         // Position de la structure dans le
 1822:                                         // tableau **noeuds du père
 1823: 
 1824:     struct arbre_variables              *noeud_pere;
 1825:     struct arbre_variables              **noeuds;
 1826: 
 1827:     struct liste_variables              *feuille;
 1828:     struct liste_variables_statiques    *feuille_statique;
 1829: } struct_arbre_variables;
 1830: 
 1831: typedef struct arbre_variables_partagees
 1832: {
 1833:     unsigned int                        noeuds_utilises;
 1834:                                         // Nombre de noeuds utilisés dans le
 1835:                                         // tableau **noeuds
 1836:     signed int                          indice_tableau_pere;
 1837:                                         // Position de la structure dans le
 1838:                                         // tableau **noeuds du père
 1839: 
 1840:     struct arbre_variables_partagees    *noeud_pere;
 1841:     struct arbre_variables_partagees    **noeuds;
 1842: 
 1843:     struct liste_variables_partagees    *feuille;
 1844: 
 1845:     pthread_mutex_t                     mutex_feuille;
 1846: } struct_arbre_variables_partagees;
 1847: 
 1848: #define INITIALISATION_MUTEX(mutex) \
 1849:     do { \
 1850:         pthread_mutexattr_t     attributs_mutex; \
 1851:         pthread_mutexattr_init(&attributs_mutex); \
 1852:         pthread_mutexattr_settype(&attributs_mutex, PTHREAD_MUTEX_RECURSIVE); \
 1853:         pthread_mutex_init(&(mutex), &attributs_mutex); \
 1854:         pthread_mutexattr_destroy(&attributs_mutex); \
 1855:     } while(0)
 1856: 
 1857: typedef struct tableau_variables
 1858: {
 1859:     unsigned char           origine;
 1860:     unsigned char           *nom;       // pointeur sur la struct_variable
 1861:                                         // réelle et non copie de la chaîne
 1862:     integer8                niveau;
 1863: 
 1864:     struct_objet            *objet;     // pointeur sur l'objet et non copie
 1865:                                         // de l'objet.
 1866: 
 1867:     logical1                variable_verrouillee;
 1868:     logical1                variable_masquee;
 1869:     pthread_mutex_t         *mutex;
 1870:     union_position_variable variable_statique;
 1871:     union_position_variable variable_partagee;
 1872: } struct_tableau_variables;
 1873: 
 1874: // La liste des variables est une liste doublement chaînée et circulaire.
 1875: typedef struct liste_variables
 1876: {
 1877:     union
 1878:     {
 1879:         // Utilisation dans la gestion des variables
 1880:         struct_variable                 *variable;
 1881:         // Utilisation dans la pile système (variables par niveau)
 1882:         struct_liste_chainee            *liste;
 1883:     };
 1884: 
 1885:     struct arbre_variables              *noeud_pere;
 1886:     struct arbre_variables              *noeud;
 1887:     struct liste_variables              *suivant;
 1888:     struct liste_variables              *precedent;
 1889: } struct_liste_variables;
 1890: 
 1891: // La liste des variables statiques et une liste double chaînée et non
 1892: // circulaire.
 1893: typedef struct liste_variables_statiques
 1894: {
 1895:     struct liste_variables_statiques    *suivant;
 1896:     struct liste_variables_statiques    *precedent;
 1897:     struct liste_variables_statiques    *reference;
 1898:     struct_arbre_variables              *feuille;
 1899:     struct_variable_statique            *variable;
 1900: } struct_liste_variables_statiques;
 1901: 
 1902: typedef struct liste_variables_partagees
 1903: {
 1904:     struct liste_variables_partagees    *suivant;
 1905:     struct liste_variables_partagees    *precedent;
 1906:     struct liste_variables_partagees    *reference;
 1907:     struct_arbre_variables_partagees    *feuille;
 1908:     struct_variable_partagee            *variable;
 1909:     pthread_t                           tid;
 1910:     pid_t                               pid;
 1911: } struct_liste_variables_partagees;
 1912: #endif
 1913: 
 1914: 
 1915: /*
 1916: --------------------------------------------------------------------------------
 1917:   Structure fonction
 1918: --------------------------------------------------------------------------------
 1919: */
 1920: 
 1921: #ifndef RPLARGS
 1922: typedef struct fonction
 1923: {
 1924:     unsigned char                       *nom_fonction;
 1925:     integer8                            nombre_arguments;
 1926: 
 1927:     void                                (*fonction)(struct processus *);
 1928: 
 1929:     volatile struct_liste_chainee       *prediction_saut;
 1930:     volatile logical1                   prediction_execution;
 1931: } struct_fonction;
 1932: #endif
 1933: 
 1934: 
 1935: /*
 1936: --------------------------------------------------------------------------------
 1937:   Structure buffer
 1938: --------------------------------------------------------------------------------
 1939: */
 1940: 
 1941: typedef struct buffer
 1942: {
 1943:     unsigned char                       *buffer;
 1944: 
 1945:     size_t                              longueur_requise;
 1946:     int                                 classe;
 1947: } struct_buffer;
 1948: 
 1949: 
 1950: /*
 1951: --------------------------------------------------------------------------------
 1952:   Structure processus
 1953: --------------------------------------------------------------------------------
 1954: */
 1955: 
 1956: #ifndef RPLARGS
 1957: typedef struct processus
 1958: {
 1959: /* Pointeurs sur le programme                           */
 1960: 
 1961:     unsigned char               *definitions_chainees;
 1962:     struct_liste_chainee        *expression_courante;
 1963: 
 1964:     unsigned char               *instruction_courante;
 1965:     struct_objet                *objet_courant;
 1966:     unsigned char               evaluation_expression_compilee;     /*Y/N*/
 1967: 
 1968:     unsigned char               *nom_fichier_source;
 1969:     unsigned char               *nom_fichier_historique;
 1970: 
 1971:     unsigned char               autorisation_conversion_chaine;     /*Y/N*/
 1972:     unsigned char               autorisation_empilement_programme;  /*Y/N*/
 1973:     unsigned char               autorisation_evaluation_nom;        /*Y/N*/
 1974:     unsigned char               autorisation_nom_implicite;         /*Y/N*/
 1975:     unsigned char               evaluation_forcee;                  /*Y/N*/
 1976:     unsigned char               instruction_valide;                 /*Y/N*/
 1977:     unsigned char               instruction_intrinseque;            /*Y/I/N*/
 1978:     unsigned char               instruction_sensible;               /*Y/N*/
 1979:     unsigned char               test_instruction;                   /*Y/N*/
 1980:     unsigned char               affichage_arguments;                /*Y/N*/
 1981:     unsigned char               constante_symbolique;               /*Y/N*/
 1982:     unsigned char               traitement_symbolique;              /*Y/N*/
 1983:     unsigned char               mode_execution_programme;           /*Y/I/N*/
 1984:     unsigned char               mode_interactif;                    /*Y/N*/
 1985:     unsigned char               mode_evaluation_expression;         /*Y/N*/
 1986:     unsigned char               traitement_cycle_exit;              /*N/E/C*/
 1987:     unsigned char               recherche_type;                     /*Y/N*/
 1988: 
 1989:     integer8                    position_courante;
 1990:     integer8                    longueur_definitions_chainees;
 1991: 
 1992: /* Pointeurs sur les instructions                       */
 1993: 
 1994:     int                         *pointeurs_caracteres;
 1995:     int                         nombre_caracteres;
 1996:     struct_instruction          *arbre_instructions;
 1997: 
 1998: /* Requetes                                             */
 1999: 
 2000:     unsigned char               requete_arret;                      /*Y/N*/
 2001: 
 2002: /* Piles operationnelles                                */
 2003: 
 2004:     struct_liste_chainee        *l_base_pile;
 2005:     struct_liste_chainee        *l_base_pile_last;
 2006: 
 2007:     integer8                    hauteur_pile_operationnelle;
 2008: 
 2009: /* Piles systemes                                       */
 2010: 
 2011:     struct_liste_pile_systeme   *l_base_pile_systeme;
 2012: 
 2013:     integer8                    hauteur_pile_systeme;
 2014: 
 2015: /* Gestion des processus                                */
 2016: 
 2017:     volatile
 2018:     struct_liste_chainee        *l_base_pile_processus;
 2019: 
 2020:     logical1                    presence_pipes;
 2021: 
 2022:     int                         pipe_acquittement;
 2023:     int                         pipe_donnees;
 2024:     int                         pipe_injections;
 2025:     int                         pipe_nombre_injections;
 2026:     int                         pipe_interruptions;
 2027:     int                         pipe_nombre_elements_attente;
 2028:     int                         nombre_objets_envoyes_non_lus;
 2029:     int                         nombre_objets_injectes;
 2030: 
 2031:     real8                       pourcentage_maximal_cpu;
 2032:     real8                       temps_maximal_cpu;
 2033: 
 2034:     logical1                    presence_fusible;
 2035:     pthread_t                   thread_fusible;
 2036:     pthread_t                   thread_surveille_par_fusible;
 2037:     pthread_t                   thread_signaux;
 2038:     int                         pipe_signaux[2];
 2039: 
 2040:     volatile int                pointeur_signal_ecriture;
 2041:     volatile int                pointeur_signal_lecture;
 2042:     volatile enum signaux_rpl   signaux_en_queue[LONGUEUR_QUEUE_SIGNAUX];
 2043:     volatile logical1           demarrage_fils;
 2044:     volatile logical1           redemarrage_processus;
 2045: 
 2046: /* Contextes                                            */
 2047: 
 2048:     struct_liste_chainee        *l_base_pile_contextes;
 2049:     struct_liste_chainee        *l_base_pile_taille_contextes;
 2050: 
 2051: /* Variables                                            */
 2052: 
 2053:     // La liste des variables par niveau est doublement chaînée.
 2054:     // À tout moment, elle pointe sur le niveau le plus haut existant et
 2055:     // l_liste_variable_par_niveau->precedent renvoie la liste des
 2056:     // définitions. l_liste_variable_par_niveau->precedent->precedent pointe
 2057:     // sur la liste des variables globales.
 2058:     //
 2059:     // À l'initialisation :
 2060:     // l_liste_variables_par_niveau->suivant == l_liste_variables_par_niveau
 2061:     // l_liste_variables_par_niveau->precedent == l_liste_variables_par_niveau
 2062: 
 2063:     struct_arbre_variables      *s_arbre_variables;
 2064:     struct_liste_variables      *l_liste_variables_par_niveau;
 2065:     struct_liste_variables_statiques
 2066:                                 *l_liste_variables_statiques;
 2067: 
 2068:     struct_arbre_variables_partagees
 2069:                                 **s_arbre_variables_partagees;
 2070:     struct_liste_variables_partagees
 2071:                                 **l_liste_variables_partagees;
 2072: 
 2073:     logical1                    niveau_supprime;
 2074: 
 2075:     struct_variable             *pointeur_variable_courante;
 2076:     struct_liste_variables      *pointeur_feuille_courante;
 2077:     struct_variable_statique    *pointeur_variable_statique_courante;
 2078:     struct_variable_partagee    *pointeur_variable_partagee_courante;
 2079: 
 2080:     int                         *pointeurs_caracteres_variables;
 2081:     int                         nombre_caracteres_variables;
 2082: 
 2083:     integer8                    niveau_courant;
 2084:     integer8                    niveau_initial;
 2085: 
 2086:     logical1                    creation_variables_statiques;
 2087:     logical1                    creation_variables_partagees;
 2088:     logical1                    gel_liste_variables;
 2089: 
 2090: /* Fichiers                                             */
 2091: 
 2092:     struct_liste_chainee        *s_fichiers;
 2093: 
 2094: /*  Sockets                                             */
 2095: 
 2096:     struct_liste_chainee        *s_sockets;
 2097: 
 2098: /*  Connecteurs aux bases de données                    */
 2099: 
 2100:     struct_liste_chainee        *s_connecteurs_sql;
 2101: 
 2102: /* Bibliothèques dynamiques                             */
 2103: 
 2104:     struct_liste_chainee        *s_bibliotheques;
 2105:     struct_instruction_externe  *s_instructions_externes;
 2106:     integer8                    nombre_instructions_externes;
 2107: 
 2108: /* Fichier d'impression                                 */
 2109: 
 2110:     unsigned char               *nom_fichier_impression;
 2111:     unsigned char               format_papier[16];
 2112: 
 2113: /* Parametres graphiques                                */
 2114: 
 2115:     struct_fichier_graphique    *fichiers_graphiques;    /* NULL */
 2116: 
 2117:     unsigned char               type_trace_eq[21];
 2118: 
 2119:                                 /*
 2120:                                  * 2D :
 2121:                                  * FONCTION
 2122:                                  * PARAMETRIQUE
 2123:                                  * POLAIRE
 2124:                                  * COURBES DE NIVEAU
 2125:                                  *
 2126:                                  * 3D :
 2127:                                  * GRILLE 3D
 2128:                                  * COURBE PARAMETRIQUE // A FAIRE
 2129:                                  * SURFACE PARAMETRIQUE // A FAIRE
 2130:                                  * CYNLINDRIQUE // A FAIRE
 2131:                                  * SPHERIQUE // A FAIRE
 2132:                                  */
 2133: 
 2134:     unsigned char               type_trace_sigma[21];
 2135: 
 2136:                                 /*
 2137:                                  * POINTS
 2138:                                  * HISTOGRAMME
 2139:                                  * TABLE TRACANTE
 2140:                                  */
 2141: 
 2142:                                 /*
 2143:                                  * ECHELLES
 2144:                                  */
 2145: 
 2146:     integer8                    systeme_axes;
 2147: 
 2148:     real8                       x_min;
 2149:     real8                       x_max;
 2150:     real8                       y_min;
 2151:     real8                       y_max;
 2152:     real8                       z_min;
 2153:     real8                       z_max;
 2154: 
 2155:     real8                       x_tics;
 2156:     real8                       y_tics;
 2157:     real8                       z_tics;
 2158:     
 2159:     integer8                    mx_tics;
 2160:     integer8                    my_tics;
 2161:     integer8                    mz_tics;
 2162: 
 2163:     logical1                    x_lines;
 2164:     logical1                    y_lines;
 2165:     logical1                    z_lines;
 2166: 
 2167:     logical1                    mx_lines;
 2168:     logical1                    my_lines;
 2169:     logical1                    mz_lines;
 2170: 
 2171:                                 /*
 2172:                                  * -1 : absent du graphique
 2173:                                  *  0 : graduations automatiques
 2174:                                  * >0 : valeur manuelle
 2175:                                  */
 2176: 
 2177:     real8                       x2_min;
 2178:     real8                       x2_max;
 2179:     real8                       y2_min;
 2180:     real8                       y2_max;
 2181:     real8                       z2_min;
 2182:     real8                       z2_max;
 2183: 
 2184:     real8                       x2_tics;
 2185:     real8                       y2_tics;
 2186:     real8                       z2_tics;
 2187: 
 2188:     integer8                    mx2_tics;
 2189:     integer8                    my2_tics;
 2190:     integer8                    mz2_tics;
 2191: 
 2192:     logical1                    x2_lines;
 2193:     logical1                    y2_lines;
 2194:     logical1                    z2_lines;
 2195: 
 2196:     logical1                    mx2_lines;
 2197:     logical1                    my2_lines;
 2198:     logical1                    mz2_lines;
 2199: 
 2200:     real8                       resolution;
 2201: 
 2202:     logical1                    souris_active;
 2203: 
 2204:     logical1                    echelle_automatique_x;
 2205:     logical1                    echelle_automatique_y;
 2206:     logical1                    echelle_automatique_z;
 2207: 
 2208:     logical1                    echelle_automatique_x2;
 2209:     logical1                    echelle_automatique_y2;
 2210:     logical1                    echelle_automatique_z2;
 2211: 
 2212:     logical1                    echelle_log_x;
 2213:     logical1                    echelle_log_y;
 2214:     logical1                    echelle_log_z;
 2215: 
 2216:     logical1                    echelle_log_x2;
 2217:     logical1                    echelle_log_y2;
 2218:     logical1                    echelle_log_z2;
 2219: 
 2220:     real8                       point_de_vue_theta;
 2221:     real8                       point_de_vue_phi;
 2222:     real8                       echelle_3D;
 2223: 
 2224:     unsigned char               *label_x;
 2225:     unsigned char               *label_y;
 2226:     unsigned char               *label_z;
 2227:     unsigned char               *titre;
 2228:     unsigned char               *legende;
 2229: 
 2230:     unsigned char               *nom_fichier_gnuplot;
 2231:     unsigned char               *type_fichier_gnuplot;
 2232: 
 2233:     struct_objet                *indep;
 2234:     struct_objet                *depend;
 2235:     struct_objet                *parametres_courbes_de_niveau;
 2236: 
 2237:     struct_marque               *s_marques;
 2238: 
 2239:     file                        *entree_standard;
 2240: 
 2241:     logical1                    requete_nouveau_plan;
 2242:     logical1                    mise_a_jour_trace_requise;
 2243: 
 2244: /* Parametres statistiques                              */
 2245: 
 2246:     integer8                    colonne_statistique_1;
 2247:     integer8                    colonne_statistique_2;
 2248: 
 2249: /* Etat du calculateur                                  */
 2250: 
 2251:     t_8_bits                    drapeaux_etat[8];
 2252: 
 2253: /* Traitement des exceptions                            */
 2254: 
 2255:     logical1                    arret_si_exception;
 2256:     int                         exception;
 2257:     int                         derniere_exception;
 2258:     int                         exception_processus_fils;
 2259: 
 2260: /* Traitement des erreurs                               */
 2261: 
 2262:     int                         erreur_compilation;
 2263:     volatile int                erreur_execution;
 2264:     volatile int                erreur_systeme;
 2265: 
 2266:     struct_objet                *s_objet_errone;
 2267:     struct_objet                *s_objet_erreur;
 2268: 
 2269:     logical1                    erreur_scrutation;
 2270: 
 2271:     volatile int                erreur_systeme_processus_fils;
 2272:     int                         erreur_execution_processus_fils;
 2273: 
 2274:     pid_t                       pid_erreur_processus_fils;
 2275: 
 2276:     logical1                    erreur_processus_fils;
 2277: 
 2278:     integer8                    derniere_erreur_fonction_externe;
 2279: 
 2280:     int                         derniere_erreur_systeme;
 2281:     int                         derniere_erreur_execution;
 2282:     int                         derniere_erreur_evaluation;
 2283: 
 2284:     unsigned char               *instruction_derniere_erreur;
 2285: 
 2286:     integer8                    niveau_derniere_erreur;
 2287: 
 2288:     logical1                    core;
 2289:     logical1                    invalidation_message_erreur;
 2290: 
 2291: /* Debug                                                */
 2292: 
 2293:     logical1                    debug;
 2294:     logical8                    type_debug;
 2295:     logical1                    debug_programme;
 2296:     logical1                    execution_pas_suivant;
 2297:     logical1                    traitement_instruction_halt;
 2298: 
 2299: /* Interruptions logicielles                            */
 2300: 
 2301:     unsigned char               masque_interruptions[d_NOMBRE_INTERRUPTIONS];
 2302: 
 2303:     /*
 2304:      * 'I' : interruption ignorée
 2305:      * 'Q' : interruption mise en queue pour un traitement ultérieur
 2306:      * 'N' : traitement normal de l'interruption
 2307:      */
 2308: 
 2309:     integer8                    queue_interruptions[d_NOMBRE_INTERRUPTIONS];
 2310:     integer8                    nombre_interruptions_en_queue;
 2311:     struct_liste_chainee        *pile_origine_interruptions
 2312:                                         [d_NOMBRE_INTERRUPTIONS];
 2313:     volatile integer8           nombre_interruptions_non_affectees;
 2314: 
 2315:     struct_objet                *corps_interruptions[d_NOMBRE_INTERRUPTIONS];
 2316: 
 2317:     unsigned char               traitement_interruption;  /* Y/N */
 2318:     unsigned char               traitement_interruptible; /* Y/N */
 2319:     unsigned char               traitement_at_poke;       /* Y/N */
 2320: 
 2321:     struct_objet                *at_exit;
 2322:     struct_objet                *at_poke;
 2323: 
 2324: /* Variables volatiles                                  */
 2325: 
 2326:     volatile sig_atomic_t       var_volatile_alarme;
 2327:     // Traitement de ctrl+C et des arrêts brutaux
 2328:     volatile sig_atomic_t       var_volatile_requete_arret;
 2329:     // Traitement de ctrl+Z
 2330:     volatile sig_atomic_t       var_volatile_requete_arret2;
 2331:     volatile sig_atomic_t       var_volatile_traitement_retarde_stop;
 2332:     volatile sig_atomic_t       var_volatile_traitement_sigint;
 2333: 
 2334:     volatile sig_atomic_t       var_volatile_processus_racine;
 2335:     volatile sig_atomic_t       var_volatile_processus_pere;
 2336:     volatile sig_atomic_t       var_volatile_recursivite;
 2337: 
 2338:     volatile sig_atomic_t       arret_depuis_abort;
 2339: 
 2340:     volatile int                var_volatile_exception_gsl;
 2341: 
 2342: /* Autres                                               */
 2343: 
 2344:     char                        *rpl_home;
 2345: 
 2346:     gsl_rng                     *generateur_aleatoire;
 2347:     const gsl_rng_type          *type_generateur_aleatoire;
 2348: 
 2349:     void                        *contexte_cas;
 2350: 
 2351:     integer8                    nombre_arguments;
 2352: 
 2353:     /*
 2354:      * Il s'agit du nombre d'arguments utilisé pour l'évaluation
 2355:      * des expressions algébriques.
 2356:      * -1 : la fonction ne peut être dans un objet de type ALG.
 2357:      * -2 : nombre d'arguments inconnu
 2358:      *  0 : la fonction doit apparaître en notation infixe
 2359:      * >0 : la fonction apparaît comme une fonction normale
 2360:      */
 2361: 
 2362:     logical1                    lancement_interactif;
 2363: 
 2364:     unsigned char               *chemin_fichiers_temporaires;
 2365:     unsigned char               langue;
 2366:     unsigned char               retour_routine_evaluation;
 2367:     unsigned char               *localisation;
 2368: 
 2369:     integer8                    niveau_recursivite;
 2370: 
 2371:     pid_t                       pid_processus_pere;
 2372:     pthread_t                   tid_processus_pere;
 2373:     pthread_t                   tid;
 2374: 
 2375:     logical1                    processus_detache;
 2376: 
 2377:     enum t_type                 type_en_cours;
 2378: 
 2379: /* Profilage                                            */
 2380: 
 2381:     logical1                    profilage;
 2382:     int                         niveau_profilage;
 2383:     struct_liste_profilage      *pile_profilage;
 2384:     struct_liste_profilage2     *pile_profilage_fonctions;
 2385:     struct timeval              horodatage_profilage;
 2386: 
 2387:     pthread_mutex_t             mutex_allocation;
 2388:     pthread_mutex_t             mutex_allocation_buffer;
 2389:     pthread_mutex_t             mutex_interruptions;
 2390:     pthread_mutex_t             mutex_pile_processus;
 2391:     pthread_mutex_t             mutex_signaux;
 2392: 
 2393:     // Mutex autorisant les fork()
 2394:     sem_t __PTR__               semaphore_fork;
 2395: 
 2396: /* Mutexes                                          */
 2397: 
 2398:     struct_liste_chainee        *liste_mutexes;
 2399:     pthread_mutex_t             protection_liste_mutexes;
 2400:     unsigned int                sections_critiques;
 2401: 
 2402: /* Variable d'initialisation pour SCHED             */
 2403: 
 2404:     logical1                    initialisation_scheduler;
 2405: 
 2406: /* Drapeau nécessaire à RESTART                     */
 2407: 
 2408:     volatile logical1           requete_redemarrage;
 2409: 
 2410: /* Gestion optimisée de la mémoire                  */
 2411: 
 2412:     double                      estimation_taille_pile_tampon;
 2413:     integer8                    taille_pile_tampon;
 2414:     struct_liste_chainee        *pile_tampon;
 2415: 
 2416:     double                      estimation_taille_pile_systeme_tampon;
 2417:     integer8                    taille_pile_systeme_tampon;
 2418:     struct_liste_pile_systeme   *pile_systeme_tampon;
 2419: 
 2420:     integer8                    taille_pile_objets;
 2421:     struct_objet                *pile_objets;
 2422: 
 2423: #   define TAILLE_CACHE         1024
 2424: #   define CACHE(type, nom) \
 2425:     type                        *objets_##nom[TAILLE_CACHE]; \
 2426:     volatile int                pointeur_##nom;
 2427: 
 2428: #   define CACHE2(type, nom) \
 2429:     type                        *nom[TAILLE_CACHE]; \
 2430:     volatile int                pointeur_##nom;
 2431: 
 2432:     CACHE(integer8, adr)
 2433:     CACHE(logical8, bin)
 2434:     CACHE(complex16, cpl)
 2435:     CACHE(struct_fonction, fct)
 2436:     CACHE(integer8, int)
 2437:     CACHE(struct_matrice, mat)
 2438:     CACHE(struct_nom, nom)
 2439:     CACHE(real8, rel)
 2440:     CACHE(struct_tableau, tab)
 2441:     CACHE(struct_vecteur, vec)
 2442: 
 2443:     CACHE2(struct_liste_chainee, maillons)
 2444:     CACHE2(struct_arbre_variables, variables_noeud)
 2445:     CACHE2(struct_arbre_variables_partagees, variables_partagees_noeud)
 2446:     CACHE2(struct_liste_variables, variables_feuille)
 2447:     CACHE2(struct_variable, variables_variable)
 2448:     CACHE2(struct_arbre_variables *, variables_tableau_noeuds)
 2449:     CACHE2(struct_arbre_variables_partagees *,
 2450:             variables_tableau_noeuds_partages)
 2451: 
 2452:     CACHE2(struct_buffer, enveloppes_buffers)
 2453:     unsigned char       ***cache_buffer;
 2454:     int                 *pointeur_cache_buffer;
 2455: } struct_processus;
 2456: #endif
 2457: 
 2458: 
 2459: /*
 2460: ================================================================================
 2461:   MISE EN PLACE DE L'ALLOCATEUR SPÉCIFIQUE
 2462: ================================================================================*/
 2463: 
 2464: #ifndef DEBUG_MEMOIRE
 2465: #   define malloc(a)            rpl_malloc(s_etat_processus, a)
 2466: #   define realloc(a, b)        rpl_realloc(s_etat_processus, a, b)
 2467: #   define free(a)              rpl_free(s_etat_processus, a)
 2468: #endif
 2469: 
 2470: void *rpl_malloc(struct_processus *s_etat_processus, size_t s);
 2471: void *rpl_realloc(struct_processus *s_etat_processus, void *ptr, size_t s);
 2472: void rpl_free(struct_processus *s_etat_processus, void *ptr);
 2473: void *sys_malloc(size_t s);
 2474: void *sys_realloc(void *ptr, size_t s);
 2475: void sys_free(void *ptr);
 2476: 
 2477: /*
 2478:  * Wrapper de readline() pour que la fonction renvoie un pointeur sur un
 2479:  * buffer alloué par rpl_malloc().
 2480:  */
 2481: 
 2482: #define readline(s) readline_wrapper(s_etat_processus, s)
 2483: unsigned char *readline_wrapper(struct_processus *s_etat_processus,
 2484:         unsigned char *s);
 2485: 
 2486: 
 2487: /*
 2488: ================================================================================
 2489:   PROTOTYPES
 2490: ================================================================================
 2491: */
 2492: 
 2493: /*
 2494: --------------------------------------------------------------------------------
 2495:   Procédures d'exécution des mots-clef du langage RPL/2
 2496: --------------------------------------------------------------------------------
 2497: */
 2498: 
 2499: // BEGIN C PROTOTYPES
 2500: void instruction_sensible_e(struct_processus *s_etat_processus);
 2501: void instruction_sensible_i(struct_processus *s_etat_processus);
 2502: void instruction_sensible_infinity(struct_processus *s_etat_processus);
 2503: 
 2504: void instruction_abort(struct_processus *s_etat_processus);
 2505: void instruction_abs(struct_processus *s_etat_processus);
 2506: void instruction_acos(struct_processus *s_etat_processus);
 2507: void instruction_acosh(struct_processus *s_etat_processus);
 2508: void instruction_alarm(struct_processus *s_etat_processus);
 2509: void instruction_alog(struct_processus *s_etat_processus);
 2510: void instruction_and(struct_processus *s_etat_processus);
 2511: void instruction_append(struct_processus *s_etat_processus);
 2512: void instruction_array_fleche(struct_processus *s_etat_processus);
 2513: void instruction_arg(struct_processus *s_etat_processus);
 2514: void instruction_asin(struct_processus *s_etat_processus);
 2515: void instruction_asinh(struct_processus *s_etat_processus);
 2516: void instruction_asl(struct_processus *s_etat_processus);
 2517: void instruction_asr(struct_processus *s_etat_processus);
 2518: void instruction_atan(struct_processus *s_etat_processus);
 2519: void instruction_atanh(struct_processus *s_etat_processus);
 2520: void instruction_atexit(struct_processus *s_etat_processus);
 2521: void instruction_atpoke(struct_processus *s_etat_processus);
 2522: void instruction_autoscale(struct_processus *s_etat_processus);
 2523: void instruction_axes(struct_processus *s_etat_processus);
 2524: 
 2525: void instruction_b_vers_r(struct_processus *s_etat_processus);
 2526: void instruction_backspace(struct_processus *s_etat_processus);
 2527: void instruction_backtrace(struct_processus *s_etat_processus);
 2528: void instruction_beep(struct_processus *s_etat_processus);
 2529: void instruction_bessel(struct_processus *s_etat_processus);
 2530: void instruction_bin(struct_processus *s_etat_processus);
 2531: 
 2532: void instruction_c_vers_r(struct_processus *s_etat_processus);
 2533: void instruction_case(struct_processus *s_etat_processus);
 2534: void instruction_ceil(struct_processus *s_etat_processus);
 2535: void instruction_centr(struct_processus *s_etat_processus);
 2536: void instruction_cf(struct_processus *s_etat_processus);
 2537: void instruction_chr(struct_processus *s_etat_processus);
 2538: void instruction_cipher(struct_processus *s_etat_processus);
 2539: void instruction_clear(struct_processus *s_etat_processus);
 2540: void instruction_cllcd(struct_processus *s_etat_processus);
 2541: void instruction_clmf(struct_processus *s_etat_processus);
 2542: void instruction_close(struct_processus *s_etat_processus);
 2543: void instruction_clratexit(struct_processus *s_etat_processus);
 2544: void instruction_clratpoke(struct_processus *s_etat_processus);
 2545: void instruction_clrcntxt(struct_processus *s_etat_processus);
 2546: void instruction_clrerr(struct_processus *s_etat_processus);
 2547: void instruction_clrfuse(struct_processus *s_etat_processus);
 2548: void instruction_clrmtx(struct_processus *s_etat_processus);
 2549: void instruction_clrsmphr(struct_processus *s_etat_processus);
 2550: void instruction_clrswi(struct_processus *s_etat_processus);
 2551: void instruction_cls(struct_processus *s_etat_processus);
 2552: void instruction_clusr(struct_processus *s_etat_processus);
 2553: void instruction_cnrm(struct_processus *s_etat_processus);
 2554: void instruction_cols(struct_processus *s_etat_processus);
 2555: void instruction_col_fleche(struct_processus *s_etat_processus);
 2556: void instruction_col_moins(struct_processus *s_etat_processus);
 2557: void instruction_col_plus(struct_processus *s_etat_processus);
 2558: void instruction_comb(struct_processus *s_etat_processus);
 2559: void instruction_compress(struct_processus *s_etat_processus);
 2560: void instruction_con(struct_processus *s_etat_processus);
 2561: void instruction_cond(struct_processus *s_etat_processus);
 2562: void instruction_cont(struct_processus *s_etat_processus);
 2563: void instruction_continue(struct_processus *s_etat_processus);
 2564: void instruction_conj(struct_processus *s_etat_processus);
 2565: void instruction_convert(struct_processus *s_etat_processus);
 2566: void instruction_copy(struct_processus *s_etat_processus);
 2567: void instruction_copyright(struct_processus *s_etat_processus);
 2568: void instruction_corr(struct_processus *s_etat_processus);
 2569: void instruction_cos(struct_processus *s_etat_processus);
 2570: void instruction_cosh(struct_processus *s_etat_processus);
 2571: void instruction_cov(struct_processus *s_etat_processus);
 2572: void instruction_cr(struct_processus *s_etat_processus);
 2573: void instruction_create(struct_processus *s_etat_processus);
 2574: void instruction_critical(struct_processus *s_etat_processus);
 2575: void instruction_crmtx(struct_processus *s_etat_processus);
 2576: void instruction_cross(struct_processus *s_etat_processus);
 2577: void instruction_crsmphr(struct_processus *s_etat_processus);
 2578: void instruction_crtab(struct_processus *s_etat_processus);
 2579: void instruction_cstop(struct_processus *s_etat_processus);
 2580: void instruction_cswp(struct_processus *s_etat_processus);
 2581: void instruction_currenc(struct_processus *s_etat_processus);
 2582: void instruction_cycle(struct_processus *s_etat_processus);
 2583: 
 2584: void instruction_d_vers_r(struct_processus *s_etat_processus);
 2585: void instruction_daemonize(struct_processus *s_etat_processus);
 2586: void instruction_date(struct_processus *s_etat_processus);
 2587: void instruction_dec(struct_processus *s_etat_processus);
 2588: void instruction_decr(struct_processus *s_etat_processus);
 2589: void instruction_default(struct_processus *s_etat_processus);
 2590: void instruction_deg(struct_processus *s_etat_processus);
 2591: void instruction_delete(struct_processus *s_etat_processus);
 2592: void instruction_depnd(struct_processus *s_etat_processus);
 2593: void instruction_depth(struct_processus *s_etat_processus);
 2594: void instruction_der(struct_processus *s_etat_processus);
 2595: void instruction_det(struct_processus *s_etat_processus);
 2596: void instruction_detach(struct_processus *s_etat_processus);
 2597: void instruction_dft(struct_processus *s_etat_processus);
 2598: void instruction_dgtiz(struct_processus *s_etat_processus);
 2599: void instruction_diag_fleche(struct_processus *s_etat_processus);
 2600: void instruction_digest(struct_processus *s_etat_processus);
 2601: void instruction_disp(struct_processus *s_etat_processus);
 2602: void instruction_division(struct_processus *s_etat_processus);
 2603: void instruction_do(struct_processus *s_etat_processus);
 2604: void instruction_dot(struct_processus *s_etat_processus);
 2605: void instruction_draw(struct_processus *s_etat_processus);
 2606: void instruction_drax(struct_processus *s_etat_processus);
 2607: void instruction_drop(struct_processus *s_etat_processus);
 2608: void instruction_drop2(struct_processus *s_etat_processus);
 2609: void instruction_dropcntxt(struct_processus *s_etat_processus);
 2610: void instruction_dropn(struct_processus *s_etat_processus);
 2611: void instruction_drws(struct_processus *s_etat_processus);
 2612: void instruction_dup(struct_processus *s_etat_processus);
 2613: void instruction_dup2(struct_processus *s_etat_processus);
 2614: void instruction_dupcntxt(struct_processus *s_etat_processus);
 2615: void instruction_dupn(struct_processus *s_etat_processus);
 2616: 
 2617: void instruction_e(struct_processus *s_etat_processus);
 2618: void instruction_edit(struct_processus *s_etat_processus);
 2619: void instruction_egalite(struct_processus *s_etat_processus);
 2620: void instruction_egv(struct_processus *s_etat_processus);
 2621: void instruction_egvl(struct_processus *s_etat_processus);
 2622: void instruction_else(struct_processus *s_etat_processus);
 2623: void instruction_elseif(struct_processus *s_etat_processus);
 2624: void instruction_end(struct_processus *s_etat_processus);
 2625: void instruction_eng(struct_processus *s_etat_processus);
 2626: void instruction_epsilon(struct_processus *s_etat_processus);
 2627: void instruction_eqv(struct_processus *s_etat_processus);
 2628: void instruction_erase(struct_processus *s_etat_processus);
 2629: void instruction_errm(struct_processus *s_etat_processus);
 2630: void instruction_errn(struct_processus *s_etat_processus);
 2631: void instruction_eval(struct_processus *s_etat_processus);
 2632: void instruction_exget(struct_processus *s_etat_processus);
 2633: void instruction_exit(struct_processus *s_etat_processus);
 2634: void instruction_exp(struct_processus *s_etat_processus);
 2635: void instruction_expm(struct_processus *s_etat_processus);
 2636: void instruction_exsub(struct_processus *s_etat_processus);
 2637: void instruction_externals(struct_processus *s_etat_processus);
 2638: void instruction_eyept(struct_processus *s_etat_processus);
 2639: 
 2640: void instruction_fact(struct_processus *s_etat_processus);
 2641: void instruction_false(struct_processus *s_etat_processus);
 2642: void instruction_fc_test(struct_processus *s_etat_processus);
 2643: void instruction_fc_test_c(struct_processus *s_etat_processus);
 2644: void instruction_fc_test_s(struct_processus *s_etat_processus);
 2645: void instruction_fft(struct_processus *s_etat_processus);
 2646: void instruction_fix(struct_processus *s_etat_processus);
 2647: void instruction_fleche(struct_processus *s_etat_processus);
 2648: void instruction_fleche_array(struct_processus *s_etat_processus);
 2649: void instruction_fleche_col(struct_processus *s_etat_processus);
 2650: void instruction_fleche_diag(struct_processus *s_etat_processus);
 2651: void instruction_fleche_hms(struct_processus *s_etat_processus);
 2652: void instruction_fleche_lcd(struct_processus *s_etat_processus);
 2653: void instruction_fleche_list(struct_processus *s_etat_processus);
 2654: void instruction_fleche_num(struct_processus *s_etat_processus);
 2655: void instruction_fleche_q(struct_processus *s_etat_processus);
 2656: void instruction_fleche_row(struct_processus *s_etat_processus);
 2657: void instruction_fleche_str(struct_processus *s_etat_processus);
 2658: void instruction_fleche_table(struct_processus *s_etat_processus);
 2659: void instruction_floor(struct_processus *s_etat_processus);
 2660: void instruction_for(struct_processus *s_etat_processus);
 2661: void instruction_forall(struct_processus *s_etat_processus);
 2662: void instruction_format(struct_processus *s_etat_processus);
 2663: void instruction_fp(struct_processus *s_etat_processus);
 2664: void instruction_fs_test(struct_processus *s_etat_processus);
 2665: void instruction_fs_test_c(struct_processus *s_etat_processus);
 2666: void instruction_fs_test_s(struct_processus *s_etat_processus);
 2667: void instruction_function(struct_processus *s_etat_processus);
 2668: void instruction_fuse(struct_processus *s_etat_processus);
 2669: 
 2670: void instruction_gamma(struct_processus *s_etat_processus);
 2671: void instruction_ge(struct_processus *s_etat_processus);
 2672: void instruction_gegv(struct_processus *s_etat_processus);
 2673: void instruction_gegvl(struct_processus *s_etat_processus);
 2674: void instruction_get(struct_processus *s_etat_processus);
 2675: void instruction_getc(struct_processus *s_etat_processus);
 2676: void instruction_geti(struct_processus *s_etat_processus);
 2677: void instruction_getr(struct_processus *s_etat_processus);
 2678: void instruction_glegv(struct_processus *s_etat_processus);
 2679: void instruction_gregv(struct_processus *s_etat_processus);
 2680: void instruction_gt(struct_processus *s_etat_processus);
 2681: 
 2682: void instruction_halt(struct_processus *s_etat_processus);
 2683: void instruction_head(struct_processus *s_etat_processus);
 2684: void instruction_help(struct_processus *s_etat_processus);
 2685: void instruction_hex(struct_processus *s_etat_processus);
 2686: void instruction_histogram(struct_processus *s_etat_processus);
 2687: void instruction_hms_fleche(struct_processus *s_etat_processus);
 2688: void instruction_hms_moins(struct_processus *s_etat_processus);
 2689: void instruction_hms_plus(struct_processus *s_etat_processus);
 2690: 
 2691: void instruction_i(struct_processus *s_etat_processus);
 2692: void instruction_idft(struct_processus *s_etat_processus);
 2693: void instruction_idn(struct_processus *s_etat_processus);
 2694: void instruction_if(struct_processus *s_etat_processus);
 2695: void instruction_iferr(struct_processus *s_etat_processus);
 2696: void instruction_ifft(struct_processus *s_etat_processus);
 2697: void instruction_ift(struct_processus *s_etat_processus);
 2698: void instruction_ifte(struct_processus *s_etat_processus);
 2699: void instruction_im(struct_processus *s_etat_processus);
 2700: void instruction_implicit(struct_processus *s_etat_processus);
 2701: void instruction_in(struct_processus *s_etat_processus);
 2702: void instruction_incr(struct_processus *s_etat_processus);
 2703: void instruction_indep(struct_processus *s_etat_processus);
 2704: void instruction_input(struct_processus *s_etat_processus);
 2705: void instruction_infinity(struct_processus *s_etat_processus);
 2706: void instruction_inquire(struct_processus *s_etat_processus);
 2707: void instruction_int(struct_processus *s_etat_processus);
 2708: void instruction_interrupt(struct_processus *s_etat_processus);
 2709: void instruction_inv(struct_processus *s_etat_processus);
 2710: void instruction_ip(struct_processus *s_etat_processus);
 2711: void instruction_iswi(struct_processus *s_etat_processus);
 2712: void instruction_itrace(struct_processus *s_etat_processus);
 2713: 
 2714: void instruction_jdate(struct_processus *s_etat_processus);
 2715: 
 2716: void instruction_key(struct_processus *s_etat_processus);
 2717: void instruction_keylabel(struct_processus *s_etat_processus);
 2718: void instruction_keytitle(struct_processus *s_etat_processus);
 2719: void instruction_kill(struct_processus *s_etat_processus);
 2720: void instruction_kind(struct_processus *s_etat_processus);
 2721: 
 2722: void instruction_label(struct_processus *s_etat_processus);
 2723: void instruction_last(struct_processus *s_etat_processus);
 2724: void instruction_lcase(struct_processus *s_etat_processus);
 2725: void instruction_lcd_fleche(struct_processus *s_etat_processus);
 2726: void instruction_lchol(struct_processus *s_etat_processus);
 2727: void instruction_le(struct_processus *s_etat_processus);
 2728: void instruction_legv(struct_processus *s_etat_processus);
 2729: void instruction_limit(struct_processus *s_etat_processus);
 2730: void instruction_line(struct_processus *s_etat_processus);
 2731: void instruction_list_fleche(struct_processus *s_etat_processus);
 2732: void instruction_ln(struct_processus *s_etat_processus);
 2733: void instruction_lnp1(struct_processus *s_etat_processus);
 2734: void instruction_localization(struct_processus *s_etat_processus);
 2735: void instruction_lock(struct_processus *s_etat_processus);
 2736: void instruction_log(struct_processus *s_etat_processus);
 2737: void instruction_logger(struct_processus *s_etat_processus);
 2738: void instruction_logscale(struct_processus *s_etat_processus);
 2739: void instruction_lq(struct_processus *s_etat_processus);
 2740: void instruction_lsq(struct_processus *s_etat_processus);
 2741: void instruction_lt(struct_processus *s_etat_processus);
 2742: void instruction_lu(struct_processus *s_etat_processus);
 2743: void instruction_l_vers_t(struct_processus *s_etat_processus);
 2744: 
 2745: void instruction_mant(struct_processus *s_etat_processus);
 2746: void instruction_mark(struct_processus *s_etat_processus);
 2747: void instruction_max(struct_processus *s_etat_processus);
 2748: void instruction_maxs(struct_processus *s_etat_processus);
 2749: void instruction_mclrin(struct_processus *s_etat_processus);
 2750: void instruction_mean(struct_processus *s_etat_processus);
 2751: void instruction_mem(struct_processus *s_etat_processus);
 2752: void instruction_memlock(struct_processus *s_etat_processus);
 2753: void instruction_memunlock(struct_processus *s_etat_processus);
 2754: void instruction_min(struct_processus *s_etat_processus);
 2755: void instruction_mins(struct_processus *s_etat_processus);
 2756: void instruction_mod(struct_processus *s_etat_processus);
 2757: void instruction_moins(struct_processus *s_etat_processus);
 2758: void instruction_mtxlock(struct_processus *s_etat_processus);
 2759: void instruction_mtxstatus(struct_processus *s_etat_processus);
 2760: void instruction_mtxtrylock(struct_processus *s_etat_processus);
 2761: void instruction_mtxunlock(struct_processus *s_etat_processus);
 2762: void instruction_multiplication(struct_processus *s_etat_processus);
 2763: 
 2764: void instruction_ne(struct_processus *s_etat_processus);
 2765: void instruction_neg(struct_processus *s_etat_processus);
 2766: void instruction_next(struct_processus *s_etat_processus);
 2767: void instruction_newplane(struct_processus *s_etat_processus);
 2768: void instruction_not(struct_processus *s_etat_processus);
 2769: void instruction_nrand(struct_processus *s_etat_processus);
 2770: void instruction_nrproc(struct_processus *s_etat_processus);
 2771: void instruction_ns(struct_processus *s_etat_processus);
 2772: void instruction_num(struct_processus *s_etat_processus);
 2773: 
 2774: void instruction_obget(struct_processus *s_etat_processus);
 2775: void instruction_obsub(struct_processus *s_etat_processus);
 2776: void instruction_oct(struct_processus *s_etat_processus);
 2777: void instruction_open(struct_processus *s_etat_processus);
 2778: void instruction_or(struct_processus *s_etat_processus);
 2779: void instruction_over(struct_processus *s_etat_processus);
 2780: 
 2781: void instruction_p_vers_r(struct_processus *s_etat_processus);
 2782: void instruction_paper(struct_processus *s_etat_processus);
 2783: void instruction_parameter(struct_processus *s_etat_processus);
 2784: void instruction_parametric(struct_processus *s_etat_processus);
 2785: void instruction_pcov(struct_processus *s_etat_processus);
 2786: void instruction_peek(struct_processus *s_etat_processus);
 2787: void instruction_perm(struct_processus *s_etat_processus);
 2788: void instruction_persist(struct_processus *s_etat_processus);
 2789: void instruction_pi(struct_processus *s_etat_processus);
 2790: void instruction_pick(struct_processus *s_etat_processus);
 2791: void instruction_plot(struct_processus *s_etat_processus);
 2792: void instruction_plotter(struct_processus *s_etat_processus);
 2793: void instruction_plus(struct_processus *s_etat_processus);
 2794: void instruction_pmax(struct_processus *s_etat_processus);
 2795: void instruction_pmin(struct_processus *s_etat_processus);
 2796: void instruction_poke(struct_processus *s_etat_processus);
 2797: void instruction_polar(struct_processus *s_etat_processus);
 2798: void instruction_poll(struct_processus *s_etat_processus);
 2799: void instruction_pos(struct_processus *s_etat_processus);
 2800: void instruction_pourcent(struct_processus *s_etat_processus);
 2801: void instruction_pourcent_ch(struct_processus *s_etat_processus);
 2802: void instruction_pourcent_t(struct_processus *s_etat_processus);
 2803: void instruction_ppar(struct_processus *s_etat_processus);
 2804: void instruction_pr1(struct_processus *s_etat_processus);
 2805: void instruction_print(struct_processus *s_etat_processus);
 2806: void instruction_private(struct_processus *s_etat_processus);
 2807: void instruction_prlcd(struct_processus *s_etat_processus);
 2808: void instruction_prmd(struct_processus *s_etat_processus);
 2809: void instruction_procid(struct_processus *s_etat_processus);
 2810: void instruction_prompt(struct_processus *s_etat_processus);
 2811: void instruction_protect(struct_processus *s_etat_processus);
 2812: void instruction_prst(struct_processus *s_etat_processus);
 2813: void instruction_prstc(struct_processus *s_etat_processus);
 2814: void instruction_prusr(struct_processus *s_etat_processus);
 2815: void instruction_prvar(struct_processus *s_etat_processus);
 2816: void instruction_psdev(struct_processus *s_etat_processus);
 2817: void instruction_puissance(struct_processus *s_etat_processus);
 2818: void instruction_purge(struct_processus *s_etat_processus);
 2819: void instruction_pshcntxt(struct_processus *s_etat_processus);
 2820: void instruction_pshprfl(struct_processus *s_etat_processus);
 2821: void instruction_pulcntxt(struct_processus *s_etat_processus);
 2822: void instruction_pulprfl(struct_processus *s_etat_processus);
 2823: void instruction_put(struct_processus *s_etat_processus);
 2824: void instruction_putc(struct_processus *s_etat_processus);
 2825: void instruction_puti(struct_processus *s_etat_processus);
 2826: void instruction_putr(struct_processus *s_etat_processus);
 2827: void instruction_pvar(struct_processus *s_etat_processus);
 2828: 
 2829: void instruction_qr(struct_processus *s_etat_processus);
 2830: 
 2831: void instruction_r_vers_b(struct_processus *s_etat_processus);
 2832: void instruction_r_vers_c(struct_processus *s_etat_processus);
 2833: void instruction_r_vers_d(struct_processus *s_etat_processus);
 2834: void instruction_r_vers_p(struct_processus *s_etat_processus);
 2835: void instruction_rad(struct_processus *s_etat_processus);
 2836: void instruction_rand(struct_processus *s_etat_processus);
 2837: void instruction_rank(struct_processus *s_etat_processus);
 2838: void instruction_rceq(struct_processus *s_etat_processus);
 2839: void instruction_rci(struct_processus *s_etat_processus);
 2840: void instruction_rcij(struct_processus *s_etat_processus);
 2841: void instruction_rcl(struct_processus *s_etat_processus);
 2842: void instruction_rclf(struct_processus *s_etat_processus);
 2843: void instruction_rcls(struct_processus *s_etat_processus);
 2844: void instruction_rclswi(struct_processus *s_etat_processus);
 2845: void instruction_rcws(struct_processus *s_etat_processus);
 2846: void instruction_rdate(struct_processus *s_etat_processus);
 2847: void instruction_rdm(struct_processus *s_etat_processus);
 2848: void instruction_rdgn(struct_processus *s_etat_processus);
 2849: void instruction_rdz(struct_processus *s_etat_processus);
 2850: void instruction_re(struct_processus *s_etat_processus);
 2851: void instruction_read(struct_processus *s_etat_processus);
 2852: void instruction_recode(struct_processus *s_etat_processus);
 2853: void instruction_recv(struct_processus *s_etat_processus);
 2854: void instruction_redraw(struct_processus *s_etat_processus);
 2855: void instruction_regex(struct_processus *s_etat_processus);
 2856: void instruction_relax(struct_processus *s_etat_processus);
 2857: void instruction_remove(struct_processus *s_etat_processus);
 2858: void instruction_res(struct_processus *s_etat_processus);
 2859: void instruction_restart(struct_processus *s_etat_processus);
 2860: void instruction_recall(struct_processus *s_etat_processus);
 2861: void instruction_regv(struct_processus *s_etat_processus);
 2862: void instruction_repeat(struct_processus *s_etat_processus);
 2863: void instruction_repl(struct_processus *s_etat_processus);
 2864: void instruction_return(struct_processus *s_etat_processus);
 2865: void instruction_revlist(struct_processus *s_etat_processus);
 2866: void instruction_rewind(struct_processus *s_etat_processus);
 2867: void instruction_rfuse(struct_processus *s_etat_processus);
 2868: void instruction_rgdl(struct_processus *s_etat_processus);
 2869: void instruction_rgdr(struct_processus *s_etat_processus);
 2870: void instruction_rl(struct_processus *s_etat_processus);
 2871: void instruction_rlb(struct_processus *s_etat_processus);
 2872: void instruction_rnd(struct_processus *s_etat_processus);
 2873: void instruction_rnrm(struct_processus *s_etat_processus);
 2874: void instruction_roll(struct_processus *s_etat_processus);
 2875: void instruction_rolld(struct_processus *s_etat_processus);
 2876: void instruction_rot(struct_processus *s_etat_processus);
 2877: void instruction_row_fleche(struct_processus *s_etat_processus);
 2878: void instruction_row_moins(struct_processus *s_etat_processus);
 2879: void instruction_row_plus(struct_processus *s_etat_processus);
 2880: void instruction_rr(struct_processus *s_etat_processus);
 2881: void instruction_rrb(struct_processus *s_etat_processus);
 2882: void instruction_rsd(struct_processus *s_etat_processus);
 2883: void instruction_rstop(struct_processus *s_etat_processus);
 2884: void instruction_rswp(struct_processus *s_etat_processus);
 2885: 
 2886: void instruction_s_moins(struct_processus *s_etat_processus);
 2887: void instruction_s_plus(struct_processus *s_etat_processus);
 2888: void instruction_same(struct_processus *s_etat_processus);
 2889: void instruction_save(struct_processus *s_etat_processus);
 2890: void instruction_scatter(struct_processus *s_etat_processus);
 2891: void instruction_scale(struct_processus *s_etat_processus);
 2892: void instruction_sched(struct_processus *s_etat_processus);
 2893: void instruction_schur(struct_processus *s_etat_processus);
 2894: void instruction_sci(struct_processus *s_etat_processus);
 2895: void instruction_scls(struct_processus *s_etat_processus);
 2896: void instruction_sconj(struct_processus *s_etat_processus);
 2897: void instruction_sdev(struct_processus *s_etat_processus);
 2898: void instruction_select(struct_processus *s_etat_processus);
 2899: void instruction_send(struct_processus *s_etat_processus);
 2900: void instruction_sf(struct_processus *s_etat_processus);
 2901: void instruction_shared(struct_processus *s_etat_processus);
 2902: void instruction_sign(struct_processus *s_etat_processus);
 2903: void instruction_sin(struct_processus *s_etat_processus);
 2904: void instruction_sinh(struct_processus *s_etat_processus);
 2905: void instruction_sinv(struct_processus *s_etat_processus);
 2906: void instruction_size(struct_processus *s_etat_processus);
 2907: void instruction_sl(struct_processus *s_etat_processus);
 2908: void instruction_slb(struct_processus *s_etat_processus);
 2909: void instruction_slice(struct_processus *s_etat_processus);
 2910: void instruction_slicescale(struct_processus *s_etat_processus);
 2911: void instruction_smphrdecr(struct_processus *s_etat_processus);
 2912: void instruction_smphrgetv(struct_processus *s_etat_processus);
 2913: void instruction_smphrincr(struct_processus *s_etat_processus);
 2914: void instruction_smphrtrydecr(struct_processus *s_etat_processus);
 2915: void instruction_sneg(struct_processus *s_etat_processus);
 2916: void instruction_sort(struct_processus *s_etat_processus);
 2917: void instruction_spar(struct_processus *s_etat_processus);
 2918: void instruction_spawn(struct_processus *s_etat_processus);
 2919: void instruction_splash(struct_processus *s_etat_processus);
 2920: void instruction_sq(struct_processus *s_etat_processus);
 2921: void instruction_sqlconnect(struct_processus *s_etat_processus);
 2922: void instruction_sqldisconnect(struct_processus *s_etat_processus);
 2923: void instruction_sqlquery(struct_processus *s_etat_processus);
 2924: void instruction_sqrt(struct_processus *s_etat_processus);
 2925: void instruction_sr(struct_processus *s_etat_processus);
 2926: void instruction_srb(struct_processus *s_etat_processus);
 2927: void instruction_srev(struct_processus *s_etat_processus);
 2928: void instruction_sst(struct_processus *s_etat_processus);
 2929: void instruction_star_d(struct_processus *s_etat_processus);
 2930: void instruction_star_h(struct_processus *s_etat_processus);
 2931: void instruction_star_s(struct_processus *s_etat_processus);
 2932: void instruction_star_w(struct_processus *s_etat_processus);
 2933: void instruction_start(struct_processus *s_etat_processus);
 2934: void instruction_static(struct_processus *s_etat_processus);
 2935: void instruction_std(struct_processus *s_etat_processus);
 2936: void instruction_step(struct_processus *s_etat_processus);
 2937: void instruction_steq(struct_processus *s_etat_processus);
 2938: void instruction_sto(struct_processus *s_etat_processus);
 2939: void instruction_sto_division(struct_processus *s_etat_processus);
 2940: void instruction_sto_fois(struct_processus *s_etat_processus);
 2941: void instruction_sto_moins(struct_processus *s_etat_processus);
 2942: void instruction_sto_plus(struct_processus *s_etat_processus);
 2943: void instruction_stof(struct_processus *s_etat_processus);
 2944: void instruction_stop(struct_processus *s_etat_processus);
 2945: void instruction_store(struct_processus *s_etat_processus);
 2946: void instruction_stos(struct_processus *s_etat_processus);
 2947: void instruction_stoswi(struct_processus *s_etat_processus);
 2948: void instruction_str_fleche(struct_processus *s_etat_processus);
 2949: void instruction_stws(struct_processus *s_etat_processus);
 2950: void instruction_sub(struct_processus *s_etat_processus);
 2951: void instruction_suspend(struct_processus *s_etat_processus);
 2952: void instruction_svd(struct_processus *s_etat_processus);
 2953: void instruction_svl(struct_processus *s_etat_processus);
 2954: void instruction_swap(struct_processus *s_etat_processus);
 2955: void instruction_swi(struct_processus *s_etat_processus);
 2956: void instruction_swilock(struct_processus *s_etat_processus);
 2957: void instruction_swiqueue(struct_processus *s_etat_processus);
 2958: void instruction_swistatus(struct_processus *s_etat_processus);
 2959: void instruction_swiunlock(struct_processus *s_etat_processus);
 2960: void instruction_swapcntxt(struct_processus *s_etat_processus);
 2961: void instruction_sx(struct_processus *s_etat_processus);
 2962: void instruction_sx2(struct_processus *s_etat_processus);
 2963: void instruction_sxy(struct_processus *s_etat_processus);
 2964: void instruction_sy(struct_processus *s_etat_processus);
 2965: void instruction_sy2(struct_processus *s_etat_processus);
 2966: void instruction_sync(struct_processus *s_etat_processus);
 2967: void instruction_syseval(struct_processus *s_etat_processus);
 2968: 
 2969: void instruction_table_fleche(struct_processus *s_etat_processus);
 2970: void instruction_tail(struct_processus *s_etat_processus);
 2971: void instruction_tan(struct_processus *s_etat_processus);
 2972: void instruction_tanh(struct_processus *s_etat_processus);
 2973: void instruction_target(struct_processus *s_etat_processus);
 2974: void instruction_taylr(struct_processus *s_etat_processus);
 2975: void instruction_then(struct_processus *s_etat_processus);
 2976: void instruction_time(struct_processus *s_etat_processus);
 2977: void instruction_title(struct_processus *s_etat_processus);
 2978: void instruction_tokenize(struct_processus *s_etat_processus);
 2979: void instruction_tot(struct_processus *s_etat_processus);
 2980: void instruction_trim(struct_processus *s_etat_processus);
 2981: void instruction_trn(struct_processus *s_etat_processus);
 2982: void instruction_trnc(struct_processus *s_etat_processus);
 2983: void instruction_true(struct_processus *s_etat_processus);
 2984: void instruction_type(struct_processus *s_etat_processus);
 2985: void instruction_t_vers_l(struct_processus *s_etat_processus);
 2986: 
 2987: void instruction_ucase(struct_processus *s_etat_processus);
 2988: void instruction_uchol(struct_processus *s_etat_processus);
 2989: void instruction_uncompress(struct_processus *s_etat_processus);
 2990: void instruction_unlock(struct_processus *s_etat_processus);
 2991: void instruction_unprotect(struct_processus *s_etat_processus);
 2992: void instruction_until(struct_processus *s_etat_processus);
 2993: void instruction_use(struct_processus *s_etat_processus);
 2994: void instruction_utpc(struct_processus *s_etat_processus);
 2995: void instruction_utpf(struct_processus *s_etat_processus);
 2996: void instruction_utpn(struct_processus *s_etat_processus);
 2997: void instruction_utpt(struct_processus *s_etat_processus);
 2998: 
 2999: void instruction_var(struct_processus *s_etat_processus);
 3000: void instruction_variable(struct_processus *s_etat_processus);
 3001: void instruction_vars(struct_processus *s_etat_processus);
 3002: void instruction_verify(struct_processus *s_etat_processus);
 3003: void instruction_vers_niveau_inferieur(struct_processus *s_etat_processus);
 3004: void instruction_vers_niveau_superieur(struct_processus *s_etat_processus);
 3005: void instruction_version(struct_processus *s_etat_processus);
 3006: void instruction_visit(struct_processus *s_etat_processus);
 3007: void instruction_volatile(struct_processus *s_etat_processus);
 3008: 
 3009: void instruction_wait(struct_processus *s_etat_processus);
 3010: void instruction_warranty(struct_processus *s_etat_processus);
 3011: void instruction_wfdata(struct_processus *s_etat_processus);
 3012: void instruction_wfack(struct_processus *s_etat_processus);
 3013: void instruction_wflock(struct_processus *s_etat_processus);
 3014: void instruction_wfpoke(struct_processus *s_etat_processus);
 3015: void instruction_wfproc(struct_processus *s_etat_processus);
 3016: void instruction_wfsock(struct_processus *s_etat_processus);
 3017: void instruction_wfswi(struct_processus *s_etat_processus);
 3018: void instruction_while(struct_processus *s_etat_processus);
 3019: void instruction_wireframe(struct_processus *s_etat_processus);
 3020: void instruction_workdir(struct_processus *s_etat_processus);
 3021: void instruction_write(struct_processus *s_etat_processus);
 3022: 
 3023: void instruction_xcol(struct_processus *s_etat_processus);
 3024: void instruction_xor(struct_processus *s_etat_processus);
 3025: void instruction_xpon(struct_processus *s_etat_processus);
 3026: void instruction_xroot(struct_processus *s_etat_processus);
 3027: 
 3028: void instruction_ycol(struct_processus *s_etat_processus);
 3029: void instruction_yield(struct_processus *s_etat_processus);
 3030: 
 3031: /*
 3032: --------------------------------------------------------------------------------
 3033:   Procédures
 3034: --------------------------------------------------------------------------------
 3035: */
 3036: 
 3037: #ifndef RPLARGS
 3038: void affectation_interruptions_logicielles(struct_processus *s_etat_processus);
 3039: void affichage_pile(struct_processus *s_etat_processus,
 3040:         struct_liste_chainee *l_element_courant, integer8 niveau_courant);
 3041: #endif
 3042: 
 3043: void *allocation_maillon(struct_processus *s_etat_processus);
 3044: 
 3045: #ifndef RPLARGS
 3046: void analyse(struct_processus *s_etat_processus, void (*fonction)());
 3047: void *analyse_instruction(struct_processus *s_etat_processus,
 3048:         unsigned char *candidat);
 3049: void appel_gnuplot(struct_processus *s_etat_processus,
 3050:         unsigned char persistance);
 3051: void cf(struct_processus *s_etat_processus, unsigned char indice_drapeau);
 3052: void cond(struct_processus *s_etat_processus,
 3053:         struct_matrice *s_matrice, real8 *condition);
 3054: void conversion_chaine(struct_processus *s_etat_processus,
 3055:         unsigned char *chaine, unsigned char type);
 3056: void conversion_decimal_vers_hms(real8 *angle);
 3057: void conversion_degres_vers_radians(real8 *angle);
 3058: void conversion_element_tex(struct_processus *s_etat_processus,
 3059:         unsigned char **element, unsigned char *fonction);
 3060: void conversion_format(struct_processus *s_etat_processus,
 3061:         unsigned char *chaine);
 3062: void conversion_hms_vers_decimal(real8 *angle);
 3063: void conversion_majuscule_limitee(
 3064:         unsigned char *chaine_entree, unsigned char *chaine_sortie,
 3065:         integer8 longueur);
 3066: void conversion_radians_vers_degres(real8 *angle);
 3067: void copie_arbre_variables(struct_processus *s_etat_processus,
 3068:         struct_processus *s_nouvel_etat_processus);
 3069: void correction_formateur_tex(struct_processus *s_etat_processus,
 3070:         unsigned char **ligne);
 3071: void depilement_pile_systeme(struct_processus *s_etat_processus);
 3072: void derivation(struct_processus *s_etat_processus,
 3073:         struct_objet **s_expression);
 3074: void determinant(struct_processus *s_etat_processus, struct_matrice *s_matrice,
 3075:         void *valeur);
 3076: void deverrouillage_threads_concurrents(struct_processus *s_etat_processus);
 3077: void ecriture_pile(struct_processus *s_etat_processus, file *flux,
 3078:         struct_liste_chainee *l_element_courant, integer8 niveau_courant);
 3079: void ecriture_profil(struct_processus *s_etat_processus);
 3080: void effacement_pile_systeme(struct_processus *s_etat_processus);
 3081: void empilement_pile_systeme(struct_processus *s_etat_processus);
 3082: void encart(struct_processus *s_etat_processus, integer8 duree);
 3083: void evaluation_romberg(struct_processus *s_etat_processus,
 3084:         struct_objet *s_expression, unsigned char *variable, real8 *point,
 3085:         real8 *valeur, logical1 *validite);
 3086: void factorisation_cholesky(struct_processus *s_etat_processus,
 3087:         struct_matrice *s_matrice, unsigned char mode);
 3088: void factorisation_lq(struct_processus *s_etat_processus,
 3089:         struct_matrice *s_matrice, void **tau);
 3090: void factorisation_lu(struct_processus *s_etat_processus,
 3091:         struct_matrice *s_matrice, struct_matrice **s_permutation);
 3092: void factorisation_qr(struct_processus *s_etat_processus,
 3093:         struct_matrice *s_matrice, void **tau);
 3094: void factorisation_schur(struct_processus *s_etat_processus,
 3095:         struct_matrice *s_matrice, struct_matrice **s_schur);
 3096: void *fusible(void *argument);
 3097: void formateur_tex(struct_processus *s_etat_processus, struct_objet *s_objet,
 3098:         unsigned char environnement);
 3099: void formateur_elementaire_tex(struct_processus *s_etat_processus,
 3100:         file *fichier, struct_objet *s_objet, unsigned char environnement);
 3101: void impression_pile(struct_processus *s_etat_processus,
 3102:             struct_liste_chainee *l_element_courant,
 3103:             unsigned char methode, integer8 niveau_courant);
 3104: void impression_tex(struct_processus *s_etat_processus);
 3105: void informations(struct_processus *s_etat_processus);
 3106: void initialisation_allocateur(struct_processus *s_etat_processus);
 3107: void initialisation_completion(void);
 3108: void initialisation_contexte_cas(struct_processus *s_etat_processus);
 3109: void initialisation_drapeaux(struct_processus *s_etat_processus);
 3110: void initialisation_generateur_aleatoire(struct_processus *s_etat_processus,
 3111:         logical1 initialisation_automatique, integer8 racine);
 3112: void initialisation_instructions(struct_processus *s_etat_processus);
 3113: void initialisation_variables(struct_processus *s_etat_processus);
 3114: #endif
 3115: 
 3116: void initialisation_objet(struct_objet *s_objet);
 3117: 
 3118: #ifndef RPLARGS
 3119: void insertion_thread(struct_processus *s_etat_processus,
 3120:         logical1 thread_principal);
 3121: void insertion_thread_surveillance(struct_processus *s_etat_processus,
 3122:         struct_descripteur_thread *s_argument_thread);
 3123: void integrale_romberg(struct_processus *s_etat_processus,
 3124:         struct_objet *s_expression, unsigned char *variable,
 3125:         real8 a, real8 b, real8 precision);
 3126: void interface_cas(struct_processus *s_etat_processus,
 3127:         enum t_rplcas_commandes commande);
 3128: void interruption1(int signal);
 3129: void interruption2(int signal);
 3130: void interruption3(int signal);
 3131: void interruption4(int signal);
 3132: void interruption5(int signal);
 3133: void interruption6(int signal);
 3134: void interruption_depassement_pile(int urgence, stackoverflow_context_t scp);
 3135: void inversion_matrice(struct_processus *s_etat_processus,
 3136:         struct_matrice *s_matrice);
 3137: void lancement_daemon(struct_processus *s_etat_processus);
 3138: void *lancement_thread(void *argument);
 3139: #endif
 3140: 
 3141: void liberation(struct_processus *s_etat_processus, struct_objet *s_objet);
 3142: void liberation_maillon(struct_processus *s_etat_processus,
 3143:         struct_liste_chainee *maillon);
 3144: 
 3145: #ifndef RPLARGS
 3146: void liberation_allocateur(struct_processus *s_etat_processus);
 3147: void liberation_arbre_instructions(struct_processus *s_etat_processus,
 3148:         struct_instruction *arbre);
 3149: void liberation_arbre_variables(struct_processus *s_etat_processus,
 3150:         struct_arbre_variables *arbre, logical1 definitions);
 3151: void liberation_arbre_variables_partagees(struct_processus *s_etat_processus,
 3152:         struct_arbre_variables_partagees *arbre);
 3153: void liberation_contexte_cas(struct_processus *s_etat_processus);
 3154: void liberation_generateur_aleatoire(struct_processus *s_etat_processus);
 3155: void liberation_mutexes_arbre_variables_partagees(struct_processus
 3156:         *s_etat_processus, struct_arbre_variables_partagees *l_element_courant);
 3157: void liberation_threads(struct_processus *s_etat_processus);
 3158: void liberation_profil(struct_processus *s_etat_processus);
 3159: void localisation_courante(struct_processus *s_etat_processus);
 3160: void modification_pid_thread_pere(struct_processus *s_etat_processus);
 3161: void moindres_carres(struct_processus *s_etat_processus,
 3162:         struct_matrice *s_matrice_a, struct_matrice *s_matrice_b,
 3163:         struct_matrice *s_matrice_x);
 3164: void profilage(struct_processus *s_etat_processus, unsigned char *fonction);
 3165: void rang(struct_processus *s_etat_processus, struct_matrice *s_matrice,
 3166:         integer8 *valeur);
 3167: void recherche_type(struct_processus *s_etat_processus);
 3168: void retrait_thread(struct_processus *s_etat_processus);
 3169: void retrait_thread_surveillance(struct_processus *s_etat_processus,
 3170:         struct_descripteur_thread *s_argument_thread);
 3171: void rplcore(struct_processus *s_etat_processus);
 3172: #endif
 3173: 
 3174: void scrutation_injection(struct_processus *s_etat_processus);
 3175: 
 3176: #ifndef RPLARGS
 3177: void scrutation_interruptions(struct_processus *s_etat_processus);
 3178: void sf(struct_processus *s_etat_processus, unsigned char indice_drapeau);
 3179: void *surveillance_processus(void *argument);
 3180: void swap(void *variable_1, void *variable_2, integer8 taille_octets);
 3181: void *thread_signaux(void *argument);
 3182: void trace(struct_processus *s_etat_processus, FILE *flux);
 3183: void traitement_asynchrone_exceptions_gsl(struct_processus *s_etat_processus);
 3184: void traitement_exceptions_gsl(const char *reason, const char *file,
 3185:         int line, int gsl_errno);
 3186: void traitement_interruptions_logicielles(struct_processus *s_etat_processus);
 3187: void tri_base_symboles_externes(struct_processus *s_etat_processus);
 3188: void tri_vecteur(real8 *vecteur, integer8 taille);
 3189: void valeurs_propres(struct_processus *s_etat_processus,
 3190:         struct_matrice *s_matrice,
 3191:         struct_vecteur *s_valeurs_propres,
 3192:         struct_matrice *s_vecteurs_propres_gauches,
 3193:         struct_matrice *s_vecteur_propres_droits);
 3194: void valeurs_propres_generalisees(struct_processus *s_etat_processus,
 3195:         struct_matrice *s_matrice,
 3196:         struct_matrice *s_metrique,
 3197:         struct_vecteur *s_valeurs_propres,
 3198:         struct_matrice *s_vecteurs_propres_gauches,
 3199:         struct_matrice *s_vecteur_propres_droits);
 3200: void valeurs_singulieres(struct_processus *s_etat_processus,
 3201:         struct_matrice *s_matrice,
 3202:         struct_matrice *u, struct_vecteur *s, struct_matrice *vh);
 3203: void verrouillage_threads_concurrents(struct_processus *s_etat_processus);
 3204: #endif
 3205: 
 3206: /*
 3207: --------------------------------------------------------------------------------
 3208:   Fonctions de gestion des signaux
 3209: --------------------------------------------------------------------------------
 3210: */
 3211: 
 3212: #ifndef RPLARGS
 3213: void creation_queue_signaux(struct_processus *s_etat_processus);
 3214: void liberation_queue_signaux(struct_processus *s_etat_processus);
 3215: void destruction_queue_signaux(struct_processus *s_etat_processus);
 3216: int envoi_signal_contexte(struct_processus *s_etat_processus,
 3217:         enum signaux_rpl signal);
 3218: int envoi_signal_processus(pid_t pid, enum signaux_rpl signal);
 3219: int envoi_signal_thread(pthread_t tid, enum signaux_rpl signal);
 3220: #endif
 3221: 
 3222: /*
 3223: --------------------------------------------------------------------------------
 3224:   Fonctions de sommation de vecteur dans perte de précision
 3225: --------------------------------------------------------------------------------
 3226: */
 3227: 
 3228: real8 sommation_vecteur_reel(real8 *vecteur, integer8 *taille,
 3229:         logical1 *erreur_memoire);
 3230: complex16 sommation_vecteur_complexe(complex16 *vecteur, integer8 *taille,
 3231:         logical1 *erreur_memoire);
 3232: 
 3233: /*
 3234: --------------------------------------------------------------------------------
 3235:   Routine principale
 3236: --------------------------------------------------------------------------------
 3237: */
 3238: 
 3239: #ifndef RPLARGS
 3240: int rplinit(int argc, char *argv[], char *envp[],
 3241:         unsigned char ***resultats, char *rpl_home);
 3242: #endif
 3243: 
 3244: /*
 3245: --------------------------------------------------------------------------------
 3246:   Routines de statistiques
 3247: --------------------------------------------------------------------------------
 3248: */
 3249: 
 3250: #ifndef RPLARGS
 3251: real8 correlation_statistique(struct_matrice *s_matrice,
 3252:         integer8 colonne_1, integer8 colonne_2, logical1 *erreur);
 3253: real8 covariance_statistique(struct_matrice *s_matrice,
 3254:         integer8 colonne_1, integer8 colonne_2,
 3255:         unsigned char type, logical1 *erreur);
 3256: struct_vecteur *ecart_type_statistique(struct_processus *s_etat_processus,
 3257:         struct_matrice *s_matrice, unsigned char type);
 3258: struct_vecteur *moyenne_statistique(struct_processus *s_etat_processus,
 3259:         struct_matrice *s_matrice);
 3260: struct_vecteur *sommation_colonne_statistique(
 3261:         struct_processus *s_etat_processus, struct_matrice *s_matrice,
 3262:         integer8 colonne);
 3263: struct_vecteur *sommation_produits_colonnes_statistiques(
 3264:         struct_processus *s_etat_processus, struct_matrice
 3265:         *s_matrice, integer8 colonne_1, integer8 colonne_2);
 3266: struct_vecteur *sommation_statistique(struct_processus *s_etat_processus,
 3267:         struct_matrice *s_matrice);
 3268: struct_vecteur *variance_statistique(struct_processus *s_etat_processus,
 3269:         struct_matrice *s_matrice, unsigned char type);
 3270: #endif
 3271: 
 3272: /*
 3273: --------------------------------------------------------------------------------
 3274:   Gestion des bibliothèques
 3275: --------------------------------------------------------------------------------
 3276: */
 3277: 
 3278: #ifndef RPLARGS
 3279: void *chargement_bibliotheque(struct_processus *s_etat_processus,
 3280:         unsigned char *bibliotheque);
 3281: logical1 execution_fonction_de_bibliotheque(struct_processus *s_etat_processus,
 3282:         unsigned char *nom_fonction, unsigned char *bibliothque);
 3283: logical1 retrait_bibliotheque(struct_processus *s_etat_processus,
 3284:         struct_bibliotheque *descripteur);
 3285: #endif
 3286: 
 3287: struct_liste_chainee *depilement_pile_operationnelle(struct_rpl_arguments
 3288:         *s_rpl_arguments, struct_objet **s_objet);
 3289: struct_liste_chainee *empilement_pile_operationnelle(struct_rpl_arguments
 3290:         *s_rpl_arguments, struct_objet *s_objet);
 3291: struct_liste_chainee *sauvegarde_arguments(struct_rpl_arguments
 3292:         *s_rpl_arguments, integer8 nombre_arguments);
 3293: 
 3294: /*
 3295: --------------------------------------------------------------------------------
 3296:   Fonctions retournant un CHARACTER*(*)
 3297: --------------------------------------------------------------------------------
 3298: */
 3299: 
 3300: #ifndef RPLARGS
 3301: unsigned char *analyse_algebrique(struct_processus *s_etat_processus,
 3302:         unsigned char *chaine_algebrique, struct_liste_chainee **l_base_liste);
 3303: unsigned char *analyse_flux(struct_processus *s_etat_processus,
 3304:         unsigned char *flux, integer8 longueur);
 3305: unsigned char *chiffrement(struct_processus *s_etat_processus,
 3306:         const EVP_CIPHER *type_chiffrement,
 3307:         logical1 encodage, unsigned char *message, integer8 longueur_message,
 3308:         unsigned char *clef, integer8 longueur_clef,
 3309:         unsigned char *vecteur_initialisation,
 3310:         integer8 *longueur_message_chiffre);
 3311: unsigned char *compactage(struct_processus *s_etat_processus,
 3312:         unsigned char *chaine);
 3313: unsigned char *conversion_majuscule(struct_processus *s_etat_processus,
 3314:         unsigned char *chaine);
 3315: unsigned char *creation_nom_fichier(struct_processus *s_etat_processus,
 3316:         unsigned char *chemin);
 3317: unsigned char *date_compilation(struct_processus *s_etat_processus);
 3318: unsigned char *extraction_chaine(struct_processus *s_etat_processus,
 3319:         unsigned char *chaine, integer8 i, integer8 j);
 3320: unsigned char *formateur(struct_processus *s_etat_processus, long offset,
 3321:         struct_objet *s_objet);
 3322: unsigned char *formateur_fichier(struct_processus *s_etat_processus,
 3323:         struct_objet *s_objet, struct_objet *s_format,
 3324:         integer8 longueur, integer8 longueur_champ, unsigned char format,
 3325:         unsigned char type, integer8 *longueur_effective, integer8 *recursivite,
 3326:         logical1 export_fichier);
 3327: unsigned char *formateur_flux(struct_processus *s_etat_processus,
 3328:         unsigned char *donnees, integer8 *longueur);
 3329: unsigned char *formateur_fichier_nombre(struct_processus *s_etat_processus,
 3330:         void *valeur_numerique, unsigned char type,
 3331:         integer8 longueur, integer8 longueur_champ, unsigned char format);
 3332: unsigned char *formateur_fichier_binaire_nombre(struct_processus
 3333:         *s_etat_processus, void *valeur_numerique, unsigned char type_entree,
 3334:         unsigned char type, integer8 longueur, integer8 *longueur_conversion);
 3335: unsigned char *formateur_fichier_reel(struct_processus *s_etat_processus,
 3336:         void *valeur_numerique, unsigned char type,
 3337:         integer8 longueur, integer8 longueur_champ, unsigned char format);
 3338: unsigned char *formateur_nombre(struct_processus *s_etat_processus,
 3339:         void *valeur_numerique, unsigned char type);
 3340: unsigned char *formateur_reel(struct_processus *s_etat_processus,
 3341:         void *valeur_numerique, unsigned char type);
 3342: unsigned char *messages(struct_processus *s_etat_processus);
 3343: unsigned char *pointeur_ieme_caractere(struct_processus *s_etat_processus,
 3344:         unsigned char *chaine, integer8 position);
 3345: unsigned char *purification_chaine(struct_processus *s_etat_processus,
 3346:         unsigned char *chaine);
 3347: unsigned char *recherche_chemin_fichiers_temporaires(struct_processus
 3348:         *s_etat_processus);
 3349: unsigned char *reencodage(struct_processus *s_etat_processus,
 3350:         unsigned char *chaine_entree, unsigned char *codage_entree,
 3351:         unsigned char *codage_sortie);
 3352: unsigned char *transliteration(struct_processus *s_etat_processus,
 3353:         unsigned char *chaine_entree, unsigned char *codage_entree,
 3354:         unsigned char *codage_sortie);
 3355: #endif
 3356: 
 3357: /*
 3358: --------------------------------------------------------------------------------
 3359:   Fonctions retournant un INTEGER*1 (drapeau d'erreur)
 3360: --------------------------------------------------------------------------------
 3361: */
 3362: 
 3363: #ifndef RPLARGS
 3364: logical1 analyse_syntaxique(struct_processus *s_etat_processus);
 3365: logical1 arret_thread_signaux(struct_processus *s_etat_processus);
 3366: logical1 caracteristiques_fichier(struct_processus *s_etat_processus,
 3367:         unsigned char *nom, logical1 *existence, logical1 *ouverture,
 3368:         unsigned long *unite);
 3369: logical1 controle(struct_processus *s_etat_processus, unsigned char *fichier,
 3370:         unsigned char *type, unsigned char *somme_candidate);
 3371: logical1 controle_integrite(struct_processus *s_etat_processus,
 3372:         unsigned char *executable_candidat, unsigned char *executable);
 3373: logical1 creation_variable(struct_processus *s_etat_processus,
 3374:         struct_variable *s_variable,
 3375:         unsigned char autorisation_creation_variable_statique,
 3376:         unsigned char autorisation_creation_variable_partagee);
 3377: logical1 creation_variable_partagee(struct_processus *s_etat_processus,
 3378:         struct_variable_partagee *s_variable);
 3379: logical1 creation_variable_statique(struct_processus *s_etat_processus,
 3380:         struct_variable_statique *s_variable);
 3381: logical1 chainage(struct_processus *s_etat_processus);
 3382: logical1 compilation(struct_processus *s_etat_processus);
 3383: logical1 depilement(struct_processus *s_etat_processus,
 3384:         struct_liste_chainee **l_base_liste, struct_objet **s_objet);
 3385: logical1 destruction_fichier(unsigned char *nom_fichier);
 3386: logical1 empilement(struct_processus *s_etat_processus,
 3387:         struct_liste_chainee **l_base_liste, struct_objet *s_objet);
 3388: logical1 empilement_pile_last(struct_processus *s_etat_processus,
 3389:         integer8 nombre_arguments);
 3390: logical1 evaluation(struct_processus *s_etat_processus, struct_objet *s_objet,
 3391:         unsigned char type_evaluation);
 3392: logical1 initialisation_fichier_acces_direct(struct_processus *s_etat_processus,
 3393:         sqlite3 *sqlite, logical1 binaire);
 3394: logical1 initialisation_fichier_acces_indexe(struct_processus *s_etat_processus,
 3395:         sqlite3 *sqlite, integer8 position_clef, logical1 binaire);
 3396: logical1 lancement_thread_signaux(struct_processus *s_etat_processus);
 3397: logical1 recherche_instruction_suivante(struct_processus *s_etat_processus);
 3398: logical1 recherche_instruction_suivante_recursive(
 3399:         struct_processus *s_etat_processus, integer8 recursivite);
 3400: logical1 retrait_variable(struct_processus *s_etat_processus,
 3401:         unsigned char *nom_variable, unsigned char type);
 3402: logical1 retrait_variables_par_niveau(struct_processus *s_etat_processus);
 3403: logical1 retrait_variable_partagee(struct_processus *s_etat_processus,
 3404:         unsigned char *nom_variable, union_position_variable position);
 3405: logical1 retrait_variables_partagees_locales(
 3406:         struct_processus *s_etat_processus);
 3407: logical1 retrait_variable_statique(struct_processus *s_etat_processus,
 3408:         unsigned char *nom_variable, union_position_variable position);
 3409: logical1 retrait_variables_statiques_locales(
 3410:         struct_processus *s_etat_processus);
 3411: logical1 sequenceur(struct_processus *s_etat_processus);
 3412: logical1 sequenceur_optimise(struct_processus *s_etat_processus);
 3413: #endif
 3414: 
 3415: /*
 3416: --------------------------------------------------------------------------------
 3417:   Fonctions retournant un INTEGER*1 (drapeau)
 3418: --------------------------------------------------------------------------------
 3419: */
 3420: 
 3421: logical1 depassement_addition(integer8 *a, integer8 *b, integer8 *resultat);
 3422: logical1 depassement_multiplication(integer8 *a, integer8 *b,
 3423:         integer8 *resultat);
 3424: logical1 depassement_soustraction(integer8 *a, integer8 *b, integer8 *resultat);
 3425: logical1 depassement_puissance(integer8 *a, integer8 *b, integer8 *resultat);
 3426: 
 3427: #ifndef RPLARGS
 3428: logical1 ecriture_pipe(struct_processus *s_etat_processus, int pipe,
 3429:         struct_objet *s_objet);
 3430: logical1 recherche_variable(struct_processus *s_etat_processus,
 3431:         unsigned char *nom_variable);
 3432: logical1 recherche_variable_globale(struct_processus *s_etat_processus,
 3433:         unsigned char *nom_variable);
 3434: logical1 test_cfsf(struct_processus *s_etat_processus,
 3435:         unsigned char indice_drapeau);
 3436: logical1 test_expression_rpn(unsigned char *chaine);
 3437: logical1 test_fonction(unsigned char *chaine);
 3438: logical1 validation_chaine(unsigned char *chaine);
 3439: #endif
 3440: 
 3441: /*
 3442: --------------------------------------------------------------------------------
 3443:   Fonctions retournant un ssize_t
 3444: --------------------------------------------------------------------------------
 3445: */
 3446: 
 3447: #ifndef RPLARGS
 3448: ssize_t read_atomic(struct_processus *s_etat_processus,
 3449:         int fd, void *buf, size_t count);
 3450: ssize_t write_atomic(struct_processus *s_etat_processus,
 3451:         int fd, void *buf, size_t count);
 3452: #endif
 3453: 
 3454: /*
 3455: --------------------------------------------------------------------------------
 3456:   Fonctions renvoyant un int
 3457: --------------------------------------------------------------------------------
 3458: */
 3459: 
 3460: int alsprintf(struct_processus *s_etat_processus,
 3461:         unsigned char **strp, const char *fmt, ...);
 3462: #ifndef RPLARGS
 3463: int association_etat_processus_readline();
 3464: #endif
 3465: int interruption_violation_access(void *adresse_fautive, int gravite);
 3466: #ifndef RPLARGS
 3467: int initialisation_etat_processus_readline();
 3468: int liberation_etat_processus_readline();
 3469: integer8 liste_variables(struct_processus *s_etat_processus,
 3470:         struct_tableau_variables *tableau);
 3471: integer8 nombre_variables(struct_processus *s_etat_processus);
 3472: int readline_analyse_syntaxique(int count, int key);
 3473: int readline_effacement(int count, int key);
 3474: #endif
 3475: int std_fprintf(file *flux, const char *format, ...);
 3476: int tex_fprintf(struct_processus *s_etat_processus,
 3477:         file *flux, const char *format, ...);
 3478: int transliterated_fprintf(struct_processus *s_etat_processus, file *flux,
 3479:         const char *format, ...);
 3480: int valsprintf(struct_processus *s_etat_processus,
 3481:         unsigned char **strp, const char *fmt, va_list ap);
 3482: int wrapper_instruction_intrinseque(void (*fonction)(),
 3483:         struct_rpl_arguments *rpl_arguments);
 3484: 
 3485: /*
 3486: --------------------------------------------------------------------------------
 3487:   Fonctions renvoyant un INTEGER*1 (longueur d'un entier binaire)
 3488: --------------------------------------------------------------------------------
 3489: */
 3490: 
 3491: #ifndef RPLARGS
 3492: unsigned char longueur_entiers_binaires(struct_processus *s_etat_processus);
 3493: #endif
 3494: 
 3495: /*
 3496: --------------------------------------------------------------------------------
 3497:   Fonctions retournant un INTEGER*8 (valeur binaire non signée)
 3498: --------------------------------------------------------------------------------
 3499: */
 3500: 
 3501: #ifndef RPLARGS
 3502: logical8 masque_entiers_binaires(struct_processus *s_etat_processus);
 3503: #endif
 3504: 
 3505: /*
 3506: --------------------------------------------------------------------------------
 3507:   Fonctions retournant un INTEGER*8 (entier standard RPL/2)
 3508: --------------------------------------------------------------------------------
 3509: */
 3510: 
 3511: #ifndef RPLARGS
 3512: integer8 occupation_memoire(struct_objet *s_objet);
 3513: integer8 longueur_chaine(struct_processus *s_etat_processus,
 3514:         unsigned char *chaine);
 3515: integer8 position_caractere_de_chaine(struct_processus *s_etat_processus,
 3516:         unsigned char *chaine, unsigned char *position);
 3517: #endif
 3518: 
 3519: /*
 3520: --------------------------------------------------------------------------------
 3521:   Fonctions renvoyant une liste chaînée (pointeur sur *struct_liste_chainee)
 3522: --------------------------------------------------------------------------------
 3523: */
 3524: 
 3525: #ifndef RPLARGS
 3526: struct_liste_chainee *analyse_rpn(struct_processus *s_etat_processus,
 3527:         unsigned char *chaine_rpn);
 3528: #endif
 3529: 
 3530: /*
 3531: --------------------------------------------------------------------------------
 3532:   Allocateur de buffers à cache
 3533: --------------------------------------------------------------------------------
 3534: */
 3535: 
 3536: void initialisation_allocateur_buffer(struct_processus *s_etat_processus);
 3537: void liberation_allocateur_buffer(struct_processus *s_etat_pocessus);
 3538: struct_buffer *allocation_buffer(struct_processus *s_etat_processus,
 3539:         size_t longueur);
 3540: void liberation_buffer(struct_processus *s_etat_processus,
 3541:         struct_buffer *buffer);
 3542: 
 3543: /*
 3544: --------------------------------------------------------------------------------
 3545:   Fonctions renvoyant une copie de la structure de description des processus
 3546: --------------------------------------------------------------------------------
 3547: */
 3548: 
 3549: #ifndef RPLARGS
 3550: struct_processus *copie_etat_processus(struct_processus *s_etat_processus);
 3551: #endif
 3552: 
 3553: /*
 3554: --------------------------------------------------------------------------------
 3555:   Fonctions renvoyant un pointeur sur un fichier (file *) ou un descripteur
 3556: --------------------------------------------------------------------------------
 3557: */
 3558: 
 3559: #ifndef RPLARGS
 3560: file *creation_fichier_tex(struct_processus *s_etat_processus);
 3561: struct_descripteur_fichier *descripteur_fichier(struct_processus
 3562:         *s_etat_processus, struct_fichier *s_fichier);
 3563: #endif
 3564: 
 3565: /*
 3566: --------------------------------------------------------------------------------
 3567:   Fonctions renvoyant un pointeur sur une *struct_objet
 3568: --------------------------------------------------------------------------------
 3569: */
 3570: 
 3571: struct_objet *copie_objet(struct_processus *s_etat_processus,
 3572:         struct_objet *s_objet, unsigned char type);
 3573: 
 3574: struct_objet *allocation(struct_processus *s_etat_processus, enum t_type type);
 3575: #ifndef RPLARGS
 3576: struct_objet *formateur_date(struct_processus *s_etat_processus,
 3577:         struct timeval *temps);
 3578: struct_objet *lecture_fichier_non_formate(struct_processus *s_etat_processus,
 3579:         void *argument, integer8 longueur_buffer, logical1 recursivite);
 3580: struct_objet *lecture_pipe(struct_processus *s_etat_processus, int pipe);
 3581: struct_objet *parametres_sql(struct_processus *s_etat_processus,
 3582:         struct_objet *s_parametres);
 3583: struct_objet *simplification(struct_processus *s_etat_processus,
 3584:         struct_objet *s_objet);
 3585: 
 3586: struct_arbre_variables *allocation_noeud(struct_processus *s_etat_processus);
 3587: struct_arbre_variables **allocation_tableau_noeuds(
 3588:         struct_processus *s_etat_processus);
 3589: 
 3590: /*
 3591: --------------------------------------------------------------------------------
 3592:   Fonctions renvoyant un pointeur sur une *struct_liste_variables_statiques
 3593:   ou *struct_liste_variables_partagees
 3594: --------------------------------------------------------------------------------
 3595: */
 3596: 
 3597: struct_liste_variables_statiques *recherche_variable_statique(struct_processus
 3598:         *s_etat_processus, unsigned char *nom_variable,
 3599:         union_position_variable position, unsigned char origine);
 3600: struct_liste_variables_partagees *recherche_variable_partagee(struct_processus
 3601:         *s_etat_processus, unsigned char *nom_variable,
 3602:         union_position_variable position, unsigned char origine);
 3603: #endif
 3604: 
 3605: /*
 3606: --------------------------------------------------------------------------------
 3607:   Fonctions gérant la complétion automatique
 3608: --------------------------------------------------------------------------------
 3609: */
 3610: 
 3611: char **completion_rpl();
 3612: char *generateur_commandes();
 3613: char **completion_matches();
 3614: 
 3615: // END C PROTOTYPES
 3616: 
 3617: /*
 3618: --------------------------------------------------------------------------------
 3619:   Arithmétique
 3620: --------------------------------------------------------------------------------
 3621: */
 3622: 
 3623: void f77absc_(complex16 *c, real8 *resultat);
 3624: 
 3625: void f77additioncc_(complex16 *ca, complex16 *cb, complex16 *resultat);
 3626: void f77additionci_(complex16 *ca, integer8 *ib, complex16 *resultat);
 3627: void f77additioncr_(complex16 *ca, real8 *rb, complex16 *resultat);
 3628: 
 3629: void f77divisioncc_(complex16 *ca, complex16 *rb, complex16 *resultat);
 3630: void f77divisionci_(complex16 *ca, integer8 *ib, complex16 *resultat);
 3631: void f77divisioncr_(complex16 *ca, real8 *rb, complex16 *resultat);
 3632: void f77divisionic_(integer8 *ib, complex16 *cb, complex16 *resultat);
 3633: void f77divisionrc_(real8 *ra, complex16 *cb, complex16 *resultat);
 3634: 
 3635: void f77multiplicationcc_(complex16 *ca, complex16 *cb, complex16 *resultat);
 3636: void f77multiplicationci_(complex16 *ca, integer8 *ib, complex16 *resultat);
 3637: void f77multiplicationcr_(complex16 *ca, real8 *rb, complex16 *resultat);
 3638: 
 3639: void f77puissancecc_(complex16 *ca, complex16 *cb, complex16 *resultat);
 3640: void f77puissanceci_(complex16 *ca, integer8 *ib, complex16 *resultat);
 3641: void f77puissancecr_(complex16 *ca, real8 *rb, complex16 *resultat);
 3642: void f77puissanceic_(integer8 *ia, complex16 *cb, complex16 *resultat);
 3643: void f77puissanceii_(integer8 *ia, integer8 *ib, integer8 *resultat);
 3644: void f77puissanceir_(integer8 *ia, real8 *rb, real8 *resultat);
 3645: void f77puissancerc_(real8 *ra, complex16 *cb, complex16 *resultat);
 3646: void f77puissanceri_(real8 *ra, integer8 *ib, real8 *resultat);
 3647: void f77puissancerr_(real8 *ra, real8 *rb, real8 *resultat);
 3648: 
 3649: void f77racinecarreec_(complex16 *ca, complex16 *resultat);
 3650: void f77racinecarreein_(integer8 *ia, complex16 *resultat);
 3651: void f77racinecarreeip_(integer8 *ia, real8 *resultat);
 3652: void f77racinecarreern_(real8 *ia, complex16 *resultat);
 3653: void f77racinecarreerp_(real8 *ia, real8 *resultat);
 3654: 
 3655: void f77soustractioncc_(complex16 *ca, complex16 *cb, complex16 *resultat);
 3656: void f77soustractionci_(complex16 *ca, integer8 *ib, complex16 *resultat);
 3657: void f77soustractioncr_(complex16 *ca, real8 *rb, complex16 *resultat);
 3658: void f77soustractionic_(integer8 *ib, complex16 *cb, complex16 *resultat);
 3659: void f77soustractionrc_(real8 *ra, complex16 *cb, complex16 *resultat);
 3660: 
 3661: /*
 3662: --------------------------------------------------------------------------------
 3663:   Trigonométrie complexe
 3664: --------------------------------------------------------------------------------
 3665: */
 3666: 
 3667: void f77acos_(complex16 *argument, complex16 *resultat);
 3668: void f77asin_(complex16 *argument, complex16 *resultat);
 3669: void f77atan_(complex16 *argument, complex16 *resultat, integer4 *erreur);
 3670: void f77cos_(complex16 *argument, complex16 *resultat);
 3671: void f77sin_(complex16 *argument, complex16 *resultat);
 3672: void f77tan_(complex16 *argument, complex16 *resultat, integer4 *erreur);
 3673: 
 3674: /*
 3675: --------------------------------------------------------------------------------
 3676:   Fonctions hyperboliques
 3677: --------------------------------------------------------------------------------
 3678: */
 3679: 
 3680: void f77acoshc_(complex16 *argument, complex16 *resultat);
 3681: void f77alogc_(complex16 *argument, complex16 *resultat);
 3682: void f77asinhc_(complex16 *argument, complex16 *resultat);
 3683: void f77atanhc_(complex16 *argument, complex16 *resultat);
 3684: void f77cosh_(complex16 *argument, complex16 *resultat);
 3685: void f77expc_(complex16 *argument, complex16 *resultat);
 3686: void f77lnc_(complex16 *argument, complex16 *resultat, integer4 *erreur);
 3687: void f77lnin_(integer8 *argument, complex16 *resultat, integer4 *erreur);
 3688: void f77lnrn_(real8 *argument, complex16 *resultat, integer4 *erreur);
 3689: void f77logc_(complex16 *argument, complex16 *resultat, integer4 *erreur);
 3690: void f77login_(integer8 *argument, complex16 *resultat, integer4 *erreur);
 3691: void f77logrn_(real8 *argument, complex16 *resultat, integer4 *erreur);
 3692: void f77sinh_(complex16 *argument, complex16 *resultat);
 3693: void f77tanh_(complex16 *argument, complex16 *resultat, integer4 *erreur);
 3694: void f77acoshi_(integer8 *argument, real8 *resultat);
 3695: void f77acoshr_(real8 *argument, real8 *resultat);
 3696: void f77asinhi_(integer8 *argument, real8 *resultat);
 3697: void f77asinhr_(real8 *argument, real8 *resultat);
 3698: void f77atanhi_(integer8 *argument, real8 *resultat);
 3699: void f77atanhr_(real8 *argument, real8 *resultat);
 3700: void f77lnip_(integer8 *argument, real8 *resultat, integer4 *erreur);
 3701: void f77lnrp_(real8 *argument, real8 *resultat, integer4 *erreur);
 3702: void f77logip_(integer8 *argument, real8 *resultat, integer4 *erreur);
 3703: void f77logrp_(real8 *argument, real8 *resultat, integer4 *erreur);
 3704: 
 3705: /*
 3706: --------------------------------------------------------------------------------
 3707:   Calculs divers
 3708: --------------------------------------------------------------------------------
 3709: */
 3710: 
 3711: void f90arrangement(integer8 *n, integer8 *k, real8 *resultat);
 3712: void f90combinaison(integer8 *n, integer8 *k, real8 *resultat);
 3713: void f90fcd(real8 *x, integer8 *n1, integer8 *n2, real8 *resultat);
 3714: void f90gausscd(real8 *x, real8 *moyenne, real8 *variance, real8 *resultat);
 3715: void f90tcd(real8 *x, integer8 *n, real8 *resultat);
 3716: void f90x2cd(real8 *x, integer8 *n, real8 *resultat);
 3717: 
 3718: // BEGIN C PROTOTYPES
 3719: void dft(complex16 *dft, integer4 *nombre_lignes, integer4 *nombre_colonnes,
 3720:         integer4 *inverse, integer4 *erreur);
 3721: // END C PROTOTYPES
 3722: 
 3723: /*
 3724: --------------------------------------------------------------------------------
 3725:   Fonctions Lapack
 3726: --------------------------------------------------------------------------------
 3727: */
 3728: 
 3729:     /*
 3730:      * Calcul de la longueur d'un espace de travail
 3731:      */
 3732: 
 3733: #ifndef RPLARGS
 3734: integer4 ilaenv_(integer4 *optimal, char *nom_fonction, char *option,
 3735:         integer4 *n1, integer4 *n2, integer4 *n3, integer4 *n4,
 3736:         integer4 longueur_nom_fonction, integer4 longueur_option);
 3737: 
 3738:     /*
 3739:      * Inversion
 3740:      */
 3741: 
 3742: void dgetri_(integer4 *ordre_a, real8 *a, integer4 *lda, integer4 *pivot,
 3743:         real8 *work, integer4 *dim_work, integer4 *ios);
 3744: void zgetri_(integer4 *ordre_a, complex16 *a, integer4 *lda, integer4 *pivot,
 3745:         complex16 *work, integer4 *dim_work, integer4 *ios);
 3746: 
 3747:     /*
 3748:      * Valeurs propres
 3749:      */
 3750: 
 3751: void zgeev_(unsigned char *calcul_vp_gauches, unsigned char *calcul_vp_droits,
 3752:         integer4 *dim_matrice1, complex16 *matrice_f77,
 3753:         integer4 *dim_matrice2, complex16 *valeurs_propres,
 3754:         complex16 *vpg_f77, integer4 *dim_matrice3,
 3755:         complex16 *vpd_f77, integer4 *dim_matrice4,
 3756:         complex16 *work, integer4 *lwork, real8 *rwork,
 3757:         integer4 *erreur, integer4 longueur_1, integer4 longueur_2);
 3758: 
 3759:     /*
 3760:      * Valeurs propres généralisées
 3761:      */
 3762: 
 3763: void zggev_(unsigned char *calcul_vp_gauches, unsigned char *calcul_vp_droits,
 3764:         integer4 *dim_matrice1, complex16 *matrice_f77,
 3765:         integer4 *dim_matrice2, complex16 *metrique_f77,
 3766:         integer4 *dim_matrice3, complex16 *alpha, complex16 *beta,
 3767:         complex16 *vpg_f77, integer4 *dim_matrice4,
 3768:         complex16 *vpd_f77, integer4 *dim_matrice5,
 3769:         complex16 *work, integer4 *lwork, real8 *rwork,
 3770:         integer4 *erreur, integer4 longueur_1, integer4 longueur_2);
 3771: 
 3772:     /*
 3773:      * Moindres carrés
 3774:      */
 3775: 
 3776: void dgelsd_(integer4 *nombre_lignes_a, integer4 *nombre_colonnes_a,
 3777:         integer4 *nombre_colonnes_b, real8 *matrice_a, integer4 *lda,
 3778:         real8 *matrice_b, integer4 *ldb, real8 *valeurs_singulieres,
 3779:         real8 *rcond, integer4 *rank, real8 *work, integer4 *lwork,
 3780:         integer4 *iwork, integer4 *info);
 3781: void zgelsd_(integer4 *nombre_lignes_a, integer4 *nombre_colonnes_a,
 3782:         integer4 *nombre_colonnes_b, complex16 *matrice_a, integer4 *lda,
 3783:         complex16 *matrice_b, integer4 *ldb, real8 *valeurs_singulieres,
 3784:         real8 *rcond, integer4 *rank, complex16 *work, integer4 *lwork,
 3785:         real8 *rwork, integer4 *iwork, integer4 *info);
 3786: 
 3787:     /*
 3788:      * Moindres carrés généralisé
 3789:      */
 3790: 
 3791:     /*
 3792:      * Décomposition en valeurs singulières
 3793:      */
 3794: 
 3795: void dgesvd_(unsigned char *jobu, unsigned char *jobvh,
 3796:         integer4 *m, integer4 *n, real8 *a, integer4 *lda,
 3797:         real8 *s, real8 *u, integer4 *ldu, real8 *vh, integer4 *ldvh,
 3798:         real8 *work, integer4 *lwork, integer4 *info, integer4 longueur_jobu,
 3799:         integer4 longueur_jobvh);
 3800: void zgesvd_(unsigned char *jobu, unsigned char *jobvh,
 3801:         integer4 *m, integer4 *n, real8 *a, integer4 *lda,
 3802:         real8 *s, real8 *u, integer4 *ldu, real8 *vh, integer4 *ldvh,
 3803:         real8 *work, integer4 *lwork, real8 *rwork, integer4 *info,
 3804:         integer4 longueur_jobu, integer4 longueur_jobvh);
 3805: 
 3806:     /*
 3807:      * Factorisations diverses
 3808:      */
 3809: 
 3810:         /* LU de Crout */
 3811: void dgetrf_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, real8 *a,
 3812:         integer4 *lda, integer4 *pivot, integer4 *ios);
 3813: void zgetrf_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, complex16 *a,
 3814:         integer4 *lda, integer4 *pivot, integer4 *ios);
 3815: 
 3816:         /* LQ */
 3817: void dgelq2_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, real8 *a,
 3818:         integer4 *lda, real8 *tau, real8 *work, integer4 *ios);
 3819: void zgelq2_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, complex16 *a,
 3820:         integer4 *lda, complex16 *tau, complex16 *work, integer4 *ios);
 3821: 
 3822:         /* QR */
 3823: void dgeqp3_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, real8 *a,
 3824:         integer4 *lda, integer4 *pivot, real8 *tau, real8 *work,
 3825:         integer4 *lwork, integer4 *ios);
 3826: void zgeqp3_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, complex16 *a,
 3827:         integer4 *lda, integer4 *pivot, complex16 *tau, complex16 *work,
 3828:         integer4 *lwork, real8 *rwork, integer4 *ios);
 3829: 
 3830:         /* Cholesky */
 3831: void dpptrf_(unsigned char *mode, integer4 *n, complex16 *triangle,
 3832:         integer4 *ios, integer4 longueur);
 3833: void zpptrf_(unsigned char *mode, integer4 *n, complex16 *triangle,
 3834:         integer4 *ios, integer4 longueur);
 3835: 
 3836:         /* Schur */
 3837: void dgees_(unsigned char *calcul_vecteur, unsigned char *valeurs_triees,
 3838:         logical4 (*fonction_tri)(), integer4 *n, real8 *a,
 3839:         integer4 *lda, integer4 *sdim, real8 *wr, real8 *wi,
 3840:         real8 *vs, integer4 *ldvs, real8 *work, integer4 *lwork,
 3841:         logical4 *bwork, integer4 *info, integer4 l1, integer4 l2);
 3842: void zgees_(unsigned char *calcul_vecteur, unsigned char *valeurs_triees,
 3843:         logical4 (*fonction_tri)(), integer4 *n, complex16 *a,
 3844:         integer4 *lda, integer4 *sdim, complex16 *w,
 3845:         complex16 *vs, integer4 *ldvs, complex16 *work, integer4 *lwork,
 3846:         real8 *rwork, logical4 *bwork, integer4 *info,
 3847:         integer4 l1, integer4 l2);
 3848: 
 3849:         /* Déterminant et rang */
 3850: void dgecon_(unsigned char *norm, integer4 *n, real8 *a, integer4 *lda,
 3851:         real8 *anorm, real8 *rcond, real8 *work, integer4 *iwork,
 3852:         integer4 *info, integer4 l1);
 3853: void dgelsy_(integer4 *m, integer4 *n, integer4 *nrhs, real8 *a,
 3854:         integer4 *lda, real8 *b, integer4 *ldb, integer4 *jpvt, real8 *rcond,
 3855:         integer4 *rank, real8 *work, integer4 *lwork, integer4 *info);
 3856: real8 dlange_(unsigned char *norme, integer4 *n, integer4 *m, real8 *a,
 3857:         integer4 *lda, real8 *work, integer4 longueur);
 3858: real8 zlange_(unsigned char *norme, integer4 *n, integer4 *m, real8 *a,
 3859:         integer4 *lda, real8 *work, integer4 longueur);
 3860: void zgecon_(unsigned char *norm, integer4 *n, complex16 *a, integer4 *lda,
 3861:         real8 *anorm, real8 *rcond, complex16 *work, real8 *rwork,
 3862:         integer4 *info, integer4 l1);
 3863: void zgelsy_(integer4 *m, integer4 *n, integer4 *nrhs, complex16 *a,
 3864:         integer4 *lda, complex16 *b, integer4 *ldb, integer4 *jpvt,
 3865:         real8 *rcond, integer4 *rank, complex16 *work, integer4 *lwork,
 3866:         real8 *rwork, integer4 *info);
 3867: #endif
 3868: 
 3869: /*
 3870:  * Fonction testant la requête d'arrêt (nécessaire pour tester le
 3871:  * drapeau depuis une bibliothèque).
 3872:  */
 3873: 
 3874: int test_arret(struct_processus *s_etat_processus);
 3875: 
 3876: #endif
 3877: 
 3878: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>