[Swfdec] 2 commits - libswfdec/swfdec_sound.c libswfdec/swfdec_text_field_movie_as.c libswfdec/swfdec_text_field_movie.c libswfdec/swfdec_text_field_movie_html.c

Pekka Lampila medar at kemper.freedesktop.org
Wed Oct 31 05:57:43 PDT 2007


 libswfdec/swfdec_sound.c                 |    5 ++++-
 libswfdec/swfdec_text_field_movie.c      |   24 +++++++++---------------
 libswfdec/swfdec_text_field_movie_as.c   |   19 +++++++++++++++----
 libswfdec/swfdec_text_field_movie_html.c |    6 +++---
 4 files changed, 31 insertions(+), 23 deletions(-)

New commits:
commit 73aaa5c30a072ebf5be478d943526450aedb312c
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Oct 31 14:54:09 2007 +0200

    Always use byte offsets internally in TextField, not UTF-8 offsets
    
    Fixes at least one assert

diff --git a/libswfdec/swfdec_text_field_movie.c b/libswfdec/swfdec_text_field_movie.c
index dc2cca0..1858004 100644
--- a/libswfdec/swfdec_text_field_movie.c
+++ b/libswfdec/swfdec_text_field_movie.c
@@ -1033,7 +1033,7 @@ swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text,
   g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
   g_return_if_fail (SWFDEC_IS_TEXT_FORMAT (format));
   g_return_if_fail (start_index < end_index);
-  g_return_if_fail (end_index <= (guint) g_utf8_strlen (text->input->str, -1));
+  g_return_if_fail (end_index <= text->input->len);
 
   g_assert (text->formats != NULL);
   g_assert (text->formats->data != NULL);
@@ -1051,7 +1051,7 @@ swfdec_text_field_movie_set_text_format (SwfdecTextFieldMovie *text,
       findex_end_index =
 	((SwfdecFormatIndex *)iter->next->data)->index_;
     } else {
-      findex_end_index = g_utf8_strlen (text->input->str, -1);
+      findex_end_index = text->input->len;
     }
 
     if (findex_end_index <= start_index)
