File:  [local] / rpl / src / formateur_flux.c
Revision 1.27: download - view: text, annotated - select for diffs - revision graph
Mon Oct 1 11:05:01 2012 UTC (11 years, 6 months ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_1_11, HEAD
En route pour la 4.1.11.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.11
    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: #include "rpl-conv.h"
   24: 
   25: 
   26: /*
   27: ================================================================================
   28:   Routine de formation des données pour l'envoi de flux binaires
   29: ================================================================================
   30:   Entrées : structure sur l'état du processus et objet à afficher
   31: --------------------------------------------------------------------------------
   32:   Sorties : chaine de caractères
   33: --------------------------------------------------------------------------------
   34:   Effets de bord : néant
   35: ================================================================================
   36: */
   37: 
   38: unsigned char *
   39: formateur_flux(struct_processus *s_etat_processus, unsigned char *donnees,
   40:         long *longueur)
   41: {
   42:     unsigned char           *chaine;
   43: 
   44:     unsigned char           *ptr_ecriture;
   45:     unsigned char           *ptr_lecture;
   46: 
   47:     if ((chaine = malloc((strlen(donnees) + 1) * sizeof(unsigned char)))
   48:             == NULL)
   49:     {
   50:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
   51:         return(NULL);
   52:     }
   53: 
   54:     ptr_lecture = donnees;
   55:     ptr_ecriture = chaine;
   56: 
   57:     while((*ptr_lecture) != d_code_fin_chaine)
   58:     {
   59:         (*ptr_ecriture) = (*ptr_lecture);
   60: 
   61:         // Début de la séquence d'échappement
   62: 
   63:         if ((*ptr_lecture) == '\\')
   64:         {
   65:             if ((*(ptr_lecture + 1)) == '"')
   66:             {
   67:                 ptr_lecture++;
   68:                 (*ptr_ecriture) = '\"';
   69:             }
   70:             else if ((*(ptr_lecture + 1)) == 'b')
   71:             {
   72:                 ptr_lecture++;
   73:                 (*ptr_ecriture) = '\b';
   74:             }
   75:             else if ((*(ptr_lecture + 1)) == 'n')
   76:             {
   77:                 ptr_lecture++;
   78:                 (*ptr_ecriture) = '\n';
   79:             }
   80:             else if ((*(ptr_lecture + 1)) == 't')
   81:             {
   82:                 ptr_lecture++;
   83:                 (*ptr_ecriture) = '\t';
   84:             }
   85:             else if ((*(ptr_lecture + 1)) == 'x')
   86:             {
   87:                 ptr_lecture += 2;
   88: 
   89:                 if ((*ptr_lecture) != d_code_fin_chaine)
   90:                 {
   91:                     if ((*(ptr_lecture + 1)) != d_code_fin_chaine)
   92:                     {
   93:                         logical1        erreur;
   94:                         unsigned char   ec;
   95: 
   96:                         erreur = d_faux;
   97: 
   98:                         switch(*ptr_lecture)
   99:                         {
  100:                             case '0':
  101:                             case '1':
  102:                             case '2':
  103:                             case '3':
  104:                             case '4':
  105:                             case '5':
  106:                             case '6':
  107:                             case '7':
  108:                             case '8':
  109:                             case '9':
  110:                                 ec = (*ptr_lecture) - '0';
  111:                                 break;
  112: 
  113:                             case 'A':
  114:                             case 'B':
  115:                             case 'C':
  116:                             case 'D':
  117:                             case 'E':
  118:                             case 'F':
  119:                                 ec = ((*ptr_lecture) - 'A') + 10;
  120:                                 break;
  121: 
  122:                             default:
  123:                                 ec = 0;
  124:                                 erreur = d_vrai;
  125:                                 break;
  126:                         }
  127: 
  128:                         ec *= 0x10;
  129:                         ptr_lecture++;
  130: 
  131:                         switch(*ptr_lecture)
  132:                         {
  133:                             case '0':
  134:                             case '1':
  135:                             case '2':
  136:                             case '3':
  137:                             case '4':
  138:                             case '5':
  139:                             case '6':
  140:                             case '7':
  141:                             case '8':
  142:                             case '9':
  143:                                 ec += (*ptr_lecture) - '0';
  144:                                 break;
  145: 
  146:                             case 'A':
  147:                             case 'B':
  148:                             case 'C':
  149:                             case 'D':
  150:                             case 'E':
  151:                             case 'F':
  152:                                 ec += ((*ptr_lecture) - 'A') + 10;
  153:                                 break;
  154: 
  155:                             default:
  156:                                 erreur = d_vrai;
  157:                                 break;
  158:                         }
  159: 
  160:                         (*ptr_ecriture) = ec;
  161: 
  162:                         if (erreur == d_vrai)
  163:                         {
  164:                             if ((*s_etat_processus).langue == 'F')
  165:                             {
  166:                                 printf("+++Information : "
  167:                                         "Séquence d'échappement "
  168:                                         "inconnue [%d]\n",
  169:                                         (int) getpid());
  170:                             }
  171:                             else
  172:                             {
  173:                                 printf("+++Warning : Unknown "
  174:                                         "escape code "
  175:                                         "[%d]\n", (int) getpid());
  176:                             }
  177:                         }
  178:                     }
  179:                     else
  180:                     {
  181:                         if ((*s_etat_processus).langue == 'F')
  182:                         {
  183:                             printf("+++Information : "
  184:                                     "Séquence d'échappement "
  185:                                     "inconnue [%d]\n", (int) getpid());
  186:                         }
  187:                         else
  188:                         {
  189:                             printf("+++Warning : Unknown escape code "
  190:                                     "[%d]\n", (int) getpid());
  191:                         }
  192:                     }
  193:                 }
  194:                 else
  195:                 {
  196:                     if ((*s_etat_processus).langue == 'F')
  197:                     {
  198:                         printf("+++Information : "
  199:                                 "Séquence d'échappement "
  200:                                 "inconnue [%d]\n", (int) getpid());
  201:                     }
  202:                     else
  203:                     {
  204:                         printf("+++Warning : Unknown escape code "
  205:                                 "[%d]\n", (int) getpid());
  206:                     }
  207:                 }
  208:             }
  209:             else if ((*(ptr_lecture + 1)) == '\\')
  210:             {
  211:                 ptr_lecture++;
  212:             }
  213:             else
  214:             {
  215:                 if ((*s_etat_processus).langue == 'F')
  216:                 {
  217:                     printf("+++Information : Séquence d'échappement "
  218:                             "inconnue [%d]\n", (int) getpid());
  219:                 }
  220:                 else
  221:                 {
  222:                     printf("+++Warning : Unknown escape code "
  223:                             "[%d]\n", (int) getpid());
  224:                 }
  225:             }
  226:         }
  227: 
  228:         ptr_ecriture++;
  229:         ptr_lecture++;
  230:     }
  231: 
  232:     (*ptr_ecriture) = d_code_fin_chaine;
  233: 
  234:     if ((chaine = realloc(chaine, ((((*longueur) = ptr_ecriture - chaine)) + 1)
  235:             * sizeof(unsigned char))) == NULL)
  236:     {
  237:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  238:         return(NULL);
  239:     }
  240: 
  241:     return(chaine);
  242: }
  243: 
  244: 
  245: /*
  246: ================================================================================
  247:   Routine de d'analyse d'un flux
  248: ================================================================================
  249:   Entrées : structure sur l'état du processus et objet à afficher
  250: --------------------------------------------------------------------------------
  251:   Sorties : chaine de caractères
  252: --------------------------------------------------------------------------------
  253:   Effets de bord : néant
  254: ================================================================================
  255: */
  256: 
  257: unsigned char *
  258: analyse_flux(struct_processus *s_etat_processus, unsigned char *donnees,
  259:         long longueur)
  260: {
  261:     long                    longueur_courante;
  262:     long                    offset;
  263: 
  264:     unsigned char           *chaine;
  265:     unsigned char           hexadecimal[3];
  266:     unsigned char           *ptr_ecriture;
  267:     unsigned char           *ptr_lecture;
  268: 
  269:     if ((chaine = malloc((longueur_courante = longueur + 1) *
  270:             sizeof(unsigned char))) == NULL)
  271:     {
  272:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  273:         return(NULL);
  274:     }
  275: 
  276:     ptr_lecture = donnees;
  277:     ptr_ecriture = chaine;
  278: 
  279:     while(longueur > 0)
  280:     {
  281:         // Début de la séquence d'échappement
  282: 
  283:         switch((*ptr_lecture))
  284:         {
  285:             case '"':
  286:             case '\b':
  287:             case '\n':
  288:             case '\t':
  289:             {
  290:                 offset = ptr_ecriture - chaine;
  291: 
  292:                 if ((chaine = realloc(chaine, (++longueur_courante)
  293:                         * sizeof(unsigned char))) == NULL)
  294:                 {
  295:                     (*s_etat_processus).erreur_systeme =
  296:                             d_es_allocation_memoire;
  297:                     return(NULL);
  298:                 }
  299: 
  300:                 ptr_ecriture = chaine + offset;
  301:                 *ptr_ecriture++ = '\\';
  302: 
  303:                 switch((*ptr_lecture++))
  304:                 {
  305:                     case '"':
  306:                     {
  307:                         *ptr_ecriture++ = '"';
  308:                         break;
  309:                     }
  310: 
  311:                     case '\b':
  312:                     {
  313:                         *ptr_ecriture++ = 'b';
  314:                         break;
  315:                     }
  316: 
  317:                     case '\n':
  318:                     {
  319:                         *ptr_ecriture++ = 'n';
  320:                         break;
  321:                     }
  322: 
  323:                     case '\t':
  324:                     {
  325:                         *ptr_ecriture++ = 't';
  326:                         break;
  327:                     }
  328:                 }
  329: 
  330:                 break;
  331:             }
  332: 
  333:             case ' ':
  334:             {
  335:                 *ptr_ecriture++ = *ptr_lecture++;
  336:                 break;
  337:             }
  338: 
  339:             default:
  340:             {
  341:                 if (isgraph((*ptr_lecture)))
  342:                 {
  343:                     *ptr_ecriture++ = *ptr_lecture++;
  344:                 }
  345:                 else
  346:                 {
  347:                     offset = ptr_ecriture - chaine;
  348: 
  349:                     if ((chaine = realloc(chaine, (longueur_courante =
  350:                             longueur_courante + 3) * sizeof(unsigned char)))
  351:                             == NULL)
  352:                     {
  353:                         (*s_etat_processus).erreur_systeme =
  354:                                 d_es_allocation_memoire;
  355:                         return(NULL);
  356:                     }
  357: 
  358:                     ptr_ecriture = chaine + offset;
  359:                     *ptr_ecriture++ = '\\';
  360:                     *ptr_ecriture++ = 'x';
  361: 
  362:                     sprintf(hexadecimal, "%02X", *ptr_lecture++);
  363: 
  364:                     *ptr_ecriture++ = hexadecimal[0];
  365:                     *ptr_ecriture++ = hexadecimal[1];
  366:                 }
  367: 
  368:                 break;
  369:             }
  370:         }
  371: 
  372:         longueur--;
  373:     }
  374: 
  375:     (*ptr_ecriture) = d_code_fin_chaine;
  376: 
  377:     return(chaine);
  378: }
  379: 
  380: 
  381: /*
  382: ================================================================================
  383:   Routine testant la validité d'une chaîne de caractères
  384: ================================================================================
  385:   Entrées : structure sur l'état du processus et chaîne courante
  386: --------------------------------------------------------------------------------
  387:   Sorties : pointeur sur le caractère suivant
  388: --------------------------------------------------------------------------------
  389:   Effets de bord : néant
  390: ================================================================================
  391: */
  392: 
  393: logical1
  394: validation_chaine(unsigned char *chaine)
  395: {
  396:     if (chaine == NULL)
  397:     {
  398:         return(d_faux);
  399:     }
  400: 
  401:     while((*chaine) != d_code_fin_chaine)
  402:     {
  403:         if ((*chaine) == '\\')
  404:         {
  405:             if ((*(chaine + 1)) == '"')
  406:             {
  407:                 chaine += 2;
  408:             }
  409:             else if ((*(chaine + 1)) == 'b')
  410:             {
  411:                 chaine += 2;
  412:             }
  413:             else if ((*(chaine + 1)) == 'n')
  414:             {
  415:                 chaine += 2;
  416:             }
  417:             else if ((*(chaine + 1)) == 't')
  418:             {
  419:                 chaine += 2;
  420:             }
  421:             else if ((*(chaine + 1)) == 'x')
  422:             {
  423:                 if ((*(chaine + 2)) != d_code_fin_chaine)
  424:                 {
  425:                     if ((*(chaine + 3)) != d_code_fin_chaine)
  426:                     {
  427:                         switch(*(chaine + 2))
  428:                         {
  429:                             case '0':
  430:                             case '1':
  431:                             case '2':
  432:                             case '3':
  433:                             case '4':
  434:                             case '5':
  435:                             case '6':
  436:                             case '7':
  437:                             case '8':
  438:                             case '9':
  439:                             case 'A':
  440:                             case 'B':
  441:                             case 'C':
  442:                             case 'D':
  443:                             case 'E':
  444:                             case 'F':
  445:                                 break;
  446: 
  447:                             default:
  448:                                 return(d_faux);
  449:                                 break;
  450:                         }
  451: 
  452:                         switch(*(chaine + 3))
  453:                         {
  454:                             case '0':
  455:                             case '1':
  456:                             case '2':
  457:                             case '3':
  458:                             case '4':
  459:                             case '5':
  460:                             case '6':
  461:                             case '7':
  462:                             case '8':
  463:                             case '9':
  464:                             case 'A':
  465:                             case 'B':
  466:                             case 'C':
  467:                             case 'D':
  468:                             case 'E':
  469:                             case 'F':
  470:                                 break;
  471: 
  472:                             default:
  473:                                 return(d_faux);
  474:                                 break;
  475:                         }
  476:                     }
  477:                     else
  478:                     {
  479:                         return(d_faux);
  480:                     }
  481:                 }
  482:                 else
  483:                 {
  484:                     return(d_faux);
  485:                 }
  486: 
  487:                 chaine += 4;
  488:             }
  489:             else if ((*(chaine + 1)) == '\\')
  490:             {
  491:                 chaine += 2;
  492:             }
  493:             else
  494:             {
  495:                 // Tous les autres cas sont invalides
  496:                 return(d_faux);
  497:             }
  498:         }
  499:         else
  500:         {
  501:             chaine++;
  502:         }
  503:     }
  504: 
  505:     return(d_vrai);
  506: }
  507: 
  508: 
  509: /*
  510: ================================================================================
  511:   Routine permettant de trouver le caractère suivant dans une chaîne
  512: ================================================================================
  513:   Entrées : structure sur l'état du processus et chaîne courante
  514: --------------------------------------------------------------------------------
  515:   Sorties : pointeur sur le caractère suivant
  516: --------------------------------------------------------------------------------
  517:   Effets de bord : néant
  518: ================================================================================
  519: */
  520: 
  521: static inline unsigned char *
  522: prochain_caractere(struct_processus *s_etat_processus, unsigned char *chaine)
  523: {
  524:     unsigned char       *suivant;
  525: 
  526:     if (chaine == NULL)
  527:     {
  528:         return(NULL);
  529:     }
  530: 
  531:     if ((*chaine) == '\\')
  532:     {
  533:         if ((*(chaine + 1)) == '"')
  534:         {
  535:             suivant = chaine + 2;
  536:         }
  537:         else if ((*(chaine + 1)) == 'b')
  538:         {
  539:             suivant = chaine + 2;
  540:         }
  541:         else if ((*(chaine + 1)) == 'n')
  542:         {
  543:             suivant = chaine + 2;
  544:         }
  545:         else if ((*(chaine + 1)) == 't')
  546:         {
  547:             suivant = chaine + 2;
  548:         }
  549:         else if ((*(chaine + 1)) == 'x')
  550:         {
  551:             if ((*(chaine + 2)) != d_code_fin_chaine)
  552:             {
  553:                 if ((*(chaine + 3)) != d_code_fin_chaine)
  554:                 {
  555:                     logical1        erreur;
  556: 
  557:                     erreur = d_faux;
  558: 
  559:                     switch(*(chaine + 2))
  560:                     {
  561:                         case '0':
  562:                         case '1':
  563:                         case '2':
  564:                         case '3':
  565:                         case '4':
  566:                         case '5':
  567:                         case '6':
  568:                         case '7':
  569:                         case '8':
  570:                         case '9':
  571:                         case 'A':
  572:                         case 'B':
  573:                         case 'C':
  574:                         case 'D':
  575:                         case 'E':
  576:                         case 'F':
  577:                             break;
  578: 
  579:                         default:
  580:                             erreur = d_vrai;
  581:                             break;
  582:                     }
  583: 
  584:                     switch(*(chaine + 3))
  585:                     {
  586:                         case '0':
  587:                         case '1':
  588:                         case '2':
  589:                         case '3':
  590:                         case '4':
  591:                         case '5':
  592:                         case '6':
  593:                         case '7':
  594:                         case '8':
  595:                         case '9':
  596:                         case 'A':
  597:                         case 'B':
  598:                         case 'C':
  599:                         case 'D':
  600:                         case 'E':
  601:                         case 'F':
  602:                             break;
  603: 
  604:                         default:
  605:                             erreur = d_vrai;
  606:                             break;
  607:                     }
  608: 
  609:                     if (erreur == d_vrai)
  610:                     {
  611:                         if ((*s_etat_processus).langue == 'F')
  612:                         {
  613:                             printf("+++Information : "
  614:                                     "Séquence d'échappement "
  615:                                     "inconnue [%d]\n",
  616:                                     (int) getpid());
  617:                         }
  618:                         else
  619:                         {
  620:                             printf("+++Warning : Unknown "
  621:                                     "escape code "
  622:                                     "[%d]\n", (int) getpid());
  623:                         }
  624: 
  625:                         return(NULL);
  626:                     }
  627: 
  628:                     suivant = chaine + 4;
  629:                 }
  630:                 else
  631:                 {
  632:                     if ((*s_etat_processus).langue == 'F')
  633:                     {
  634:                         printf("+++Information : "
  635:                                 "Séquence d'échappement "
  636:                                 "inconnue [%d]\n", (int) getpid());
  637:                     }
  638:                     else
  639:                     {
  640:                         printf("+++Warning : Unknown escape code "
  641:                                 "[%d]\n", (int) getpid());
  642:                     }
  643: 
  644:                     return(NULL);
  645:                 }
  646:             }
  647:             else
  648:             {
  649:                 if ((*s_etat_processus).langue == 'F')
  650:                 {
  651:                     printf("+++Information : "
  652:                             "Séquence d'échappement "
  653:                             "inconnue [%d]\n", (int) getpid());
  654:                 }
  655:                 else
  656:                 {
  657:                     printf("+++Warning : Unknown escape code "
  658:                             "[%d]\n", (int) getpid());
  659:                 }
  660: 
  661:                 return(NULL);
  662:             }
  663:         }
  664:         else if ((*(chaine + 1)) == '\\')
  665:         {
  666:             suivant = chaine + 2;
  667:         }
  668:         else
  669:         {
  670:             if ((*s_etat_processus).langue == 'F')
  671:             {
  672:                 printf("+++Information : Séquence d'échappement "
  673:                         "inconnue [%d]\n", (int) getpid());
  674:             }
  675:             else
  676:             {
  677:                 printf("+++Warning : Unknown escape code "
  678:                         "[%d]\n", (int) getpid());
  679:             }
  680: 
  681:             return(NULL);
  682:         }
  683:     }
  684:     else
  685:     {
  686:         suivant = chaine + 1;
  687:     }
  688: 
  689:     return(suivant);
  690: }
  691: 
  692: 
  693: /*
  694: ================================================================================
  695:   Routine donnant la longueur d'une chaîne de caractères
  696: ================================================================================
  697:   Entrées : structure sur l'état du processus et chaîne
  698: --------------------------------------------------------------------------------
  699:   Sorties : longueur de la chaîne
  700: --------------------------------------------------------------------------------
  701:   Effets de bord : néant
  702: ================================================================================
  703: */
  704: 
  705: integer8
  706: longueur_chaine(struct_processus *s_etat_processus, unsigned char *chaine)
  707: {
  708:     integer8        nombre_caracteres;
  709: 
  710:     unsigned char   *pointeur;
  711: 
  712:     pointeur = chaine;
  713:     nombre_caracteres = 0;
  714: 
  715:     if ((*pointeur) == '\0')
  716:     {
  717:         return(0);
  718:     }
  719: 
  720:     do
  721:     {
  722:         if ((pointeur = prochain_caractere(s_etat_processus, pointeur)) == NULL)
  723:         {
  724:             return(0);
  725:         }
  726: 
  727:         nombre_caracteres++;
  728:     } while((*pointeur) != 0);
  729: 
  730:     return(nombre_caracteres);
  731: }
  732: 
  733: 
  734: /*
  735: ================================================================================
  736:   Routine retournant un pointeur sur le i-ème caractère d'une chaîne
  737: ================================================================================
  738:   Entrées : structure sur l'état du processus, chaîne et position du caractère
  739: --------------------------------------------------------------------------------
  740:   Sorties : pointeur sur le caractère
  741: --------------------------------------------------------------------------------
  742:   Effets de bord : néant
  743: ================================================================================
  744: */
  745: 
  746: unsigned char *
  747: pointeur_ieme_caractere(struct_processus *s_etat_processus,
  748:         unsigned char *chaine, integer8 position)
  749: {
  750:     integer8            i;
  751: 
  752:     unsigned char       *pointeur;
  753: 
  754:     if ((pointeur = chaine) == NULL)
  755:     {
  756:         return(NULL);
  757:     }
  758: 
  759:     for(i = 0; i < position; i++)
  760:     {
  761:         pointeur = prochain_caractere(s_etat_processus, pointeur);
  762: 
  763:         if ((*pointeur) == d_code_fin_chaine)
  764:         {
  765:             return(pointeur);
  766:         }
  767:     }
  768: 
  769:     return(pointeur);
  770: }
  771: 
  772: 
  773: /*
  774: ================================================================================
  775:   Routine retournant la position du caractère en fonction du pointeur
  776:   dans la chaîne
  777: ================================================================================
  778:   Entrées : structure sur l'état du processus, chaîne et position
  779: --------------------------------------------------------------------------------
  780:   Sorties : quantième dans la chaîne
  781: --------------------------------------------------------------------------------
  782:   Effets de bord : néant
  783: ================================================================================
  784: */
  785: 
  786: integer8
  787: position_caractere_de_chaine(struct_processus *s_etat_processus,
  788:         unsigned char *chaine, unsigned char *position)
  789: {
  790:     integer8            i;
  791: 
  792:     i = 1;
  793: 
  794:     while(chaine != position)
  795:     {
  796:         chaine = prochain_caractere(s_etat_processus, chaine);
  797:         i++;
  798: 
  799:         if ((*chaine) == d_code_fin_chaine)
  800:         {
  801:             return(0);
  802:         }
  803:     }
  804: 
  805:     return(i);
  806: }
  807: 
  808: 
  809: /*
  810: ================================================================================
  811:   Conversion d'une chaîne en majuscule ou en minuscule
  812: ================================================================================
  813:   Entrées : chaîne et indicateur ('M' pour majuscules, 'm' pour minuscules)
  814: --------------------------------------------------------------------------------
  815:   Sorties : néant
  816: --------------------------------------------------------------------------------
  817:   Effets de bord : néant
  818: ================================================================================
  819: */
  820: 
  821: void
  822: conversion_chaine(struct_processus *s_etat_processus,
  823:         unsigned char *chaine, unsigned char type)
  824: {
  825:     int                 (*fonction_1)(int);
  826:     int                 (*fonction_2)(int);
  827: 
  828:     unsigned char       *ptr;
  829:     unsigned char       *ptr2;
  830:     unsigned char       registre;
  831: 
  832:     if (type == 'M')
  833:     {
  834:         fonction_1 = toupper;
  835:         fonction_2 = tolower;
  836:     }
  837:     else
  838:     {
  839:         fonction_1 = tolower;
  840:         fonction_2 = toupper;
  841:     }
  842: 
  843:     ptr = chaine;
  844: 
  845:     while((*ptr) != d_code_fin_chaine)
  846:     {
  847:         ptr2 = prochain_caractere(s_etat_processus, ptr);
  848: 
  849:         if ((ptr2 - ptr) == 1)
  850:         {
  851:             registre = fonction_1((*ptr));
  852: 
  853:             if (fonction_2(registre) == (*ptr))
  854:             {
  855:                 (*ptr) = registre;
  856:             }
  857:         }
  858: 
  859:         ptr = ptr2;
  860:     }
  861: 
  862:     return;
  863: }
  864: 
  865: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>