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