Няшная / Говнокод #11280 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
int print_entry(const char* name, const char* dir,const struct stat* st)
{
  if(!S_ISDIR(st->st_mode)){
      if(S_ISREG(st->st_mode)){
        printf("<file type=\"regular file\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
      };
      if(S_ISCHR(st->st_mode)){
        printf("<file type=\"charcter device\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
      }
      if(S_ISBLK(st->st_mode)){
        printf("<file type=\"block device\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
      }
      if(S_ISFIFO(st->st_mode)){
        printf("<file type=\"FIFO(named pipe)\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
      }
      if(S_ISLNK(st->st_mode)){
         char *linkname;
         ssize_t r;
         char *lname=strcat(dir,"");
         linkname =  new char[st->st_size + 1];
         if (linkname == NULL) {
            fprintf(stderr, "insufficient memory\n");
            exit(EXIT_FAILURE);
         }
        r=readlink(lname, linkname, st->st_size + 1);
        if (r < 0) {
          return 0;
        }
           if (r > st->st_size) {
        fprintf(stderr, "symlink increased in size "
                        "between lstat() and readlink()\n");
        exit(EXIT_FAILURE);
    }

        linkname[st->st_size] = '\0';
        printf("<file type=\"symbolic link\" owner=\"%d\" group=\"%d\" linkname=\"%s\">%s/%s</file>\n",st->st_uid,st->st_gid,linkname,dir,name);
      }
      if(S_ISSOCK(st->st_mode)){
        printf("<file type=\"socket\" owner=\"%d\" group=\"%d\">%s/%s</file>\n",st->st_uid,st->st_gid,dir,name);
      }
    }
    return 0;
}
 
int main(int argc, char* argv[])
{
if(argc != 2)
    {
    fprintf(stderr, "Usage: %s DIR\n", argv[0]);
    exit(1);
    }
    printf("<dir name=\"%s\">\n",argv[1]);
    walk(argv[1], print_entry, 1,0);
    printf("</dir>",argv[1]);
}

Создание xml файла всех директорий, поддиректорий и их файлов

Запостил: AliceGoth AliceGoth, (Updated )

Комментарии (23) RSS

  • };
    Автор тот же?

    linkname = new char[st->st_size + 1]; - какой ещё С?
    int main без return - халтура какая-то.

    Вот уж не думал что файл может одновременно быть:
    regular file, charcter device, block device, FIFO(named pipe).
    Ответить
  • AliceGoth - какой то препод, хвалящийся работами студентоты по теме "обработка xml на C"?
    Ответить
    • Это просто пиздец какой-то а не код. Ворнинги читать религия не позволяет?
      1.cpp:29:5: ошибка: слишком много аргументов для форматирования [-Werror=format-extra-args]
      1.cpp:33:5: ошибка: слишком много аргументов для форматирования [-Werror=format-extra-args]
      1.cpp:43:31: ошибка: некорректное преобразование из «const char*» в «char*» [-fpermissive]
      ...
      Ответить
    • Итак, разбор кода и советы:

      1) Надо бы выбрать какой-либо приличный стиль форматирования кода и придерживаться его.
      2) Если мы пишем на С - то new и delete в нем нет, а есть malloc и free.
      3) Всегда компилим код как минимум с -Wall и -Wextra. Они ничего плохого не сделают, а кучу глупых ошибок помогут устранить.
      4) return используем в void функциях, return <значение> в остальных (строка 86).
      5) strcat портит свой первый аргумент (строка 43) поэтому внимательно читаем man strcat и переделываем как положено.
      6) У xml в первой строке желательно поставить декларацию с версией и кодировкой.
      Ответить
        • Еще в 29, 33, 87 строках лишние параметры у printf.
          Результат, возвращаемый walk, игнорируется.
          Ответить
        • Ну и если walk претендует на общность и использование в других проектах - надо бы выкинуть из него вывод <dir></dir> и продумать, как бы этот вывод реализовать в колбеке.
          Ответить
        • 1) Не смешивайте С и С++, это плохо для переваривания психикой
          Если плюсы, то std::cout, std::cin и иже с ними.
          2) linkname = NULL;
          Не нужно, скоуп решает.
          3) Посмотрите реализацию инициализации-проверки для ваших if'ов в JavaScript
          4) Единообразный стиль очень не помешает:
          - если exit(EXIT_FAILURE); - то уж везде exit(EXIT_FAILURE);
          - формат вывода ошибок

          И уже, в конце-то концов http://ftp.gnu.org/gnu/coreutils/ есть такое ls.c

          Обратите внимание на книгу «Linux программирование в примерах» А.Роббинс
          Ответить

Добавить комментарий

Помни, guest, за тобой могут следить!

    А не использовать ли нам bbcode?


    8