Package: libdjvulibre15
Version: 3.5.20-3
Severity: important
Due to an unfortunate upstream change[1], the ddjvu_document_save function is
badly broken.
The attached program used to work fine with DjVuLibre 3.5.20-2.
$ gcc djvusave.c -ldjvulibre -o save_bundled
$ gcc djvusave.c -DINDIRECT -ldjvulibre -o save_indirect
$ ./save_bundled /usr/share/doc/libdjvulibre-dev/djvu2spec.djvu
0%
97%
100%
$ wc -c tmp.djvu
0 tmp.djvu
$ ./save_indirect /usr/share/doc/libdjvulibre-dev/djvu2spec.djvu
0%
97%
<lots-of-garbage>
terminate called after throwing an instance of 'DJVU::GException'
<even-more-garbage>
The bug has been already fixed upstream. [2]
[1]
http://djvu.cvs.sourceforge.net/djvu/djvulibre-3.5/libdjvu/ddjvuapi.cpp?r1=1.86&r2=1.87
[2]
http://djvu.cvs.sourceforge.net/djvu/djvulibre-3.5/libdjvu/ddjvuapi.cpp?r1=1.87&r2=1.88
-- System Information:
Debian Release: lenny/sid
APT prefers testing
APT policy: (900, 'testing'), (600, 'unstable'), (500, 'experimental')
Architecture: i386 (i686)
Kernel: Linux 2.6.22-3-686 (SMP w/1 CPU core)
Locale: LANG=C, LC_CTYPE=pl_PL (charmap=ISO-8859-2)
Shell: /bin/sh linked to /bin/dash
Versions of packages libdjvulibre15 depends on:
ii libc6 2.7-6 GNU C Library: Shared libraries
ii libgcc1 1:4.3-20080202-1 GCC support library
ii libjpeg62 6b-14 The Independent JPEG Group's JPEG
ii libstdc++6 4.3-20080202-1 The GNU Standard C++ Library v3
ii xdg-utils 1.0.2-3 desktop integration utilities from
libdjvulibre15 recommends no packages.
-- debconf-show failed
--
Jakub Wilk
#include <libdjvu/ddjvuapi.h>
void handle_messages(ddjvu_context_t *ctx, int wait)
{
const ddjvu_message_t *msg;
if (wait)
ddjvu_message_wait(ctx);
while ((msg = ddjvu_message_peek(ctx)))
{
switch (msg->m_any.tag)
{
case DDJVU_ERROR:
fprintf(stderr, "DDJVU_ERROR: %s\n", msg->m_error.message);
exit(4);
case DDJVU_PROGRESS:
fprintf(stderr, "%3d%%\n", msg->m_progress.percent);
}
ddjvu_message_pop(ctx);
}
}
int die(const char *message)
{
fprintf(stderr, "%s\n", message);
return 1;
}
int main(int argc, char * const argv[])
{
ddjvu_context_t *ctx;
ddjvu_document_t *doc;
ddjvu_status_t r;
ddjvu_pageinfo_t info;
ddjvu_job_t *job;
const char* optv[] = { "-indirect=/tmp/index.djvu" };
FILE * f;
f = fopen("/tmp/index.djvu", "w");
if (argc != 2)
return die("Usage: ddjvu <djvu-file>");
if (!(ctx = ddjvu_context_create(argv[0])))
return die("Cannot create djvu context.");
if (!(doc = ddjvu_document_create_by_filename(ctx, argv[1], 1)))
return die("Cannot open djvu document.");
while (!ddjvu_document_decoding_done(doc))
handle_messages(ctx, 1);
#ifdef INDIRECT
job = ddjvu_document_save(doc, NULL, 1, optv);
#else
{
FILE* f;
f = fopen("tmp.djvu", "wb");
job = ddjvu_document_save(doc, f, 0, optv);
}
#endif
if (!job)
return die("Cannot create job.");
while (!ddjvu_job_done(job))
handle_messages(ctx, 1);
handle_messages(ctx, 0);
return 0;
}