![]() ![]() | ![]() |
Commit après restauration de la sauvegarde.
1: /* 2: ================================================================================ 3: RPL/2 (R) version 4.1.3 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: void *contexte_cas; 2150: 2151: integer8 nombre_arguments; 2152: 2153: /* 2154: * Il s'agit du nombre d'arguments utilisé pour l'évaluation 2155: * des expressions algébriques. 2156: * -1 : la fonction ne peut être dans un objet de type ALG. 2157: * -2 : nombre d'arguments inconnu 2158: * 0 : la fonction doit apparaître en notation infixe 2159: * >0 : la fonction apparaît comme une fonction normale 2160: */ 2161: 2162: logical1 lancement_interactif; 2163: 2164: unsigned char *chemin_fichiers_temporaires; 2165: unsigned char langue; 2166: unsigned char retour_routine_evaluation; 2167: unsigned char *localisation; 2168: 2169: unsigned long niveau_recursivite; 2170: 2171: pid_t pid_processus_pere; 2172: pthread_t tid_processus_pere; 2173: 2174: logical1 processus_detache; 2175: 2176: /* Profilage */ 2177: 2178: logical1 profilage; 2179: int niveau_profilage; 2180: struct_liste_profilage *pile_profilage; 2181: struct_liste_profilage2 *pile_profilage_fonctions; 2182: struct timeval horodatage_profilage; 2183: 2184: // Mutex spécifique au processus et donnant accès à la pile des processus 2185: pthread_mutex_t mutex; 2186: pthread_mutex_t mutex_allocation; 2187: 2188: // Sémaphore autorisant les fork() 2189: sem_t 2190: # ifdef SEMAPHORES_NOMMES 2191: * 2192: # endif 2193: semaphore_fork; 2194: 2195: /* Mutexes */ 2196: 2197: struct_liste_chainee *liste_mutexes; 2198: pthread_mutex_t protection_liste_mutexes; 2199: 2200: /* Gestion optimisée de la mémoire */ 2201: 2202: double estimation_taille_pile_tampon; 2203: unsigned long taille_pile_tampon; 2204: struct_liste_chainee *pile_tampon; 2205: 2206: double estimation_taille_pile_systeme_tampon; 2207: unsigned long taille_pile_systeme_tampon; 2208: struct_liste_pile_systeme *pile_systeme_tampon; 2209: 2210: unsigned long taille_pile_objets; 2211: struct_objet *pile_objets; 2212: 2213: # define TAILLE_CACHE 16384 2214: 2215: unsigned long *objets_adr[TAILLE_CACHE]; 2216: int pointeur_adr; 2217: 2218: logical8 *objets_bin[TAILLE_CACHE]; 2219: int pointeur_bin; 2220: 2221: complex16 *objets_cpl[TAILLE_CACHE]; 2222: int pointeur_cpl; 2223: 2224: struct fonction *objets_fct[TAILLE_CACHE]; 2225: int pointeur_fct; 2226: 2227: integer8 *objets_int[TAILLE_CACHE]; 2228: int pointeur_int; 2229: 2230: struct_matrice *objets_mat[TAILLE_CACHE]; 2231: int pointeur_mat; 2232: 2233: struct_nom *objets_nom[TAILLE_CACHE]; 2234: int pointeur_nom; 2235: 2236: real8 *objets_rel[TAILLE_CACHE]; 2237: int pointeur_rel; 2238: 2239: struct_tableau *objets_tab[TAILLE_CACHE]; 2240: int pointeur_tab; 2241: 2242: struct_vecteur *objets_vec[TAILLE_CACHE]; 2243: int pointeur_vec; 2244: 2245: struct_liste_chainee *maillons[TAILLE_CACHE]; 2246: int pointeur_maillons; 2247: 2248: struct_arbre_variables *variables_noeud[TAILLE_CACHE]; 2249: int pointeur_variables_noeud; 2250: 2251: struct_liste_variables *variables_feuille[TAILLE_CACHE]; 2252: int pointeur_variables_feuille; 2253: 2254: struct_variable *variables_variable[TAILLE_CACHE]; 2255: int pointeur_variables_variable; 2256: 2257: struct_arbre_variables **variables_tableau_noeuds[TAILLE_CACHE]; 2258: int pointeur_variables_tableau_noeuds; 2259: } struct_processus; 2260: #endif 2261: 2262: /* 2263: -------------------------------------------------------------------------------- 2264: Structure fonction 2265: -------------------------------------------------------------------------------- 2266: */ 2267: 2268: #ifndef RPLARGS 2269: typedef struct fonction 2270: { 2271: unsigned char *nom_fonction; 2272: unsigned long nombre_arguments; 2273: 2274: void (*fonction)(struct_processus *); 2275: 2276: volatile struct_liste_chainee *prediction_saut; 2277: volatile logical1 prediction_execution; 2278: } struct_fonction; 2279: #endif 2280: 2281: 2282: /* 2283: ================================================================================ 2284: PROTOTYPES 2285: ================================================================================ 2286: */ 2287: 2288: /* 2289: -------------------------------------------------------------------------------- 2290: Procédures d'exécution des mots-clef du langage RPL/2 2291: -------------------------------------------------------------------------------- 2292: */ 2293: 2294: // BEGIN C PROTOTYPES 2295: void instruction_sensible_e(struct_processus *s_etat_processus); 2296: void instruction_sensible_i(struct_processus *s_etat_processus); 2297: void instruction_sensible_infinity(struct_processus *s_etat_processus); 2298: 2299: void instruction_abort(struct_processus *s_etat_processus); 2300: void instruction_abs(struct_processus *s_etat_processus); 2301: void instruction_acos(struct_processus *s_etat_processus); 2302: void instruction_acosh(struct_processus *s_etat_processus); 2303: void instruction_alarm(struct_processus *s_etat_processus); 2304: void instruction_alog(struct_processus *s_etat_processus); 2305: void instruction_and(struct_processus *s_etat_processus); 2306: void instruction_append(struct_processus *s_etat_processus); 2307: void instruction_array_fleche(struct_processus *s_etat_processus); 2308: void instruction_arg(struct_processus *s_etat_processus); 2309: void instruction_asin(struct_processus *s_etat_processus); 2310: void instruction_asinh(struct_processus *s_etat_processus); 2311: void instruction_asl(struct_processus *s_etat_processus); 2312: void instruction_asr(struct_processus *s_etat_processus); 2313: void instruction_atan(struct_processus *s_etat_processus); 2314: void instruction_atanh(struct_processus *s_etat_processus); 2315: void instruction_atexit(struct_processus *s_etat_processus); 2316: void instruction_atpoke(struct_processus *s_etat_processus); 2317: void instruction_autoscale(struct_processus *s_etat_processus); 2318: void instruction_axes(struct_processus *s_etat_processus); 2319: 2320: void instruction_b_vers_r(struct_processus *s_etat_processus); 2321: void instruction_backspace(struct_processus *s_etat_processus); 2322: void instruction_backtrace(struct_processus *s_etat_processus); 2323: void instruction_beep(struct_processus *s_etat_processus); 2324: void instruction_bessel(struct_processus *s_etat_processus); 2325: void instruction_bin(struct_processus *s_etat_processus); 2326: 2327: void instruction_c_vers_r(struct_processus *s_etat_processus); 2328: void instruction_case(struct_processus *s_etat_processus); 2329: void instruction_ceil(struct_processus *s_etat_processus); 2330: void instruction_centr(struct_processus *s_etat_processus); 2331: void instruction_cf(struct_processus *s_etat_processus); 2332: void instruction_chr(struct_processus *s_etat_processus); 2333: void instruction_clear(struct_processus *s_etat_processus); 2334: void instruction_cllcd(struct_processus *s_etat_processus); 2335: void instruction_clmf(struct_processus *s_etat_processus); 2336: void instruction_close(struct_processus *s_etat_processus); 2337: void instruction_clratexit(struct_processus *s_etat_processus); 2338: void instruction_clratpoke(struct_processus *s_etat_processus); 2339: void instruction_clrcntxt(struct_processus *s_etat_processus); 2340: void instruction_clrerr(struct_processus *s_etat_processus); 2341: void instruction_clrfuse(struct_processus *s_etat_processus); 2342: void instruction_clrmtx(struct_processus *s_etat_processus); 2343: void instruction_clrsmphr(struct_processus *s_etat_processus); 2344: void instruction_clrswi(struct_processus *s_etat_processus); 2345: void instruction_cls(struct_processus *s_etat_processus); 2346: void instruction_clusr(struct_processus *s_etat_processus); 2347: void instruction_cnrm(struct_processus *s_etat_processus); 2348: void instruction_cols(struct_processus *s_etat_processus); 2349: void instruction_col_fleche(struct_processus *s_etat_processus); 2350: void instruction_col_moins(struct_processus *s_etat_processus); 2351: void instruction_col_plus(struct_processus *s_etat_processus); 2352: void instruction_comb(struct_processus *s_etat_processus); 2353: void instruction_con(struct_processus *s_etat_processus); 2354: void instruction_cond(struct_processus *s_etat_processus); 2355: void instruction_cont(struct_processus *s_etat_processus); 2356: void instruction_continue(struct_processus *s_etat_processus); 2357: void instruction_conj(struct_processus *s_etat_processus); 2358: void instruction_convert(struct_processus *s_etat_processus); 2359: void instruction_copy(struct_processus *s_etat_processus); 2360: void instruction_copyright(struct_processus *s_etat_processus); 2361: void instruction_corr(struct_processus *s_etat_processus); 2362: void instruction_cos(struct_processus *s_etat_processus); 2363: void instruction_cosh(struct_processus *s_etat_processus); 2364: void instruction_cov(struct_processus *s_etat_processus); 2365: void instruction_cr(struct_processus *s_etat_processus); 2366: void instruction_create(struct_processus *s_etat_processus); 2367: void instruction_crmtx(struct_processus *s_etat_processus); 2368: void instruction_cross(struct_processus *s_etat_processus); 2369: void instruction_crsmphr(struct_processus *s_etat_processus); 2370: void instruction_crtab(struct_processus *s_etat_processus); 2371: void instruction_cstop(struct_processus *s_etat_processus); 2372: void instruction_cswp(struct_processus *s_etat_processus); 2373: void instruction_currenc(struct_processus *s_etat_processus); 2374: void instruction_cycle(struct_processus *s_etat_processus); 2375: 2376: void instruction_d_vers_r(struct_processus *s_etat_processus); 2377: void instruction_daemonize(struct_processus *s_etat_processus); 2378: void instruction_date(struct_processus *s_etat_processus); 2379: void instruction_dec(struct_processus *s_etat_processus); 2380: void instruction_decr(struct_processus *s_etat_processus); 2381: void instruction_default(struct_processus *s_etat_processus); 2382: void instruction_deg(struct_processus *s_etat_processus); 2383: void instruction_delete(struct_processus *s_etat_processus); 2384: void instruction_depnd(struct_processus *s_etat_processus); 2385: void instruction_depth(struct_processus *s_etat_processus); 2386: void instruction_der(struct_processus *s_etat_processus); 2387: void instruction_det(struct_processus *s_etat_processus); 2388: void instruction_detach(struct_processus *s_etat_processus); 2389: void instruction_dft(struct_processus *s_etat_processus); 2390: void instruction_dgtiz(struct_processus *s_etat_processus); 2391: void instruction_diag_fleche(struct_processus *s_etat_processus); 2392: void instruction_disp(struct_processus *s_etat_processus); 2393: void instruction_division(struct_processus *s_etat_processus); 2394: void instruction_do(struct_processus *s_etat_processus); 2395: void instruction_dot(struct_processus *s_etat_processus); 2396: void instruction_draw(struct_processus *s_etat_processus); 2397: void instruction_drax(struct_processus *s_etat_processus); 2398: void instruction_drop(struct_processus *s_etat_processus); 2399: void instruction_drop2(struct_processus *s_etat_processus); 2400: void instruction_dropcntxt(struct_processus *s_etat_processus); 2401: void instruction_dropn(struct_processus *s_etat_processus); 2402: void instruction_drws(struct_processus *s_etat_processus); 2403: void instruction_dup(struct_processus *s_etat_processus); 2404: void instruction_dup2(struct_processus *s_etat_processus); 2405: void instruction_dupcntxt(struct_processus *s_etat_processus); 2406: void instruction_dupn(struct_processus *s_etat_processus); 2407: 2408: void instruction_e(struct_processus *s_etat_processus); 2409: void instruction_edit(struct_processus *s_etat_processus); 2410: void instruction_egalite(struct_processus *s_etat_processus); 2411: void instruction_egv(struct_processus *s_etat_processus); 2412: void instruction_egvl(struct_processus *s_etat_processus); 2413: void instruction_else(struct_processus *s_etat_processus); 2414: void instruction_elseif(struct_processus *s_etat_processus); 2415: void instruction_end(struct_processus *s_etat_processus); 2416: void instruction_eng(struct_processus *s_etat_processus); 2417: void instruction_epsilon(struct_processus *s_etat_processus); 2418: void instruction_erase(struct_processus *s_etat_processus); 2419: void instruction_errm(struct_processus *s_etat_processus); 2420: void instruction_errn(struct_processus *s_etat_processus); 2421: void instruction_eval(struct_processus *s_etat_processus); 2422: void instruction_exget(struct_processus *s_etat_processus); 2423: void instruction_exit(struct_processus *s_etat_processus); 2424: void instruction_exp(struct_processus *s_etat_processus); 2425: void instruction_expm(struct_processus *s_etat_processus); 2426: void instruction_exsub(struct_processus *s_etat_processus); 2427: void instruction_externals(struct_processus *s_etat_processus); 2428: void instruction_eyept(struct_processus *s_etat_processus); 2429: 2430: void instruction_fact(struct_processus *s_etat_processus); 2431: void instruction_false(struct_processus *s_etat_processus); 2432: void instruction_fc_test(struct_processus *s_etat_processus); 2433: void instruction_fc_test_c(struct_processus *s_etat_processus); 2434: void instruction_fc_test_s(struct_processus *s_etat_processus); 2435: void instruction_fft(struct_processus *s_etat_processus); 2436: void instruction_fix(struct_processus *s_etat_processus); 2437: void instruction_fleche(struct_processus *s_etat_processus); 2438: void instruction_fleche_array(struct_processus *s_etat_processus); 2439: void instruction_fleche_col(struct_processus *s_etat_processus); 2440: void instruction_fleche_diag(struct_processus *s_etat_processus); 2441: void instruction_fleche_hms(struct_processus *s_etat_processus); 2442: void instruction_fleche_lcd(struct_processus *s_etat_processus); 2443: void instruction_fleche_list(struct_processus *s_etat_processus); 2444: void instruction_fleche_num(struct_processus *s_etat_processus); 2445: void instruction_fleche_q(struct_processus *s_etat_processus); 2446: void instruction_fleche_row(struct_processus *s_etat_processus); 2447: void instruction_fleche_str(struct_processus *s_etat_processus); 2448: void instruction_fleche_table(struct_processus *s_etat_processus); 2449: void instruction_floor(struct_processus *s_etat_processus); 2450: void instruction_for(struct_processus *s_etat_processus); 2451: void instruction_format(struct_processus *s_etat_processus); 2452: void instruction_fp(struct_processus *s_etat_processus); 2453: void instruction_fs_test(struct_processus *s_etat_processus); 2454: void instruction_fs_test_c(struct_processus *s_etat_processus); 2455: void instruction_fs_test_s(struct_processus *s_etat_processus); 2456: void instruction_function(struct_processus *s_etat_processus); 2457: void instruction_fuse(struct_processus *s_etat_processus); 2458: 2459: void instruction_gamma(struct_processus *s_etat_processus); 2460: void instruction_ge(struct_processus *s_etat_processus); 2461: void instruction_gegv(struct_processus *s_etat_processus); 2462: void instruction_gegvl(struct_processus *s_etat_processus); 2463: void instruction_get(struct_processus *s_etat_processus); 2464: void instruction_getc(struct_processus *s_etat_processus); 2465: void instruction_geti(struct_processus *s_etat_processus); 2466: void instruction_getr(struct_processus *s_etat_processus); 2467: void instruction_glegv(struct_processus *s_etat_processus); 2468: void instruction_gregv(struct_processus *s_etat_processus); 2469: void instruction_gt(struct_processus *s_etat_processus); 2470: 2471: void instruction_halt(struct_processus *s_etat_processus); 2472: void instruction_head(struct_processus *s_etat_processus); 2473: void instruction_help(struct_processus *s_etat_processus); 2474: void instruction_hex(struct_processus *s_etat_processus); 2475: void instruction_histogram(struct_processus *s_etat_processus); 2476: void instruction_hms_fleche(struct_processus *s_etat_processus); 2477: void instruction_hms_moins(struct_processus *s_etat_processus); 2478: void instruction_hms_plus(struct_processus *s_etat_processus); 2479: 2480: void instruction_i(struct_processus *s_etat_processus); 2481: void instruction_idft(struct_processus *s_etat_processus); 2482: void instruction_idn(struct_processus *s_etat_processus); 2483: void instruction_if(struct_processus *s_etat_processus); 2484: void instruction_iferr(struct_processus *s_etat_processus); 2485: void instruction_ifft(struct_processus *s_etat_processus); 2486: void instruction_ift(struct_processus *s_etat_processus); 2487: void instruction_ifte(struct_processus *s_etat_processus); 2488: void instruction_im(struct_processus *s_etat_processus); 2489: void instruction_implicit(struct_processus *s_etat_processus); 2490: void instruction_in(struct_processus *s_etat_processus); 2491: void instruction_incr(struct_processus *s_etat_processus); 2492: void instruction_indep(struct_processus *s_etat_processus); 2493: void instruction_input(struct_processus *s_etat_processus); 2494: void instruction_infinity(struct_processus *s_etat_processus); 2495: void instruction_inquire(struct_processus *s_etat_processus); 2496: void instruction_int(struct_processus *s_etat_processus); 2497: void instruction_interrupt(struct_processus *s_etat_processus); 2498: void instruction_inv(struct_processus *s_etat_processus); 2499: void instruction_ip(struct_processus *s_etat_processus); 2500: void instruction_iswi(struct_processus *s_etat_processus); 2501: void instruction_itrace(struct_processus *s_etat_processus); 2502: 2503: void instruction_jdate(struct_processus *s_etat_processus); 2504: 2505: void instruction_key(struct_processus *s_etat_processus); 2506: void instruction_keylabel(struct_processus *s_etat_processus); 2507: void instruction_keytitle(struct_processus *s_etat_processus); 2508: void instruction_kill(struct_processus *s_etat_processus); 2509: void instruction_kind(struct_processus *s_etat_processus); 2510: 2511: void instruction_label(struct_processus *s_etat_processus); 2512: void instruction_last(struct_processus *s_etat_processus); 2513: void instruction_lcase(struct_processus *s_etat_processus); 2514: void instruction_lcd_fleche(struct_processus *s_etat_processus); 2515: void instruction_lchol(struct_processus *s_etat_processus); 2516: void instruction_le(struct_processus *s_etat_processus); 2517: void instruction_legv(struct_processus *s_etat_processus); 2518: void instruction_limit(struct_processus *s_etat_processus); 2519: void instruction_line(struct_processus *s_etat_processus); 2520: void instruction_list_fleche(struct_processus *s_etat_processus); 2521: void instruction_ln(struct_processus *s_etat_processus); 2522: void instruction_lnp1(struct_processus *s_etat_processus); 2523: void instruction_localization(struct_processus *s_etat_processus); 2524: void instruction_lock(struct_processus *s_etat_processus); 2525: void instruction_log(struct_processus *s_etat_processus); 2526: void instruction_logger(struct_processus *s_etat_processus); 2527: void instruction_logscale(struct_processus *s_etat_processus); 2528: void instruction_lq(struct_processus *s_etat_processus); 2529: void instruction_lsq(struct_processus *s_etat_processus); 2530: void instruction_lt(struct_processus *s_etat_processus); 2531: void instruction_lu(struct_processus *s_etat_processus); 2532: void instruction_l_vers_t(struct_processus *s_etat_processus); 2533: 2534: void instruction_mant(struct_processus *s_etat_processus); 2535: void instruction_mark(struct_processus *s_etat_processus); 2536: void instruction_max(struct_processus *s_etat_processus); 2537: void instruction_maxs(struct_processus *s_etat_processus); 2538: void instruction_mclrin(struct_processus *s_etat_processus); 2539: void instruction_mean(struct_processus *s_etat_processus); 2540: void instruction_mem(struct_processus *s_etat_processus); 2541: void instruction_memlock(struct_processus *s_etat_processus); 2542: void instruction_memunlock(struct_processus *s_etat_processus); 2543: void instruction_min(struct_processus *s_etat_processus); 2544: void instruction_mins(struct_processus *s_etat_processus); 2545: void instruction_mod(struct_processus *s_etat_processus); 2546: void instruction_moins(struct_processus *s_etat_processus); 2547: void instruction_mtxlock(struct_processus *s_etat_processus); 2548: void instruction_mtxstatus(struct_processus *s_etat_processus); 2549: void instruction_mtxtrylock(struct_processus *s_etat_processus); 2550: void instruction_mtxunlock(struct_processus *s_etat_processus); 2551: void instruction_multiplication(struct_processus *s_etat_processus); 2552: 2553: void instruction_ne(struct_processus *s_etat_processus); 2554: void instruction_neg(struct_processus *s_etat_processus); 2555: void instruction_next(struct_processus *s_etat_processus); 2556: void instruction_newplane(struct_processus *s_etat_processus); 2557: void instruction_not(struct_processus *s_etat_processus); 2558: void instruction_nrand(struct_processus *s_etat_processus); 2559: void instruction_nrproc(struct_processus *s_etat_processus); 2560: void instruction_ns(struct_processus *s_etat_processus); 2561: void instruction_num(struct_processus *s_etat_processus); 2562: 2563: void instruction_obget(struct_processus *s_etat_processus); 2564: void instruction_obsub(struct_processus *s_etat_processus); 2565: void instruction_oct(struct_processus *s_etat_processus); 2566: void instruction_open(struct_processus *s_etat_processus); 2567: void instruction_or(struct_processus *s_etat_processus); 2568: void instruction_over(struct_processus *s_etat_processus); 2569: 2570: void instruction_p_vers_r(struct_processus *s_etat_processus); 2571: void instruction_paper(struct_processus *s_etat_processus); 2572: void instruction_parameter(struct_processus *s_etat_processus); 2573: void instruction_parametric(struct_processus *s_etat_processus); 2574: void instruction_pcov(struct_processus *s_etat_processus); 2575: void instruction_peek(struct_processus *s_etat_processus); 2576: void instruction_perm(struct_processus *s_etat_processus); 2577: void instruction_persist(struct_processus *s_etat_processus); 2578: void instruction_pi(struct_processus *s_etat_processus); 2579: void instruction_pick(struct_processus *s_etat_processus); 2580: void instruction_plot(struct_processus *s_etat_processus); 2581: void instruction_plotter(struct_processus *s_etat_processus); 2582: void instruction_plus(struct_processus *s_etat_processus); 2583: void instruction_pmax(struct_processus *s_etat_processus); 2584: void instruction_pmin(struct_processus *s_etat_processus); 2585: void instruction_poke(struct_processus *s_etat_processus); 2586: void instruction_polar(struct_processus *s_etat_processus); 2587: void instruction_pos(struct_processus *s_etat_processus); 2588: void instruction_pourcent(struct_processus *s_etat_processus); 2589: void instruction_pourcent_ch(struct_processus *s_etat_processus); 2590: void instruction_pourcent_t(struct_processus *s_etat_processus); 2591: void instruction_ppar(struct_processus *s_etat_processus); 2592: void instruction_pr1(struct_processus *s_etat_processus); 2593: void instruction_print(struct_processus *s_etat_processus); 2594: void instruction_private(struct_processus *s_etat_processus); 2595: void instruction_prlcd(struct_processus *s_etat_processus); 2596: void instruction_prmd(struct_processus *s_etat_processus); 2597: void instruction_procid(struct_processus *s_etat_processus); 2598: void instruction_prompt(struct_processus *s_etat_processus); 2599: void instruction_protect(struct_processus *s_etat_processus); 2600: void instruction_prst(struct_processus *s_etat_processus); 2601: void instruction_prstc(struct_processus *s_etat_processus); 2602: void instruction_prusr(struct_processus *s_etat_processus); 2603: void instruction_prvar(struct_processus *s_etat_processus); 2604: void instruction_psdev(struct_processus *s_etat_processus); 2605: void instruction_puissance(struct_processus *s_etat_processus); 2606: void instruction_purge(struct_processus *s_etat_processus); 2607: void instruction_pshcntxt(struct_processus *s_etat_processus); 2608: void instruction_pshprfl(struct_processus *s_etat_processus); 2609: void instruction_pulcntxt(struct_processus *s_etat_processus); 2610: void instruction_pulprfl(struct_processus *s_etat_processus); 2611: void instruction_put(struct_processus *s_etat_processus); 2612: void instruction_putc(struct_processus *s_etat_processus); 2613: void instruction_puti(struct_processus *s_etat_processus); 2614: void instruction_putr(struct_processus *s_etat_processus); 2615: void instruction_pvar(struct_processus *s_etat_processus); 2616: 2617: void instruction_qr(struct_processus *s_etat_processus); 2618: 2619: void instruction_r_vers_b(struct_processus *s_etat_processus); 2620: void instruction_r_vers_c(struct_processus *s_etat_processus); 2621: void instruction_r_vers_d(struct_processus *s_etat_processus); 2622: void instruction_r_vers_p(struct_processus *s_etat_processus); 2623: void instruction_rad(struct_processus *s_etat_processus); 2624: void instruction_rand(struct_processus *s_etat_processus); 2625: void instruction_rank(struct_processus *s_etat_processus); 2626: void instruction_rceq(struct_processus *s_etat_processus); 2627: void instruction_rci(struct_processus *s_etat_processus); 2628: void instruction_rcij(struct_processus *s_etat_processus); 2629: void instruction_rcl(struct_processus *s_etat_processus); 2630: void instruction_rclf(struct_processus *s_etat_processus); 2631: void instruction_rcls(struct_processus *s_etat_processus); 2632: void instruction_rclswi(struct_processus *s_etat_processus); 2633: void instruction_rcws(struct_processus *s_etat_processus); 2634: void instruction_rdate(struct_processus *s_etat_processus); 2635: void instruction_rdm(struct_processus *s_etat_processus); 2636: void instruction_rdgn(struct_processus *s_etat_processus); 2637: void instruction_rdz(struct_processus *s_etat_processus); 2638: void instruction_re(struct_processus *s_etat_processus); 2639: void instruction_read(struct_processus *s_etat_processus); 2640: void instruction_recode(struct_processus *s_etat_processus); 2641: void instruction_recv(struct_processus *s_etat_processus); 2642: void instruction_redraw(struct_processus *s_etat_processus); 2643: void instruction_relax(struct_processus *s_etat_processus); 2644: void instruction_remove(struct_processus *s_etat_processus); 2645: void instruction_res(struct_processus *s_etat_processus); 2646: void instruction_recall(struct_processus *s_etat_processus); 2647: void instruction_regv(struct_processus *s_etat_processus); 2648: void instruction_repeat(struct_processus *s_etat_processus); 2649: void instruction_repl(struct_processus *s_etat_processus); 2650: void instruction_return(struct_processus *s_etat_processus); 2651: void instruction_revlist(struct_processus *s_etat_processus); 2652: void instruction_rewind(struct_processus *s_etat_processus); 2653: void instruction_rfuse(struct_processus *s_etat_processus); 2654: void instruction_rl(struct_processus *s_etat_processus); 2655: void instruction_rlb(struct_processus *s_etat_processus); 2656: void instruction_rnd(struct_processus *s_etat_processus); 2657: void instruction_rnrm(struct_processus *s_etat_processus); 2658: void instruction_roll(struct_processus *s_etat_processus); 2659: void instruction_rolld(struct_processus *s_etat_processus); 2660: void instruction_rot(struct_processus *s_etat_processus); 2661: void instruction_row_fleche(struct_processus *s_etat_processus); 2662: void instruction_row_moins(struct_processus *s_etat_processus); 2663: void instruction_row_plus(struct_processus *s_etat_processus); 2664: void instruction_rr(struct_processus *s_etat_processus); 2665: void instruction_rrb(struct_processus *s_etat_processus); 2666: void instruction_rsd(struct_processus *s_etat_processus); 2667: void instruction_rstop(struct_processus *s_etat_processus); 2668: void instruction_rswp(struct_processus *s_etat_processus); 2669: 2670: void instruction_s_moins(struct_processus *s_etat_processus); 2671: void instruction_s_plus(struct_processus *s_etat_processus); 2672: void instruction_same(struct_processus *s_etat_processus); 2673: void instruction_save(struct_processus *s_etat_processus); 2674: void instruction_scatter(struct_processus *s_etat_processus); 2675: void instruction_scale(struct_processus *s_etat_processus); 2676: void instruction_sched(struct_processus *s_etat_processus); 2677: void instruction_schur(struct_processus *s_etat_processus); 2678: void instruction_sci(struct_processus *s_etat_processus); 2679: void instruction_scls(struct_processus *s_etat_processus); 2680: void instruction_sconj(struct_processus *s_etat_processus); 2681: void instruction_sdev(struct_processus *s_etat_processus); 2682: void instruction_select(struct_processus *s_etat_processus); 2683: void instruction_send(struct_processus *s_etat_processus); 2684: void instruction_sf(struct_processus *s_etat_processus); 2685: void instruction_shared(struct_processus *s_etat_processus); 2686: void instruction_sign(struct_processus *s_etat_processus); 2687: void instruction_sin(struct_processus *s_etat_processus); 2688: void instruction_sinh(struct_processus *s_etat_processus); 2689: void instruction_sinv(struct_processus *s_etat_processus); 2690: void instruction_size(struct_processus *s_etat_processus); 2691: void instruction_sl(struct_processus *s_etat_processus); 2692: void instruction_slb(struct_processus *s_etat_processus); 2693: void instruction_slice(struct_processus *s_etat_processus); 2694: void instruction_slicescale(struct_processus *s_etat_processus); 2695: void instruction_smphrdecr(struct_processus *s_etat_processus); 2696: void instruction_smphrgetv(struct_processus *s_etat_processus); 2697: void instruction_smphrincr(struct_processus *s_etat_processus); 2698: void instruction_smphrtrydecr(struct_processus *s_etat_processus); 2699: void instruction_sneg(struct_processus *s_etat_processus); 2700: void instruction_sort(struct_processus *s_etat_processus); 2701: void instruction_spar(struct_processus *s_etat_processus); 2702: void instruction_spawn(struct_processus *s_etat_processus); 2703: void instruction_splash(struct_processus *s_etat_processus); 2704: void instruction_sq(struct_processus *s_etat_processus); 2705: void instruction_sqlconnect(struct_processus *s_etat_processus); 2706: void instruction_sqldisconnect(struct_processus *s_etat_processus); 2707: void instruction_sqlquery(struct_processus *s_etat_processus); 2708: void instruction_sqrt(struct_processus *s_etat_processus); 2709: void instruction_sr(struct_processus *s_etat_processus); 2710: void instruction_srb(struct_processus *s_etat_processus); 2711: void instruction_srev(struct_processus *s_etat_processus); 2712: void instruction_sst(struct_processus *s_etat_processus); 2713: void instruction_star_d(struct_processus *s_etat_processus); 2714: void instruction_star_h(struct_processus *s_etat_processus); 2715: void instruction_star_s(struct_processus *s_etat_processus); 2716: void instruction_star_w(struct_processus *s_etat_processus); 2717: void instruction_start(struct_processus *s_etat_processus); 2718: void instruction_static(struct_processus *s_etat_processus); 2719: void instruction_std(struct_processus *s_etat_processus); 2720: void instruction_step(struct_processus *s_etat_processus); 2721: void instruction_steq(struct_processus *s_etat_processus); 2722: void instruction_sto(struct_processus *s_etat_processus); 2723: void instruction_sto_division(struct_processus *s_etat_processus); 2724: void instruction_sto_fois(struct_processus *s_etat_processus); 2725: void instruction_sto_moins(struct_processus *s_etat_processus); 2726: void instruction_sto_plus(struct_processus *s_etat_processus); 2727: void instruction_stof(struct_processus *s_etat_processus); 2728: void instruction_stop(struct_processus *s_etat_processus); 2729: void instruction_store(struct_processus *s_etat_processus); 2730: void instruction_stos(struct_processus *s_etat_processus); 2731: void instruction_stoswi(struct_processus *s_etat_processus); 2732: void instruction_str_fleche(struct_processus *s_etat_processus); 2733: void instruction_stws(struct_processus *s_etat_processus); 2734: void instruction_sub(struct_processus *s_etat_processus); 2735: void instruction_suspend(struct_processus *s_etat_processus); 2736: void instruction_svd(struct_processus *s_etat_processus); 2737: void instruction_svl(struct_processus *s_etat_processus); 2738: void instruction_swap(struct_processus *s_etat_processus); 2739: void instruction_swi(struct_processus *s_etat_processus); 2740: void instruction_swilock(struct_processus *s_etat_processus); 2741: void instruction_swiqueue(struct_processus *s_etat_processus); 2742: void instruction_swistatus(struct_processus *s_etat_processus); 2743: void instruction_swiunlock(struct_processus *s_etat_processus); 2744: void instruction_swapcntxt(struct_processus *s_etat_processus); 2745: void instruction_sx(struct_processus *s_etat_processus); 2746: void instruction_sx2(struct_processus *s_etat_processus); 2747: void instruction_sxy(struct_processus *s_etat_processus); 2748: void instruction_sy(struct_processus *s_etat_processus); 2749: void instruction_sy2(struct_processus *s_etat_processus); 2750: void instruction_sync(struct_processus *s_etat_processus); 2751: void instruction_syseval(struct_processus *s_etat_processus); 2752: 2753: void instruction_table_fleche(struct_processus *s_etat_processus); 2754: void instruction_tail(struct_processus *s_etat_processus); 2755: void instruction_tan(struct_processus *s_etat_processus); 2756: void instruction_tanh(struct_processus *s_etat_processus); 2757: void instruction_target(struct_processus *s_etat_processus); 2758: void instruction_taylr(struct_processus *s_etat_processus); 2759: void instruction_then(struct_processus *s_etat_processus); 2760: void instruction_time(struct_processus *s_etat_processus); 2761: void instruction_title(struct_processus *s_etat_processus); 2762: void instruction_tokenize(struct_processus *s_etat_processus); 2763: void instruction_tot(struct_processus *s_etat_processus); 2764: void instruction_trim(struct_processus *s_etat_processus); 2765: void instruction_trn(struct_processus *s_etat_processus); 2766: void instruction_trnc(struct_processus *s_etat_processus); 2767: void instruction_true(struct_processus *s_etat_processus); 2768: void instruction_type(struct_processus *s_etat_processus); 2769: void instruction_t_vers_l(struct_processus *s_etat_processus); 2770: 2771: void instruction_ucase(struct_processus *s_etat_processus); 2772: void instruction_uchol(struct_processus *s_etat_processus); 2773: void instruction_unlock(struct_processus *s_etat_processus); 2774: void instruction_unprotect(struct_processus *s_etat_processus); 2775: void instruction_until(struct_processus *s_etat_processus); 2776: void instruction_use(struct_processus *s_etat_processus); 2777: void instruction_utpc(struct_processus *s_etat_processus); 2778: void instruction_utpf(struct_processus *s_etat_processus); 2779: void instruction_utpn(struct_processus *s_etat_processus); 2780: void instruction_utpt(struct_processus *s_etat_processus); 2781: 2782: void instruction_var(struct_processus *s_etat_processus); 2783: void instruction_variable(struct_processus *s_etat_processus); 2784: void instruction_vars(struct_processus *s_etat_processus); 2785: void instruction_verify(struct_processus *s_etat_processus); 2786: void instruction_vers_niveau_inferieur(struct_processus *s_etat_processus); 2787: void instruction_vers_niveau_superieur(struct_processus *s_etat_processus); 2788: void instruction_version(struct_processus *s_etat_processus); 2789: void instruction_visit(struct_processus *s_etat_processus); 2790: void instruction_volatile(struct_processus *s_etat_processus); 2791: 2792: void instruction_wait(struct_processus *s_etat_processus); 2793: void instruction_warranty(struct_processus *s_etat_processus); 2794: void instruction_wfdata(struct_processus *s_etat_processus); 2795: void instruction_wfack(struct_processus *s_etat_processus); 2796: void instruction_wflock(struct_processus *s_etat_processus); 2797: void instruction_wfpoke(struct_processus *s_etat_processus); 2798: void instruction_wfproc(struct_processus *s_etat_processus); 2799: void instruction_wfsock(struct_processus *s_etat_processus); 2800: void instruction_wfswi(struct_processus *s_etat_processus); 2801: void instruction_while(struct_processus *s_etat_processus); 2802: void instruction_wireframe(struct_processus *s_etat_processus); 2803: void instruction_workdir(struct_processus *s_etat_processus); 2804: void instruction_write(struct_processus *s_etat_processus); 2805: 2806: void instruction_xcol(struct_processus *s_etat_processus); 2807: void instruction_xor(struct_processus *s_etat_processus); 2808: void instruction_xpon(struct_processus *s_etat_processus); 2809: void instruction_xroot(struct_processus *s_etat_processus); 2810: 2811: void instruction_ycol(struct_processus *s_etat_processus); 2812: void instruction_yield(struct_processus *s_etat_processus); 2813: 2814: /* 2815: -------------------------------------------------------------------------------- 2816: Procédures 2817: -------------------------------------------------------------------------------- 2818: */ 2819: 2820: #ifndef RPLARGS 2821: void affectation_interruptions_logicielles(struct_processus *s_etat_processus); 2822: void affichage_pile(struct_processus *s_etat_processus, 2823: struct_liste_chainee *l_element_courant, unsigned long 2824: niveau_courant); 2825: #endif 2826: 2827: void *allocation_maillon(struct_processus *s_etat_processus); 2828: 2829: #ifndef RPLARGS 2830: void analyse(struct_processus *s_etat_processus, void (*fonction)()); 2831: void *analyse_instruction(struct_processus *s_etat_processus, 2832: unsigned char *candidat); 2833: void appel_gnuplot(struct_processus *s_etat_processus, 2834: unsigned char persistance); 2835: void cf(struct_processus *s_etat_processus, unsigned char indice_drapeau); 2836: void cond(struct_processus *s_etat_processus, 2837: struct_matrice *s_matrice, real8 *condition); 2838: void conversion_decimal_vers_hms(real8 *angle); 2839: void conversion_degres_vers_radians(real8 *angle); 2840: void conversion_element_tex(unsigned char **element, unsigned char *fonction); 2841: void conversion_format(struct_processus *s_etat_processus, 2842: unsigned char *chaine); 2843: void conversion_hms_vers_decimal(real8 *angle); 2844: void conversion_majuscule_limitee(unsigned char *chaine_entree, 2845: unsigned char *chaine_sortie, unsigned long longueur); 2846: void conversion_radians_vers_degres(real8 *angle); 2847: void copie_arbre_variables(struct_processus *s_etat_processus, 2848: struct_processus *s_nouvel_etat_processus); 2849: void correction_formateur_tex(struct_processus *s_etat_processus, 2850: unsigned char **ligne); 2851: void depilement_pile_systeme(struct_processus *s_etat_processus); 2852: void derivation(struct_processus *s_etat_processus, 2853: struct_objet **s_expression); 2854: void determinant(struct_processus *s_etat_processus, struct_matrice *s_matrice, 2855: void *valeur); 2856: void deverrouillage_threads_concurrents(struct_processus *s_etat_processus); 2857: void ecriture_pile(struct_processus *s_etat_processus, file *flux, 2858: struct_liste_chainee *l_element_courant, unsigned long niveau_courant); 2859: void ecriture_profil(struct_processus *s_etat_processus); 2860: void effacement_pile_systeme(struct_processus *s_etat_processus); 2861: void empilement_pile_systeme(struct_processus *s_etat_processus); 2862: void encart(struct_processus *s_etat_processus, unsigned long duree); 2863: void evaluation_romberg(struct_processus *s_etat_processus, 2864: struct_objet *s_expression, unsigned char *variable, real8 *point, 2865: real8 *valeur, logical1 *validite); 2866: void factorisation_cholesky(struct_processus *s_etat_processus, 2867: struct_matrice *s_matrice, unsigned char mode); 2868: void factorisation_lq(struct_processus *s_etat_processus, 2869: struct_matrice *s_matrice, void **tau); 2870: void factorisation_lu(struct_processus *s_etat_processus, 2871: struct_matrice *s_matrice, struct_matrice **s_permutation); 2872: void factorisation_qr(struct_processus *s_etat_processus, 2873: struct_matrice *s_matrice, void **tau); 2874: void factorisation_schur(struct_processus *s_etat_processus, 2875: struct_matrice *s_matrice, struct_matrice **s_schur); 2876: void *fusible(void *argument); 2877: void formateur_tex(struct_processus *s_etat_processus, struct_objet *s_objet, 2878: unsigned char environnement); 2879: void formateur_elementaire_tex(struct_processus *s_etat_processus, 2880: file *fichier, struct_objet *s_objet, unsigned char environnement); 2881: void impression_pile(struct_processus *s_etat_processus, 2882: struct_liste_chainee *l_element_courant, 2883: unsigned char methode, unsigned long niveau_courant); 2884: void impression_tex(struct_processus *s_etat_processus); 2885: void informations(struct_processus *s_etat_processus); 2886: void initialisation_allocateur(struct_processus *s_etat_processus); 2887: void initialisation_completion(void); 2888: void initialisation_contexte_cas(struct_processus *s_etat_processus); 2889: void initialisation_drapeaux(struct_processus *s_etat_processus); 2890: void initialisation_generateur_aleatoire(struct_processus *s_etat_processus, 2891: logical1 initialisation_automatique, unsigned long int racine); 2892: void initialisation_instructions(struct_processus *s_etat_processus); 2893: void initialisation_variables(struct_processus *s_etat_processus); 2894: #endif 2895: 2896: void initialisation_objet(struct_objet *s_objet); 2897: 2898: #ifndef RPLARGS 2899: void insertion_thread(struct_processus *s_etat_processus, 2900: logical1 thread_principal); 2901: void insertion_thread_surveillance(struct_processus *s_etat_processus, 2902: struct_descripteur_thread *s_argument_thread); 2903: void integrale_romberg(struct_processus *s_etat_processus, 2904: struct_objet *s_expression, unsigned char *variable, 2905: real8 a, real8 b, real8 precision); 2906: void interface_cas(struct_processus *s_etat_processus, 2907: enum t_rplcas_commandes commande); 2908: void interruption1(SIGHANDLER_ARGS); 2909: void interruption2(SIGHANDLER_ARGS); 2910: void interruption3(SIGHANDLER_ARGS); 2911: void interruption4(SIGHANDLER_ARGS); 2912: void interruption5(SIGHANDLER_ARGS); 2913: void interruption6(SIGHANDLER_ARGS); 2914: void interruption7(SIGHANDLER_ARGS); 2915: void interruption8(SIGHANDLER_ARGS); 2916: void interruption9(SIGHANDLER_ARGS); 2917: void interruption10(SIGHANDLER_ARGS); 2918: void interruption11(SIGHANDLER_ARGS); 2919: void inversion_matrice(struct_processus *s_etat_processus, 2920: struct_matrice *s_matrice); 2921: void lancement_daemon(struct_processus *s_etat_processus); 2922: void *lancement_thread(void *argument); 2923: #endif 2924: 2925: void liberation(struct_processus *s_etat_processus, struct_objet *s_objet); 2926: void liberation_maillon(struct_processus *s_etat_processus, 2927: struct_liste_chainee *maillon); 2928: 2929: #ifndef RPLARGS 2930: void liberation_allocateur(struct_processus *s_etat_processus); 2931: void liberation_arbre_instructions(struct_processus *s_etat_processus, 2932: struct_instruction *arbre); 2933: void liberation_arbre_variables(struct_processus *s_etat_processus, 2934: struct_arbre_variables *arbre, logical1 definitions); 2935: void liberation_contexte_cas(struct_processus *s_etat_processus); 2936: void liberation_generateur_aleatoire(struct_processus *s_etat_processus); 2937: void liberation_threads(struct_processus *s_etat_processus); 2938: void liberation_profil(struct_processus *s_etat_processus); 2939: void localisation_courante(struct_processus *s_etat_processus); 2940: void modification_pid_thread_pere(struct_processus *s_etat_processus); 2941: void moindres_carres(struct_processus *s_etat_processus, 2942: struct_matrice *s_matrice_a, struct_matrice *s_matrice_b, 2943: struct_matrice *s_matrice_x); 2944: void profilage(struct_processus *s_etat_processus, unsigned char *fonction); 2945: void rang(struct_processus *s_etat_processus, struct_matrice *s_matrice, 2946: integer8 *valeur); 2947: void recherche_type(struct_processus *s_etat_processus); 2948: void retrait_thread(struct_processus *s_etat_processus); 2949: void retrait_thread_surveillance(struct_processus *s_etat_processus, 2950: struct_descripteur_thread *s_argument_thread); 2951: void rplcore(struct_processus *s_etat_processus); 2952: void scrutation_injection(struct_processus *s_etat_processus); 2953: void sf(struct_processus *s_etat_processus, unsigned char indice_drapeau); 2954: void *surveillance_processus(void *argument); 2955: void swap(void *variable_1, void *variable_2, unsigned long taille_octets); 2956: void trace(struct_processus *s_etat_processus, FILE *flux); 2957: void traitement_asynchrone_exceptions_gsl(struct_processus *s_etat_processus); 2958: void traitement_exceptions_gsl(const char *reason, const char *file, 2959: int line, int gsl_errno); 2960: void traitement_interruptions_logicielles(struct_processus *s_etat_processus); 2961: void tri_base_symboles_externes(struct_processus *s_etat_processus); 2962: void tri_vecteur(real8 *vecteur, unsigned long taille); 2963: void valeurs_propres(struct_processus *s_etat_processus, 2964: struct_matrice *s_matrice, 2965: struct_vecteur *s_valeurs_propres, 2966: struct_matrice *s_vecteurs_propres_gauches, 2967: struct_matrice *s_vecteur_propres_droits); 2968: void valeurs_propres_generalisees(struct_processus *s_etat_processus, 2969: struct_matrice *s_matrice, 2970: struct_matrice *s_metrique, 2971: struct_vecteur *s_valeurs_propres, 2972: struct_matrice *s_vecteurs_propres_gauches, 2973: struct_matrice *s_vecteur_propres_droits); 2974: void valeurs_singulieres(struct_processus *s_etat_processus, 2975: struct_matrice *s_matrice, 2976: struct_matrice *u, struct_vecteur *s, struct_matrice *vh); 2977: void verrouillage_threads_concurrents(struct_processus *s_etat_processus); 2978: #endif 2979: 2980: #ifndef RPLARGS 2981: #ifdef _BROKEN_SIGINFO 2982: void creation_fifos_signaux(struct_processus *s_etat_processus); 2983: void destruction_fifos_signaux(struct_processus *s_etat_processus); 2984: void liberation_fifos_signaux(struct_processus *s_etat_processus); 2985: #endif 2986: #endif 2987: 2988: /* 2989: -------------------------------------------------------------------------------- 2990: Fonctions de sommation de vecteur dans perte de précision 2991: -------------------------------------------------------------------------------- 2992: */ 2993: 2994: real8 sommation_vecteur_reel(real8 *vecteur, unsigned long *taille, 2995: logical1 *erreur_memoire); 2996: complex16 sommation_vecteur_complexe(complex16 *vecteur, unsigned long *taille, 2997: logical1 *erreur_memoire); 2998: 2999: /* 3000: -------------------------------------------------------------------------------- 3001: Routine principale 3002: -------------------------------------------------------------------------------- 3003: */ 3004: 3005: #ifndef RPLARGS 3006: int rplinit(int argc, char *argv[], unsigned char ***resultats, char *rpl_home); 3007: #endif 3008: 3009: /* 3010: -------------------------------------------------------------------------------- 3011: Routines de statistiques 3012: -------------------------------------------------------------------------------- 3013: */ 3014: 3015: #ifndef RPLARGS 3016: real8 correlation_statistique(struct_matrice *s_matrice, 3017: unsigned long colonne_1, unsigned long colonne_2, logical1 *erreur); 3018: real8 covariance_statistique(struct_matrice *s_matrice, 3019: unsigned long colonne_1, unsigned long colonne_2, 3020: unsigned char type, logical1 *erreur); 3021: struct_vecteur *ecart_type_statistique(struct_matrice *s_matrice, 3022: unsigned char type); 3023: struct_vecteur *moyenne_statistique(struct_matrice *s_matrice); 3024: struct_vecteur *sommation_colonne_statistique(struct_matrice *s_matrice, 3025: unsigned long colonne); 3026: struct_vecteur *sommation_produits_colonnes_statistiques(struct_matrice 3027: *s_matrice, unsigned long colonne_1, unsigned long colonne_2); 3028: struct_vecteur *sommation_statistique(struct_matrice *s_matrice); 3029: struct_vecteur *variance_statistique(struct_matrice *s_matrice, 3030: unsigned char type); 3031: #endif 3032: 3033: /* 3034: -------------------------------------------------------------------------------- 3035: Gestion des bibliothèques 3036: -------------------------------------------------------------------------------- 3037: */ 3038: 3039: #ifndef RPLARGS 3040: void *chargement_bibliotheque(struct_processus *s_etat_processus, 3041: unsigned char *bibliotheque); 3042: logical1 execution_fonction_de_bibliotheque(struct_processus *s_etat_processus, 3043: unsigned char *nom_fonction, unsigned char *bibliothque); 3044: logical1 retrait_bibliotheque(struct_processus *s_etat_processus, 3045: struct_bibliotheque *descripteur); 3046: #endif 3047: 3048: struct_liste_chainee *depilement_pile_operationnelle(struct_rpl_arguments 3049: *s_rpl_arguments, struct_objet **s_objet); 3050: struct_liste_chainee *empilement_pile_operationnelle(struct_rpl_arguments 3051: *s_rpl_arguments, struct_objet *s_objet); 3052: struct_liste_chainee *sauvegarde_arguments(struct_rpl_arguments 3053: *s_rpl_arguments, unsigned long nombre_arguments); 3054: 3055: /* 3056: -------------------------------------------------------------------------------- 3057: Fonctions retournant un CHARACTER*(*) 3058: -------------------------------------------------------------------------------- 3059: */ 3060: 3061: #ifndef RPLARGS 3062: unsigned char *analyse_algebrique(struct_processus *s_etat_processus, 3063: unsigned char *chaine_algebrique, struct_liste_chainee **l_base_liste); 3064: unsigned char *recherche_chemin_fichiers_temporaires(struct_processus 3065: *s_etat_processus); 3066: unsigned char *compactage(unsigned char *chaine); 3067: unsigned char *conversion_majuscule(unsigned char *chaine); 3068: unsigned char *creation_nom_fichier(struct_processus *s_etat_processus, 3069: unsigned char *chemin); 3070: unsigned char *extraction_chaine(unsigned char *chaine, unsigned long i, 3071: unsigned long j); 3072: unsigned char *formateur(struct_processus *s_etat_processus, long offset, 3073: struct_objet *s_objet); 3074: unsigned char *formateur_fichier(struct_processus *s_etat_processus, 3075: struct_objet *s_objet, struct_objet *s_format, 3076: long longueur, long longueur_champ, unsigned char format, 3077: unsigned char type, long *longueur_effective, long *recursivite); 3078: unsigned char *formateur_flux(struct_processus *s_etat_processus, 3079: unsigned char *donnees, long *longueur); 3080: unsigned char *formateur_fichier_nombre(struct_processus *s_etat_processus, 3081: void *valeur_numerique, unsigned char type, 3082: long longueur, long longueur_champ, unsigned char format); 3083: unsigned char *formateur_fichier_reel(struct_processus *s_etat_processus, 3084: void *valeur_numerique, unsigned char type, 3085: long longueur, long longueur_champ, unsigned char format); 3086: unsigned char *formateur_nombre(struct_processus *s_etat_processus, 3087: void *valeur_numerique, unsigned char type); 3088: unsigned char *formateur_reel(struct_processus *s_etat_processus, 3089: void *valeur_numerique, unsigned char type); 3090: unsigned char *messages(struct_processus *s_etat_processus); 3091: unsigned char *purification_chaine(unsigned char *chaine); 3092: unsigned char *reencodage(struct_processus *s_etat_processus, 3093: unsigned char *chaine_entree, unsigned char *codage_entree, 3094: unsigned char *codage_sortie); 3095: unsigned char *transliteration(struct_processus *s_etat_processus, 3096: unsigned char *chaine_entree, unsigned char *codage_entree, 3097: unsigned char *codage_sortie); 3098: #endif 3099: 3100: /* 3101: -------------------------------------------------------------------------------- 3102: Fonctions retournant un INTEGER*1 (drapeau d'erreur) 3103: -------------------------------------------------------------------------------- 3104: */ 3105: 3106: #ifndef RPLARGS 3107: logical1 analyse_syntaxique(struct_processus *s_etat_processus); 3108: logical1 caracteristiques_fichier(struct_processus *s_etat_processus, 3109: unsigned char *nom, logical1 *existence, logical1 *ouverture, 3110: unsigned long *unite); 3111: logical1 controle(struct_processus *s_etat_processus, unsigned char *fichier, 3112: unsigned char *type, unsigned char *somme_candidate); 3113: logical1 creation_variable(struct_processus *s_etat_processus, 3114: struct_variable *s_variable, 3115: unsigned char autorisation_creation_variable_statique, 3116: unsigned char autorisation_creation_variable_partagee); 3117: logical1 creation_variable_partagee(struct_processus *s_etat_processus, 3118: struct_variable_partagee *s_variable); 3119: logical1 creation_variable_statique(struct_processus *s_etat_processus, 3120: struct_variable_statique *s_variable); 3121: logical1 chainage(struct_processus *s_etat_processus); 3122: logical1 compilation(struct_processus *s_etat_processus); 3123: logical1 depilement(struct_processus *s_etat_processus, 3124: struct_liste_chainee **l_base_liste, struct_objet **s_objet); 3125: logical1 destruction_fichier(unsigned char *nom_fichier); 3126: logical1 empilement(struct_processus *s_etat_processus, 3127: struct_liste_chainee **l_base_liste, struct_objet *s_objet); 3128: logical1 empilement_pile_last(struct_processus *s_etat_processus, 3129: unsigned long nombre_arguments); 3130: logical1 evaluation(struct_processus *s_etat_processus, struct_objet *s_objet, 3131: unsigned char type_evaluation); 3132: logical1 initialisation_fichier_acces_direct(struct_processus *s_etat_processus, 3133: sqlite3 *sqlite, logical1 binaire); 3134: logical1 initialisation_fichier_acces_indexe(struct_processus *s_etat_processus, 3135: sqlite3 *sqlite, integer8 position_clef, logical1 binaire); 3136: logical1 recherche_instruction_suivante(struct_processus *s_etat_processus); 3137: logical1 retrait_variable(struct_processus *s_etat_processus, 3138: unsigned char *nom_variable, unsigned char type); 3139: logical1 retrait_variable_par_niveau(struct_processus *s_etat_processus); 3140: logical1 retrait_variable_partagee(struct_processus *s_etat_processus, 3141: unsigned char *nom_variable, union_position_variable position); 3142: logical1 retrait_variable_statique(struct_processus *s_etat_processus, 3143: unsigned char *nom_variable, union_position_variable position); 3144: logical1 sequenceur(struct_processus *s_etat_processus); 3145: logical1 sequenceur_optimise(struct_processus *s_etat_processus); 3146: #endif 3147: 3148: /* 3149: -------------------------------------------------------------------------------- 3150: Fonctions retournant un INTEGER*1 (drapeau) 3151: -------------------------------------------------------------------------------- 3152: */ 3153: 3154: logical1 depassement_addition(integer8 *a, integer8 *b, integer8 *resultat); 3155: logical1 depassement_multiplication(integer8 *a, integer8 *b, 3156: integer8 *resultat); 3157: logical1 depassement_puissance(integer8 *a, integer8 *b, integer8 *resultat); 3158: 3159: #ifndef RPLARGS 3160: logical1 ecriture_pipe(struct_processus *s_etat_processus, int pipe, 3161: struct_objet *s_objet); 3162: logical1 recherche_variable(struct_processus *s_etat_processus, 3163: unsigned char *nom_variable); 3164: logical1 recherche_variable_globale(struct_processus *s_etat_processus, 3165: unsigned char *nom_variable); 3166: logical1 recherche_variable_partagee(struct_processus *s_etat_processus, 3167: unsigned char *nom_variable, union_position_variable position, 3168: unsigned char origine); 3169: logical1 recherche_variable_statique(struct_processus *s_etat_processus, 3170: unsigned char *nom_variable, union_position_variable position, 3171: unsigned char origine); 3172: logical1 test_cfsf(struct_processus *s_etat_processus, 3173: unsigned char indice_drapeau); 3174: logical1 test_expression_rpn(unsigned char *chaine); 3175: logical1 test_fonction(unsigned char *chaine); 3176: #endif 3177: 3178: /* 3179: -------------------------------------------------------------------------------- 3180: Fonctions retournant un ssize_t 3181: -------------------------------------------------------------------------------- 3182: */ 3183: 3184: #ifndef RPLARGS 3185: ssize_t read_atomic(struct_processus *s_etat_processus, 3186: int fd, void *buf, size_t count); 3187: ssize_t write_atomic(struct_processus *s_etat_processus, 3188: int fd, void *buf, size_t count); 3189: #endif 3190: 3191: /* 3192: -------------------------------------------------------------------------------- 3193: Fonctions renvoyant un int 3194: -------------------------------------------------------------------------------- 3195: */ 3196: 3197: int alsprintf(unsigned char **strp, const char *fmt, ...); 3198: int liste_variables(struct_processus *s_etat_processus, 3199: struct_tableau_variables *tableau, int position, 3200: struct_arbre_variables *l_element_courant); 3201: int nombre_variables(struct_processus *s_etat_processus, 3202: struct_arbre_variables *l_element_courant); 3203: int tex_fprintf(struct_processus *s_etat_processus, 3204: file *flux, const char *format, ...); 3205: int transliterated_fprintf(struct_processus *s_etat_processus, file *flux, 3206: const char *format, ...); 3207: int valsprintf(unsigned char **strp, const char *fmt, va_list ap); 3208: int wrapper_instruction_intrinseque(void (*fonction)(), 3209: struct_rpl_arguments *rpl_arguments); 3210: 3211: /* 3212: -------------------------------------------------------------------------------- 3213: Fonctions renvoyant un INTEGER*1 (longueur d'un entier binaire) 3214: -------------------------------------------------------------------------------- 3215: */ 3216: 3217: #ifndef RPLARGS 3218: unsigned char longueur_entiers_binaires(struct_processus *s_etat_processus); 3219: unsigned char recherche_longueur_optimale(integer8 parametre); 3220: #endif 3221: 3222: /* 3223: -------------------------------------------------------------------------------- 3224: Fonctions retournant un INTEGER*8 (valeur binaire non signée) 3225: -------------------------------------------------------------------------------- 3226: */ 3227: 3228: #ifndef RPLARGS 3229: logical8 masque_entiers_binaires(struct_processus *s_etat_processus); 3230: #endif 3231: 3232: /* 3233: -------------------------------------------------------------------------------- 3234: Fonctions retournant un INTEGER*8 (entier standard RPL/2) 3235: -------------------------------------------------------------------------------- 3236: */ 3237: 3238: #ifndef RPLARGS 3239: integer8 occupation_memoire(struct_objet *s_objet); 3240: #endif 3241: 3242: /* 3243: -------------------------------------------------------------------------------- 3244: Fonctions renvoyant une liste chaînée (pointeur sur *struct_liste_chainee) 3245: -------------------------------------------------------------------------------- 3246: */ 3247: 3248: #ifndef RPLARGS 3249: struct_liste_chainee *analyse_rpn(struct_processus *s_etat_processus, 3250: unsigned char *chaine_rpn); 3251: #endif 3252: 3253: /* 3254: -------------------------------------------------------------------------------- 3255: Fonctions renvoyant une copie de la structure de description des processus 3256: -------------------------------------------------------------------------------- 3257: */ 3258: 3259: #ifndef RPLARGS 3260: struct_processus *copie_etat_processus(struct_processus *s_etat_processus); 3261: #endif 3262: 3263: /* 3264: -------------------------------------------------------------------------------- 3265: Fonctions renvoyant un pointeur sur un fichier (file *) ou un descripteur 3266: -------------------------------------------------------------------------------- 3267: */ 3268: 3269: #ifndef RPLARGS 3270: file *creation_fichier_tex(struct_processus *s_etat_processus); 3271: struct_descripteur_fichier *descripteur_fichier(struct_processus 3272: *s_etat_processus, struct_fichier *s_fichier); 3273: #endif 3274: 3275: /* 3276: -------------------------------------------------------------------------------- 3277: Fonctions renvoyant un pointeur sur une *struct_objet 3278: -------------------------------------------------------------------------------- 3279: */ 3280: 3281: struct_objet *copie_objet(struct_processus *s_etat_processus, 3282: struct_objet *s_objet, unsigned char type); 3283: 3284: #ifndef RPLARGS 3285: struct_objet *allocation(struct_processus *s_etat_processus, enum t_type type); 3286: struct_objet *formateur_date(struct_processus *s_etat_processus, 3287: struct timeval *temps); 3288: struct_objet *lecture_pipe(struct_processus *s_etat_processus, int pipe); 3289: struct_objet *parametres_sql(struct_processus *s_etat_processus, 3290: struct_objet *s_parametres); 3291: struct_objet *simplification(struct_processus *s_etat_processus, 3292: struct_objet *s_objet); 3293: #endif 3294: 3295: /* 3296: -------------------------------------------------------------------------------- 3297: Fonctions gérant les arbres de simplification 3298: -------------------------------------------------------------------------------- 3299: */ 3300: 3301: #ifndef RPLARGS 3302: struct_arbre *creation_arbre(struct_processus *s_etat_processus, 3303: struct_objet **t_objets, unsigned long indice, 3304: unsigned long indice_maximal); 3305: void liberation_arbre(struct_processus *s_etat_processus, 3306: struct_arbre *s_noeud); 3307: void parcours_arbre(struct_processus *s_etat_processus, struct_arbre *s_noeud); 3308: void simplification_arbre(struct_processus *s_etat_processus, 3309: struct_arbre *s_noeud); 3310: #endif 3311: 3312: /* 3313: -------------------------------------------------------------------------------- 3314: Fonctions gérant la complétion automatique 3315: -------------------------------------------------------------------------------- 3316: */ 3317: 3318: char **completion_rpl(); 3319: char *generateur_commandes(); 3320: char **completion_matches(); 3321: 3322: // END C PROTOTYPES 3323: 3324: /* 3325: -------------------------------------------------------------------------------- 3326: Arithmétique 3327: -------------------------------------------------------------------------------- 3328: */ 3329: 3330: void f77absc_(complex16 *c, real8 *resultat); 3331: 3332: void f77additioncc_(complex16 *ca, complex16 *cb, complex16 *resultat); 3333: void f77additionci_(complex16 *ca, integer8 *ib, complex16 *resultat); 3334: void f77additioncr_(complex16 *ca, real8 *rb, complex16 *resultat); 3335: 3336: void f77divisioncc_(complex16 *ca, complex16 *rb, complex16 *resultat); 3337: void f77divisionci_(complex16 *ca, integer8 *ib, complex16 *resultat); 3338: void f77divisioncr_(complex16 *ca, real8 *rb, complex16 *resultat); 3339: void f77divisionic_(integer8 *ib, complex16 *cb, complex16 *resultat); 3340: void f77divisionrc_(real8 *ra, complex16 *cb, complex16 *resultat); 3341: 3342: void f77multiplicationcc_(complex16 *ca, complex16 *cb, complex16 *resultat); 3343: void f77multiplicationci_(complex16 *ca, integer8 *ib, complex16 *resultat); 3344: void f77multiplicationcr_(complex16 *ca, real8 *rb, complex16 *resultat); 3345: 3346: void f77puissancecc_(complex16 *ca, complex16 *cb, complex16 *resultat); 3347: void f77puissanceci_(complex16 *ca, integer8 *ib, complex16 *resultat, 3348: integer4 *troncature); 3349: void f77puissancecr_(complex16 *ca, real8 *rb, complex16 *resultat); 3350: void f77puissanceic_(integer8 *ia, complex16 *cb, complex16 *resultat); 3351: void f77puissanceii_(integer8 *ia, integer8 *ib, integer8 *resultat); 3352: void f77puissanceir_(integer8 *ia, real8 *rb, real8 *resultat); 3353: void f77puissancerc_(real8 *ra, complex16 *cb, complex16 *resultat); 3354: void f77puissanceri_(real8 *ra, integer8 *ib, real8 *resultat, 3355: integer4 *troncature); 3356: void f77puissancerr_(real8 *ra, real8 *rb, real8 *resultat); 3357: 3358: void f77racinecarreec_(complex16 *ca, complex16 *resultat); 3359: void f77racinecarreein_(integer8 *ia, complex16 *resultat); 3360: void f77racinecarreeip_(integer8 *ia, real8 *resultat); 3361: void f77racinecarreern_(real8 *ia, complex16 *resultat); 3362: void f77racinecarreerp_(real8 *ia, real8 *resultat); 3363: 3364: void f77soustractioncc_(complex16 *ca, complex16 *cb, complex16 *resultat); 3365: void f77soustractionci_(complex16 *ca, integer8 *ib, complex16 *resultat); 3366: void f77soustractioncr_(complex16 *ca, real8 *rb, complex16 *resultat); 3367: void f77soustractionic_(integer8 *ib, complex16 *cb, complex16 *resultat); 3368: void f77soustractionrc_(real8 *ra, complex16 *cb, complex16 *resultat); 3369: 3370: /* 3371: -------------------------------------------------------------------------------- 3372: Trigonométrie complexe 3373: -------------------------------------------------------------------------------- 3374: */ 3375: 3376: void f77acos_(complex16 *argument, complex16 *resultat); 3377: void f77asin_(complex16 *argument, complex16 *resultat); 3378: void f77atan_(complex16 *argument, complex16 *resultat, integer4 *erreur); 3379: void f77cos_(complex16 *argument, complex16 *resultat); 3380: void f77sin_(complex16 *argument, complex16 *resultat); 3381: void f77tan_(complex16 *argument, complex16 *resultat, integer4 *erreur); 3382: 3383: /* 3384: -------------------------------------------------------------------------------- 3385: Fonctions hyperboliques 3386: -------------------------------------------------------------------------------- 3387: */ 3388: 3389: void f77acoshc_(complex16 *argument, complex16 *resultat); 3390: void f77alogc_(complex16 *argument, complex16 *resultat); 3391: void f77asinhc_(complex16 *argument, complex16 *resultat); 3392: void f77atanhc_(complex16 *argument, complex16 *resultat); 3393: void f77cosh_(complex16 *argument, complex16 *resultat); 3394: void f77expc_(complex16 *argument, complex16 *resultat); 3395: void f77lnc_(complex16 *argument, complex16 *resultat, integer4 *erreur); 3396: void f77lnin_(integer8 *argument, complex16 *resultat, integer4 *erreur); 3397: void f77lnrn_(real8 *argument, complex16 *resultat, integer4 *erreur); 3398: void f77logc_(complex16 *argument, complex16 *resultat, integer4 *erreur); 3399: void f77login_(integer8 *argument, complex16 *resultat, integer4 *erreur); 3400: void f77logrn_(real8 *argument, complex16 *resultat, integer4 *erreur); 3401: void f77sinh_(complex16 *argument, complex16 *resultat); 3402: void f77tanh_(complex16 *argument, complex16 *resultat, integer4 *erreur); 3403: void f77acoshi_(integer8 *argument, real8 *resultat); 3404: void f77acoshr_(real8 *argument, real8 *resultat); 3405: void f77asinhi_(integer8 *argument, real8 *resultat); 3406: void f77asinhr_(real8 *argument, real8 *resultat); 3407: void f77atanhi_(integer8 *argument, real8 *resultat); 3408: void f77atanhr_(real8 *argument, real8 *resultat); 3409: void f77lnip_(integer8 *argument, real8 *resultat, integer4 *erreur); 3410: void f77lnrp_(real8 *argument, real8 *resultat, integer4 *erreur); 3411: void f77logip_(integer8 *argument, real8 *resultat, integer4 *erreur); 3412: void f77logrp_(real8 *argument, real8 *resultat, integer4 *erreur); 3413: 3414: /* 3415: -------------------------------------------------------------------------------- 3416: Calculs divers 3417: -------------------------------------------------------------------------------- 3418: */ 3419: 3420: void f90arrangement(integer8 *n, integer8 *k, real8 *resultat); 3421: void f90combinaison(integer8 *n, integer8 *k, real8 *resultat); 3422: void f90fcd(real8 *x, integer8 *n1, integer8 *n2, real8 *resultat); 3423: void f90gausscd(real8 *x, real8 *moyenne, real8 *variance, real8 *resultat); 3424: void f90tcd(real8 *x, integer8 *n, real8 *resultat); 3425: void f90x2cd(real8 *x, integer8 *n, real8 *resultat); 3426: 3427: // BEGIN C PROTOTYPES 3428: void dft(complex16 *dft, integer4 *nombre_lignes, integer4 *nombre_colonnes, 3429: integer4 *inverse, integer4 *erreur); 3430: // END C PROTOTYPES 3431: 3432: /* 3433: -------------------------------------------------------------------------------- 3434: Fonctions Lapack 3435: -------------------------------------------------------------------------------- 3436: */ 3437: 3438: /* 3439: * Calcul de la longueur d'un espace de travail 3440: */ 3441: 3442: #ifndef RPLARGS 3443: integer4 ilaenv_(integer4 *optimal, char *nom_fonction, char *option, 3444: integer4 *n1, integer4 *n2, integer4 *n3, integer4 *n4, 3445: integer4 longueur_nom_fonction, integer4 longueur_option); 3446: 3447: /* 3448: * Inversion 3449: */ 3450: 3451: void dgetri_(integer4 *ordre_a, real8 *a, integer4 *lda, integer4 *pivot, 3452: real8 *work, integer4 *dim_work, integer4 *ios); 3453: void zgetri_(integer4 *ordre_a, complex16 *a, integer4 *lda, integer4 *pivot, 3454: complex16 *work, integer4 *dim_work, integer4 *ios); 3455: 3456: /* 3457: * Valeurs propres 3458: */ 3459: 3460: void zgeev_(unsigned char *calcul_vp_gauches, unsigned char *calcul_vp_droits, 3461: integer4 *dim_matrice1, complex16 *matrice_f77, 3462: integer4 *dim_matrice2, complex16 *valeurs_propres, 3463: complex16 *vpg_f77, integer4 *dim_matrice3, 3464: complex16 *vpd_f77, integer4 *dim_matrice4, 3465: complex16 *work, integer4 *lwork, real8 *rwork, 3466: integer4 *erreur, integer4 longueur_1, integer4 longueur_2); 3467: 3468: /* 3469: * Valeurs propres généralisées 3470: */ 3471: 3472: void zggev_(unsigned char *calcul_vp_gauches, unsigned char *calcul_vp_droits, 3473: integer4 *dim_matrice1, complex16 *matrice_f77, 3474: integer4 *dim_matrice2, complex16 *metrique_f77, 3475: integer4 *dim_matrice3, complex16 *alpha, complex16 *beta, 3476: complex16 *vpg_f77, integer4 *dim_matrice4, 3477: complex16 *vpd_f77, integer4 *dim_matrice5, 3478: complex16 *work, integer4 *lwork, real8 *rwork, 3479: integer4 *erreur, integer4 longueur_1, integer4 longueur_2); 3480: 3481: /* 3482: * Moindres carrés 3483: */ 3484: 3485: void dgelsd_(integer4 *nombre_lignes_a, integer4 *nombre_colonnes_a, 3486: integer4 *nombre_colonnes_b, real8 *matrice_a, integer4 *lda, 3487: real8 *matrice_b, integer4 *ldb, real8 *valeurs_singulieres, 3488: real8 *rcond, integer4 *rank, real8 *work, integer4 *lwork, 3489: integer4 *iwork, integer4 *info); 3490: void zgelsd_(integer4 *nombre_lignes_a, integer4 *nombre_colonnes_a, 3491: integer4 *nombre_colonnes_b, complex16 *matrice_a, integer4 *lda, 3492: complex16 *matrice_b, integer4 *ldb, real8 *valeurs_singulieres, 3493: real8 *rcond, integer4 *rank, complex16 *work, integer4 *lwork, 3494: real8 *rwork, integer4 *iwork, integer4 *info); 3495: 3496: /* 3497: * Moindres carrés généralisé 3498: */ 3499: 3500: /* 3501: * Décomposition en valeurs singulières 3502: */ 3503: 3504: void dgesvd_(unsigned char *jobu, unsigned char *jobvh, 3505: integer4 *m, integer4 *n, real8 *a, integer4 *lda, 3506: real8 *s, real8 *u, integer4 *ldu, real8 *vh, integer4 *ldvh, 3507: real8 *work, integer4 *lwork, integer4 *info, integer4 longueur_jobu, 3508: integer4 longueur_jobvh); 3509: void zgesvd_(unsigned char *jobu, unsigned char *jobvh, 3510: integer4 *m, integer4 *n, real8 *a, integer4 *lda, 3511: real8 *s, real8 *u, integer4 *ldu, real8 *vh, integer4 *ldvh, 3512: real8 *work, integer4 *lwork, real8 *rwork, integer4 *info, 3513: integer4 longueur_jobu, integer4 longueur_jobvh); 3514: 3515: /* 3516: * Factorisations diverses 3517: */ 3518: 3519: /* LU de Crout */ 3520: void dgetrf_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, real8 *a, 3521: integer4 *lda, integer4 *pivot, integer4 *ios); 3522: void zgetrf_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, complex16 *a, 3523: integer4 *lda, integer4 *pivot, integer4 *ios); 3524: 3525: /* LQ */ 3526: void dgelq2_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, real8 *a, 3527: integer4 *lda, real8 *tau, real8 *work, integer4 *ios); 3528: void zgelq2_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, complex16 *a, 3529: integer4 *lda, complex16 *tau, complex16 *work, integer4 *ios); 3530: 3531: /* QR */ 3532: void dgeqp3_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, real8 *a, 3533: integer4 *lda, integer4 *pivot, real8 *tau, real8 *work, 3534: integer4 *lwork, integer4 *ios); 3535: void zgeqp3_(integer4 *nb_lignes_a, integer4 *nb_colonnes_a, complex16 *a, 3536: integer4 *lda, integer4 *pivot, complex16 *tau, complex16 *work, 3537: integer4 *lwork, real8 *rwork, integer4 *ios); 3538: 3539: /* Cholesky */ 3540: void dpptrf_(unsigned char *mode, integer4 *n, complex16 *triangle, 3541: integer4 *ios, integer4 longueur); 3542: void zpptrf_(unsigned char *mode, integer4 *n, complex16 *triangle, 3543: integer4 *ios, integer4 longueur); 3544: 3545: /* Schur */ 3546: void dgees_(unsigned char *calcul_vecteur, unsigned char *valeurs_triees, 3547: logical4 (*fonction_tri)(), integer4 *n, real8 *a, 3548: integer4 *lda, integer4 *sdim, real8 *wr, real8 *wi, 3549: real8 *vs, integer4 *ldvs, real8 *work, integer4 *lwork, 3550: logical4 *bwork, integer4 *info, integer4 l1, integer4 l2); 3551: void zgees_(unsigned char *calcul_vecteur, unsigned char *valeurs_triees, 3552: logical4 (*fonction_tri)(), integer4 *n, complex16 *a, 3553: integer4 *lda, integer4 *sdim, complex16 *w, 3554: complex16 *vs, integer4 *ldvs, complex16 *work, integer4 *lwork, 3555: real8 *rwork, logical4 *bwork, integer4 *info, 3556: integer4 l1, integer4 l2); 3557: 3558: /* Déterminant et rang */ 3559: void dgecon_(unsigned char *norm, integer4 *n, real8 *a, integer4 *lda, 3560: real8 *anorm, real8 *rcond, real8 *work, integer4 *iwork, 3561: integer4 *info, integer4 l1); 3562: void dgelsy_(integer4 *m, integer4 *n, integer4 *nrhs, real8 *a, 3563: integer4 *lda, real8 *b, integer4 *ldb, integer4 *jpvt, real8 *rcond, 3564: integer4 *rank, real8 *work, integer4 *lwork, integer4 *info); 3565: real8 dlange_(unsigned char *norme, integer4 *n, integer4 *m, real8 *a, 3566: integer4 *lda, real8 *work, integer4 longueur); 3567: real8 zlange_(unsigned char *norme, integer4 *n, integer4 *m, real8 *a, 3568: integer4 *lda, real8 *work, integer4 longueur); 3569: void zgecon_(unsigned char *norm, integer4 *n, complex16 *a, integer4 *lda, 3570: real8 *anorm, real8 *rcond, complex16 *work, real8 *rwork, 3571: integer4 *info, integer4 l1); 3572: void zgelsy_(integer4 *m, integer4 *n, integer4 *nrhs, complex16 *a, 3573: integer4 *lda, complex16 *b, integer4 *ldb, integer4 *jpvt, 3574: real8 *rcond, integer4 *rank, complex16 *work, integer4 *lwork, 3575: real8 *rwork, integer4 *info); 3576: #endif 3577: 3578: /* 3579: * Fonction testant la requête d'arrêt (nécessaire pour tester le 3580: * drapeau depuis une bibliothèque). 3581: */ 3582: 3583: int test_arret(struct_processus *s_etat_processus); 3584: 3585: #endif 3586: 3587: // vim: ts=4