File:  [local] / rpl / rpliconv / rpliconv.c
Revision 1.2: download - view: text, annotated - select for diffs - revision graph
Wed Apr 21 13:45:42 2010 UTC (14 years ago) by bertrand
Branches: MAIN
CVS tags: rpl-4_0_15, HEAD
En route pour la 4.0.15 !

    1: /*
    2: ================================================================================
    3:   RPLiconv
    4: ================================================================================
    5: */
    6: 
    7: #include <stdlib.h>
    8: #include <stdarg.h>
    9: #include <string.h>
   10: #include <errno.h>
   11: #include <stdio.h>
   12: 
   13: #include "iconv.h"
   14: 
   15: #define file FILE
   16: 
   17: #define d_LONGUEUR  1024
   18: 
   19: unsigned char *
   20: reencodage(unsigned char *chaine_entree,
   21:         unsigned char *codage_entree,
   22:         unsigned char *codage_sortie)
   23: {
   24:     iconv_t             transcodage;
   25: 
   26:     size_t              ios;
   27:     size_t              longueur_entree;
   28:     size_t              longueur_sortie;
   29: 
   30:     unsigned char       *buffer_entree;
   31:     unsigned char       *buffer_sortie;
   32:     unsigned char       *chaine_sortie;
   33:     unsigned char       *pointeur;
   34:     unsigned char       *tampon;
   35: 
   36:     if ((transcodage = iconv_open(codage_sortie, codage_entree)) ==
   37:             (iconv_t) -1)
   38:     {
   39:         perror("iconv_open");
   40:         return(NULL);
   41:     }
   42: 
   43:     buffer_entree = chaine_entree;
   44:     longueur_entree = strlen(chaine_entree);
   45: 
   46:     if ((chaine_sortie = malloc(sizeof(unsigned char))) == NULL)
   47:     {
   48:         return(NULL);
   49:     }
   50: 
   51:     chaine_sortie[0] = 0;
   52: 
   53:     if ((buffer_sortie = malloc((d_LONGUEUR + 1) * sizeof(char))) == NULL)
   54:     {
   55:         return(NULL);
   56:     }
   57: 
   58:     do
   59:     {
   60:         longueur_sortie = d_LONGUEUR;
   61:         pointeur = buffer_sortie;
   62: 
   63:         if ((ios = iconv(transcodage, (char **) &buffer_entree,
   64:                 &longueur_entree, (char **) &pointeur, &longueur_sortie))
   65:                 == (size_t) -1)
   66:         {
   67:             // On autorise les erreurs EINVAL et EILSEQ
   68:             if (errno == EILSEQ)
   69:             {
   70:                 perror("iconv");
   71:                 free(buffer_sortie);
   72:                 return(NULL);
   73:             }
   74:         }
   75: 
   76:         tampon = (unsigned char *) chaine_sortie;
   77:         (*pointeur) = 0;
   78: 
   79:         if ((chaine_sortie = malloc((strlen(tampon) + strlen(buffer_sortie) + 1)
   80:                 * sizeof(unsigned char))) == NULL)
   81:         {
   82:             return(NULL);
   83:         }
   84: 
   85:         sprintf(chaine_sortie, "%s%s", tampon, buffer_sortie);
   86:         free(tampon);
   87:     } while((*buffer_entree) != 0);
   88: 
   89:     free(buffer_sortie);
   90:     iconv_close(transcodage);
   91: 
   92:     return(chaine_sortie);
   93: }
   94: 
   95: int
   96: main(int argc, char *argv[])
   97: {
   98:     file                    *f_source;
   99: 
  100:     int                     ios;
  101: 
  102:     unsigned char           *encodage_destination;
  103:     unsigned char           *encodage_source;
  104:     unsigned char           *nom_fichier_source;
  105:     unsigned char           option;
  106:     unsigned char           *pointeur;
  107:     unsigned char           *fichier_source;
  108:     unsigned char           *fichier_destination;
  109: 
  110:     unsigned long           i;
  111:     unsigned long           nombre_caracteres;
  112: 
  113:     nom_fichier_source = NULL;
  114:     encodage_destination = NULL;
  115:     encodage_source = NULL;
  116: 
  117:     option = ' ';
  118: 
  119:     while((--argc) > 0)
  120:     {
  121:         if ((*(++argv))[0] == '-')
  122:         {
  123:             // Options
  124: 
  125:             while((option = *(++argv[0])) != 0)
  126:             {
  127:                 switch(option)
  128:                 {
  129:                     case 'f' :
  130:                     {
  131:                         if (encodage_source != NULL)
  132:                         {
  133:                             fprintf(stderr, "More than one 'from' option\n");
  134:                             return(-1);
  135:                         }
  136: 
  137:                         while(*(++argv[0]) == ' ');
  138:                         argv[0]--;
  139: 
  140:                         if ((*(++argv[0])) != 0)
  141:                         {
  142:                             encodage_source = argv[0];
  143:                         }
  144:                         else if ((--argc) > 0)
  145:                         {
  146:                             argv++;
  147:                             encodage_source = argv[0];
  148:                         }
  149:                         else
  150:                         {
  151:                             fprintf(stderr, "-f option waits for argument\n");
  152:                             return(-1);
  153:                         }
  154: 
  155:                         while(*(argv[0]) != 0)
  156:                         {
  157:                             argv[0]++;
  158:                         }
  159: 
  160:                         argv[0]--;
  161: 
  162:                         break;
  163:                     }
  164: 
  165:                     case 't' :
  166:                     {
  167:                         if (encodage_destination != NULL)
  168:                         {
  169:                             fprintf(stderr, "More than one 'from' option\n");
  170:                             return(-1);
  171:                         }
  172: 
  173:                         while(*(++argv[0]) == ' ');
  174:                         argv[0]--;
  175: 
  176:                         if ((*(++argv[0])) != 0)
  177:                         {
  178:                             encodage_destination = argv[0];
  179:                         }
  180:                         else if ((--argc) > 0)
  181:                         {
  182:                             argv++;
  183:                             encodage_destination = argv[0];
  184:                         }
  185:                         else
  186:                         {
  187:                             fprintf(stderr, "-f option waits for argument\n");
  188:                             return(-1);
  189:                         }
  190: 
  191:                         while(*(argv[0]) != 0)
  192:                         {
  193:                             argv[0]++;
  194:                         }
  195: 
  196:                         argv[0]--;
  197: 
  198:                         break;
  199:                     }
  200: 
  201:                     default :
  202:                     {
  203:                         fprintf(stderr, "Unknown option\n");
  204:                         return(-1);
  205:                     }
  206:                 }
  207:             }
  208:         }
  209:         else
  210:         {
  211:             // Nom du fichier à convertir
  212: 
  213:             if (nom_fichier_source != NULL)
  214:             {
  215:                 fprintf(stderr, "More than one file\n");
  216:                 return(-1);
  217:             }
  218: 
  219:             nom_fichier_source = argv[0];
  220:         }
  221:     }
  222: 
  223:     if (encodage_source == NULL)
  224:     {
  225:         fprintf(stderr, "Source encodage not found\n");
  226:         return(-1);
  227:     }
  228: 
  229:     if (encodage_destination == NULL)
  230:     {
  231:         fprintf(stderr, "Destination encodage not found\n");
  232:         return(-1);
  233:     }
  234: 
  235:     if (nom_fichier_source != NULL)
  236:     {
  237:         // Lecture à partir d'un fichier
  238: 
  239:         if ((f_source = fopen(nom_fichier_source, "r")) == NULL)
  240:         {
  241:             fprintf(stderr, "Source file not found\n");
  242:             return(-1);
  243:         }
  244: 
  245:         nombre_caracteres = 0;
  246: 
  247:         while(getc(f_source) != EOF)
  248:         {
  249:             nombre_caracteres++;
  250:         }
  251: 
  252:         if ((fichier_source = malloc((nombre_caracteres + 1) *
  253:                 sizeof(unsigned char))) == NULL)
  254:         {
  255:             fprintf(stderr, "Not enough memory\n");
  256:             return(-1);
  257:         }
  258: 
  259:         rewind(f_source);
  260:         pointeur = fichier_source;
  261: 
  262:         for(i = 0; i < nombre_caracteres; i++)
  263:         {
  264:             (*pointeur) = getc(f_source);
  265:             pointeur++;
  266:         }
  267: 
  268:         (*pointeur) = 0;
  269: 
  270:         fclose(f_source);
  271:     }
  272:     else
  273:     {
  274:         // Lecture depuis stdin
  275: 
  276:         fichier_source = NULL;
  277: 
  278:         for(i = 1;; i++)
  279:         {
  280:             if ((fichier_source = realloc(fichier_source,
  281:                     ((d_LONGUEUR * i) + 1) * sizeof(unsigned char))) == NULL)
  282:             {
  283:                 fprintf(stderr, "Not enough memory\n");
  284:                 return(-1);
  285:             }
  286: 
  287:             if (fread(&(fichier_source[d_LONGUEUR * (i - 1)]),
  288:                     sizeof(unsigned char), d_LONGUEUR, stdin) < d_LONGUEUR)
  289:             {
  290:                 break;
  291:             }
  292:         }
  293:     }
  294: 
  295:     if ((fichier_destination = reencodage(fichier_source, encodage_source,
  296:             encodage_destination)) == NULL)
  297:     {
  298:         free(fichier_source);
  299:         free(fichier_destination);
  300: 
  301:         fprintf(stderr, "Conversion error\n");
  302:         return(-1);
  303:     }
  304: 
  305:     free(fichier_source);
  306: 
  307:     while((ios = fprintf(stdout, "%s", fichier_destination)) < 0)
  308:     {
  309:         if ((errno != EINTR) && (errno != 0))
  310:         {
  311:             free(fichier_destination);
  312:             perror("fprintf(stdout, ...)");
  313:             return(-1);
  314:         }
  315:     }
  316: 
  317:     free(fichier_destination);
  318: 
  319:     return(0);
  320: }
  321: 
  322: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>