pdf-devel
[Top][All Lists]
Advanced

[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




reply via email to

[Prev in Thread] Current Thread [Next in Thread]