pdf-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[pdf-devel] Patch for RL filter and more


From: gerel
Subject: [pdf-devel] Patch for RL filter and more
Date: Thu, 25 Sep 2008 08:25:12 -0700 (PDT)

Hey everyone,

I finally got the RL filter working. It's not easy to deal with state. :-/

On the filter itself, I concluded that the minimum cache needed for the encoder
is of 5 bytes (for writting).
I couldn't make the encoder work _good_ with less, i.e. encode as much as you
can before writting. This is due to the trailing character and previous state,
the trailing character might not be copied otherwise.
The decoder works fine with any cache size.

Here I send the patch for the filter, a test, the memcpy() replacements and
some other minor fixes.

##
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: address@hidden
# target_branch: file:///home/gerel/PROJECTS/libgnupdf/trunk/
# testament_sha1: a6035123b93bcf9fa25f6c673f500e17343ecaaf
# timestamp: 2008-09-25 12:14:36 -0300
# base_revision_id: address@hidden
# 
# Begin patch
=== modified file 'ChangeLog'
--- ChangeLog   2008-09-22 23:40:53 +0000
+++ ChangeLog   2008-09-25 15:14:23 +0000
@@ -1,3 +1,33 @@
+2008-09-25  Gerardo E. Gidoni  <address@hidden>
+
+       * src/Makefile.am: added pdf-stm-f-rl.c.
+
+       * doc/gnupdf-tsd.texi: added RL filter test.
+       
+       * src/base/pdf-base.h: included list and hash headers.
+
+       * src/base/pdf-error.h: fixed PDF_ENOTEMPY error string order.
+
+       * src/base/pdf-stm-be.c: memcpy() in place of strncpy().
+
+       * src/base/pdf-stm.c: same.
+       
+       * src/base/pdf-stm-f-null.c: same.
+
+       * src/base/pdf-stm-f-rl.c: modified for the new API.
+
+       * src/base/pdf-stm-f-rl.h: same.
+
+       * src/base/pdf-stm-filter.c: added PDF_STM_FILTER_RL_ENC/DEC
+
+       * src/base/pdf-stm-filter.h: same.
+
+       * torture/unit/Makefile.am: added filter's test
+       
+       * torture/unit/base/stm/tsuite-stm.c: same.
+
+       * torture/unit/base/stm/pdf-stm-f-rl.c: first add.
+
 2008-09-23  Jose E. Marchesi  <address@hidden>
 
        * ../ahex-filters/src/base/pdf-stm-f-ahex.c

=== modified file 'doc/gnupdf-tsd.texi'
--- doc/gnupdf-tsd.texi 2008-09-22 02:23:04 +0000
+++ doc/gnupdf-tsd.texi 2008-09-25 15:14:23 +0000
@@ -189,6 +189,7 @@
 * pdf_stm_seek::
 * pdf_stm_tell::
 * pdf_stm_write::
+* pdf_stm_f_rl::
 @end menu
 
 @node pdf_stm_mem_new
@@ -341,6 +342,19 @@
 @end table
 @end deffn
 
address@hidden pdf_stm_f_rl
address@hidden pdf_stm_f_rl
+
address@hidden Test pdf_stm_f_rl_001
+Create a memory-based writing and reading stream and attach
+a RunLength filter decoder and encoder to each one.
address@hidden @strong
address@hidden Success condition
+The decoded 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-25 15:14:23 +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-base.h'
--- src/base/pdf-base.h 2008-07-28 21:52:46 +0000
+++ src/base/pdf-base.h 2008-09-25 15:14:23 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/07/21 01:36:59 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-24 14:35:48 gerel"
  *
  *       File:         pdf-base.h
  *       Date:         Fri Jul  6 20:22:05 2007
@@ -29,6 +29,8 @@
 #include <pdf-alloc.h>
 #include <pdf-types.h>
 #include <pdf-error.h>
+#include <pdf-hash.h>
+#include <pdf-list.h>
 //#include <pdf-stm.h>
 #include <pdf-fp.h>
 #include <pdf-text.h>