@@ -1113,7 +1113,7 @@ swfdec_text_field_movie_get_text_format (SwfdecTextFieldMovie *text,
 
   g_assert (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
   g_assert (start_index < end_index);
-  g_assert (end_index <= (guint) g_utf8_strlen (text->input->str, -1));
+  g_assert (end_index <= text->input->len);
 
   g_assert (text->formats != NULL);
   g_assert (text->formats->data != NULL);
@@ -1288,7 +1288,7 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
   gboolean first;
 
   g_return_if_fail (SWFDEC_IS_TEXT_FIELD_MOVIE (text));
-  g_return_if_fail (end_index <= (guint) g_utf8_strlen (text->input->str, -1));
+  g_return_if_fail (end_index <= text->input->len);
   g_return_if_fail (start_index <= end_index);
   g_return_if_fail (str != NULL);
 
@@ -1304,8 +1304,7 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     findex = iter->data;
 
     if (findex->index_ >= start_index) {
-      if (end_index == (guint) g_utf8_strlen (text->input->str, -1) ||
-	  (iter->next != NULL &&
+      if (end_index == text->input->len ||(iter->next != NULL &&
 	   ((SwfdecFormatIndex *)iter->next->data)->index_ <= end_index))
       {
 	g_free (iter->data);
@@ -1324,7 +1323,7 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     prev = iter;
   }
 
-  if (end_index == (guint) g_utf8_strlen (text->input->str, -1)) {
+  if (end_index == text->input->len) {
     if (SWFDEC_AS_OBJECT (text)->context->version < 8) {
       SWFDEC_FIXME ("replaceText to the end of the TextField might use wrong text format on version 7");
     }
@@ -1335,14 +1334,9 @@ swfdec_text_field_movie_replace_text (SwfdecTextFieldMovie *text,
     text->formats = g_slist_append (text->formats, findex);
   }
 
-  text->input = g_string_erase (text->input,
-      g_utf8_offset_to_pointer (text->input->str, start_index) -
-      text->input->str,
-      g_utf8_offset_to_pointer (text->input->str, end_index) -
-      g_utf8_offset_to_pointer (text->input->str, start_index));
-  text->input = g_string_insert (text->input,
-      g_utf8_offset_to_pointer (text->input->str, start_index) -
-      text->input->str, str);
+  text->input = g_string_erase (text->input, start_index,
+      end_index - start_index);
+  text->input = g_string_insert (text->input, start_index, str);
 
   swfdec_movie_invalidate (SWFDEC_MOVIE (text));
   swfdec_text_field_movie_auto_size (text);
diff --git a/libswfdec/swfdec_text_field_movie_as.c b/libswfdec/swfdec_text_field_movie_as.c
index 248d878..7d91250 100644
--- a/libswfdec/swfdec_text_field_movie_as.c
+++ b/libswfdec/swfdec_text_field_movie_as.c
@@ -1031,7 +1031,11 @@ swfdec_text_field_movie_setTextFormat (SwfdecAsContext *cx,
 
   format = SWFDEC_TEXT_FORMAT (SWFDEC_AS_VALUE_GET_OBJECT (&argv[i]));
 
-  swfdec_text_field_movie_set_text_format (text, format, start_index, end_index);
+  swfdec_text_field_movie_set_text_format (text, format,
+      g_utf8_offset_to_pointer (text->input->str, start_index) -
+      text->input->str,
+      g_utf8_offset_to_pointer (text->input->str, end_index) -
+      text->input->str);
 }
 
 SWFDEC_AS_NATIVE (104, 101, swfdec_text_field_movie_getTextFormat)
@@ -1068,8 +1072,11 @@ swfdec_text_field_movie_getTextFormat (SwfdecAsContext *cx,
   if (start_index == end_index) {
     format = SWFDEC_TEXT_FORMAT (swfdec_text_format_new (cx));
   } else {
-    format =
-      swfdec_text_field_movie_get_text_format (text, start_index, end_index);
+    format = swfdec_text_field_movie_get_text_format (text,
+      g_utf8_offset_to_pointer (text->input->str, start_index) -
+      text->input->str,
+      g_utf8_offset_to_pointer (text->input->str, end_index) -
+      text->input->str);
   }
 
   SWFDEC_AS_VALUE_SET_OBJECT (ret, SWFDEC_AS_OBJECT (format));
@@ -1097,7 +1104,11 @@ swfdec_text_field_movie_replaceText (SwfdecAsContext *cx,
   start_index = MIN (start_index, g_utf8_strlen (text->input->str, -1));
   end_index = MIN (end_index, g_utf8_strlen (text->input->str, -1));
 
-  swfdec_text_field_movie_replace_text (text, start_index, end_index, str);
+  swfdec_text_field_movie_replace_text (text,
+      g_utf8_offset_to_pointer (text->input->str, start_index) -
+      text->input->str,
+      g_utf8_offset_to_pointer (text->input->str, end_index) -
+      text->input->str, str);
 }
 
 // static
diff --git a/libswfdec/swfdec_text_field_movie_html.c b/libswfdec/swfdec_text_field_movie_html.c
index 3352bd6..ef22415 100644
--- a/libswfdec/swfdec_text_field_movie_html.c
+++ b/libswfdec/swfdec_text_field_movie_html.c
@@ -71,7 +71,7 @@ swfdec_text_field_movie_html_parse_close_tag (ParserData *data, ParserTag *tag)
 	ParserTag *n = g_new0 (ParserTag, 1);
 	n->name = f->name;
 	n->name_length = f->name_length;
-	n->index = g_utf8_strlen (data->text->str, -1);
+	n->index = data->text->len;
 	n->end_index = n->index + 1;
 	n->format = swfdec_text_format_copy (f->format);
 	data->tags_closed = g_slist_prepend (data->tags_closed, n);
@@ -81,7 +81,7 @@ swfdec_text_field_movie_html_parse_close_tag (ParserData *data, ParserTag *tag)
     data->text = g_string_append_c (data->text, '\n');
   }
 
-  tag->end_index = g_utf8_strlen (data->text->str, -1);
+  tag->end_index = data->text->len;
 
   data->tags_open = g_slist_remove (data->tags_open, tag);
   data->tags_closed = g_slist_prepend (data->tags_closed, tag);
@@ -347,7 +347,7 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p)
     tag->name = name;
     tag->name_length = name_length;
     tag->format = SWFDEC_TEXT_FORMAT (swfdec_text_format_new (data->cx));
-    tag->index = g_utf8_strlen (data->text->str, -1);
+    tag->index = data->text->len;
 
     data->tags_open = g_slist_prepend (data->tags_open, tag);
 
commit a69bc92b48bb2fd9fd32e1d0d7f6fd477e1c4a98
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Oct 31 12:24:31 2007 +0200

    Handle running out of bits in sound envelope parsing better

diff --git a/libswfdec/swfdec_sound.c b/libswfdec/swfdec_sound.c
index 3e9da94..06022bc 100644
--- a/libswfdec/swfdec_sound.c
+++ b/libswfdec/swfdec_sound.c
@@ -356,7 +356,7 @@ swfdec_sound_parse_chunk (SwfdecSwfDecoder *s, SwfdecBits *b, int id)
     SWFDEC_LOG ("  n_envelopes = %u", chunk->n_envelopes);
   }
 
-  for (i = 0; i < chunk->n_envelopes; i++) {
+  for (i = 0; i < chunk->n_envelopes && swfdec_bits_left (b); i++) {
     chunk->envelope[i].offset = swfdec_bits_get_u32 (b);
     if (i > 0 && chunk->envelope[i-1].offset > chunk->envelope[i].offset) {
       SWFDEC_ERROR ("unordered sound envelopes");
@@ -376,6 +376,9 @@ swfdec_sound_parse_chunk (SwfdecSwfDecoder *s, SwfdecBits *b, int id)
 	(guint) chunk->envelope[i].volume[0], (guint) chunk->envelope[i].volume[1]);
   }
 
+  if (i < chunk->n_envelopes)
+    SWFDEC_ERROR ("out of bits when reading sound envelopes");
+
   return chunk;
 }
 


More information about the Swfdec mailing list