File:  [local] / rpl / src / rplexternals.h
Revision 1.41: download - view: text, annotated - select for diffs - revision graph
Wed Dec 19 09:58:28 2012 UTC (11 years, 4 months ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Changement des dates du copyright.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.12
    4:   Copyright (C) 1989-2012 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #ifndef INCLUSION_RPLARGS
   24: #   define INCLUSION_RPLARGS
   25: 
   26: /*
   27: ================================================================================
   28:   INCLUSIONS
   29: ================================================================================
   30: */
   31: 
   32: #   define RPLARGS
   33: #   define struct_processus void
   34: #   include "rpl.h"
   35: 
   36: /*
   37: ================================================================================
   38:   MACROS SPECIFIQUES
   39: ================================================================================
   40: */
   41: 
   42: #define allocation(a) librpl_allocation((*rpl_arguments).s_etat_processus, a)
   43: #define copie_objet(a, b) librpl_copie_objet( \
   44:             (*rpl_arguments).s_etat_processus, a, b)
   45: #define liberation(a) librpl_liberation((*rpl_arguments).s_etat_processus, a)
   46: 
   47: /*
   48: --------------------------------------------------------------------------------
   49:   Types
   50: --------------------------------------------------------------------------------
   51: */
   52: 
   53: #define declareObject(object) struct_objet *object = NULL
   54: #define declareInteger(integer) integer8 integer
   55: #define declareReal(real) real8 real
   56: #define declareComplex(complex) complex16 complex
   57: #define declareDaisyChain(daisyChain) struct_liste_chainee *daisyChain = NULL
   58: 
   59: #define getDaisyChainFromList(list, daisyChain) { \
   60:     typeof(list) __list = list; \
   61:     daisyChain = NULL; \
   62:     ifIsList(__list) { daisyChain = (*__list).objet; } \
   63:     else executionError("Type mistmatch error"); } while(0)
   64: 
   65: #define fetchElementFromDaisyChain(daisyChain) \
   66:     ({ typeof(daisyChain) __daisyChain = daisyChain; \
   67:     if (__daisyChain == NULL) executionError("End of daisy chain"); \
   68:     (__daisyChain == NULL) ? NULL : (*__daisyChain).donnee; })
   69: 
   70: #define replaceElementIntoDaisyChain(daisyChain, element) \
   71:     do { typeof(daisyChain) __daisyChain = daisyChain; \
   72:     if (__daisyChain == NULL) executionError("Nullified daisy chain"); \
   73:     (*__daisyChain).donnee = element; } while(0)
   74: 
   75: #define nextElementOfDaisyChain(daisyChain) \
   76:     ({ typeof(daisyChain) __daisyChain = daisyChain; \
   77:     if (__daisyChain == NULL) executionError("End of daisy chain"); \
   78:     (__daisyChain == NULL) ? NULL : (*__daisyChain).suivant; })
   79:     
   80: #define null NULL
   81: #define nullify(ptr) { ptr = NULL; } while(0)
   82: #define nullified(ptr) ((ptr) == NULL)
   83: 
   84: #define postIncr(x) (x++)
   85: #define preIncr(x) (++x)
   86: #define postDecr(x) (x--)
   87: #define preDecr(x) (--x)
   88: 
   89: #define eq ==
   90: #define ne !=
   91: #define ge >=
   92: #define gt >
   93: #define le <=
   94: #define lt <
   95: #define not !
   96: #define and &&
   97: #define or ||
   98: #define false 0
   99: #define true -1
  100: 
  101: #define setFalse(a) a = false
  102: #define setTrue(a) a = true
  103: 
  104: #define logical int
  105: #define string char *
  106: #define integer int
  107: 
  108: #define declareStructure typedef struct {
  109: #define declareUnion typedef union {
  110: #define as(name) } name;
  111: 
  112: #define target(a) (*a)
  113: #define address(a) (&a)
  114: 
  115: #define beginGroup {
  116: #define endGroup }
  117: #define beginMacro beginGroup
  118: #define endMacro endGroup while(0)
  119: #define stopRequest test_arret((*rpl_arguments).s_etat_processus)
  120: 
  121: /*
  122: --------------------------------------------------------------------------------
  123:   Constructeurs
  124: --------------------------------------------------------------------------------
  125: */
  126: 
  127: #define DISABLE_SET_BUT_NOT_USED_WARNING(a) if (&a != ((&a) + 1));
  128: 
  129: #define HEADER \
  130:     int             __constante; \
  131:     logical1        __evaluation; \
  132:     logical1        __validation_instruction = d_faux; \
  133:     logical1        __presence_aide = d_faux; \
  134:     logical1        __presence_validation = d_faux; \
  135:     unsigned char   __indice_bit; \
  136:     unsigned char   __indice_bloc; \
  137:     unsigned char   __taille_bloc; \
  138:     unsigned char   __type; \
  139:     t_8_bits        __masque; \
  140:     { \
  141:         (*rpl_arguments).instruction_valide = 'Y'; \
  142:         (*rpl_arguments).erreur = 0; \
  143:         __constante = 0; \
  144:         __evaluation = d_faux; \
  145:         DISABLE_SET_BUT_NOT_USED_WARNING(__evaluation); \
  146:         DISABLE_SET_BUT_NOT_USED_WARNING(__type); \
  147:         DISABLE_SET_BUT_NOT_USED_WARNING(__indice_bit); \
  148:         DISABLE_SET_BUT_NOT_USED_WARNING(__indice_bloc); \
  149:         DISABLE_SET_BUT_NOT_USED_WARNING(__taille_bloc); \
  150:         DISABLE_SET_BUT_NOT_USED_WARNING(__masque);
  151: 
  152: #define FUNCTION \
  153:     if (__validation_instruction == d_vrai) return; \
  154:     if (__presence_aide == d_faux) \
  155:     { \
  156:         systemError("Help string not defined"); \
  157:     } \
  158:     else if (__presence_validation == d_faux) \
  159:     { \
  160:         systemError("Number of arguments not defined"); \
  161:     } \
  162:     __indice_bit = 0; \
  163:     __indice_bloc = 0; \
  164:     __taille_bloc = 0; \
  165:     __type = 0; \
  166:     __masque = 0; \
  167:     {
  168: 
  169: #define END \
  170:         strcpy((char *) __function_name, ""); \
  171:         if (__constante != 0) \
  172:             systemError("Constant definition error"); \
  173:     } } \
  174:     return;
  175: 
  176: /*
  177: --------------------------------------------------------------------------------
  178:   Déclaration des fonctions externes
  179: --------------------------------------------------------------------------------
  180: */
  181: 
  182: #define declareExternalFunction(name) \
  183:     void __external_##name(struct_rpl_arguments *rpl_arguments) { \
  184:     char __function_name[] = "__external_"#name;
  185: 
  186: #define useExternalFunction(function) \
  187:     void __external_##function(struct_rpl_arguments *rpl_arguments)
  188: 
  189: #define libraryName(name) char __library_name[] = #name;
  190: 
  191: #define __onLoading void __runOnLoading(struct_rpl_arguments *rpl_arguments)
  192: #define __onClosing void __runOnClosing(struct_rpl_arguments *rpl_arguments)
  193: #define declareSubroutine(when) __##when { \
  194:     char __function_name[] = #when; \
  195:     HEADER \
  196:         declareHelpString(""); \
  197:         numberOfArguments(0); \
  198:     FUNCTION
  199: #define endSubroutine END }
  200: 
  201: #define notice(s, ...) do { ufprintf(s, __VA_ARGS__); fflush(s); } while(0)
  202: #define logger(...) do { syslog(LOG_NOTICE, __VA_ARGS__); } while(0) 
  203: 
  204: #define exportExternalFunctions(...) \
  205:     char **__external_symbols(unsigned long *nb_symbols, \
  206:             const char *version) { \
  207:         char arguments[] = #__VA_ARGS__; \
  208:         char **tableau; \
  209:         char *ptr1, *ptr2; \
  210:         int drapeau; \
  211:         unsigned long i; \
  212:         if (strcmp(version, _d_version_rpl) != 0) \
  213:         { \
  214:             notice(stdout, "Versions mismatch : library %s, expected %s\n", \
  215:                     _d_version_rpl, version); \
  216:             (*nb_symbols) = -1; return(NULL); \
  217:         } \
  218:         (*nb_symbols) = 0; ptr1 = arguments; drapeau = 0; \
  219:         while((*ptr1) != 0) \
  220:         { \
  221:             if (((*ptr1) != ',') && ((*ptr1) != ' ')) drapeau = -1; \
  222:             ptr1++; \
  223:         } \
  224:         if (drapeau == 0) return(NULL); \
  225:         ptr1 = arguments; (*nb_symbols) = 1; \
  226:         while((*ptr1) != 0) if ((*ptr1++) == ',') (*nb_symbols)++; \
  227:         if ((tableau = malloc((*nb_symbols) * sizeof(char *))) == NULL) \
  228:             return(NULL); \
  229:         ptr2 = arguments; i = 0; \
  230:         while(*ptr2 != 0) \
  231:         { \
  232:             while(((*ptr2) == ' ') || ((*ptr2) == ',')) ptr2++; \
  233:             ptr1 = ptr2; \
  234:             while(((*ptr2) != 0) && ((*ptr2) != ',') && ((*ptr2) != ' ')) \
  235:                     ptr2++; \
  236:             if ((tableau[i] = malloc((ptr2 + 2 + \
  237:                     strlen(__library_name) - ptr1) * \
  238:                     sizeof(unsigned char))) == NULL) \
  239:                 return(NULL); \
  240:             sprintf(tableau[i], "%s$", __library_name); \
  241:             strncat(&tableau[i][strlen(tableau[i])], ptr1, ptr2 - ptr1); \
  242:             i++; \
  243:             if ((*ptr2) != 0) \
  244:             { \
  245:                 while((*ptr2) == ' ') ptr2++; \
  246:                 if ((*ptr2) == ',') ptr2++; \
  247:             } \
  248:         } \
  249:         (*nb_symbols) = i; \
  250:         return(tableau); \
  251:     }
  252: 
  253: #define endExternalFunction return; }
  254: 
  255: #define callExternalFunction(function) { \
  256:     __taille_bloc = sizeof(t_8_bits) * 8; \
  257:     __indice_bloc = (35 - 1) / __taille_bloc; \
  258:     __indice_bit = (35 - 1) % __taille_bloc; \
  259:     __masque = ((t_8_bits) 1) << (__taille_bloc - __indice_bit - 1); \
  260:     __evaluation = ((*rpl_arguments).drapeaux_etat[__indice_bloc] & __masque) \
  261:             ? d_vrai : d_faux; \
  262:     __masque = ~(((t_8_bits) 1) << (__taille_bloc - __indice_bit - 1)); \
  263:     (*rpl_arguments).drapeaux_etat[__indice_bloc] &= __masque; \
  264:     __external_##function(rpl_arguments); \
  265:     if (__evaluation == d_vrai) \
  266:     { \
  267:         __masque = ((t_8_bits) 1) << (__taille_bloc - __indice_bit - 1); \
  268:         (*rpl_arguments).drapeaux_etat[__indice_bloc] |= __masque; \
  269:     } \
  270:     else \
  271:     { \
  272:         __masque = ~(((t_8_bits) 1) << (__taille_bloc - __indice_bit - 1)); \
  273:         (*rpl_arguments).drapeaux_etat[__indice_bloc] &= __masque; \
  274:     } } while(0)
  275: 
  276: /*
  277: --------------------------------------------------------------------------------
  278:   Macros spécifiques à l'en-tête
  279: --------------------------------------------------------------------------------
  280: */
  281: 
  282: #define declareHelpString(h) { \
  283:     __presence_aide = d_vrai; \
  284:     if ((*rpl_arguments).affichage_arguments == 'Y') \
  285:     { \
  286:         uprintf("%s\n", h); \
  287:         return; \
  288:     } } while(0)
  289: 
  290: #define declareSymbolicConstant { \
  291:     numberOfArguments(0); \
  292:     (*rpl_arguments).constante_symbolique = 'Y'; \
  293:     __constante++; } while(0)
  294: 
  295: #define numberOfArguments(n) { \
  296:     __presence_validation = d_vrai; \
  297:     if ((*rpl_arguments).test_instruction == 'Y') \
  298:     { \
  299:         if (n < 0) \
  300:             systemError("Number of arguments must be positive or null"); \
  301:         (*rpl_arguments).nombre_arguments = n; \
  302:         __validation_instruction = d_vrai; \
  303:     } \
  304:     else \
  305:     { \
  306:         __taille_bloc = sizeof(t_8_bits) * 8; \
  307:         __indice_bloc = (31 - 1) / __taille_bloc; \
  308:         __indice_bit = (31 - 1) % __taille_bloc; \
  309:         __masque = ((t_8_bits) 1) << (__taille_bloc - __indice_bit - 1); \
  310:         if (((*rpl_arguments).drapeaux_etat[__indice_bloc] & __masque) != 0) \
  311:         { \
  312:             (*rpl_arguments).l_base_pile_last = \
  313:                     sauvegarde_arguments(rpl_arguments, n); \
  314:         } \
  315:     } } while(0)
  316: 
  317: /*
  318: --------------------------------------------------------------------------------
  319:   Gestion des boucles
  320: --------------------------------------------------------------------------------
  321: */
  322: 
  323: #define loop(b, e, s) for(b; e; s) {
  324: #define endLoop }
  325: 
  326: #define repeatWhile(c) while(c) {
  327: #define endWhile }
  328: 
  329: #define doUntil do {
  330: #define repeatUntil(c) } while(!(c));
  331: 
  332: #define select(s) switch(s) {
  333: #define endSelect }
  334: #define nonExclusiveCase(c) case c: {
  335: #define endNonExclusiveCase }
  336: #define exclusiveCase(c) case c: {
  337: #define endExclusiveCase break; }
  338: #define defaultCase default:
  339: #define endDefaultCase break; }
  340: 
  341: /*
  342: --------------------------------------------------------------------------------
  343:   Gestion des erreurs
  344: --------------------------------------------------------------------------------
  345: */
  346: 
  347: #define returnOnError(...) { \
  348:     if ((*rpl_arguments).erreur != 0) \
  349:     { \
  350:         __VA_ARGS__; \
  351:         return; \
  352:     } } while(0)
  353: 
  354: #define systemError(message) { \
  355:     (*rpl_arguments).erreur = __LINE__; \
  356:     (*rpl_arguments).type_erreur = 'S'; \
  357:     (*rpl_arguments).message_erreur = (unsigned char *) message; \
  358:     return; } while(0)
  359: 
  360: #define executionError(message) { \
  361:     (*rpl_arguments).erreur = __LINE__; \
  362:     (*rpl_arguments).type_erreur = 'E'; \
  363:     (*rpl_arguments).message_erreur = (unsigned char *) message; } while(0)
  364: 
  365: #define onError(...) \
  366:     do { if (((*rpl_arguments).type_erreur == 'E') && \
  367:             ((*rpl_arguments).erreur != 0)) { __VA_ARGS__; \
  368:             (*rpl_arguments).erreur = 0; } } while(0)
  369: 
  370: #define onExecution(...) \
  371:     do { if (((*rpl_arguments).type_erreur == 'E') && \
  372:             ((*rpl_arguments).erreur == 0)) { __VA_ARGS__; } } while(0)
  373: 
  374: /*
  375: --------------------------------------------------------------------------------
  376:   Gestion de la pile opérationnelle
  377: --------------------------------------------------------------------------------
  378: */
  379: 
  380: #define pushOnStack(object) { \
  381:     if (((*rpl_arguments).l_base_pile = \
  382:             empilement_pile_operationnelle(rpl_arguments, object)) == NULL) \
  383:         systemError("Memory allocation error"); \
  384:     if ((*object).nombre_occurrences == 1) object = NULL; } while(0)
  385: 
  386: #define pullFromStack(object, ...) { \
  387:     (*rpl_arguments).l_base_pile = \
  388:             depilement_pile_operationnelle(rpl_arguments, &object); \
  389:     if (object == NULL) \
  390:     { \
  391:         executionError("Too few arguments"); \
  392:     } \
  393:     else \
  394:     { \
  395:         if (strlen(#__VA_ARGS__) == 0) \
  396:         { \
  397:             systemError("Undefined type"); \
  398:         } \
  399:         else \
  400:         { \
  401:             __type = 0; \
  402:             if (strstr(#__VA_ARGS__, "integer") != NULL) \
  403:                 if ((*object).type == INT) __type = 1; \
  404:             if (strstr(#__VA_ARGS__, "real") != NULL) \
  405:                 if ((*object).type == REL) __type = 1; \
  406:             if (strstr(#__VA_ARGS__, "complex") != NULL) \
  407:                 if ((*object).type == CPL) __type = 1; \
  408:             if (strstr(#__VA_ARGS__, "string") != NULL) \
  409:                 if ((*object).type == CHN) __type = 1; \
  410:             if (strstr(#__VA_ARGS__, "list") != NULL) \
  411:                 if ((*object).type == LST) __type = 1; \
  412:             if (strstr(#__VA_ARGS__, "unknown") != NULL) \
  413:                 __type = 1; \
  414:             if (__type == 0) \
  415:             { \
  416:                 executionError("Type not allowed"); \
  417:             } \
  418:         } \
  419:     } } while(0)
  420: 
  421: /*
  422: --------------------------------------------------------------------------------
  423:   Gestion des objets
  424: --------------------------------------------------------------------------------
  425: */
  426: 
  427: #define then {
  428: #define endIf }
  429: #define elseIf } else if
  430: #define orElse } else {
  431: 
  432: //  Constantes symboliques
  433: 
  434: #define createSymbolicConstant(object, type, value) { \
  435:     if ((strcmp(#type, "integer") != 0) && (strcmp(#type, "real") != 0)) \
  436:         systemError("Type not allowed for symbolic constant"); \
  437:     __taille_bloc = sizeof(t_8_bits) * 8; \
  438:     __indice_bloc = (35 - 1) / __taille_bloc; \
  439:     __indice_bit = (35 - 1) % __taille_bloc; \
  440:     __masque = ((t_8_bits) 1) << (__taille_bloc - __indice_bit - 1); \
  441:     if (((*rpl_arguments).drapeaux_etat[__indice_bloc] & __masque) != 0) \
  442:     { \
  443:         createNameObject(object); \
  444:         { \
  445:             char *__constant_name; \
  446:             if ((__constant_name = malloc((strlen(__library_name) + \
  447:                     strlen(__function_name) - 9) * sizeof(char))) == NULL) \
  448:                 systemError("Memory allocation error"); \
  449:             sprintf(__constant_name, "%s$%s", __library_name, \
  450:                     &(__function_name[11])); \
  451:             setName(object, __constant_name); \
  452:             free(__constant_name); \
  453:         } \
  454:     } \
  455:     else \
  456:     { \
  457:         if (strcmp(#type, "integer") == 0) \
  458:         { \
  459:             createIntegerObject(object); \
  460:             setInteger(object, value); \
  461:         } \
  462:         else if (strcmp(#type, "real") == 0) \
  463:         { \
  464:             createRealObject(object); \
  465:             setReal(object, value); \
  466:         } \
  467:     } \
  468:     __constante--; } while(0)
  469: 
  470: #define createSymbolicComplexConstant(object, rp, ip) { \
  471:     __taille_bloc = sizeof(t_8_bits) * 8; \
  472:     __indice_bloc = (35 - 1) / __taille_bloc; \
  473:     __indice_bit = (35 - 1) % __taille_bloc; \
  474:     __masque = ((t_8_bits) 1) << (__taille_bloc - __indice_bit - 1); \
  475:     if (((*rpl_arguments).drapeaux_etat[__indice_bloc] & __masque) != 0) \
  476:     { \
  477:         createNameObject(object); \
  478:         { \
  479:             char *__constant_name; \
  480:             if ((__constant_name = malloc((strlen(__library_name) + \
  481:                     strlen(__function_name) + 2) * sizeof(char))) == NULL) \
  482:                 systemError("Memory allocation error"); \
  483:             sprintf(__constant_name, "%s$%s", __library_name, \
  484:                     __function_name); \
  485:             setName(object, __constant_name); \
  486:             free(__constant_name); \
  487:         } \
  488:     } \
  489:     else \
  490:     { \
  491:         createComplexObject(object); \
  492:         setComplex(object, rp, im); \
  493:     } \
  494:     __constante--; } while(0)
  495: 
  496: // Integer
  497: 
  498: #define setInteger(object, value) { \
  499:     ifIsInteger(object) \
  500:     { \
  501:         if ((*object).nombre_occurrences > 1) \
  502:         { \
  503:             struct_objet *__tmp_object; \
  504:             if ((__tmp_object = copie_objet(object, 'O')) == NULL) \
  505:                 systemError("Memory allocation error"); \
  506:             liberation(object); \
  507:             object = __tmp_object; \
  508:         } \
  509:         (*((integer8 *) (*object).objet)) = (integer8) value; \
  510:     } \
  511:     else executionError("Type mistmatch error"); } while(0)
  512: 
  513: #define isInteger(object) \
  514:     ((*object).type == INT)
  515: 
  516: #define ifIsInteger(object) if (isInteger(object))
  517: #define elseIfIsInteger(object) } else ifIsInteger(object)
  518: 
  519: #define getInteger(object, value) { \
  520:     value = 0; \
  521:     ifIsInteger(object) value = (*((integer8 *) (*object).objet)); \
  522:     else executionError("Type mismatch error"); } while(0)
  523: 
  524: #define createIntegerObject(object) { \
  525:     if (object != NULL) \
  526:         systemError("Reallocated object"); \
  527:     if ((object = allocation(INT)) == NULL) \
  528:         systemError("Memory allocation error"); \
  529:     setInteger(object, 0); } while(0)
  530: 
  531: // Real
  532: 
  533: #define setReal(object, value) { \
  534:     ifIsReal(object) \
  535:     { \
  536:         if ((*object).nombre_occurrences > 1) \
  537:         { \
  538:             struct_objet *__tmp_object; \
  539:             if ((__tmp_object = copie_objet(object, 'O')) == NULL) \
  540:                 systemError("Memory allocation error"); \
  541:             liberation(object); \
  542:             object = __tmp_object; \
  543:         } \
  544:         (*((real8 *) (*object).objet)) = (real8) value; \
  545:     } \
  546:     else executionError("Type mistmatch error"); } while(0)
  547: 
  548: #define isReal(object) \
  549:     ((*object).type == REL)
  550: 
  551: #define ifIsReal(object) if (isReal(object))
  552: #define elseIfIsReal(object) } else ifIsReal(object)
  553: 
  554: #define getReal(object, value) { \
  555:     value = 0; \
  556:     ifIsReal(object) value = (*((real8 *) (*object).objet)); \
  557:     else executionError("Type mismatch error"); } while(0)
  558: 
  559: #define createRealObject(object) { \
  560:     if (object != NULL) \
  561:         systemError("Reallocated object"); \
  562:     if ((object = allocation(REL)) == NULL) \
  563:         systemError("Memory allocation error"); \
  564:     setReal(object, 0); } while(0)
  565: 
  566: // Complex
  567: 
  568: #define setComplex(object, rp, ip) { \
  569:     typeof(rp) __rp = rp; \
  570:     typeof(ip) __ip = ip; \
  571:     ifIsComplex(object) \
  572:     { \
  573:         if ((*object).nombre_occurrences > 1) \
  574:         { \
  575:             struct_objet *__tmp_object; \
  576:             if ((__tmp_object = copie_objet(object, 'O')) == NULL) \
  577:                 systemError("Memory allocation error"); \
  578:             liberation(object); \
  579:             object = __tmp_object; \
  580:         } \
  581:         setRealPartOfComplex(object, __rp); \
  582:         setImaginaryPartOfComplex(object, __ip); \
  583:     } \
  584:     else executionError("Type mismatch error"); } while(0)
  585: 
  586: #define setRealPartOfComplex(object, value) { \
  587:     if ((*object).nombre_occurrences > 1) \
  588:     { \
  589:         struct_objet *__tmp_object; \
  590:         if ((__tmp_object = copie_objet(object, 'O')) == NULL) \
  591:             systemError("Memory allocation error"); \
  592:         liberation(object); \
  593:         object = __tmp_object; \
  594:     } \
  595:     ifIsComplex(object) (*((complex16 *) (*object).objet)).partie_reelle = \
  596:             value; \
  597:     else executionError("Type mismatch error"); } while(0)
  598: 
  599: #define setImaginaryPartOfComplex(object, value) { \
  600:     if ((*object).nombre_occurrences > 1) \
  601:     { \
  602:         struct_objet *__tmp_object; \
  603:         if ((__tmp_object = copie_objet(object, 'O')) == NULL) \
  604:             systemError("Memory allocation error"); \
  605:         liberation(object); \
  606:         object = __tmp_object; \
  607:     } \
  608:     (*((complex16 *) (*object).objet)).partie_imaginaire = value; \
  609:     else executionError("Type mismatch error"); } while(0)
  610: 
  611: #define getRealPartOfComplex(object, value) \
  612:     value = (*((complex16 *) (*object).objet)).partie_reelle
  613: 
  614: #define getImaginaryPartOfComplex(object, value) \
  615:     value = (*((complex16 *) (*object).objet)).partie_imaginaire
  616: 
  617: #define isComplex(object) \
  618:     ((*object).type == CPL)
  619: 
  620: #define ifIsComplex(object) if (isComplex(object))
  621: #define elseIfIsComplex(object) } else ifIsComplex(object)
  622: 
  623: #define getComplex(object, value) { \
  624:     value.partie_reelle = 0; \
  625:     value.partie_imaginaire = 0; \
  626:     ifIsComplex(object) value = (*((complex16 *) (*object).objet)); \
  627:     else systemError("Not a complex"); } while(0)
  628: 
  629: #define createComplexObject(object) { \
  630:     if (object != NULL) \
  631:         systemError("Reallocated object"); \
  632:     if ((object = allocation(CPL)) == NULL) \
  633:         systemError("Memory allocation error"); \
  634:     setComplex(object, 0, 0); } while(0)
  635: 
  636: // Generalized vectors
  637: 
  638: #define createVectorObject(object, size, otype, structure, cat) { \
  639:     integer8 i; \
  640:     if (object != NULL) \
  641:         systemError("Reallocated object"); \
  642:     if ((object = allocation(cat)) == NULL) \
  643:         systemError("Memory allocation error"); \
  644:     (*((structure *) (*object).objet)).taille = size; \
  645:     if (((*((structure *) (*object).objet)).tableau = \
  646:             malloc(size * sizeof(otype))) == NULL) \
  647:         systemError("Memory allocation error"); \
  648:     if (cat != VCX) \
  649:     { \
  650:         if (cat == VIN) \
  651:             (*((structure *) (*object).objet)).type = 'I'; \
  652:         else \
  653:             (*((structure *) (*object).objet)).type = 'R'; \
  654:         for(i = 0; i < size; ((otype *) (*((structure *) (*object).objet)) \
  655:                 .tableau)[i++] = (otype) 0); \
  656:     } \
  657:     else \
  658:     { \
  659:         (*((structure *) (*object).objet)).type = 'C'; \
  660:         for(i = 0; i < size; i++) \
  661:         { \
  662:             ((complex16 *) (*((structure *) (*object).objet)).tableau)[i] \
  663:                     .partie_reelle = 0; \
  664:             ((complex16 *) (*((structure *) (*object).objet)).tableau)[i] \
  665:                     .partie_imaginaire = 0; \
  666:         } \
  667:     } } while(0)
  668: 
  669: // Integer vector
  670: 
  671: #define setIntegerIntoVector(object, value, position) { \
  672:     typeof(position) __position = position; \
  673:     ifIsIntegerVector(object) \
  674:     { \
  675:         if ((*object).nombre_occurrences > 1) \
  676:         { \
  677:             struct_objet *__tmp_object; \
  678:             if ((__tmp_object = copie_objet(object, 'O')) == NULL) \
  679:                 systemError("Memory allocation error"); \
  680:             liberation(object); \
  681:             object = __tmp_object; \
  682:         } \
  683:         __position--; \
  684:         if ((__position < 0) || (__position >= (*((struct_vecteur *) \
  685:                 (*object).objet)).taille)) \
  686:             { executionError("Element out of range"); } \
  687:         else \
  688:             ((integer8 *) (*((struct_vecteur *) (*object).objet)).tableau) \
  689:                     [__position] = (integer8) value; \
  690:     } \
  691:     else executionError("Type mistmatch error"); } while(0)
  692: 
  693: #define isIntegerVector(object) \
  694:     ((*object).type == VIN)
  695: 
  696: #define ifIsIntegerVector(object) if (isIntegerVector(object))
  697: #define elseIfIsIntegerVector(object) } else ifIsIntegerVector(object)
  698: 
  699: #define getIntegerFromVector(object, value, position) { \
  700:     typeof(position) __position = position; \
  701:     value = 0; \
  702:     ifIsIntegerVector(object) \
  703:     { \
  704:         __position--; \
  705:         if ((__position < 0) || (__position >= (*((struct_vecteur *) \
  706:                 (*object).objet)).taille)) \
  707:             executionError("Element out of range"); \
  708:         else \
  709:             value = ((integer8 *) (*((struct_vecteur *) (*object).objet)) \
  710:                 .tableau)[__position]; \
  711:     } \
  712:     else executionError("Type mismatch error"); } while(0)
  713: 
  714: #define createIntegerVectorObject(object, size) \
  715:     createVectorObject(object, size, integer8, struct_vecteur, VIN)
  716: 
  717: // Real vector
  718: 
  719: #define setRealIntoVector(object, value, position) { \
  720:     typeof(position) __position = position; \
  721:     ifIsRealVector(object) \
  722:     { \
  723:         if ((*object).nombre_occurrences > 1) \
  724:         { \
  725:             struct_objet *__tmp_object; \
  726:             if ((__tmp_object = copie_objet(object, 'O')) == NULL) \
  727:                 systemError("Memory allocation error"); \
  728:             liberation(object); \
  729:             object = __tmp_object; \
  730:         } \
  731:         __position--; \
  732:         if ((__position < 0) || (__position >= (*((struct_vecteur *) \
  733:                 (*object).objet)).taille)) \
  734:             { executionError("Element out of range"); } \
  735:         else \
  736:             ((real8 *) (*((struct_vecteur *) (*object).objet)).tableau) \
  737:                     [__position] = (real8) value; \
  738:     } \
  739:     else executionError("Type mistmatch error"); } while(0)
  740: 
  741: #define isRealVector(object) \
  742:     ((*object).type == VRL)
  743: 
  744: #define ifIsRealVector(object) if (isRealVector(object))
  745: #define elseIfIsRealVector(object) } else ifIsRealVector(object)
  746: 
  747: #define getRealFromVector(object, value, position) { \
  748:     typeof(position) __position = position; \
  749:     value = 0; \
  750:     ifIsRealVector(object) \
  751:     { \
  752:         __position--; \
  753:         if ((__position < 0) || (__position >= (*((struct_vecteur *) \
  754:                 (*object).objet)).taille)) \
  755:             executionError("Element out of range"); \
  756:         value = ((real8 *) (*((struct_vecteur *) (*object).objet)).tableau) \
  757:                 [__position]; \
  758:     } \
  759:     else executionError("Type mismatch error"); } while(0)
  760: 
  761: #define createRealVectorObject(object, size) \
  762:     createVectorObject(object, size, real8, struct_vecteur, VRL)
  763: 
  764: // A FIXER
  765: 
  766: #define createComplexVectorObject
  767: 
  768: #define createIntegerMatrixObject
  769: 
  770: #define createRealMatrixObject
  771: 
  772: #define createComplexMatrixObject
  773: 
  774: // Binary integer
  775: 
  776: #define setBinaryInteger(object, value) { \
  777:     ifIsBinaryInteger(object) \
  778:     { \
  779:         if ((*object).nombre_occurrences > 1) \
  780:         { \
  781:             struct_objet *__tmp_object; \
  782:             if ((__tmp_object = copie_objet(object, 'O')) == NULL) \
  783:                 systemError("Memory allocation error"); \
  784:             liberation(object); \
  785:             object = __tmp_object; \
  786:         } \
  787:         (*((integer8 *) (*object).objet)) = (integer8) value; \
  788:     } \
  789:     else executionError("Type mistmatch error"); } while(0)
  790: 
  791: #define isBinaryInteger(object) \
  792:     ((*object).type == BIN)
  793: 
  794: #define ifIsBinaryInteger(object) if (isBinaryInteger(object))
  795: #define elseIfIsBinaryInteger(object) } else ifIsBinaryInteger(object)
  796: 
  797: #define getBinaryInteger(object, value) { \
  798:     value = 0; \
  799:     ifIsBinaryInteger(object) value = (*((integer8 *) (*object).objet)); \
  800:     else executionError("Type mismatch error"); } while(0)
  801: 
  802: #define createBinaryIntegerObject(object) { \
  803:     if (object != NULL) \
  804:         systemError("Reallocated object"); \
  805:     if ((object = allocation(BIN)) == NULL) \
  806:         systemError("Memory allocation error"); \
  807:     setBinaryInteger(object, 0); } while(0)
  808: 
  809: // Name
  810: 
  811: #define isName(object) \
  812:     ((*object).type == NOM)
  813: 
  814: #define ifIsName(object) if (isName(object))
  815: #define elseIfIsName(object)  } else if (isName(object))
  816: 
  817: #define setName(object, value) { \
  818:     ifIsName(object) \
  819:     { \
  820:         if ((*object).nombre_occurrences > 1) \
  821:         { \
  822:             struct_objet *__tmp_object; \
  823:             if ((__tmp_object = copie_objet(object, 'O')) == NULL) \
  824:                 systemError("Memory allocation error"); \
  825:             liberation(object); \
  826:             object = __tmp_object; \
  827:         } \
  828:         free((*((struct_nom *) (*object).objet)).nom); \
  829:         (*((struct_nom *) (*object).objet)).symbole = d_faux; \
  830:         if (((*((struct_nom *) (*object).objet)).nom = malloc( \
  831:                 (strlen(value) + 1) * sizeof(unsigned char))) == NULL) \
  832:             systemError("Memory allocation error"); \
  833:         strcpy((char *) (*((struct_nom *) (*object).objet)).nom, \
  834:                 (char *) value); \
  835:     } \
  836:     else executionError("Type mistmatch error"); } while(0)
  837: 
  838: #define createNameObject(object) { \
  839:     if (object != NULL) \
  840:         systemError("Reallocated object"); \
  841:     if ((object = allocation(NOM)) == NULL) \
  842:         systemError("Memory allocation error"); \
  843:     (*((struct_nom *) (*object).objet)).symbole = d_faux; \
  844:     if (((*((struct_nom *) (*object).objet)).nom = malloc( \
  845:             sizeof(unsigned char))) == NULL) \
  846:         systemError("Memory allocation error"); \
  847:     strcpy((char *) (*((struct_nom *) (*object).objet)).nom, ""); } while(0)
  848: 
  849: // String
  850: 
  851: #define isString(object) \
  852:     ((*object).type == CHN)
  853: 
  854: #define ifIsString(object) if (isString(object))
  855: #define elseIfIsString(object) else if (isString(objet))
  856: 
  857: #define setString(object, string) { \
  858:     ifIsString(object) \
  859:     { \
  860:         if ((*object).nombre_occurrences > 1) \
  861:         { \
  862:             struct_objet *__tmp_object; \
  863:             if ((__tmp_object = copie_objet(object, 'O')) == NULL) \
  864:                 systemError("Memory allocation error"); \
  865:             liberation(object); \
  866:             object = __tmp_object; \
  867:         } \
  868:         free((unsigned char *) (*object).objet); \
  869:         if (((*object).objet = malloc((strlen(string) + 1) * \
  870:                 sizeof(unsigned char))) == NULL) \
  871:             systemError("Memory allocation error"); \
  872:         strcpy((char *) (*object).objet, string); \
  873:     } \
  874:     else executionError("Type mistmatch error"); } while(0)
  875: 
  876: #define getString(object, string) { \
  877:     string = NULL; \
  878:     ifIsString(object) string = (char *) (*object).objet; \
  879:     else executionError("Type mismatch error"); } while(0)
  880: 
  881: #define createStringObject(object) { \
  882:     if (object != NULL) \
  883:         systemError("Reallocated object"); \
  884:     if ((object = allocation(CHN)) == NULL) \
  885:         systemError("Memory allocation error"); \
  886:     if (((*object).objet = malloc(sizeof(unsigned char))) == NULL) \
  887:         systemError("Memory allocation error"); \
  888:     strcpy((char *) (*object).objet, ""); } while(0)
  889: 
  890: // List
  891: 
  892: #define isList(object) \
  893:     ((*object).type == LST)
  894: 
  895: #define ifIsList(object) if (isList(object))
  896: #define elseIfIsList(object) else if (isList(object))
  897: 
  898: #define createListObject(object) { \
  899:     if (object != NULL) \
  900:         systemError("Reallocated object"); \
  901:     if ((object = allocation(LST)) == NULL) \
  902:         systemError("Memory allocation error"); \
  903:     (*object).objet = NULL; } while(0)
  904: 
  905: #define addObjectToList(list, object) { \
  906:     ifIsList(list) \
  907:     { \
  908:         struct_objet *__tmp_object; \
  909:         if ((__tmp_object = copie_objet(list, 'N')) == NULL) \
  910:             systemError("Memory allocation error"); \
  911:         liberation(list); \
  912:         list = __tmp_object; \
  913:         if ((*list).objet == NULL) \
  914:         { \
  915:             if (((*list).objet = malloc(sizeof(struct_liste_chainee))) \
  916:                     == NULL) \
  917:                 systemError("Memory allocation error"); \
  918:             (*((struct_liste_chainee *) (*list).objet)).suivant = NULL; \
  919:             (*((struct_liste_chainee *) (*list).objet)).donnee = object; \
  920:         } \
  921:         else \
  922:         { \
  923:             struct_liste_chainee    *l_element_courant; \
  924:             l_element_courant = (*list).objet; \
  925:             while((*l_element_courant).suivant != NULL) \
  926:                 l_element_courant = (*l_element_courant).suivant; \
  927:             if (((*l_element_courant).suivant = \
  928:                     malloc(sizeof(struct_liste_chainee))) == NULL) \
  929:                 systemError("Memory allocation error"); \
  930:             l_element_courant = (*l_element_courant).suivant; \
  931:             (*l_element_courant).suivant = NULL; \
  932:             (*l_element_courant).donnee = object; \
  933:         } \
  934:         object = NULL; \
  935:     } \
  936:     else executionError("Type mistmatch error"); } while(0)
  937: 
  938: #define insertObjectIntoList(list, object) { \
  939:     ifIsList(list) \
  940:     { \
  941:         struct_objet *__tmp_object; \
  942:         if ((__tmp_object = copie_objet(list, 'N')) == NULL) \
  943:             systemError("Memory allocation error"); \
  944:         liberation(list); \
  945:         list = __tmp_object; \
  946:         if ((*list).objet == NULL) \
  947:         { \
  948:             if (((*list).objet = malloc(sizeof(struct_liste_chainee))) \
  949:                     == NULL) \
  950:                 systemError("Memory allocation error"); \
  951:             (*((struct_liste_chainee *) (*list).objet)).suivant = NULL; \
  952:             (*((struct_liste_chainee *) (*list).objet)).donnee = object; \
  953:         } \
  954:         else \
  955:         { \
  956:             struct_liste_chainee    *l_element_courant; \
  957:             if ((l_element_courant = \
  958:                     malloc(sizeof(struct_liste_chainee))) == NULL) \
  959:                 systemError("Memory allocation error"); \
  960:             (*l_element_courant).donnee = object; \
  961:             (*l_element_courant).suivant = (*list).objet; \
  962:             (*list).objet = l_element_courant; \
  963:         } \
  964:         object = NULL; \
  965:     } \
  966:     else executionError("Type mistmatch error"); } while(0)
  967: 
  968: #define removeObjectFromList(list, object) \
  969:     ifIsList(list) \
  970:     { \
  971:         if ((*object).objet == NULL) \
  972:         { \
  973:             struct_objet *__tmp_object; \
  974:             if ((__tmp_object = copie_objet(list, 'N')) == NULL) \
  975:                 systemError("Memory allocation error"); \
  976:             liberation(object); \
  977:             object = __tmp_object; \
  978:             \
  979:             \
  980:             \
  981:             \
  982:         } \
  983:     } \
  984:     else executionError("Type mistmatch error"); } while(0)
  985: 
  986: #define getObjectFromList(list, position, object)
  987: 
  988: #define putObjectIntoList(list, position, object)
  989: 
  990: #define getListFromList(list, position1, position2, object)
  991: 
  992: #define listLength(list, length) { \
  993:     if (list == NULL) executionError("Nullified object"); \
  994:     if ((*list).type != LST) \
  995:             executionError("Type mistmatch error"); \
  996:     { \
  997:         struct_liste_chainee        *l_element_courant; \
  998:         length = 0; \
  999:         l_element_courant = (*list).objet; \
 1000:         while(l_element_courant != NULL) \
 1001:         { \
 1002:             l_element_courant = (*l_element_courant).suivant; \
 1003:             length++; \
 1004:         } \
 1005:     } } while(0)
 1006: 
 1007: 
 1008: /*
 1009: --------------------------------------------------------------------------------
 1010:   Destruction d'un objet
 1011: --------------------------------------------------------------------------------
 1012: */
 1013: 
 1014: #define freeObject(object) \
 1015:     { \
 1016:         if (object == NULL) \
 1017:             systemError("Nullified object"); \
 1018:         liberation(object); \
 1019:         object = NULL; \
 1020:     } while(0)
 1021: 
 1022: /*
 1023: --------------------------------------------------------------------------------
 1024:   Copie d'un objet
 1025: --------------------------------------------------------------------------------
 1026: */
 1027: 
 1028: #define dupObject(object) \
 1029:     { if (copie_objet(object, 'P') != object) \
 1030:         systemError("Memory allocation error"); } while(0)
 1031: 
 1032: /*
 1033: --------------------------------------------------------------------------------
 1034:   Allocation mémoire
 1035: --------------------------------------------------------------------------------
 1036: */
 1037: 
 1038: #define size(a) sizeof(a)
 1039: 
 1040: #define allocate(a) ({ void *ptr; \
 1041:     if ((ptr = malloc(a)) == NULL) \
 1042:             systemError("Memory allocation error"); ptr; })
 1043: 
 1044: #define deallocate(a) free(a)
 1045: 
 1046: /*
 1047: --------------------------------------------------------------------------------
 1048:   Récupération des interruptions et des signaux
 1049: --------------------------------------------------------------------------------
 1050: */
 1051: 
 1052: #define pollSignalsAndInterrupts() \
 1053:     { scrutation_injection((*rpl_arguments).s_etat_processus); } while(0)
 1054: 
 1055: /*
 1056: --------------------------------------------------------------------------------
 1057:   Exécution d'une fonction intrinsèque
 1058: --------------------------------------------------------------------------------
 1059: */
 1060: 
 1061: #define intrinsic(function) { \
 1062:     int __status; \
 1063:     __status = wrapper_instruction_intrinseque( \
 1064:             instruction_##function, rpl_arguments); \
 1065:     if (__status == 1) executionError(#function); \
 1066:     if (__status == 2) systemError(#function); \
 1067:     } while(0)
 1068: 
 1069: #endif
 1070: 
 1071: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>