=== modified file 'src/base/pdf-error.h'
--- src/base/pdf-error.h        2008-09-20 16:25:27 +0000
+++ src/base/pdf-error.h        2008-09-25 15:14:23 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/20 16:48:46 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-23 13:40:21 gerel"
  *
  *       File:         pdf-error.h
  *       Date:         Sun Feb  24 20:22:05 2008
@@ -80,8 +80,8 @@
   ERROR_ENTRY (PDF_EBADNAME,    "invalid path name"),                   \
   ERROR_ENTRY (PDF_EAGAIN,      "operation can't be performed now, maybe 
later"), \
   ERROR_ENTRY (PDF_ENOSPC,      "no space left on device"),             \
-  ERROR_ENTRY (PDF_ENOTEMPTY,   "text module global context not initialized"), 
\
-  ERROR_ENTRY (PDF_EBADCONTEXT, "operation requires some entity be empty")
+  ERROR_ENTRY (PDF_EBADCONTEXT, "text module global context not initialized"), 
\
+  ERROR_ENTRY (PDF_ENOTEMPTY,   "operation requires some entity be empty")
 
 
 #define ERROR_ENTRY(id,string) id

=== modified file 'src/base/pdf-stm-be.c'
--- src/base/pdf-stm-be.c       2008-09-22 21:39:19 +0000
+++ src/base/pdf-stm-be.c       2008-09-25 15:14:23 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/22 23:21:03 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-24 19:59:09 gerel"
  *
  *       File:         pdf-stm-be.c
  *       Date:         Wed Jun 18 21:15:16 2008
@@ -236,13 +236,12 @@
   if (readed_bytes != 0)
     {
       /* Copy the data */
-      strncpy ((char *) buffer,
-               (char *) be->data.mem.buffer + be->data.mem.pos,
-               readed_bytes);
+      memcpy ((char *) buffer,
+              (char *) be->data.mem.buffer + be->data.mem.pos,
+              readed_bytes);
 
       be->data.mem.pos += readed_bytes;
     }
-
   /* Ok, bye bye */
   return readed_bytes;
 }
