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

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;
1.3       bertrand   61:        longueur_entree = strlen(buffer_entree);
1.1       bertrand   62:        pointeur = buffer_sortie;
                     63: 
                     64:        if ((ios = iconv(transcodage, (char **) &buffer_entree,
                     65:                &longueur_entree, (char **) &pointeur, &longueur_sortie))
                     66:                == (size_t) -1)
                     67:        {
1.3       bertrand   68:            // On autorise les erreurs EINVAL et E2BIG
1.1       bertrand   69:            if (errno == EILSEQ)
                     70:            {
                     71:                perror("iconv");
                     72:                free(buffer_sortie);
                     73:                return(NULL);
                     74:            }
                     75:        }
                     76: 
                     77:        tampon = (unsigned char *) chaine_sortie;
                     78:        (*pointeur) = 0;
                     79: 
                     80:        if ((chaine_sortie = malloc((strlen(tampon) + strlen(buffer_sortie) + 1)
                     81:                * sizeof(unsigned char))) == NULL)
                     82:        {
                     83:            return(NULL);
                     84:        }
                     85: 
                     86:        sprintf(chaine_sortie, "%s%s", tampon, buffer_sortie);
                     87:        free(tampon);
                     88:    } while((*buffer_entree) != 0);
                     89: 
                     90:    free(buffer_sortie);
                     91:    iconv_close(transcodage);
                     92: 
                     93:    return(chaine_sortie);
                     94: }
                     95: 
                     96: int
                     97: main(int argc, char *argv[])
                     98: {
                     99:    file                    *f_source;
                    100: 
1.6       bertrand  101:    int                     caractere;
1.1       bertrand  102:    int                     ios;
                    103: 
                    104:    unsigned char           *encodage_destination;
                    105:    unsigned char           *encodage_source;
                    106:    unsigned char           *nom_fichier_source;
                    107:    unsigned char           option;
                    108:    unsigned char           *pointeur;
                    109:    unsigned char           *fichier_source;
                    110:    unsigned char           *fichier_destination;
                    111: 
1.3       bertrand  112:    unsigned long           drapeau;
1.1       bertrand  113:    unsigned long           i;
1.3       bertrand  114:    unsigned long           j;
1.1       bertrand  115:    unsigned long           nombre_caracteres;
                    116: 
                    117:    nom_fichier_source = NULL;
                    118:    encodage_destination = NULL;
                    119:    encodage_source = NULL;
                    120: 
                    121:    option = ' ';
                    122: 
                    123:    while((--argc) > 0)
                    124:    {
                    125:        if ((*(++argv))[0] == '-')
                    126:        {
                    127:            // Options
                    128: 
                    129:            while((option = *(++argv[0])) != 0)
                    130:            {
                    131:                switch(option)
                    132:                {
                    133:                    case 'f' :
                    134:                    {
                    135:                        if (encodage_source != NULL)
                    136:                        {
                    137:                            fprintf(stderr, "More than one 'from' option\n");
                    138:                            return(-1);
                    139:                        }
                    140: 
                    141:                        while(*(++argv[0]) == ' ');
                    142:                        argv[0]--;
                    143: 
                    144:                        if ((*(++argv[0])) != 0)
                    145:                        {
                    146:                            encodage_source = argv[0];
                    147:                        }
                    148:                        else if ((--argc) > 0)
                    149:                        {
                    150:                            argv++;
                    151:                            encodage_source = argv[0];
                    152:                        }
                    153:                        else
                    154:                        {
                    155:                            fprintf(stderr, "-f option waits for argument\n");
                    156:                            return(-1);
                    157:                        }
                    158: 
                    159:                        while(*(argv[0]) != 0)
                    160:                        {
                    161:                            argv[0]++;
                    162:                        }
                    163: 
                    164:                        argv[0]--;
                    165: 
                    166:                        break;
                    167:                    }
                    168: 
                    169:                    case 't' :
                    170:                    {
                    171:                        if (encodage_destination != NULL)
                    172:                        {
                    173:                            fprintf(stderr, "More than one 'from' option\n");
                    174:                            return(-1);
                    175:                        }
                    176: 
                    177:                        while(*(++argv[0]) == ' ');
                    178:                        argv[0]--;
                    179: 
                    180:                        if ((*(++argv[0])) != 0)
                    181:                        {
                    182:                            encodage_destination = argv[0];
                    183:                        }
                    184:                        else if ((--argc) > 0)
                    185:                        {
                    186:                            argv++;
                    187:                            encodage_destination = argv[0];
                    188:                        }
                    189:                        else
                    190:                        {
                    191:                            fprintf(stderr, "-f option waits for argument\n");
                    192:                            return(-1);
                    193:                        }
                    194: 
                    195:                        while(*(argv[0]) != 0)
                    196:                        {
                    197:                            argv[0]++;
                    198:                        }
                    199: 
                    200:                        argv[0]--;
                    201: 
                    202:                        break;
                    203:                    }
                    204: 
                    205:                    default :
                    206:                    {
                    207:                        fprintf(stderr, "Unknown option\n");
                    208:                        return(-1);
                    209:                    }
                    210:                }
                    211:            }
                    212:        }
                    213:        else
                    214:        {
                    215:            // Nom du fichier à convertir
                    216: 
                    217:            if (nom_fichier_source != NULL)
                    218:            {
                    219:                fprintf(stderr, "More than one file\n");
                    220:                return(-1);
                    221:            }
                    222: 
                    223:            nom_fichier_source = argv[0];
                    224:        }
                    225:    }
                    226: 
                    227:    if (encodage_source == NULL)
                    228:    {
                    229:        fprintf(stderr, "Source encodage not found\n");
                    230:        return(-1);
                    231:    }
                    232: 
                    233:    if (encodage_destination == NULL)
                    234:    {
                    235:        fprintf(stderr, "Destination encodage not found\n");
                    236:        return(-1);
                    237:    }
                    238: 
                    239:    if (nom_fichier_source != NULL)
                    240:    {
                    241:        // Lecture à partir d'un fichier
                    242: 
                    243:        if ((f_source = fopen(nom_fichier_source, "r")) == NULL)
                    244:        {
                    245:            fprintf(stderr, "Source file not found\n");
                    246:            return(-1);
                    247:        }
                    248: 
                    249:        nombre_caracteres = 0;
                    250: 
                    251:        while(getc(f_source) != EOF)
                    252:        {
                    253:            nombre_caracteres++;
                    254:        }
                    255: 
                    256:        if ((fichier_source = malloc((nombre_caracteres + 1) *
                    257:                sizeof(unsigned char))) == NULL)
                    258:        {
                    259:            fprintf(stderr, "Not enough memory\n");
                    260:            return(-1);
                    261:        }
                    262: 
                    263:        rewind(f_source);
                    264:        pointeur = fichier_source;
                    265: 
                    266:        for(i = 0; i < nombre_caracteres; i++)
                    267:        {
                    268:            (*pointeur) = getc(f_source);
                    269:            pointeur++;
                    270:        }
                    271: 
                    272:        (*pointeur) = 0;
                    273: 
                    274:        fclose(f_source);
                    275:    }
                    276:    else
                    277:    {
                    278:        // Lecture depuis stdin
                    279: 
                    280:        fichier_source = NULL;
1.3       bertrand  281:        drapeau = 0;
1.1       bertrand  282: 
1.3       bertrand  283:        for(i = 1; drapeau == 0; i++)
1.1       bertrand  284:        {
                    285:            if ((fichier_source = realloc(fichier_source,
                    286:                    ((d_LONGUEUR * i) + 1) * sizeof(unsigned char))) == NULL)
                    287:            {
                    288:                fprintf(stderr, "Not enough memory\n");
                    289:                return(-1);
                    290:            }
                    291: 
1.3       bertrand  292:            for(j = 0; (j < d_LONGUEUR) && (drapeau == 0); j++)
1.1       bertrand  293:            {
1.6       bertrand  294:                if ((caractere = getc(stdin)) == EOF)
1.3       bertrand  295:                {
1.4       bertrand  296:                    fichier_source[(d_LONGUEUR * (i - 1)) + j] = 0;
1.3       bertrand  297:                    drapeau = 1;
                    298:                }
1.6       bertrand  299:                else
                    300:                {
                    301:                    fichier_source[(d_LONGUEUR * (i - 1)) + j] =
                    302:                            (unsigned char) caractere;
                    303:                }
1.1       bertrand  304:            }
                    305:        }
                    306:    }
                    307: 
                    308:    if ((fichier_destination = reencodage(fichier_source, encodage_source,
                    309:            encodage_destination)) == NULL)
                    310:    {
                    311:        free(fichier_source);
                    312:        free(fichier_destination);
                    313: 
                    314:        fprintf(stderr, "Conversion error\n");
                    315:        return(-1);
                    316:    }
                    317: 
                    318:    free(fichier_source);
                    319: 
                    320:    while((ios = fprintf(stdout, "%s", fichier_destination)) < 0)
                    321:    {
                    322:        if ((errno != EINTR) && (errno != 0))
                    323:        {
                    324:            free(fichier_destination);
                    325:            perror("fprintf(stdout, ...)");
                    326:            return(-1);
                    327:        }
                    328:    }
                    329: 
                    330:    free(fichier_destination);
                    331: 
                    332:    return(0);
                    333: }
                    334: 
                    335: // vim: ts=4

CVSweb interface <joel.bertrand@systella.fr>