Annotation of rpl/rpltags/rpltags.c, revision 1.1
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>