Я люблю какао. Часть 4. Си

14 views
Skip to first unread message

Dmitry Chestnykh

unread,
Jul 30, 2008, 12:33:54 PM7/30/08
to sellm...@googlegroups.com
Я люблю Objective-C, потому что это
надстройка над Си, а значит мы можем
забить на ObjC и писать в Си, если нужно. А
Си, как известно, рулит. Круче Си --
только Visual Basic 6.

Например, пишем код для архивирования
файлы в ZIP. Нужно отсеять расширения
уже сжатых файлов, для которых
применять нулевую компрессию (то есть,
вообще не сжимать такие файлы).

Можно, конечно, использовать NSString
lastPathExtension. Потом сравнивать полученное
расширение в куче if (бууу) или искать их
в заранее подготовленном массиве
(массив надо готовить -- бууу). Но смысл
отсеивания файлов по расширению в
ускорении зиповки... так почему же нам
не ускорить отсев?

const char *ZIP_RAW_EXTENTIONS = ".png|.zip|.gz|.mpg|.mov|.rar|";
inline static BOOL no_compression_file_ext(const char *filename)
{
char *ext = strrchr(filename, '.');
if (ext != NULL) {
char *ep = strstr(ZIP_RAW_EXTENTIONS, ext);
if (ep != NULL && *(ep+strlen(ext)) == '|')
return YES;
}
return NO;
}

Красиво и мало строчек кода. Код для
зипа работает с char *, поэтому эта
функция вызывается просто. Если же
нужна NSString, тогда делаем [NSString UTF8String].

* * *

Gnomики начнут говорить про то, что у них
вообще весь GUI можно написать на Си.
Круто? Не круто, а отстойно: GUI приятнее
писать на нормальном объекто-
ориентированном языке (C++ в эту
категорию, кстати, не входит).

P.S. ext != NULL? Почему не ext? Мне так хочется.
Если есть вопросы по
производительности, идите в cc -S.

- Дмитрий Честных.

Dmitry Chestnykh

unread,
Jul 30, 2008, 12:51:59 PM7/30/08
to sellme-dev
> Можно, конечно, использовать NSString
> lastPathExtension. Потом сравнивать полученное

1) Опечатка: не lastPathExtension, а pathExtension.

2) Опять эти Google Groups неправильно слова перенесли! Гррр.

- Дмитрий Честных.

Inviz

unread,
Jul 30, 2008, 1:58:44 PM7/30/08
to sellme-dev


> const char *ZIP_RAW_EXTENTIONS = ".png|.zip|.gz|.mpg|.mov|.rar|";
> inline static BOOL no_compression_file_ext(const char *filename)
> {
>         char *ext = strrchr(filename, '.');
>         if (ext != NULL) {
>                 char *ep = strstr(ZIP_RAW_EXTENTIONS, ext);
>                 if (ep != NULL && *(ep+strlen(ext)) == '|')
>                         return YES;
>         }
>         return NO;
>
> }

Мило. В следующей статье мы откроем сортировку пузырьком? А там и до
регекспов доберемся?

Ни в коем случае, Дмитрий, не подумайте, что я имею что-то против вас
или Objective C, но ваш пример совершенно не показателен.
Единственное, что он говорит новичку вроде меня об objC, это то, что в
нём сложно сложнее сделать обычный массив со строками, чем жестокий
"выкус" строки и хардкод экстеншенов в пайп-сепарейтед леденящий душу
П-ц.

Если вы избрали путь адвоката objC, то относитесь посерьезнее к
подбору примеров.

Начинание ваше уважаю, потому что уж лучше это, чем rubyCocoa.

Dmitry Chestnykh

unread,
Jul 30, 2008, 4:07:55 PM7/30/08
to sellme-dev
> Ни в коем случае, Дмитрий, не подумайте, что я имею что-то против вас
> или Objective C, но ваш пример совершенно не показателен.
> Единственное, что он говорит новичку вроде меня об objC, это то, что в
> нём сложно сложнее сделать обычный массив со строками, чем жестокий
> "выкус" строки и хардкод экстеншенов в пайп-сепарейтед леденящий душу
> П-ц.

Я показал, что в нем можно "спуститься" до использования простого Си,
когда надо, или когда хочется.

- Дмитрий Честных.

Inviz

unread,
Jul 30, 2008, 5:04:33 PM7/30/08
to sellme-dev
Отлично. А для того, чтобы узнать, что можно есть руками, а не
столовыми приборами, когда надо, или когда хочется, я тоже должен
прочитать статью?

Dmitry Chestnykh

unread,
Jul 30, 2008, 5:28:31 PM7/30/08
to sellme-dev
Зачем меня обвинять в том, что я говорю то, что вам известно -- я же
не могу выкачать ваш мозг и перед каждым постом проверять, известно
вам это или нет?

Тема закрыта.

- Дмитрий Честных.
Reply all
Reply to author
Forward
0 new messages