[cdev] исправление find
Grigoriy A. Sitkarev
sitkarev на komitex.ru
Вт Мар 16 20:33:51 MSK 2010
Много замечаний конечно.
Пока что самые основные, всё остальное я думаю вы сами увидите и
исправите после того как начнёт более-менее работать ваша программа.
1. После скобок, завершающих тело функции, точку с запятой не надо
ставить. Она там лишняя.
Аргументы функции должны быть разделены пробелами. Пробелы должны быть и
после операторов +,-,=,!=,== и т.д. Вы посмотрите ещё раз LKCS, там
много примеров, всё же понятно должно быть. Секция 3.1 как раз говорит
про пробелы.
2. Имена в верхнем регистре принято использовать для макросов,
переменных с такими именами желательно избегать.
3. Функцию xstrcpy надо убрать и заменить на xstrdup тогда. Что-то в
таком духе должно быть, проверите как работает.
char *
xstrdup(const char *str)
{
char *rs;
size_t len;
len = strlen(str);
rs = malloc(len+1);
if (rs == NULL) {
fprintf(stderr, "xstrdup: out of memory\n");
exit(1);
}
memcpy(rs, str, len);
rs[len] = 0;
return rs;
}
4. Вы не понимаете смысла модификатора extern. Он нужен если переменная,
которую вы хотите использовать, объявлена в другом файле. В вашем случае
его использовать не нужно. Перечитайте пожалуйста в литературе по языку
Си про extern подробнее.
5. С getcwd(3) думаю можно обойтись так. Вам это проверить тоже надо.
char *
xgetcwd(void)
{
#define CWD_GROW_UP 32
size_t len;
char *rs, *s;
len = 0;
do {
rs = realloc(rs, len+CWD_GROW_UP);
if (rs == NULL) {
fprintf(stderr, "xgetcwd: out of memory\n");
exit(1);
}
len += CWD_GROW_UP;
s = getcwd(rs, len);
} while ((s == NULL) && (errno == ERANGE));
if (s == NULL) {
fprintf(stderr, "xgetcwd: can't get current dir: %s\n",
strerror(errno));
exit(1);
}
return rs;
}
6. Вам надо сделать конечно чтобы в нескольких каталогах можно было
делать поиск и -exec бы надо приделать тоже. Начните с первого пока.
Кроме того, шаблон, по которому задаётся поиск, это аргумент операнда
-name. У вас его вообще нет.
7. Почему вы решили что именно lstat(2) тормозит?
8. По поводу проверки ошибок системных вызовов, в каждой man-странице к
системному вызову есть секция ERRORS. При ошибке системные вызова
возвращают -1 и устанавливают переменную errno. Прочтите errno(3) и
strerror(3) также.
Как обрабатывать ошибку, зависит от контекста. Если ошибка фатальная и
вы ничего не можете сделать, то программу надо завершать. Если ошибка не
фатальная, то как правило, алгоритм должен предусматривать её обработку
каким то образом. Как это делать - зависит от ситуации.
Что-то ещё вспомню - напишу.
lenad89 пишет:
> Вот код.
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> cdev mailing list
> cdev на wiki.syktsu.ru
> http://wiki.syktsu.ru/cgi-bin/mailman/listinfo/cdev
Подробная информация о списке рассылки cdev