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