File:  [local] / rpl / src / instructions_k1.c
Revision 1.3: download - view: text, annotated - select for diffs - revision graph
Wed Feb 10 10:14:22 2010 UTC (14 years, 2 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_11, HEAD
Branchement vers 4.0.11

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.0.11
    4:   Copyright (C) 1989-2010 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: #include "rpl.conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Fonction 'kill'
   29: ================================================================================
   30:   Entrées :
   31: --------------------------------------------------------------------------------
   32:   Sorties :
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: void
   39: instruction_kill(struct_processus *s_etat_processus)
   40: {
   41:     (*s_etat_processus).erreur_execution = d_ex;
   42: 
   43:     if ((*s_etat_processus).affichage_arguments == 'Y')
   44:     {
   45:         printf("\n  KILL ");
   46: 
   47:         if ((*s_etat_processus).langue == 'F')
   48:         {
   49:             printf("(abandon du processus en cours)\n\n");
   50:             printf("  Aucun argument\n");
   51:         }
   52:         else
   53:         {
   54:             printf("(current process abort)\n\n");
   55:             printf("  No argument\n");
   56:         }
   57: 
   58:         return;
   59:     }
   60:     else if ((*s_etat_processus).test_instruction == 'Y')
   61:     {
   62:         (*s_etat_processus).nombre_arguments = -1;
   63:         return;
   64:     }
   65: 
   66:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
   67:     {
   68:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
   69:         {
   70:             return;
   71:         }
   72:     }
   73: 
   74:     (*s_etat_processus).requete_arret = 'Y';
   75: 
   76:     if ((*s_etat_processus).traitement_instruction_halt == d_vrai)
   77:     {
   78:         (*s_etat_processus).execution_pas_suivant = d_vrai;
   79:     }
   80: 
   81:     return;
   82: }
   83: 
   84: 
   85: /*
   86: ================================================================================
   87:   Fonction 'key'
   88: ================================================================================
   89:   Entrées :
   90: --------------------------------------------------------------------------------
   91:   Sorties :
   92: --------------------------------------------------------------------------------
   93:   Effets de bord : néant
   94: ================================================================================
   95: */
   96: 
   97: void
   98: instruction_key(struct_processus *s_etat_processus)
   99: {
  100:     int                             unite;
  101: 
  102:     struct_objet                    *s_objet_caractere;
  103:     struct_objet                    *s_objet_drapeau;
  104: 
  105:     struct termios                  tp;
  106: 
  107:     tcflag_t                        drapeaux;
  108: 
  109:     unsigned char                   caractere;
  110: 
  111:     (*s_etat_processus).erreur_execution = d_ex;
  112: 
  113:     if ((*s_etat_processus).affichage_arguments == 'Y')
  114:     {
  115:         printf("\n  KEY ");
  116: 
  117:         if ((*s_etat_processus).langue == 'F')
  118:         {
  119:             printf("(saisit une entrée au vol)\n\n");
  120:         }
  121:         else
  122:         {
  123:             printf("(non blocking character input)\n\n");
  124:         }
  125: 
  126:         printf("->  1: %s (0)\n\n", d_INT);
  127: 
  128:         printf("->  2: %s\n", d_CHN);
  129:         printf("    1: %s (-1)\n", d_INT);
  130: 
  131:         return;
  132:     }
  133:     else if ((*s_etat_processus).test_instruction == 'Y')
  134:     {
  135:         (*s_etat_processus).nombre_arguments = -1;
  136:         return;
  137:     }
  138:     
  139:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  140:     {
  141:         if (empilement_pile_last(s_etat_processus, 0) == d_erreur)
  142:         {
  143:             return;
  144:         }
  145:     }
  146: 
  147:     if (tcgetattr(0, &tp) == -1)
  148:     {
  149:         (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
  150:         return;
  151:     }
  152: 
  153:     drapeaux = (ECHO | ECHOK | ICANON);
  154:     tp.c_lflag &= (~drapeaux);
  155: 
  156:     if (tcsetattr(0, TCSANOW, &tp) == -1)
  157:     {
  158:         (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
  159:         return;
  160:     }
  161: 
  162:     if ((unite = open(ttyname(0), O_NONBLOCK|O_NOCTTY)) == -1)
  163:     {
  164:         tp.c_lflag |= drapeaux;
  165: 
  166:         if (tcsetattr(0, TCSANOW, &tp) == -1)
  167:         {
  168:             (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
  169:             return;
  170:         }
  171: 
  172:         (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
  173:         return;
  174:     }
  175: 
  176:     if ((s_objet_drapeau = allocation(s_etat_processus, INT)) == NULL)
  177:     {
  178:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  179:         return;
  180:     }
  181: 
  182:     if (read_atomic(s_etat_processus, unite, (void *) &caractere, 1) == -1)
  183:     {
  184:         (*((integer8 *) (*s_objet_drapeau).objet)) = 0;
  185: 
  186:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  187:                 s_objet_drapeau) == d_erreur)
  188:         {
  189:             return;
  190:         }
  191:     }
  192:     else
  193:     {
  194:         if ((s_objet_caractere = allocation(s_etat_processus, CHN)) == NULL)
  195:         {
  196:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  197:             return;
  198:         }
  199: 
  200:         if (((*s_objet_caractere).objet = malloc(2 *
  201:                 sizeof(unsigned char))) == NULL)
  202:         {
  203:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  204:             return;
  205:         }
  206: 
  207:         ((unsigned char *) (*s_objet_caractere).objet)[0] = caractere;
  208:         ((unsigned char *) (*s_objet_caractere).objet)[1] = d_code_fin_chaine;
  209: 
  210:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  211:                 s_objet_caractere) == d_erreur)
  212:         {
  213:             return;
  214:         }
  215: 
  216:         (*((integer8 *) (*s_objet_drapeau).objet)) = -1;
  217: 
  218:         if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  219:                 s_objet_drapeau) == d_erreur)
  220:         {
  221:             return;
  222:         }
  223:     }
  224: 
  225:     if (close(unite) == -1)
  226:     {
  227:         tp.c_lflag |= drapeaux;
  228: 
  229:         if (tcsetattr(0, TCSANOW, &tp) == -1)
  230:         {
  231:             (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
  232:             return;
  233:         }
  234: 
  235:         (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
  236:         return;
  237:     }
  238: 
  239:     tp.c_lflag |= drapeaux;
  240: 
  241:     if (tcsetattr(0, TCSANOW, &tp) == -1)
  242:     {
  243:         (*s_etat_processus).erreur_systeme = d_es_peripherique_stdin;
  244:         return;
  245:     }
  246: 
  247:     return;
  248: }
  249: 
  250: 
  251: /*
  252: ================================================================================
  253:   Fonction 'kind'
  254: ================================================================================
  255:   Entrées : structure processus
  256: --------------------------------------------------------------------------------
  257:   Sorties :
  258: --------------------------------------------------------------------------------
  259:   Effets de bord : néant
  260: ================================================================================
  261: */
  262: 
  263: void
  264: instruction_kind(struct_processus *s_etat_processus)
  265: {
  266:     struct_objet                        *s_objet_argument;
  267:     struct_objet                        *s_objet_resultat;
  268: 
  269:     (*s_etat_processus).erreur_execution = d_ex;
  270: 
  271:     if ((*s_etat_processus).affichage_arguments == 'Y')
  272:     {
  273:         printf("\n  KIND ");
  274: 
  275:         if ((*s_etat_processus).langue == 'F')
  276:         {
  277:             printf("(variété d'objet)\n\n");
  278:         }
  279:         else
  280:         {
  281:             printf("(kind of object)\n\n");
  282:         }
  283: 
  284:         printf("    1: %s, %s, %s, %s, %s, %s,\n"
  285:                 "       %s, %s, %s\n",
  286:                 d_INT, d_REL, d_CPL, d_VIN, d_VRL, d_VCX, d_MIN, d_MRL, d_MCX);
  287:         printf("->  1: %s\n", d_INT);
  288: 
  289:         return;
  290:     }
  291:     else if ((*s_etat_processus).test_instruction == 'Y')
  292:     {
  293:         (*s_etat_processus).nombre_arguments = -1;
  294:         return;
  295:     }
  296: 
  297:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  298:     {
  299:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  300:         {
  301:             return;
  302:         }
  303:     }
  304: 
  305:     if (depilement(s_etat_processus, &((*s_etat_processus)
  306:                 .l_base_pile), &s_objet_argument) == d_erreur)
  307:     {
  308:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  309:         return;
  310:     }
  311: 
  312:     if ((s_objet_resultat = allocation(s_etat_processus, INT)) == NULL)
  313:     {
  314:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  315:         return;
  316:     }
  317: 
  318:     if (((*s_objet_argument).type == INT) ||
  319:             ((*s_objet_argument).type == VIN) ||
  320:             ((*s_objet_argument).type == MIN))
  321:     {
  322:         (*((integer8 *) (*s_objet_resultat).objet)) = 0;
  323:     }
  324:     else if (((*s_objet_argument).type == REL) ||
  325:             ((*s_objet_argument).type == VRL) ||
  326:             ((*s_objet_argument).type == MRL))
  327:     {
  328:         (*((integer8 *) (*s_objet_resultat).objet)) = 1;
  329:     }
  330:     else if (((*s_objet_argument).type == CPL) ||
  331:             ((*s_objet_argument).type == VCX) ||
  332:             ((*s_objet_argument).type == MCX))
  333:     {
  334:         (*((integer8 *) (*s_objet_resultat).objet)) = 2;
  335:     }
  336:     else
  337:     {
  338:         /*
  339:          * Les autres types de données sont des types non numériques.
  340:          */
  341: 
  342:         liberation(s_etat_processus, s_objet_argument);
  343: 
  344:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  345:         return;
  346:     }   
  347: 
  348:     if (empilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  349:             s_objet_resultat) == d_erreur)
  350:     {
  351:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  352:         return;
  353:     }
  354: 
  355:     liberation(s_etat_processus, s_objet_argument);
  356: 
  357:     return;
  358: }
  359: 
  360: 
  361: /*
  362: ================================================================================
  363:   Fonction 'keytitle'
  364: ================================================================================
  365:   Entrées :
  366: --------------------------------------------------------------------------------
  367:   Sorties :
  368: --------------------------------------------------------------------------------
  369:   Effets de bord : néant
  370: ================================================================================
  371: */
  372: 
  373: void
  374: instruction_keytitle(struct_processus *s_etat_processus)
  375: {
  376:     struct_objet                    *s_objet;
  377: 
  378:     (*s_etat_processus).erreur_execution = d_ex;
  379: 
  380:     if ((*s_etat_processus).affichage_arguments == 'Y')
  381:     {
  382:         printf("\n  KEYTITLE ");
  383: 
  384:         if ((*s_etat_processus).langue == 'F')
  385:         {
  386:             printf("(titre de la légende d'un graphique)\n\n");
  387:         }
  388:         else
  389:         {
  390:             printf("(title of graphic key)\n\n");
  391:         }
  392: 
  393:         printf("    1: %s\n", d_CHN);
  394: 
  395:         return;
  396:     }
  397:     else if ((*s_etat_processus).test_instruction == 'Y')
  398:     {
  399:         (*s_etat_processus).nombre_arguments = -1;
  400:         return;
  401:     }
  402: 
  403:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  404:     {
  405:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  406:         {
  407:             return;
  408:         }
  409:     }
  410: 
  411:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  412:             &s_objet) == d_erreur)
  413:     {
  414:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  415:         return;
  416:     }
  417: 
  418:     if ((*s_objet).type == CHN)
  419:     {
  420:         free((*s_etat_processus).legende);
  421: 
  422:         if (((*s_etat_processus).legende = malloc((strlen((unsigned char *)
  423:                 (*s_objet).objet) + 1) * sizeof(unsigned char))) == NULL)
  424:         {
  425:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  426:             return;
  427:         }
  428: 
  429:         strcpy((*s_etat_processus).legende, (unsigned char *) (*s_objet).objet);
  430:         liberation(s_etat_processus, s_objet);
  431: 
  432:         (*s_etat_processus).mise_a_jour_trace_requise = d_vrai;
  433:     }
  434:     else
  435:     {
  436:         liberation(s_etat_processus, s_objet);
  437: 
  438:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  439:         return;
  440:     }
  441: 
  442:     return;
  443: }
  444: 
  445: 
  446: /*
  447: ================================================================================
  448:   Fonction 'keylabel'
  449: ================================================================================
  450:   Entrées :
  451: --------------------------------------------------------------------------------
  452:   Sorties :
  453: --------------------------------------------------------------------------------
  454:   Effets de bord : néant
  455: ================================================================================
  456: */
  457: 
  458: void
  459: instruction_keylabel(struct_processus *s_etat_processus)
  460: {
  461:     struct_fichier_graphique        *l_element_courant;
  462: 
  463:     struct_objet                    *s_objet;
  464: 
  465:     (*s_etat_processus).erreur_execution = d_ex;
  466: 
  467:     if ((*s_etat_processus).affichage_arguments == 'Y')
  468:     {
  469:         printf("\n  KEYLABEL ");
  470: 
  471:         if ((*s_etat_processus).langue == 'F')
  472:         {
  473:             printf("(label du graphique courant)\n\n");
  474:         }
  475:         else
  476:         {
  477:             printf("(current graphic label)\n\n");
  478:         }
  479: 
  480:         printf("    1: %s\n", d_CHN);
  481: 
  482:         return;
  483:     }
  484:     else if ((*s_etat_processus).test_instruction == 'Y')
  485:     {
  486:         (*s_etat_processus).nombre_arguments = -1;
  487:         return;
  488:     }
  489: 
  490:     if (test_cfsf(s_etat_processus, 31) == d_vrai)
  491:     {
  492:         if (empilement_pile_last(s_etat_processus, 1) == d_erreur)
  493:         {
  494:             return;
  495:         }
  496:     }
  497: 
  498:     if (depilement(s_etat_processus, &((*s_etat_processus).l_base_pile),
  499:             &s_objet) == d_erreur)
  500:     {
  501:         (*s_etat_processus).erreur_execution = d_ex_manque_argument;
  502:         return;
  503:     }
  504: 
  505:     if ((*s_objet).type == CHN)
  506:     {
  507:         l_element_courant = (*s_etat_processus).fichiers_graphiques;
  508: 
  509:         if (l_element_courant == NULL)
  510:         {
  511:             liberation(s_etat_processus, s_objet);
  512: 
  513:             (*s_etat_processus).erreur_execution =
  514:                     d_ex_absence_graphique_courant;
  515:             return;
  516:         }
  517: 
  518:         while((*l_element_courant).suivant != NULL)
  519:         {
  520:             l_element_courant = (*l_element_courant).suivant;
  521:         }
  522: 
  523:         if ((*l_element_courant).legende != NULL)
  524:         {
  525:             free((*l_element_courant).legende);
  526:         }
  527: 
  528:         if (((*l_element_courant).legende = malloc((strlen((unsigned char *)
  529:                 (*s_objet).objet) + 1) * sizeof(unsigned char))) == NULL)
  530:         {
  531:             (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  532:             return;
  533:         }
  534: 
  535:         strcpy((*l_element_courant).legende, (unsigned char *)
  536:                 (*s_objet).objet);
  537:         liberation(s_etat_processus, s_objet);
  538: 
  539:         (*s_etat_processus).mise_a_jour_trace_requise = d_vrai;
  540:     }
  541:     else
  542:     {
  543:         liberation(s_etat_processus, s_objet);
  544: 
  545:         (*s_etat_processus).erreur_execution = d_ex_erreur_type_argument;
  546:         return;
  547:     }
  548: 
  549:     return;
  550: }
  551: 
  552: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>