File:  [local] / rpl / src / formateur_flux.c
Revision 1.33: download - view: text, annotated - select for diffs - revision graph
Fri Mar 1 09:29:30 2013 UTC (11 years, 1 month ago) by bertrand
Branches: MAIN
CVS tags: HEAD
Correction de bugs critiques dans READ (sockets) et dans les échappements
des caractères.

    1: /*
    2: ================================================================================
    3:   RPL/2 (R) version 4.1.13
    4:   Copyright (C) 1989-2013 Dr. BERTRAND Joël
    5: 
    6:   This file is part of RPL/2.
    7: 
    8:   RPL/2 is free software; you can redistribute it and/or modify it
    9:   under the terms of the CeCILL V2 License as published by the french
   10:   CEA, CNRS and INRIA.
   11:  
   12:   RPL/2 is distributed in the hope that it will be useful, but WITHOUT
   13:   ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
   14:   FITNESS FOR A PARTICULAR PURPOSE.  See the CeCILL V2 License
   15:   for more details.
   16:  
   17:   You should have received a copy of the CeCILL License
   18:   along with RPL/2. If not, write to info@cecill.info.
   19: ================================================================================
   20: */
   21: 
   22: 
   23: #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 (\\x%c%c) [%d]\n",
  169:                                         *ptr_lecture, *(ptr_lecture + 1),
  170:                                         (int) getpid());
  171:                             }
  172:                             else
  173:                             {
  174:                                 printf("+++Warning : Unknown "
  175:                                         "escape code (\\x%c%c) [%d]\n",
  176:                                         *ptr_lecture, *(ptr_lecture + 1),
  177:                                         (int) getpid());
  178:                             }
  179:                         }
  180:                     }
  181:                     else
  182:                     {
  183:                         if ((*s_etat_processus).langue == 'F')
  184:                         {
  185:                             printf("+++Information : "
  186:                                     "Séquence d'échappement "
  187:                                     "tronquée [%d]\n", (int) getpid());
  188:                         }
  189:                         else
  190:                         {
  191:                             printf("+++Warning : Truncated escape code "
  192:                                     "[%d]\n", (int) getpid());
  193:                         }
  194:                     }
  195:                 }
  196:                 else
  197:                 {
  198:                     if ((*s_etat_processus).langue == 'F')
  199:                     {
  200:                         printf("+++Information : "
  201:                                 "Séquence d'échappement "
  202:                                 "inconnue [%d]\n", (int) getpid());
  203:                     }
  204:                     else
  205:                     {
  206:                         printf("+++Warning : Unknown escape code "
  207:                                 "[%d]\n", (int) getpid());
  208:                     }
  209:                 }
  210:             }
  211:             else if ((*(ptr_lecture + 1)) == '\\')
  212:             {
  213:                 ptr_lecture++;
  214:             }
  215:             else
  216:             {
  217:                 if ((*(ptr_lecture + 1)) == d_code_fin_chaine)
  218:                 {
  219:                     if ((*s_etat_processus).langue == 'F')
  220:                     {
  221:                         printf("+++Information : "
  222:                                 "Séquence d'échappement "
  223:                                 "tronquée [%d]\n", (int) getpid());
  224:                     }
  225:                     else
  226:                     {
  227:                         printf("+++Warning : Truncated escape code "
  228:                                 "[%d]\n", (int) getpid());
  229:                     }
  230:                 }
  231:                 else
  232:                 {   
  233:                     if ((*s_etat_processus).langue == 'F')
  234:                     {
  235:                         printf("+++Information : Séquence d'échappement "
  236:                                 "inconnue (%c%c) [%d]\n",
  237:                                 *ptr_lecture, *(ptr_lecture + 1),
  238:                                 (int) getpid());
  239:                     }
  240:                     else
  241:                     {
  242:                         printf("+++Warning : Unknown escape code (%c%c) "
  243:                                 "[%d]\n", *ptr_lecture, *(ptr_lecture + 1),
  244:                                 (int) getpid());
  245:                     }
  246:                 }
  247:             }
  248:         }
  249: 
  250:         ptr_ecriture++;
  251:         ptr_lecture++;
  252:     }
  253: 
  254:     (*ptr_ecriture) = d_code_fin_chaine;
  255: 
  256:     if ((chaine = realloc(chaine, ((((*longueur) = ptr_ecriture - chaine)) + 1)
  257:             * sizeof(unsigned char))) == NULL)
  258:     {
  259:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  260:         return(NULL);
  261:     }
  262: 
  263:     return(chaine);
  264: }
  265: 
  266: 
  267: /*
  268: ================================================================================
  269:   Routine de d'analyse d'un flux
  270: ================================================================================
  271:   Entrées : structure sur l'état du processus et objet à afficher
  272: --------------------------------------------------------------------------------
  273:   Sorties : chaine de caractères
  274: --------------------------------------------------------------------------------
  275:   Effets de bord : néant
  276: ================================================================================
  277: */
  278: 
  279: unsigned char *
  280: analyse_flux(struct_processus *s_etat_processus, unsigned char *donnees,
  281:         long longueur)
  282: {
  283:     long                    longueur_courante;
  284:     long                    offset;
  285: 
  286:     unsigned char           *chaine;
  287:     unsigned char           hexadecimal[3];
  288:     unsigned char           *ptr_ecriture;
  289:     unsigned char           *ptr_lecture;
  290: 
  291:     if ((chaine = malloc((longueur_courante = longueur + 1) *
  292:             sizeof(unsigned char))) == NULL)
  293:     {
  294:         (*s_etat_processus).erreur_systeme = d_es_allocation_memoire;
  295:         return(NULL);
  296:     }
  297: 
  298:     ptr_lecture = donnees;
  299:     ptr_ecriture = chaine;
  300: 
  301:     while(longueur > 0)
  302:     {
  303:         // Début de la séquence d'échappement
  304: 
  305:         switch((*ptr_lecture))
  306:         {
  307:             case '"':
  308:             case '\b':
  309:             case '\n':
  310:             case '\t':
  311:             case '\\':
  312:             {
  313:                 offset = ptr_ecriture - chaine;
  314: 
  315:                 if ((chaine = realloc(chaine, (++longueur_courante)
  316:                         * sizeof(unsigned char))) == NULL)
  317:                 {
  318:                     (*s_etat_processus).erreur_systeme =
  319:                             d_es_allocation_memoire;
  320:                     return(NULL);
  321:                 }
  322: 
  323:                 ptr_ecriture = chaine + offset;
  324:                 *ptr_ecriture++ = '\\';
  325: 
  326:                 switch((*ptr_lecture++))
  327:                 {
  328:                     case '"':
  329:                     {
  330:                         *ptr_ecriture++ = '"';
  331:                         break;
  332:                     }
  333: 
  334:                     case '\b':
  335:                     {
  336:                         *ptr_ecriture++ = 'b';
  337:                         break;
  338:                     }
  339: 
  340:                     case '\n':
  341:                     {
  342:                         *ptr_ecriture++ = 'n';
  343:                         break;
  344:                     }
  345: 
  346:                     case '\t':
  347:                     {
  348:                         *ptr_ecriture++ = 't';
  349:                         break;
  350:                     }
  351: 
  352:                     case '\\':
  353:                     {
  354:                         *ptr_ecriture++ = '\\';
  355:                         break;
  356:                     }
  357:                 }
  358: 
  359:                 break;
  360:             }
  361: 
  362:             case ' ':
  363:             {
  364:                 *ptr_ecriture++ = *ptr_lecture++;
  365:                 break;
  366:             }
  367: 
  368:             default:
  369:             {
  370:                 if (isgraph((*ptr_lecture)))
  371:                 {
  372:                     *ptr_ecriture++ = *ptr_lecture++;
  373:                 }
  374:                 else
  375:                 {
  376:                     offset = ptr_ecriture - chaine;
  377: 
  378:                     if ((chaine = realloc(chaine, (longueur_courante =
  379:                             longueur_courante + 3) * sizeof(unsigned char)))
  380:                             == NULL)
  381:                     {
  382:                         (*s_etat_processus).erreur_systeme =
  383:                                 d_es_allocation_memoire;
  384:                         return(NULL);
  385:                     }
  386: 
  387:                     ptr_ecriture = chaine + offset;
  388:                     *ptr_ecriture++ = '\\';
  389:                     *ptr_ecriture++ = 'x';
  390: 
  391:                     sprintf(hexadecimal, "%02X", *ptr_lecture++);
  392: 
  393:                     *ptr_ecriture++ = hexadecimal[0];
  394:                     *ptr_ecriture++ = hexadecimal[1];
  395:                 }
  396: 
  397:                 break;
  398:             }
  399:         }
  400: 
  401:         longueur--;
  402:     }
  403: 
  404:     (*ptr_ecriture) = d_code_fin_chaine;
  405: 
  406:     return(chaine);
  407: }
  408: 
  409: 
  410: /*
  411: ================================================================================
  412:   Routine testant la validité d'une chaîne de caractères
  413: ================================================================================
  414:   Entrées : structure sur l'état du processus et chaîne courante
  415: --------------------------------------------------------------------------------
  416:   Sorties : pointeur sur le caractère suivant
  417: --------------------------------------------------------------------------------
  418:   Effets de bord : néant
  419: ================================================================================
  420: */
  421: 
  422: logical1
  423: validation_chaine(unsigned char *chaine)
  424: {
  425:     if (chaine == NULL)
  426:     {
  427:         return(d_faux);
  428:     }
  429: 
  430:     while((*chaine) != d_code_fin_chaine)
  431:     {
  432:         if ((*chaine) == '\\')
  433:         {
  434:             if ((*(chaine + 1)) == '"')
  435:             {
  436:                 chaine += 2;
  437:             }
  438:             else if ((*(chaine + 1)) == 'b')
  439:             {
  440:                 chaine += 2;
  441:             }
  442:             else if ((*(chaine + 1)) == 'n')
  443:             {
  444:                 chaine += 2;
  445:             }
  446:             else if ((*(chaine + 1)) == 't')
  447:             {
  448:                 chaine += 2;
  449:             }
  450:             else if ((*(chaine + 1)) == 'x')
  451:             {
  452:                 if ((*(chaine + 2)) != d_code_fin_chaine)
  453:                 {
  454:                     if ((*(chaine + 3)) != d_code_fin_chaine)
  455:                     {
  456:                         switch(*(chaine + 2))
  457:                         {
  458:                             case '0':
  459:                             case '1':
  460:                             case '2':
  461:                             case '3':
  462:                             case '4':
  463:                             case '5':
  464:                             case '6':
  465:                             case '7':
  466:                             case '8':
  467:                             case '9':
  468:                             case 'A':
  469:                             case 'B':
  470:                             case 'C':
  471:                             case 'D':
  472:                             case 'E':
  473:                             case 'F':
  474:                                 break;
  475: 
  476:                             default:
  477:                                 return(d_faux);
  478:                                 break;
  479:                         }
  480: 
  481:                         switch(*(chaine + 3))
  482:                         {
  483:                             case '0':
  484:                             case '1':
  485:                             case '2':
  486:                             case '3':
  487:                             case '4':
  488:                             case '5':
  489:                             case '6':
  490:                             case '7':
  491:                             case '8':
  492:                             case '9':
  493:                             case 'A':
  494:                             case 'B':
  495:                             case 'C':
  496:                             case 'D':
  497:                             case 'E':
  498:                             case 'F':
  499:                                 break;
  500: 
  501:                             default:
  502:                                 return(d_faux);
  503:                                 break;
  504:                         }
  505:                     }
  506:                     else
  507:                     {
  508:                         return(d_faux);
  509:                     }
  510:                 }
  511:                 else
  512:                 {
  513:                     return(d_faux);
  514:                 }
  515: 
  516:                 chaine += 4;
  517:             }
  518:             else if ((*(chaine + 1)) == '\\')
  519:             {
  520:                 chaine += 2;
  521:             }
  522:             else
  523:             {
  524:                 // Tous les autres cas sont invalides
  525:                 return(d_faux);
  526:             }
  527:         }
  528:         else
  529:         {
  530:             chaine++;
  531:         }
  532:     }
  533: 
  534:     return(d_vrai);
  535: }
  536: 
  537: 
  538: /*
  539: ================================================================================
  540:   Routine permettant de trouver le caractère suivant dans une chaîne
  541: ================================================================================
  542:   Entrées : structure sur l'état du processus et chaîne courante
  543: --------------------------------------------------------------------------------
  544:   Sorties : pointeur sur le caractère suivant
  545: --------------------------------------------------------------------------------
  546:   Effets de bord : néant
  547: ================================================================================
  548: */
  549: 
  550: static inline unsigned char *
  551: prochain_caractere(struct_processus *s_etat_processus, unsigned char *chaine)
  552: {
  553:     unsigned char       *suivant;
  554: 
  555:     if (chaine == NULL)
  556:     {
  557:         return(NULL);
  558:     }
  559: 
  560:     if ((*chaine) == '\\')
  561:     {
  562:         if ((*(chaine + 1)) == '"')
  563:         {
  564:             suivant = chaine + 2;
  565:         }
  566:         else if ((*(chaine + 1)) == 'b')
  567:         {
  568:             suivant = chaine + 2;
  569:         }
  570:         else if ((*(chaine + 1)) == 'n')
  571:         {
  572:             suivant = chaine + 2;
  573:         }
  574:         else if ((*(chaine + 1)) == 't')
  575:         {
  576:             suivant = chaine + 2;
  577:         }
  578:         else if ((*(chaine + 1)) == 'x')
  579:         {
  580:             if ((*(chaine + 2)) != d_code_fin_chaine)
  581:             {
  582:                 if ((*(chaine + 3)) != d_code_fin_chaine)
  583:                 {
  584:                     logical1        erreur;
  585: 
  586:                     erreur = d_faux;
  587: 
  588:                     switch(*(chaine + 2))
  589:                     {
  590:                         case '0':
  591:                         case '1':
  592:                         case '2':
  593:                         case '3':
  594:                         case '4':
  595:                         case '5':
  596:                         case '6':
  597:                         case '7':
  598:                         case '8':
  599:                         case '9':
  600:                         case 'A':
  601:                         case 'B':
  602:                         case 'C':
  603:                         case 'D':
  604:                         case 'E':
  605:                         case 'F':
  606:                             break;
  607: 
  608:                         default:
  609:                             erreur = d_vrai;
  610:                             break;
  611:                     }
  612: 
  613:                     switch(*(chaine + 3))
  614:                     {
  615:                         case '0':
  616:                         case '1':
  617:                         case '2':
  618:                         case '3':
  619:                         case '4':
  620:                         case '5':
  621:                         case '6':
  622:                         case '7':
  623:                         case '8':
  624:                         case '9':
  625:                         case 'A':
  626:                         case 'B':
  627:                         case 'C':
  628:                         case 'D':
  629:                         case 'E':
  630:                         case 'F':
  631:                             break;
  632: 
  633:                         default:
  634:                             erreur = d_vrai;
  635:                             break;
  636:                     }
  637: 
  638:                     if (erreur == d_vrai)
  639:                     {
  640:                         if ((*s_etat_processus).langue == 'F')
  641:                         {
  642:                             printf("+++Information : "
  643:                                     "Séquence d'échappement "
  644:                                     "inconnue [%d]\n",
  645:                                     (int) getpid());
  646:                         }
  647:                         else
  648:                         {
  649:                             printf("+++Warning : Unknown "
  650:                                     "escape code "
  651:                                     "[%d]\n", (int) getpid());
  652:                         }
  653: 
  654:                         return(NULL);
  655:                     }
  656: 
  657:                     suivant = chaine + 4;
  658:                 }
  659:                 else
  660:                 {
  661:                     if ((*s_etat_processus).langue == 'F')
  662:                     {
  663:                         printf("+++Information : "
  664:                                 "Séquence d'échappement "
  665:                                 "inconnue [%d]\n", (int) getpid());
  666:                     }
  667:                     else
  668:                     {
  669:                         printf("+++Warning : Unknown escape code "
  670:                                 "[%d]\n", (int) getpid());
  671:                     }
  672: 
  673:                     return(NULL);
  674:                 }
  675:             }
  676:             else
  677:             {
  678:                 if ((*s_etat_processus).langue == 'F')
  679:                 {
  680:                     printf("+++Information : "
  681:                             "Séquence d'échappement "
  682:                             "inconnue [%d]\n", (int) getpid());
  683:                 }
  684:                 else
  685:                 {
  686:                     printf("+++Warning : Unknown escape code "
  687:                             "[%d]\n", (int) getpid());
  688:                 }
  689: 
  690:                 return(NULL);
  691:             }
  692:         }
  693:         else if ((*(chaine + 1)) == '\\')
  694:         {
  695:             suivant = chaine + 2;
  696:         }
  697:         else
  698:         {
  699:             if ((*s_etat_processus).langue == 'F')
  700:             {
  701:                 printf("+++Information : Séquence d'échappement "
  702:                         "inconnue [%d]\n", (int) getpid());
  703:             }
  704:             else
  705:             {
  706:                 printf("+++Warning : Unknown escape code "
  707:                         "[%d]\n", (int) getpid());
  708:             }
  709: 
  710:             return(NULL);
  711:         }
  712:     }
  713:     else
  714:     {
  715:         suivant = chaine + 1;
  716:     }
  717: 
  718:     return(suivant);
  719: }
  720: 
  721: 
  722: /*
  723: ================================================================================
  724:   Routine donnant la longueur d'une chaîne de caractères
  725: ================================================================================
  726:   Entrées : structure sur l'état du processus et chaîne
  727: --------------------------------------------------------------------------------
  728:   Sorties : longueur de la chaîne
  729: --------------------------------------------------------------------------------
  730:   Effets de bord : néant
  731: ================================================================================
  732: */
  733: 
  734: integer8
  735: longueur_chaine(struct_processus *s_etat_processus, unsigned char *chaine)
  736: {
  737:     integer8        nombre_caracteres;
  738: 
  739:     unsigned char   *pointeur;
  740: 
  741:     pointeur = chaine;
  742:     nombre_caracteres = 0;
  743: 
  744:     if ((*pointeur) == '\0')
  745:     {
  746:         return(0);
  747:     }
  748: 
  749:     do
  750:     {
  751:         if ((pointeur = prochain_caractere(s_etat_processus, pointeur)) == NULL)
  752:         {
  753:             return(0);
  754:         }
  755: 
  756:         nombre_caracteres++;
  757:     } while((*pointeur) != 0);
  758: 
  759:     return(nombre_caracteres);
  760: }
  761: 
  762: 
  763: /*
  764: ================================================================================
  765:   Routine retournant un pointeur sur le i-ème caractère d'une chaîne
  766: ================================================================================
  767:   Entrées : structure sur l'état du processus, chaîne et position du caractère
  768: --------------------------------------------------------------------------------
  769:   Sorties : pointeur sur le caractère
  770: --------------------------------------------------------------------------------
  771:   Effets de bord : néant
  772: ================================================================================
  773: */
  774: 
  775: unsigned char *
  776: pointeur_ieme_caractere(struct_processus *s_etat_processus,
  777:         unsigned char *chaine, integer8 position)
  778: {
  779:     integer8            i;
  780: 
  781:     unsigned char       *pointeur;
  782: 
  783:     if ((pointeur = chaine) == NULL)
  784:     {
  785:         return(NULL);
  786:     }
  787: 
  788:     for(i = 0; i < position; i++)
  789:     {
  790:         pointeur = prochain_caractere(s_etat_processus, pointeur);
  791: 
  792:         if ((*pointeur) == d_code_fin_chaine)
  793:         {
  794:             return(pointeur);
  795:         }
  796:     }
  797: 
  798:     return(pointeur);
  799: }
  800: 
  801: 
  802: /*
  803: ================================================================================
  804:   Routine retournant la position du caractère en fonction du pointeur
  805:   dans la chaîne
  806: ================================================================================
  807:   Entrées : structure sur l'état du processus, chaîne et position
  808: --------------------------------------------------------------------------------
  809:   Sorties : quantième dans la chaîne
  810: --------------------------------------------------------------------------------
  811:   Effets de bord : néant
  812: ================================================================================
  813: */
  814: 
  815: integer8
  816: position_caractere_de_chaine(struct_processus *s_etat_processus,
  817:         unsigned char *chaine, unsigned char *position)
  818: {
  819:     integer8            i;
  820: 
  821:     i = 1;
  822: 
  823:     while(chaine != position)
  824:     {
  825:         chaine = prochain_caractere(s_etat_processus, chaine);
  826:         i++;
  827: 
  828:         if ((*chaine) == d_code_fin_chaine)
  829:         {
  830:             return(0);
  831:         }
  832:     }
  833: 
  834:     return(i);
  835: }
  836: 
  837: 
  838: /*
  839: ================================================================================
  840:   Conversion d'une chaîne en majuscule ou en minuscule
  841: ================================================================================
  842:   Entrées : chaîne et indicateur ('M' pour majuscules, 'm' pour minuscules)
  843: --------------------------------------------------------------------------------
  844:   Sorties : néant
  845: --------------------------------------------------------------------------------
  846:   Effets de bord : néant
  847: ================================================================================
  848: */
  849: 
  850: void
  851: conversion_chaine(struct_processus *s_etat_processus,
  852:         unsigned char *chaine, unsigned char type)
  853: {
  854:     int                 (*fonction_1)(int);
  855:     int                 (*fonction_2)(int);
  856: 
  857:     unsigned char       *ptr;
  858:     unsigned char       *ptr2;
  859:     unsigned char       registre;
  860: 
  861:     if (type == 'M')
  862:     {
  863:         fonction_1 = toupper;
  864:         fonction_2 = tolower;
  865:     }
  866:     else
  867:     {
  868:         fonction_1 = tolower;
  869:         fonction_2 = toupper;
  870:     }
  871: 
  872:     ptr = chaine;
  873: 
  874:     while((*ptr) != d_code_fin_chaine)
  875:     {
  876:         ptr2 = prochain_caractere(s_etat_processus, ptr);
  877: 
  878:         if ((ptr2 - ptr) == 1)
  879:         {
  880:             registre = fonction_1((*ptr));
  881: 
  882:             if (fonction_2(registre) == (*ptr))
  883:             {
  884:                 (*ptr) = registre;
  885:             }
  886:         }
  887: 
  888:         ptr = ptr2;
  889:     }
  890: 
  891:     return;
  892: }
  893: 
  894: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>