Annotation of rpl/rpliconv/rpliconv.c, revision 1.1

1.1     ! bertrand    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>