fileinfo.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <stdlib.h>
  2. #include <string.h>
  3. #include <libgen.h>
  4. #include "fileinfo.h"
  5. #define FAILURE 0
  6. #define SUCCESS 1
  7. static int initializeFullname(struct fileInfo *info, const char *filePath) {
  8. info->fullnameLength = strlen(filePath);
  9. info->fullname = malloc(info->fullnameLength+1);
  10. if (!info->fullname) return FAILURE;
  11. strcpy(info->fullname, filePath);
  12. return SUCCESS;
  13. }
  14. static int initializeBasename(struct fileInfo *info) {
  15. char *base = basename(info->fullname);
  16. info->basenameLength = strlen(base);
  17. info->_base = malloc(info->basenameLength+1);
  18. if (!info->_base) return FAILURE;
  19. strcpy(info->_base, base);
  20. return SUCCESS;
  21. }
  22. static int initializeExt(struct fileInfo *info) {
  23. char *baseCopy = malloc(info->basenameLength+1);
  24. if (!baseCopy) return FAILURE;
  25. strcpy(baseCopy, info->_base);
  26. char *dot = strrchr(baseCopy, '.');
  27. if (!dot) {
  28. free(baseCopy);
  29. return FAILURE;
  30. }
  31. dot[0] = '\0';
  32. info->nameLength = strlen(baseCopy);
  33. info->name = malloc(info->nameLength+1);
  34. if (!info->name) {
  35. free(baseCopy);
  36. return FAILURE;
  37. }
  38. strcpy(info->name, baseCopy);
  39. info->ext = malloc(strlen(dot+1)+1);
  40. if (!info->ext) {
  41. free(baseCopy);
  42. return FAILURE;
  43. }
  44. strcpy(info->ext, dot+1);
  45. free(baseCopy);
  46. return SUCCESS;
  47. }
  48. struct fileInfo* newFileInfo(const char *filePath) {
  49. if (!strrchr(filePath, '.')) return NULL;
  50. struct fileInfo *info = malloc(sizeof(struct fileInfo));
  51. if (!info) return NULL;
  52. if (!initializeFullname(info, filePath)) return NULL;
  53. if (!initializeBasename(info)) return NULL;
  54. if (initializeExt(info)) return info;
  55. freeFileInfo(info);
  56. return NULL;
  57. }
  58. void freeFileInfo(struct fileInfo *info) {
  59. free(info->fullname);
  60. free(info->_base);
  61. free(info->name);
  62. free(info->ext);
  63. free(info);
  64. }