Annotation of rpl/rpltags/rpltags.c, revision 1.3

1.1       bertrand    1: /*
                      2: ================================================================================
                      3:   RPLtags
                      4: ================================================================================
                      5: */
                      6: 
                      7: #include "rpltags.h"
                      8: 
                      9: char ***
                     10: traitement(char *nom_fichier, char ***tab, int *nb_lignes)
                     11: {
                     12:    char                    *chaine;
                     13:    char                    *ptr;
                     14:    char                    *ptr2;
                     15:    char                    *nom;
                     16:    char                    *text;
                     17: 
                     18:    FILE                    *fichier;
                     19: 
                     20:    int                     drapeau_chaine;
                     21:    int                     ligne_valide;
                     22:    int                     niveau;
                     23: 
                     24:    unsigned long           i;
                     25:    unsigned long           ligne;
                     26:    unsigned long           nombre_caracteres_source;
                     27: 
                     28:    if ((fichier = fopen(nom_fichier, "r")) == NULL)
                     29:    {
                     30:        exit(EXIT_FAILURE);
                     31:    }
                     32: 
                     33:    nombre_caracteres_source = 0;
                     34: 
                     35:    while(getc(fichier) != EOF)
                     36:    {
                     37:        nombre_caracteres_source++;
                     38:    }
                     39: 
                     40:    if ((chaine = malloc((nombre_caracteres_source + 1) * sizeof(char)))
                     41:            == NULL)
                     42:    {
                     43:        exit(EXIT_FAILURE);
                     44:    }
                     45: 
                     46:    rewind(fichier);
                     47:    ptr = chaine;
                     48: 
                     49:    for(i = 0; i < nombre_caracteres_source; i++)
                     50:    {
                     51:        *ptr++ = getc(fichier);
                     52:    }
                     53: 
                     54:    *ptr = 0;
                     55:    ptr = chaine;
                     56:    text = NULL;
                     57:    nom = NULL;
                     58: 
                     59:    drapeau_chaine = 0;
                     60:    ligne = 1;
                     61:    niveau = 0;
                     62: 
                     63:    while((*ptr) != 0)
                     64:    {
                     65:        if ((*ptr) == '\"')
                     66:        {
                     67:            drapeau_chaine = (drapeau_chaine == 0) ? -1 : 0;
                     68:        }
                     69: 
                     70:        if (drapeau_chaine == 0)
                     71:        {
                     72:            if ((*ptr) == '#')
                     73:            {
                     74:                if (ptr == chaine)
                     75:                {
                     76:                    while(((*ptr) != '\n') && ((*ptr) != 0))
                     77:                    {
                     78:                        ptr++;
                     79:                    }
                     80:                }
                     81:                else if ((*(ptr - 1)) == '\n')
                     82:                {
                     83:                    while(((*ptr) != '\n') && ((*ptr) != 0))
                     84:                    {
                     85:                        ptr++;
                     86:                    }
                     87:                }
                     88:            }
                     89:            else if ((*ptr) == '<')
                     90:            {
                     91:                if ((*(ptr + 1)) == '<')
                     92:                {
                     93:                    if (text == NULL)
                     94:                    {
                     95:                        if ((text = malloc(3 * sizeof(char))) == NULL)
                     96:                        {
                     97:                            exit(EXIT_FAILURE);
                     98:                        }
                     99: 
                    100:                        text[0] = (*ptr);
                    101:                        text[1] = (*(ptr + 1));
                    102:                        text[2] = 0;
                    103:                    }
                    104:                    else
                    105:                    {
                    106:                        if ((text = realloc(text, (strlen(text) + 3) *
                    107:                                sizeof(char))) == NULL)
                    108:                        {
                    109:                            exit(EXIT_FAILURE);
                    110:                        }
                    111: 
                    112:                        ptr2 = &text[strlen(text)];
                    113:                        (*ptr2++) = (*ptr);
                    114:                        (*ptr2++) = (*(ptr + 1));
                    115:                        (*ptr2++) = 0;
                    116:                    }
                    117: 
                    118:                    niveau++;
                    119:                    ptr += 2;
                    120:                }
                    121:            }
                    122:            else if ((*ptr) == '>')
                    123:            {
                    124:                if ((*(ptr + 1)) == '>')
                    125:                {
                    126:                    if (text == NULL)
                    127:                    {
                    128:                        if ((text = malloc(3 * sizeof(char))) == NULL)
                    129:                        {
                    130:                            exit(EXIT_FAILURE);
                    131:                        }
                    132: 
                    133:                        text[0] = (*ptr);
                    134:                        text[1] = (*(ptr + 1));
                    135:                        text[2] = 0;
                    136:                    }
                    137:                    else
                    138:                    {
                    139:                        if ((text = realloc(text, (strlen(text) + 3) *
                    140:                                sizeof(char))) == NULL)
                    141:                        {
                    142:                            exit(EXIT_FAILURE);
                    143:                        }
                    144: 
                    145:                        ptr2 = &text[strlen(text)];
                    146:                        (*ptr2++) = (*ptr);
                    147:                        (*ptr2++) = (*(ptr + 1));
                    148:                        (*ptr2++) = 0;
                    149:                    }
                    150: 
                    151:                    niveau--;
                    152:                    ptr += 2;
                    153:                }
                    154:            }
                    155:            else if ((*ptr) == '/')
                    156:            {
                    157:                if ((*(ptr + 1)) == '/')
                    158:                {
                    159:                    while(((*ptr) != '\n') && ((*ptr) != 0))
                    160:                    {
                    161:                        ptr++;
                    162:                    }
                    163:                }
                    164:                else if ((*(ptr + 1)) == '*')
                    165:                {
                    166:                    ptr += 2;
                    167: 
                    168:                    for(;;)
                    169:                    {
                    170:                        while(((*ptr) != '*') && ((*ptr) != 0))
                    171:                        {
                    172:                            if ((*ptr) == '\n')
                    173:                            {
                    174:                                ligne++;
                    175:                            }
                    176: 
                    177:                            ptr++;
                    178:                        }
                    179: 
                    180:                        if ((*ptr) == 0)
                    181:                        {
                    182:                            break;
                    183:                        }
                    184: 
                    185:                        if ((*(ptr + 1) == '/'))
                    186:                        {
                    187:                            ptr += 2;
                    188:                            break;
                    189:                        }
                    190: 
                    191:                        ptr++;
                    192:                    }
                    193:                }
                    194:            }
                    195:        }
                    196: 
                    197:        if (niveau == 0)
                    198:        {
                    199:            if (nom == NULL)
                    200:            {
                    201:                if ((nom = malloc(2 * sizeof(char))) == NULL)
                    202:                {
                    203:                    exit(EXIT_FAILURE);
                    204:                }
                    205: 
                    206:                nom[0] = (*ptr);
                    207:                nom[1] = 0;
                    208:            }
                    209:            else
                    210:            {
                    211:                if ((nom = realloc(nom, (strlen(nom) + 2) * sizeof(char)))
                    212:                        == NULL)
                    213:                {
                    214:                    exit(EXIT_FAILURE);
                    215:                }
                    216: 
                    217:                ptr2 = &nom[strlen(nom)];
                    218:                (*ptr2++) = (*ptr);
                    219:                (*ptr2++) = 0;
                    220:            }
                    221:        }
                    222: 
                    223:        if (text == NULL)
                    224:        {
                    225:            if ((text = malloc(2 * sizeof(char))) == NULL)
                    226:            {
                    227:                exit(EXIT_FAILURE);
                    228:            }
                    229: 
                    230:            text[0] = (*ptr);
                    231:            text[1] = 0;
                    232:        }
                    233:        else
                    234:        {
                    235:            if ((text = realloc(text, (strlen(text) + 2) * sizeof(char)))
                    236:                    == NULL)
                    237:            {
                    238:                exit(EXIT_FAILURE);
                    239:            }
                    240: 
                    241:            text[strlen(text) + 1] = 0;
                    242:            text[strlen(text)] = (*ptr);
                    243:        }
                    244: 
                    245:        if ((*ptr) == '\n')
                    246:        {
                    247:            ptr2 = nom;
                    248:            ligne_valide = 0;
                    249: 
                    250:            if (nom != NULL)
                    251:            {
                    252:                while((*ptr2) != 0)
                    253:                {
                    254:                    if (((*ptr2) != ' ') && ((*ptr2) != '\n'))
                    255:                    {
                    256:                        ligne_valide = -1;
                    257:                    }
                    258: 
                    259:                    ptr2++;
                    260:                }
                    261:            }
                    262: 
                    263:            if (ligne_valide == -1)
                    264:            {
                    265:                if (nom[strlen(nom) - 1] == '\n')
                    266:                {
                    267:                    nom[strlen(nom) - 1] = 0;
                    268:                }
                    269: 
                    270:                if (text[strlen(text) - 1] == '\n')
                    271:                {
                    272:                    text[strlen(text) - 1] = 0;
                    273:                }
                    274: 
                    275:                if ((*nb_lignes) == 0)
                    276:                {
                    277:                    if ((tab = malloc(sizeof(char **))) == NULL)
                    278:                    {
                    279:                        exit(EXIT_FAILURE);
                    280:                    }
                    281: 
                    282:                    if ((tab[0] = malloc(3 * sizeof(char *))) == NULL)
                    283:                    {
                    284:                        exit(EXIT_FAILURE);
                    285:                    }
                    286: 
                    287:                    if ((tab[0][0] = malloc((strlen(nom) + 1) * sizeof(char)))
                    288:                            == NULL)
                    289:                    {
                    290:                        exit(EXIT_FAILURE);
                    291:                    }
                    292: 
                    293:                    strcpy(tab[0][0], nom);
                    294: 
                    295:                    if ((tab[0][1] = malloc((strlen(nom_fichier) + 1) *
                    296:                            sizeof(char))) == NULL)
                    297:                    {
                    298:                        exit(EXIT_FAILURE);
                    299:                    }
                    300: 
                    301:                    strcpy(tab[0][1], nom_fichier);
                    302: 
                    303:                    if ((tab[0][2] = malloc((strlen(text) + 1) * sizeof(char)))
                    304:                            == NULL)
                    305:                    {
                    306:                        exit(EXIT_FAILURE);
                    307:                    }
                    308: 
                    309:                    strcpy(tab[0][2], text);
                    310:                }
                    311:                else
                    312:                {
                    313:                    if ((tab = realloc(tab, ((*nb_lignes) + 1) *
                    314:                            sizeof(char **))) == NULL)
                    315:                    {
                    316:                        exit(EXIT_FAILURE);
                    317:                    }
                    318: 
                    319:                    if ((tab[(*nb_lignes)] = malloc(3 * sizeof(char *)))
                    320:                            == NULL)
                    321:                    {
                    322:                        exit(EXIT_FAILURE);
                    323:                    }
                    324: 
                    325:                    if ((tab[(*nb_lignes)][0] = malloc((strlen(nom) + 1) *
                    326:                            sizeof(char))) == NULL)
                    327:                    {
                    328:                        exit(EXIT_FAILURE);
                    329:                    }
                    330: 
                    331:                    strcpy(tab[(*nb_lignes)][0], nom);
                    332: 
                    333:                    if ((tab[(*nb_lignes)][1] =
                    334:                            malloc((strlen(nom_fichier) + 1) *
                    335:                            sizeof(char))) == NULL)
                    336:                    {
                    337:                        exit(EXIT_FAILURE);
                    338:                    }
                    339: 
                    340:                    strcpy(tab[(*nb_lignes)][1], nom_fichier);
                    341: 
                    342:                    if ((tab[(*nb_lignes)][2] = malloc((strlen(text) + 1) *
                    343:                            sizeof(char))) == NULL)
                    344:                    {
                    345:                        exit(EXIT_FAILURE);
                    346:                    }
                    347: 
                    348:                    strcpy(tab[(*nb_lignes)][2], text);
                    349:                }
                    350: 
                    351:                (*nb_lignes)++;
                    352:            }
                    353: 
                    354:            ligne++;
                    355:            free(text);
                    356:            free(nom);
                    357:            text = NULL;
                    358:            nom = NULL;
                    359:        }
                    360: 
                    361:        ptr++;
                    362:    }
                    363: 
                    364:    free(text);
                    365:    free(chaine);
                    366: 
                    367:    fclose(fichier);
                    368: 
                    369:    return(tab);
                    370: }
                    371: 
                    372: int
                    373: main(int argc, char *argv[])
                    374: {
                    375:    char        ***tab;
                    376: 
                    377:    FILE        *tags;
                    378: 
                    379:    int         drapeau_desordre;
                    380:    int         i;
                    381:    int         j;
                    382:    int         nb_lignes;
                    383:    int         p;
                    384: 
                    385:    void        *tmp;
                    386: 
                    387:    if (argc == 1)
                    388:    {
                    389:        printf("No file specified\n");
                    390:        return(EXIT_FAILURE);
                    391:    }
                    392:    else
                    393:    {
                    394:        p = 1;
                    395:        argc--;
                    396: 
                    397:        tab = NULL;
                    398:        nb_lignes = 0;
                    399: 
                    400:        while(argc > 0)
                    401:        {
                    402:            tab = traitement(argv[p], tab, &nb_lignes);
                    403:            argc--;
                    404:            p++;
                    405:        }
                    406: 
                    407:        if ((tags = fopen("tags", "w+")) == NULL)
                    408:        {
                    409:            return(EXIT_FAILURE);
                    410:        }
                    411: 
                    412:        i = 0;
                    413:        j = 0;
                    414:        drapeau_desordre = -1;
                    415: 
                    416:        for(i = 0; (i < nb_lignes) && drapeau_desordre; i++)
                    417:        {
                    418:            drapeau_desordre = 0;
                    419:            for(j = 1; j < nb_lignes - i; j++)
                    420:            {
                    421:                if (strcmp(tab[j][0], tab[j - 1][0]) < 0)
                    422:                {
                    423:                    tmp = tab[j - 1];
                    424:                    tab[j - 1] = tab[j];
                    425:                    tab[j] = tmp;
                    426: 
                    427:                    drapeau_desordre = -1;
                    428:                }
                    429:            }
                    430:        }
                    431: 
                    432:        for(i = 0; i < nb_lignes; i++)
                    433:        {
                    434:            for(j = 0; j < strlen(tab[i][0]); j++)
                    435:                if (tab[i][0][j] == ' ') tab[i][0][j] = 0;
                    436:            for(j = 0; j < strlen(tab[i][1]); j++)
                    437:                if (tab[i][1][j] == ' ') tab[i][1][j] = 0;
                    438:            for(j = 0; j < strlen(tab[i][0]); j++)
                    439:                if (tab[i][2][j] == ' ') tab[i][2][j] = 0;
                    440: 
                    441:            fprintf(tags, "%s\t%s\t/^%s/;\n", tab[i][0], tab[i][1], tab[i][2]);
                    442:        }
                    443: 
                    444:        fclose(tags);
                    445: 
                    446:        for(i = 0; i < nb_lignes; i++)
                    447:        {
                    448:            free(tab[i][0]);
                    449:            free(tab[i][1]);
                    450:            free(tab[i][2]);
                    451:            free(tab[i]);
                    452:        }
                    453: 
                    454:        free(tab);
                    455:    }
                    456: 
                    457:    return(EXIT_SUCCESS);
                    458: }

CVSweb interface <joel.bertrand@systella.fr>