zlib - это просто!

аватар: cristobal-junta

Логотип библиотеки zlib. Изображение: http://en.wikipedia.org/wiki/Zlib Долго объяснять, зачем мне вдруг понадобилось использовать zlib, но применять ее оказалось на удивление просто. Потому только код:

/*
 * gcc main.c -Wall -Wextra -lz
 *
 * ZLib is simple!
 * http://andyceo.ruware.com/blog/cristobal-junta
 */

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <zlib.h>

#define N 1983

void Print_Return_Code(const char *fname, int res)
{
    assert(fname);

    printf("%s(): ", fname);

    switch (res)
    {
        case Z_OK:
            puts("Z_OK");
            break;
        case Z_MEM_ERROR:
            puts("Z_MEM_ERROR");
            exit(EXIT_FAILURE);
            break;
        case Z_BUF_ERROR:
            puts("Z_BUF_ERROR");
            exit(EXIT_FAILURE);
            break;
        default:
            puts("unrecognized return code");
            exit(EXIT_FAILURE);
            break;
    }
}

int main()
{
    unsigned long i;
    int res;

    int *src;
    unsigned long src_len = N * sizeof(src[0]);

    char *cmp;
    unsigned long cmp_len = compressBound(src_len);

    int *unc;
    unsigned long unc_len = src_len;

    printf("src_len: %lu\n", src_len);
    printf("Upper bound on cmp_len: %lu\n", cmp_len);

    src = malloc(src_len);
    assert(src != NULL);

    cmp = malloc(cmp_len);
    assert(cmp != NULL);

    unc = malloc(unc_len);
    assert(unc != NULL);

    for (i = 0; i < N; ++i)
        src[i] = i;

    res = compress(cmp, &cmp_len, (char *)src, src_len);
    Print_Return_Code("compress", res);

    printf("Actual cmp_len: %lu\n", cmp_len);
    printf("Compression ratio: %3.0f%%\n", 100.0 * cmp_len / (double)src_len);

    res = uncompress((char *)unc, &unc_len, cmp, cmp_len);
    Print_Return_Code("uncompress", res);

    if (unc_len != src_len)
    {
        puts("unc_len != src_len");
        return EXIT_FAILURE;
    }

    for (i = 0; i < N; ++i)
        if (unc[i] != src[i])
        {
            printf("unc[%lu] != src[%lu]\n", i, i);
            return EXIT_FAILURE;
        }

    puts("OK!");

    free(src);
    free(cmp);
    free(unc);

    return EXIT_SUCCESS;
}


syntax highlighted by Code2HTML, v. 0.9.1

Комментарии

аватар: andyceo

На PHP Zlib ещё

На PHP Zlib ещё проще :)

  $data = implode("", file("bigfile.txt"));
  $gzdata = gzencode($data, 9);
  $fp = fopen("bigfile.txt.gz", "w");
  fwrite($fp, $gzdata);
  fclose($fp);

Взято с описания функции PHP gzencode.

Кстати, ты можешь пользоваться тегом

<blockcode lang="cpp">
//Your
//piece of
//code
</blockcode>

lang="cpp" означает расцвечивать как C++, может быть равен c для простого C, php, drupal5, drupal6, css, delphi, html4strict, ini, java, javascript, mysql, pascal, python, ruby, sql, xml - думаю здесь всё понятно, smarty - язык шаблонов Smarty. Потому что у меня установлен замечательнейший модуль GeSHi Filter for syntax highlighting

Admin is here.

PS: если уберёшь прямую ссылку на zlib, вытащу на главную :)

аватар: cristobal-junta

Если бы я хотел

Если бы я хотел на главную, ссылку бы не ставил :-) Извини, мне просто нужно было сохранить код в надежном месте. Я сотворил пост и тут же отправил его в delicious.

Php на Blue Gene не за работает, потому неактуально, но, тем не менее, спасибо.

Этот фильтр я на hpc@cmc тоже поставил. Странно, что я не заметил, что он у тебя есть...
Кстати, не знаешь, как для Друпал подключить подсветку для Фортрана. В исходной библиотеке она есть, а в Друпал-версии такого значения параметра не предлагается...

аватар: andyceo

Хм. В Drupal-версии

Хм. В Drupal-версии этой библиотеки походу много ещё чего нет. Например нет языка Scilab (хотя есть Matlab), в оригинале он заявлен. Как включить - не знаю, но наверное тоже буду узнавать об этом, т.к. нужно для проекта - я сейчас работаю над одним проектом, тоже можно сказать по заданию кафедры (но добровольно) - над сайтом http://scilab.su/, который будет посвящён Scilab. Она становится популярной, а работ по ней русскоязычных маловато. Может быть удастся сформировать и русскоязычное сообщество. Ярушкина Н.Г. (мой научник) сейчас переписывает какие-то методички под неё. Раньше они были написаны под Matlab (помнишь сам, наверное, как сдавали нечёткую логику на Матлабе).

Так что если ты узнаешь раньше меня, сообщи... Если раньше я узнаю, то я сообщу. Здесь. А если никто не напишет, то никто и не искал значит :)

Admin is here.

аватар: cristobal-junta

При мне не

При мне не сдавали.

Да-да, Scilab набирает популярность. Но я по привычке все еще пользуюсь Matlab'ом. Даже собираюсь купить студенческую лицензию!

аватар: andyceo

Поддержка Fortran and Scilab

Кстати, не знаешь, как для Друпал подключить подсветку для Фортрана. В исходной библиотеке она есть, а в Друпал-версии такого значения параметра не предлагается...

Может, ты и сам разобрался уже, но я всё же напишу, ибо сделал это только что. Дело в том, что у нас с тобой, видимо, была немного устаревшая версия самой библиотеки GeSHi - 1.0.8 (у меня стояла именно эта версия), тогда как:

The latest stable version of GeSHi is 1.0.8.1, released on the 31th of October, 2008.

По крайней мере, на сегодня это так. Там тебе и Fortran, и Scilab и, по-моему, ещё около 5 новых языков добавлено.

Подсветку для языков Фортран и Сайлаб я включил на этом сайте.

PS: Когда зальёшь обновлённую библиотеку, и зайдёшь на страницу всех языков (admin/settings/geshifilter/languages/all), не забудь нажать на ссылочку "Flush cache of available languages". :)

Admin is here.

аватар: cristobal-junta

geshi & fortran

О! спасибо!
Я не знал про ссылку geshifilter/languages/all
Обновил geshi, зашел на страницу, где у меня был ма-а-аленький фортрановский код, а он уже подсвечен! (выходит, что я заранее прописал там правильное значение для тэга) :-)

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can use the <go> tags just like the <a> for nicer urls.
  • Доступны HTML теги: <a> <img> <noindex> <br> <em> <i> <strong> <b> <strike> <s> <u> <sup> <sub> <h1> <h2> <h3> <h4> <h5> <h6> <cite> <blockquote> <abbr> <code> <ul> <ol> <li> <dl> <dt> <dd> <p> <div> <span> <hr>
  • Строки и параграфы переносятся автоматически.
  • You can enable syntax highlighting of source code with the following tags: <blockcode>. The supported tag styles are: <foo>, [foo]. PHP source code can also be enclosed in <?php ... ?> or <% ... %>.

Подробнее о форматировании

CAPTCHA
Введите, пожалуйста, код, который Вы видите на картинке. Показ изображений в браузере должен быть включен.
CAPTCHA на основе изображений
Введите символы, которые показаны на картинке.
Добавьте страницу в закладки. Перейти к верху страницы
RSS-материал