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