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