[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [pdf-devel] Patch for RL filter and more
From: |
gerel |
Subject: |
Re: [pdf-devel] Patch for RL filter and more |
Date: |
Sat, 27 Sep 2008 15:37:22 -0700 (PDT) |
Well, here is the patch for the RL filter only. Also did the modifications you
asked.
cheers
##
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: address@hidden
# target_branch: file:///home/gerel/PROJECTS/libgnupdf/trunk/
# testament_sha1: 025fdf597ba9e45dc22c6a73bd70142be9fa44ef
# timestamp: 2008-09-27 19:28:49 -0300
# base_revision_id: address@hidden
#
# Begin patch
=== modified file 'ChangeLog'
--- ChangeLog 2008-09-26 22:52:29 +0000
+++ ChangeLog 2008-09-27 22:28:27 +0000
@@ -1,3 +1,22 @@
+2008-09-27 Gerardo E. Gidoni <address@hidden>
+
+ * src/Makefile.am: added the RunLength filter.
+
+ * src/base/pdf-stm-f-rl.c: adapted to the new API.
+
+ * src/base/pdf-stm-f-rl.h: adapted to the new API.
+
+ * src/base/pdf-stm-filter.c: added the RunLength filter.
+
+ * src/base/pdf-stm-filter.h: added the RunLength filter.
+
+ * torture/unit/base/stm/pdf-stm-read.c: added decoder filter test.
+
+ * torture/unit/base/stm/pdf-stm-write.c: added encoder filter test.
+
+ * doc/gnupdf-tsd.texi: added filter tests and missing
+ pdf_stm_write() test specification.
+
2008-09-27 Jose E. Marchesi <address@hidden>
* src/base/pdf-stm-f-ahex.c (pdf_stm_f_ahexdec_apply): Fix the
=== modified file 'doc/gnupdf-tsd.texi'
--- doc/gnupdf-tsd.texi 2008-09-22 02:23:04 +0000
+++ doc/gnupdf-tsd.texi 2008-09-27 22:28:27 +0000
@@ -240,6 +240,15 @@
@end table
@end deffn
address@hidden Test pdf_stm_read_005
+Create a memory-based reading stream and attach a RunLength filter
+decoder to it.
address@hidden @strong
address@hidden Success condition
+The decoded data should be correct.
address@hidden table
address@hidden deffn
+
@node pdf_stm_read_char
@subsubsection pdf_stm_read_char
@@ -341,6 +350,24 @@
@end table
@end deffn
address@hidden Test pdf_stm_write_004
+Write some bytes to a write memory stream with an ASCII Hex encoder.
address@hidden @strong
address@hidden Success condition
+The written data should be consistent.
address@hidden table
address@hidden deffn
+
address@hidden Test pdf_stm_write_005
+Create a memory-based writing stream and attach a RunLength filter
+encoder to it.
address@hidden @strong
address@hidden Success condition
+The encoded data should be correct.
address@hidden table
address@hidden deffn
+
+
@node Text Module
@subsection Text Module
=== modified file 'src/Makefile.am'
--- src/Makefile.am 2008-09-22 21:39:19 +0000
+++ src/Makefile.am 2008-09-27 22:28:27 +0000
@@ -43,7 +43,8 @@
base/pdf-stm-buffer.c base/pdf-stm-buffer.h \
base/pdf-stm-filter.h base/pdf-stm-filter.c \
base/pdf-stm-f-null.h base/pdf-stm-f-null.c \
- base/pdf-stm-f-ahex.h base/pdf-stm-f-ahex.c
+ base/pdf-stm-f-ahex.h base/pdf-stm-f-ahex.c \
+ base/pdf-stm-f-rl.h base/pdf-stm-f-rl.c
# if ZLIB
# STM_MODULE_SOURCES += base/pdf-stm-f-flate.c base/pdf-stm-f-flate.h
=== modified file 'src/base/pdf-stm-f-rl.c'
--- src/base/pdf-stm-f-rl.c 2008-03-05 12:32:04 +0000
+++ src/base/pdf-stm-f-rl.c 2008-09-27 22:28:27 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/03/05 12:24:57 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-27 18:32:05 gerel"
*
* File: pdf-stm-f-rl.c
* Date: Sun Jul 15 22:01:18 2007
@@ -29,203 +29,272 @@
#include <pdf-alloc.h>
#include <pdf-stm-f-rl.h>
-static int pdf_stm_f_rl_encode (pdf_char_t *in, pdf_stm_pos_t in_size,
- pdf_char_t **out, pdf_stm_pos_t *out_size);
-static int pdf_stm_f_rl_decode (pdf_char_t *in, pdf_stm_pos_t in_size,
- pdf_char_t **out, pdf_stm_pos_t *out_size);
-
-int
-pdf_stm_f_rl_init (void **filter_data,
- void *conf_data)
-{
- pdf_stm_f_rl_data_t *data;
- pdf_stm_f_rl_conf_t conf;
-
- data = (pdf_stm_f_rl_data_t *) filter_data;
- conf = (pdf_stm_f_rl_conf_t) conf_data;
-
- /* Create the private data storage */
- *data =
- (pdf_stm_f_rl_data_t) pdf_alloc (sizeof(struct pdf_stm_f_rl_data_s));
- (*data)->mode = conf->mode;
-
- return PDF_OK;
-}
-
-int
-pdf_stm_f_rl_apply (void *filter_data,
- pdf_char_t *in, pdf_stm_pos_t in_size,
- pdf_char_t **out, pdf_stm_pos_t *out_size)
-{
- pdf_stm_f_rl_data_t data;
-
- data = (pdf_stm_f_rl_data_t) filter_data;
- switch (data->mode)
- {
- case PDF_STM_F_RL_MODE_ENCODE:
- {
- return pdf_stm_f_rl_encode (in, in_size, out, out_size);
-
- }
- case PDF_STM_F_RL_MODE_DECODE:
- {
- return pdf_stm_f_rl_decode (in, in_size, out, out_size);
- }
- default:
- {
- return PDF_ERROR;
- }
- }
-
- /* Not reached */
-}
-
-int
-pdf_stm_f_rl_dealloc (void **filter_data)
-{
- pdf_stm_f_rl_data_t *data;
-
- data = (pdf_stm_f_rl_data_t *) filter_data;
- pdf_dealloc (*data);
-
- return PDF_OK;
-}
-
-/* Private functions */
-
-static int
-pdf_stm_f_rl_encode (pdf_char_t *in,
- pdf_stm_pos_t in_size,
- pdf_char_t **out,
- pdf_stm_pos_t *out_size)
-{
- pdf_stm_pos_t in_pos;
- pdf_stm_pos_t out_pos;
- pdf_stm_pos_t run_length;
- pdf_char_t run_char;
- int run_p;
- pdf_char_t c;
-
- /* The compression achieved by run-length encoding depends on the
- input data. The worst case (the hexadecimal sequence `00'
- alternating with `FF') results in an expansion of 127:128
-
- But take care about the EOD marker (one octect). */
- *out_size = (in_size * 2) + (in_size / 127) + 1;
- *out = (pdf_char_t *) pdf_alloc (*out_size);
-
- out_pos = 0;
- run_length = 0;
- run_char = 0;
- run_p = PDF_FALSE;
- in_pos = 0;
- while (in_pos < in_size)
- {
- c = in[in_pos];
-
- if (!run_p)
- {
- run_char = c;
- run_p = PDF_TRUE;
- }
-
- if ((c == run_char) &&
- (run_length < 128))
- {
- run_length++;
- in_pos++;
- }
- else
- {
- (*out)[out_pos++] = run_length;
- (*out)[out_pos++] = run_char;
- run_length = 0;
- run_p = PDF_FALSE;
- }
- }
-
- /* Insert EOD marker */
- (*out)[out_pos++] = 128;
-
- *out_size = out_pos;
- *out = (pdf_char_t *) pdf_realloc (*out,
- *out_size);
-
- return PDF_OK;
-}
-
-static int
-pdf_stm_f_rl_decode (pdf_char_t *in,
- pdf_stm_pos_t in_size,
- pdf_char_t **out,
- pdf_stm_pos_t *out_size)
-{
- pdf_stm_pos_t in_pos;
- pdf_stm_pos_t out_pos;
- pdf_stm_pos_t run_length;
- pdf_stm_pos_t i;
- pdf_char_t c;
-
- /* In the best case (all zeros), a compression of approximately 64:1
- is achieved for long files. */
- *out_size = in_size * 64;
- *out = (pdf_char_t *) pdf_alloc (*out_size);
-
- out_pos = 0;
- in_pos = 0;
- while (in_pos < in_size)
- {
- c = in[in_pos];
-
- if (c == 128)
- {
- /* EOD marker */
+
+static int encode_rl_char (pdf_stm_f_rl_t st, pdf_stm_buffer_t out);
+static int decode_rl_char (pdf_stm_f_rl_t st, pdf_stm_buffer_t out);
+static int copy_next_bytes (pdf_stm_f_rl_t st, pdf_stm_buffer_t in,
+ pdf_stm_buffer_t out);
+
+
+pdf_status_t
+pdf_stm_f_rlenc_init (pdf_hash_t params, void **state)
+{
+ pdf_status_t ret;
+ pdf_stm_f_rl_t filter_state;
+
+ filter_state = pdf_alloc (sizeof (struct pdf_stm_f_rl_s));
+
+ if (state == NULL)
+ {
+ ret = PDF_EBADDATA;
+ }
+ else if (filter_state == NULL)
+ {
+ ret = PDF_ENOMEM;
+ }
+ else
+ {
+ /* Initialize fields */
+ filter_state->curchar = 0;
+ filter_state->rlchar = 0;
+ filter_state->run_p = PDF_FALSE;
+ filter_state->rl = -1;
+ filter_state->dec_p = PDF_FALSE;;
+ filter_state->dec_count = 0;
+ filter_state->enc_p = PDF_STM_F_RL_NONE;
+
+ *state = (void *) filter_state;
+ ret = PDF_OK;
+ }
+
+ return ret;
+}
+
+
+pdf_status_t
+pdf_stm_f_rldec_init (pdf_hash_t params, void **state)
+{
+ return pdf_stm_f_rlenc_init (params,state);
+}
+
+
+pdf_status_t
+pdf_stm_f_rlenc_apply (pdf_hash_t params, void * state, pdf_stm_buffer_t in,
+ pdf_stm_buffer_t out, pdf_bool_t finish_p)
+{
+ pdf_stm_f_rl_t st;
+
+ st = (pdf_stm_f_rl_t) state;
+
+ while (!pdf_stm_buffer_eob_p (in))
+ {
+ st->curchar = in->data[in->rp];
+
+ /* we're not encoding any character yet */
+ if (!st->run_p)
+ {
+ st->rlchar = st->curchar;
+ st->run_p = PDF_TRUE;
+ st->rl++;
+ in->rp++;
+ }
+ /* we're encoding some character now */
+ else if (st->curchar == st->rlchar && st->rl < 127)
+ {
+ st->rl++;
+ in->rp++;
+ }
+ /*
+ * the rl code is too long or the rl char is different,
+ * so we write what we encoded so far.
+ */
+ else
+ {
+ if (encode_rl_char (st, out) < 0)
+ {
+ return PDF_OK;
+ }
+ st->rl=-1;
+ st->run_p = PDF_FALSE;
+ }
+ }
+
+ /*
+ * we may have finished with some history, we save it if needed,
+ * then we add the EOD.
+ */
+ if (finish_p)
+ {
+ if (st->run_p)
+ {
+ if (encode_rl_char (st, out) < 0)
+ {
+ /* Should not be reached */
+ return PDF_ERROR;
+ }
+ st->rl=-1;
+ st->run_p = PDF_FALSE;
+ }
+ if (pdf_stm_buffer_full_p (out))
+ {
+ /* Should not be reached */
+ return PDF_ERROR;
+ }
+ /* Insert EOD marker */
+ out->data[out->wp++] = 128;
+ }
+
+ if (pdf_stm_buffer_eob_p (in))
+ {
+ return PDF_EEOF;
+ }
+ return PDF_OK;
+}
+
+
+pdf_status_t
+pdf_stm_f_rldec_apply (pdf_hash_t params, void *state, pdf_stm_buffer_t in,
+ pdf_stm_buffer_t out, pdf_bool_t finish_p)
+{
+ pdf_stm_f_rl_t st;
+ pdf_status_t copied;
+
+ st = (pdf_stm_f_rl_t) state;
+
+ while (!pdf_stm_buffer_eob_p (in))
+ {
+ st->curchar = in->data[in->rp];
+
+ /* we're not decoding any character yet */
+ if (!st->run_p)
+ {
+ st->rlchar = st->curchar;
+ st->run_p = PDF_TRUE;
+ in->rp++;
+ }
+ /* copy the following 1 to 128 bytes literally */
+ else if (st->rlchar < 128)
+ {
+ copied = copy_next_bytes (st, in, out);
+ if (copied < 0)
+ {
+ return PDF_OK;
+ }
+ else if (copied > 0)
+ {
+ return PDF_EEOF;
+ }
+ st->run_p = PDF_FALSE;
+ }
+ /* copy the next char 257 - length (2 to 128) times */
+ else if (st->rlchar > 128)
+ {
+ if (decode_rl_char (st, out) < 0)
+ {
+ return PDF_OK;
+ }
+ st->run_p = PDF_FALSE;
+ in->rp++;
+ }
+ /* EOD mark */
+ else
+ {
+ in->rp++;
break;
}
- if (c <= 127)
- {
- run_length = c;
- if ((in_pos + run_length) >= in_size)
- {
- /* Not enough input */
- goto error;
- }
-
- for (i = 0;
- i < c;
- i++)
- {
- (*out)[out_pos++] = in[in_pos + run_length];
- }
- in_pos = in_pos + run_length;
- }
- if (c >= 129)
- {
- run_length = c;
- if ((in_pos + 1) >= in_size)
- {
- goto error;
- }
-
- for (i = 0;
- i < (287 - run_length);
- i++)
- {
- (*out)[out_pos++] = in[in_pos + 1];
- }
- in_pos = in_pos + 1;
- }
- }
-
- /* Adjust output buffer */
- *out_size = out_pos;
- *out = (pdf_char_t *) pdf_realloc (*out, *out_size);
+ }
+
+ if (pdf_stm_buffer_eob_p (in))
+ {
+ return PDF_EEOF;
+ }
return PDF_OK;
-
- error:
- pdf_dealloc (*out);
- return PDF_ERROR;
-}
+}
+
+
+static int
+encode_rl_char (pdf_stm_f_rl_t st, pdf_stm_buffer_t out)
+{
+ if (st->enc_p == PDF_STM_F_RL_NONE)
+ {
+ if (pdf_stm_buffer_full_p (out))
+ {
+ return -1;
+ }
+ out->data[out->wp++] = (st->rl == 0) ? 0 : 256 - st->rl;
+ st->enc_p = PDF_STM_F_RL_WRL;
+ }
+
+ if (st->enc_p == PDF_STM_F_RL_WRL)
+ {
+ if (pdf_stm_buffer_full_p (out))
+ {
+ return -1;
+ }
+ out->data[out->wp++] = st->rlchar;
+ st->enc_p = PDF_STM_F_RL_NONE;
+ }
+
+ return 0;
+}
+
+
+static int
+decode_rl_char (pdf_stm_f_rl_t st, pdf_stm_buffer_t out)
+{
+ if (!st->dec_p)
+ {
+ st->dec_count = 257 - st->rlchar;
+ st->dec_p = PDF_TRUE;
+ }
+
+ while (st->dec_count > 0)
+ {
+ if (pdf_stm_buffer_full_p (out))
+ {
+ return -1;
+ }
+ out->data[out->wp++] = st->curchar;
+ st->dec_count--;
+ }
+
+ st->dec_p = PDF_FALSE;
+ return 0;
+}
+
+
+static int
+copy_next_bytes (pdf_stm_f_rl_t st, pdf_stm_buffer_t in, pdf_stm_buffer_t out)
+{
+ if (!st->dec_p)
+ {
+ st->dec_count = st->rlchar + 1;
+ st->dec_p = PDF_TRUE;
+ out->data[out->wp++] = st->curchar;
+ in->rp++;
+ st->dec_count--;
+ }
+
+ while (st->dec_count > 0)
+ {
+ if (pdf_stm_buffer_eob_p (in))
+ {
+ return 1;
+ }
+ else if (pdf_stm_buffer_full_p (out))
+ {
+ return -1;
+ }
+ out->data[out->wp] = in->data[in->rp];
+ out->wp++;
+ in->rp++;
+ st->dec_count--;
+ }
+
+ st->dec_p = PDF_FALSE;
+ return 0;
+}
+
/* End of pdf_stm_f_rl.c */
=== modified file 'src/base/pdf-stm-f-rl.h'
--- src/base/pdf-stm-f-rl.h 2008-02-11 01:11:25 +0000
+++ src/base/pdf-stm-f-rl.h 2008-09-27 22:28:27 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/02/11 01:04:56 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-27 18:19:17 gerel"
*
* File: pdf-stm-f-rl.h
* Date: Sun Jul 15 21:57:35 2007
@@ -28,42 +28,46 @@
#include <config.h>
#include <pdf-base.h>
-
-/* BEGIN PUBLIC */
-
-enum pdf_stm_f_rl_mode_t
-{
- PDF_STM_F_RL_MODE_ENCODE,
- PDF_STM_F_RL_MODE_DECODE
-};
-
-/* END PUBLIC */
-
-/* Configuration data */
-
-struct pdf_stm_f_rl_conf_s
-{
- int mode;
-};
-
-typedef struct pdf_stm_f_rl_conf_s *pdf_stm_f_rl_conf_t;
-
-/* Private data */
-
-struct pdf_stm_f_rl_data_s
-{
- int mode;
-};
-
-typedef struct pdf_stm_f_rl_data_s *pdf_stm_f_rl_data_t;
+#include <pdf-hash.h>
+#include <pdf-stm-buffer.h>
+
+
+typedef enum
+{
+ PDF_STM_F_RL_WRL=0,
+ PDF_STM_F_RL_NONE
+} pdf_stm_f_rl_enc_e;
+
+struct pdf_stm_f_rl_s
+{
+ pdf_char_t curchar, rlchar, dec_count;
+ pdf_i32_t rl;
+ pdf_bool_t run_p, dec_p;
+ pdf_stm_f_rl_enc_e enc_p;
+};
+
+typedef struct pdf_stm_f_rl_s * pdf_stm_f_rl_t;
+
/* Filter API implementation */
-int pdf_stm_f_rl_init (void **filter_data, void *conf_data);
-int pdf_stm_f_rl_apply (void *filter_data,
- pdf_char_t *in, pdf_stm_pos_t in_size,
- pdf_char_t **out, pdf_stm_pos_t *out_size);
-int pdf_stm_f_rl_dealloc (void **filter_data);
+pdf_status_t pdf_stm_f_rldec_init (pdf_hash_t params,
+ void **state);
+
+pdf_status_t pdf_stm_f_rldec_apply (pdf_hash_t params,
+ void *state,
+ pdf_stm_buffer_t in,
+ pdf_stm_buffer_t out,
+ pdf_bool_t finish_p);
+
+pdf_status_t pdf_stm_f_rlenc_init (pdf_hash_t params,
+ void **state);
+
+pdf_status_t pdf_stm_f_rlenc_apply (pdf_hash_t params,
+ void *state,
+ pdf_stm_buffer_t in,
+ pdf_stm_buffer_t out,
+ pdf_bool_t finish_p);
#endif /* pdf_stm_f_rl.h */
=== modified file 'src/base/pdf-stm-filter.c'
--- src/base/pdf-stm-filter.c 2008-09-26 18:56:50 +0000
+++ src/base/pdf-stm-filter.c 2008-09-27 22:28:27 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/26 20:46:02 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-27 18:11:56 gerel"
*
* File: pdf-stm-filter.c
* Date: Thu Jun 12 22:13:31 2008
@@ -66,24 +66,32 @@
{
new->impl.init_fn = pdf_stm_f_null_init;
new->impl.apply_fn = pdf_stm_f_null_apply;
- new->impl.dealloc_state_fn = pdf_stm_f_null_dealloc_state;
break;
}
case PDF_STM_FILTER_AHEX_ENC:
{
new->impl.init_fn = pdf_stm_f_ahexenc_init;
new->impl.apply_fn = pdf_stm_f_ahexenc_apply;
- new->impl.dealloc_state_fn = pdf_stm_f_ahexenc_dealloc_state;
break;
}
case PDF_STM_FILTER_AHEX_DEC:
{
new->impl.init_fn = pdf_stm_f_ahexdec_init;
new->impl.apply_fn = pdf_stm_f_ahexdec_apply;
- new->impl.dealloc_state_fn = pdf_stm_f_ahexdec_dealloc_state;
- break;
- }
-
+ break;
+ }
+ case PDF_STM_FILTER_RL_ENC:
+ {
+ new->impl.init_fn = pdf_stm_f_rlenc_init;
+ new->impl.apply_fn = pdf_stm_f_rlenc_apply;
+ break;
+ }
+ case PDF_STM_FILTER_RL_DEC:
+ {
+ new->impl.init_fn = pdf_stm_f_rldec_init;
+ new->impl.apply_fn = pdf_stm_f_rldec_apply;
+ break;
+ }
default:
{
/* Shall not be reached, but makes the compiler happy */
@@ -104,7 +112,7 @@
pdf_stm_filter_destroy (pdf_stm_filter_t filter)
{
pdf_stm_buffer_destroy (filter->in);
- filter->impl.dealloc_state_fn (filter->state);
+ pdf_dealloc (filter->state);
pdf_dealloc (filter);
/* Note that the memory used by the output buffer and by the params
=== modified file 'src/base/pdf-stm-filter.h'
--- src/base/pdf-stm-filter.h 2008-09-26 18:56:50 +0000
+++ src/base/pdf-stm-filter.h 2008-09-27 22:28:27 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/26 20:46:37 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-27 18:18:52 gerel"
*
* File: pdf-stm-filter.h
* Date: Thu Jun 12 22:05:06 2008
@@ -34,6 +34,7 @@
#include <pdf-stm-f-null.h>
#include <pdf-stm-f-ahex.h>
+#include <pdf-stm-f-rl.h>
/* BEGIN PUBLIC */
@@ -42,7 +43,9 @@
{
PDF_STM_FILTER_NULL = 0,
PDF_STM_FILTER_AHEX_ENC,
- PDF_STM_FILTER_AHEX_DEC
+ PDF_STM_FILTER_AHEX_DEC,
+ PDF_STM_FILTER_RL_ENC,
+ PDF_STM_FILTER_RL_DEC
};
/* Filter implementation */
@@ -56,7 +59,6 @@
pdf_stm_buffer_t in,
pdf_stm_buffer_t out,
pdf_bool_t finish_p);
- pdf_status_t (*dealloc_state_fn) (void *state);
};
/* Filter data type */
=== modified file 'torture/unit/base/stm/pdf-stm-read.c'
--- torture/unit/base/stm/pdf-stm-read.c 2008-09-20 16:25:27 +0000
+++ torture/unit/base/stm/pdf-stm-read.c 2008-09-27 22:28:27 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/20 16:43:32 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-27 19:15:57 gerel"
*
* File: pdf-stm-read.c
* Date: Sat Sep 20 15:20:17 2008
@@ -290,6 +290,63 @@
END_TEST
/*
+ * Test: pdf_stm_read_005
+ * Description:
+ * Create a memory-based reading stream and attach a RunLength filter
+ * decoder to it.
+ * Success condition:
+ * The decoded data should be correct.
+ */
+START_TEST (pdf_stm_read_005)
+{
+ pdf_status_t ret;
+ pdf_hash_t params;
+ pdf_stm_t stm;
+ pdf_char_t *buf, *decoded="122333444455555666666777777788888888999999999";
+ pdf_size_t buf_size, total=46,read;
+ pdf_char_t *dataux, *encoded =
+ "\x00" "1" "\xff" "2" "\xfe" "3" "\xfd" "4" "\xfc" "5" "\xfb" "6" \
+ "\xfa" "7" "\xf9" "8" "\xf8" "9" "\x00" "\x00" "\x80";
+
+ /* Writing stream */
+ /* Create a memory buffer */
+ buf_size = 100;
+ buf = pdf_alloc (buf_size);
+ fail_if(buf == NULL);
+ /* Create the stream */
+ ret = pdf_stm_mem_new (encoded,
+ 21,
+ 1, /* Minimum, to restore filter's state */
+ PDF_STM_READ,
+ &stm);
+ fail_if(ret != PDF_OK);
+ /* Create the filter */
+ fail_if (pdf_stm_install_filter (stm, PDF_STM_FILTER_RL_DEC, params) !=
+ PDF_OK);
+
+ read = 0;
+ total = 46;
+ dataux = buf;
+ while (total > 0)
+ {
+ read = pdf_stm_read (stm, dataux, total);
+ dataux = dataux + read;
+ total -= read;
+ }
+
+ fail_if (memcmp (buf, decoded, 46) != 0);
+ /* Destroy the stream */
+ pdf_stm_destroy (stm);
+ pdf_dealloc (buf);
+
+
+}
+END_TEST
+
+
+
+
+/*
* Test case creation function
*/
TCase *
@@ -301,6 +358,7 @@
tcase_add_test(tc, pdf_stm_read_002);
tcase_add_test(tc, pdf_stm_read_003);
tcase_add_test(tc, pdf_stm_read_004);
+ tcase_add_test(tc, pdf_stm_read_005);
return tc;
}
=== modified file 'torture/unit/base/stm/pdf-stm-write.c'
--- torture/unit/base/stm/pdf-stm-write.c 2008-09-23 19:51:07 +0000
+++ torture/unit/base/stm/pdf-stm-write.c 2008-09-27 22:28:27 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/23 21:50:12 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-27 19:17:22 gerel"
*
* File: pdf-stm-write.c
* Date: Sun Sep 21 16:37:27 2008
@@ -233,6 +233,64 @@
}
END_TEST
+
+/*
+ * Test: pdf_stm_write_005
+ * Description:
+ * Create a memory-based writing stream and attach a RunLength filter
+ * encoder to it.
+ * Success condition:
+ * The encoded data should be correct.
+ */
+START_TEST (pdf_stm_write_005)
+{
+ pdf_status_t ret;
+ pdf_hash_t params;
+ pdf_stm_t stm;
+ pdf_char_t *buf, *decoded="122333444455555666666777777788888888999999999";
+ pdf_size_t buf_size, total=46, written;
+ pdf_char_t *dataux, *encoded =
+ "\x00" "1" "\xff" "2" "\xfe" "3" "\xfd" "4" "\xfc" "5" "\xfb" "6" \
+ "\xfa" "7" "\xf9" "8" "\xf8" "9" "\x00" "\x00" "\x80";
+
+ /* Writing stream */
+ /* Create a memory buffer */
+ buf_size = 100;
+ buf = pdf_alloc (buf_size);
+ fail_if(buf == NULL);
+ /* Create the stream */
+ ret = pdf_stm_mem_new (buf,
+ buf_size,
+ 5, /* Minimum with EOD, to restore filter's state */
+ PDF_STM_WRITE,
+ &stm);
+ fail_if(ret != PDF_OK);
+ /* Create the filter */
+ fail_if (pdf_stm_install_filter (stm, PDF_STM_FILTER_RL_ENC, params) !=
+ PDF_OK);
+
+ written=0;
+ dataux = decoded;
+ while (total > 0)
+ {
+ written = pdf_stm_write (stm, dataux, total);
+ dataux = dataux + written;
+ total -= written;
+ }
+ pdf_stm_flush(stm);
+ pdf_stm_finish(stm);
+
+ fail_if (memcmp (buf, encoded, 21) != 0);
+ /* Destroy the stream */
+ pdf_stm_destroy (stm);
+ pdf_dealloc (buf);
+
+}
+END_TEST
+
+
+
+
/*
* Test case creation function
*/
@@ -245,7 +303,8 @@
tcase_add_test(tc, pdf_stm_write_002);
tcase_add_test(tc, pdf_stm_write_003);
tcase_add_test(tc, pdf_stm_write_004);
-
+ tcase_add_test(tc, pdf_stm_write_005);
+
return tc;
}
# Begin bundle
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
###
-gerel