@@ -275,7 +274,7 @@
   if (written_bytes != 0)
     {
       /* Copy the data */
-      strncpy ((char *) be->data.mem.buffer + be->data.mem.pos,
+      memcpy ((char *) be->data.mem.buffer + be->data.mem.pos,
                (char *) buffer,
                written_bytes);
 

=== modified file 'src/base/pdf-stm-f-null.c'
--- src/base/pdf-stm-f-null.c   2008-09-22 18:20:10 +0000
+++ src/base/pdf-stm-f-null.c   2008-09-25 15:14:23 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/22 20:10:54 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-24 19:26:40 gerel"
  *
  *       File:         pdf-stm-f-null.c
  *       Date:         Mon Jul  9 22:01:41 2007
@@ -64,9 +64,9 @@
 
   if (bytes_to_copy != 0)
     {
-      strncpy ((char *) out->data,
-               (char *) in->data,
-               bytes_to_copy);
+      memcpy ((char *) out->data,
+              (char *) in->data,
+              bytes_to_copy);
 
       in->rp = in->rp + bytes_to_copy;
       out->wp = out->wp + bytes_to_copy;

=== 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-25 15:14:23 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/03/05 12:24:57 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-25 11:32:48 gerel"
  *
  *       File:         pdf-stm-f-rl.c
  *       Date:         Sun Jul 15 22:01:18 2007
@@ -29,203 +29,235 @@
 #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:
-      {
+
+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];
+      if (!st->run_p)
+        {
+          st->rlchar = st->curchar;
+          st->run_p = PDF_TRUE;
+          st->rl++; 
+          in->rp++;
+        }
+      else if (st->curchar == st->rlchar && st->rl < 127)
+        {
+          st->rl++;
+          in->rp++;
+        }
+      else
+        {
+          if (encode_rl_char (st, out) < 0)
+              return PDF_OK;
+          st->rl=-1;
+          st->run_p = PDF_FALSE;
+        }
+    }
+
+  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;
     }
 
-  /* 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);
-
+  if (pdf_stm_buffer_eob_p (in))
+    return PDF_EEOF;
+ 
   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_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_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)
+  pdf_stm_f_rl_t st;
+  pdf_status_t copied;
+
+  st = (pdf_stm_f_rl_t) state;
+
+  while (!pdf_stm_buffer_eob_p (in))
     {
-      c = in[in_pos];
+      st->curchar = in->data[in->rp];
 
-      if (!run_p)
-        {
-          run_char = c;
-          run_p = PDF_TRUE;
-        }
-     
-      if ((c == run_char) &&
-          (run_length < 128))
-        {
-          run_length++;
-          in_pos++;
-        }
+      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
         {
-          (*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 */
+          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-25 15:14:23 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/02/11 01:04:56 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-24 21:02:01 gerel"
  *
  *       File:         pdf-stm-f-rl.h
  *       Date:         Sun Jul 15 21:57:35 2007
@@ -28,42 +28,45 @@
 
 #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-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-22 21:39:19 +0000
+++ src/base/pdf-stm-filter.c   2008-09-25 15:14:23 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/22 22:18:10 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-25 10:50:27 gerel"
  *
  *       File:         pdf-stm-filter.c
  *       Date:         Thu Jun 12 22:13:31 2008
@@ -80,7 +80,18 @@
         new->impl.apply_fn = pdf_stm_f_ahexdec_apply;
         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 */

=== modified file 'src/base/pdf-stm-filter.h'
--- src/base/pdf-stm-filter.h   2008-09-22 21:39:19 +0000
+++ src/base/pdf-stm-filter.h   2008-09-25 15:14:23 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/22 22:18:18 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-24 15:25:26 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 */

=== modified file 'src/base/pdf-stm.c'
--- src/base/pdf-stm.c  2008-09-22 21:41:52 +0000
+++ src/base/pdf-stm.c  2008-09-25 15:14:23 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/22 23:29:02 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-25 11:44:22 gerel"
  *
  *       File:         pdf-stm.c
  *       Date:         Fri Jul  6 18:43:15 2007
@@ -161,9 +161,9 @@
           cache_size = stm->cache->wp - stm->cache->rp;
           to_copy_bytes = PDF_MIN(pending_bytes, cache_size);
 
-          strncpy ((char *) (buf + read_bytes),
-                   (char *) stm->cache->data + stm->cache->rp,
-                   to_copy_bytes);
+          memcpy ((char *) (buf + read_bytes),
+                  (char *) stm->cache->data + stm->cache->rp,
+                  to_copy_bytes);
           
           read_bytes += to_copy_bytes;
           stm->cache->rp += to_copy_bytes;
@@ -227,9 +227,9 @@
 
           if (to_write_bytes != 0)
             {
-              strncpy ((char *) tail_buffer->data + tail_buffer->wp,
-                       (char *) buf + written_bytes,
-                       to_write_bytes);
+              memcpy ((char *) tail_buffer->data + tail_buffer->wp,
+                      (char *) buf + written_bytes,
+                      to_write_bytes);
 
               written_bytes += to_write_bytes;
               tail_buffer->wp += to_write_bytes;

=== modified file 'torture/unit/Makefile.am'
--- torture/unit/Makefile.am    2008-09-22 02:23:04 +0000
+++ torture/unit/Makefile.am    2008-09-25 15:14:23 +0000
@@ -66,7 +66,8 @@
                  base/stm/pdf-stm-peek-char.c \
                  base/stm/pdf-stm-seek.c \
                  base/stm/pdf-stm-tell.c \
-                 base/stm/pdf-stm-write.c
+                 base/stm/pdf-stm-write.c \
+                 base/stm/pdf-stm-f-rl.c
 
 TEST_SUITE_HASH = base/hash/pdf-hash-new.c \
                  base/hash/pdf-hash-destroy.c \

=== added file 'torture/unit/base/stm/pdf-stm-f-rl.c'
--- torture/unit/base/stm/pdf-stm-f-rl.c        1970-01-01 00:00:00 +0000
+++ torture/unit/base/stm/pdf-stm-f-rl.c        2008-09-25 15:14:23 +0000
@@ -0,0 +1,127 @@
+/* -*- mode: C -*- Time-stamp: "2008-09-25 12:12:59 gerel"
+ *
+ *       File:         pdf-stm-f-rl.c
+ *       Date:         Sat Sep 20 14:37:26 2008
+ *
+ *       GNU PDF Library - Unit tests for pdf_stm_f_rl
+ *
+ */
+
+/* Copyright (C) 2008 Free Software Foundation, Inc. */
+
+/* This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+#include <check.h>
+#include <pdf.h>
+
+
+/*
+ * Test: pdf_stm_f_rl_001
+ * Description:
+ *   Create a memory-based writing and reading stream and attach
+ *   a RunLength filter decoder and encoder to each one.
+ * Success condition:
+ *   The decoded data should be correct.
+ */
+START_TEST (pdf_stm_f_rl_001)
+{
+  pdf_status_t ret;
+  pdf_hash_t params;
+  pdf_stm_t stm,stm2;
+  pdf_char_t *buf, *buf2;
+  pdf_size_t buf_size, buf_size2, total=46,read, written;
+  char *dataux, *data = "122333444455555666666777777788888888999999999";
+
+  /* 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 = data;
+  while (total > 0)
+    {
+      written = pdf_stm_write (stm, dataux, total);
+      dataux = dataux + written;
+      total -= written;
+    }
+  pdf_stm_flush(stm);
+  pdf_stm_finish(stm);
+
+  /* Reading stream */
+  /* Create a memory buffer */
+  buf_size2 = 100;
+  buf2 = pdf_alloc (buf_size2);
+  fail_if(buf2 == NULL);
+  /* Create the stream */
+
+  ret = pdf_stm_mem_new (buf,
+                         buf_size,
+                         1, /* Minimum, to restore filter's state */
+                         PDF_STM_READ,
+                         &stm2);
+  fail_if(ret != PDF_OK);
+  /* Create the filter */
+  fail_if (pdf_stm_install_filter (stm2, PDF_STM_FILTER_RL_DEC, params) !=
+           PDF_OK);
+
+  read = 0;
+  total = 46;
+  dataux = buf2;
+  while (total > 0)
+    {
+      read = pdf_stm_read (stm2, dataux, total);
+      dataux = dataux + read;
+      total -= read;
+    }
+
+  fail_if (strcmp (data, buf2) != 0);
+  /* Destroy the stream */
+  pdf_stm_destroy (stm);
+  pdf_dealloc (buf);
+  pdf_stm_destroy (stm2);
+  pdf_dealloc (buf2);
+
+}
+END_TEST
+
+
+
+/*
+ * Test case creation function
+ */
+TCase *
+test_pdf_stm_f_rl (void)
+{
+  TCase *tc = tcase_create ("pdf_stm_f_rl");
+
+  tcase_add_test(tc, pdf_stm_f_rl_001);
+
+  return tc;
+}
+
+/* End of pdf-stm-mem-new.c */

=== modified file 'torture/unit/base/stm/tsuite-stm.c'
--- torture/unit/base/stm/tsuite-stm.c  2008-09-21 14:55:24 +0000
+++ torture/unit/base/stm/tsuite-stm.c  2008-09-25 15:14:23 +0000
@@ -1,4 +1,4 @@
-/* -*- mode: C -*- Time-stamp: "08/09/21 16:43:20 jemarch"
+/* -*- mode: C -*- Time-stamp: "2008-09-24 17:45:53 gerel"
  *
  *       File:         tsuit-stm.c
  *       Date:         Sat Feb 23 21:35:11 2008
@@ -32,6 +32,7 @@
 extern TCase *test_pdf_stm_seek (void);
 extern TCase *test_pdf_stm_tell (void);
 extern TCase *test_pdf_stm_write (void);
+extern TCase *test_pdf_stm_f_rl (void);
 
 Suite *
 tsuite_stm ()
@@ -47,6 +48,7 @@
   suite_add_tcase (s, test_pdf_stm_seek ());
   suite_add_tcase (s, test_pdf_stm_tell ());
   suite_add_tcase (s, test_pdf_stm_write ());
+  suite_add_tcase (s, test_pdf_stm_f_rl ());
 
   return s;
 }

# Begin bundle
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
XgA=

###


-gerel




reply via email to

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