[Swfdec-commits] 11 commits - swfdec/swfdec_text_field_movie_html.c test/trace vivified/code

Pekka Lampila medar at kemper.freedesktop.org
Fri May 2 05:32:18 PDT 2008


 swfdec/swfdec_text_field_movie_html.c        |    3 
 test/trace/text-field-html-input-5.swf       |binary
 test/trace/text-field-html-input-5.swf.trace |   12 +
 test/trace/text-field-html-input-6.swf       |binary
 test/trace/text-field-html-input-6.swf.trace |   40 ++++
 test/trace/text-field-html-input-7.swf       |binary
 test/trace/text-field-html-input-7.swf.trace |   40 ++++
 test/trace/text-field-html-input-8.swf       |binary
 test/trace/text-field-html-input-8.swf.trace |   38 ++++
 test/trace/text-field-html-input.as          |    5 
 vivified/code/vivi_code_asm_push.c           |   23 ++
 vivified/code/vivi_code_defaults.h           |    1 
 vivified/code/vivi_code_number.c             |   53 +++++-
 vivified/code/vivi_code_number.h             |   11 +
 vivified/code/vivi_decompiler.c              |    6 
 vivified/code/vivi_parser.c                  |  228 +++++++++++++++++++++++----
 16 files changed, 415 insertions(+), 45 deletions(-)

New commits:
commit aac286cf8b3f49376056ece2f35066d68e795f11
Merge: 6bc424a... 041b515...
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Fri May 2 15:29:50 2008 +0300

    Merge branch 'master' of ssh://medar@git.freedesktop.org/git/swfdec/swfdec

commit 6bc424af8edcf8bee14e80fa911fbaac17aa85f7
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Fri May 2 15:06:25 2008 +0300

    Expand the text-field-html-input test with a test for <tab>

diff --git a/test/trace/text-field-html-input-5.swf b/test/trace/text-field-html-input-5.swf
index a0d642f..b07006a 100644
Binary files a/test/trace/text-field-html-input-5.swf and b/test/trace/text-field-html-input-5.swf differ
diff --git a/test/trace/text-field-html-input-5.swf.trace b/test/trace/text-field-html-input-5.swf.trace
index 8890a81..53a9c69 100644
--- a/test/trace/text-field-html-input-5.swf.trace
+++ b/test/trace/text-field-html-input-5.swf.trace
@@ -346,3 +346,15 @@ a<p>b<font size='10'>c</p>d
 24: a<p>b<font size='10'>c</p>d: multiline: 1 condenseWhite: 2
 undefined
 a<p>b<font size='10'>c</p>d
+25: a<tab>b	<tab> c: multiline: 0 condenseWhite: 0
+undefined
+a<tab>b	<tab> c
+25: a<tab>b	<tab> c: multiline: 1 condenseWhite: 0
+undefined
+a<tab>b	<tab> c
+25: a<tab>b	<tab> c: multiline: 0 condenseWhite: 2
+undefined
+a<tab>b	<tab> c
+25: a<tab>b	<tab> c: multiline: 1 condenseWhite: 2
+undefined
+a<tab>b	<tab> c
diff --git a/test/trace/text-field-html-input-6.swf b/test/trace/text-field-html-input-6.swf
index e7f8193..9bc5bf8 100644
Binary files a/test/trace/text-field-html-input-6.swf and b/test/trace/text-field-html-input-6.swf differ
diff --git a/test/trace/text-field-html-input-6.swf.trace b/test/trace/text-field-html-input-6.swf.trace
index d3b3aaf..433b4f9 100644
--- a/test/trace/text-field-html-input-6.swf.trace
+++ b/test/trace/text-field-html-input-6.swf.trace
@@ -864,3 +864,43 @@ abc
d
 2/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=10 tabStops= target= underline=false url=
 3/
: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
 4/d: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: false condenseWhite: false
+a	b		 c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b		 c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+5/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+6/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: true condenseWhite: false
+a	b		 c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b		 c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+5/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+6/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: false condenseWhite: true
+a	b 	 c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b 	 c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+5/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+6/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: true condenseWhite: true
+a	b 	 c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b 	 c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+3/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+5/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
+6/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning= leading=0 leftMargin=0 letterSpacing= rightMargin=0 size=12 tabStops= target= underline=false url=
diff --git a/test/trace/text-field-html-input-7.swf b/test/trace/text-field-html-input-7.swf
index 38a97cd..6c8a5ae 100644
Binary files a/test/trace/text-field-html-input-7.swf and b/test/trace/text-field-html-input-7.swf differ
diff --git a/test/trace/text-field-html-input-7.swf.trace b/test/trace/text-field-html-input-7.swf.trace
index aae712b..f02b3a9 100644
--- a/test/trace/text-field-html-input-7.swf.trace
+++ b/test/trace/text-field-html-input-7.swf.trace
@@ -800,3 +800,43 @@ abc
d
 2/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=10 tabStops= target= underline=false url=
 3/
: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
 4/d: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: false condenseWhite: false
+a	b		 c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b		 c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+5/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+6/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: true condenseWhite: false
+a	b		 c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b		 c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+5/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+6/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: false condenseWhite: true
+a	b 	 c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b 	 c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+5/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+6/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: true condenseWhite: true
+a	b 	 c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b 	 c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+3/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+5/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
+6/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=undefined leading=0 leftMargin=0 letterSpacing=undefined rightMargin=0 size=12 tabStops= target= underline=false url=
diff --git a/test/trace/text-field-html-input-8.swf b/test/trace/text-field-html-input-8.swf
index c7cde07..25aaa5b 100644
Binary files a/test/trace/text-field-html-input-8.swf and b/test/trace/text-field-html-input-8.swf differ
diff --git a/test/trace/text-field-html-input-8.swf.trace b/test/trace/text-field-html-input-8.swf.trace
index 82e685f..904c300 100644
--- a/test/trace/text-field-html-input-8.swf.trace
+++ b/test/trace/text-field-html-input-8.swf.trace
@@ -798,3 +798,41 @@ abc
d
 2/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=10 tabStops= target= underline=false url=
 3/
: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
 4/d: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: false condenseWhite: false
+a	b		 c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b		 c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+5/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+6/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: true condenseWhite: false
+a	b		 c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b		 c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+5/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+6/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: false condenseWhite: true
+a	b 	c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b 	c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+5/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+25: a<tab>b	<tab> c: multiline: true condenseWhite: true
+a	b 	c
+<P ALIGN="LEFT"><FONT FACE="Times New Roman" SIZE="12" COLOR="#000000" LETTERSPACING="0" KERNING="0">a	b 	c</FONT></P>
+0/a: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+1/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+2/b: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+3/ : align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+4/	: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
+5/c: align=left blockIndent=0 bold=false bullet=false color=0 display=block font=Times New Roman indent=0 italic=false kerning=false leading=0 leftMargin=0 letterSpacing=0 rightMargin=0 size=12 tabStops= target= underline=false url=
diff --git a/test/trace/text-field-html-input.as b/test/trace/text-field-html-input.as
index 296c246..d9f4f52 100644
--- a/test/trace/text-field-html-input.as
+++ b/test/trace/text-field-html-input.as
@@ -57,7 +57,8 @@ var texts = [
   "a<u>b</p>c",
   "a<p>b<li>c</p>d",
   "a<p>b<textformat indent='10'>c</p>d",
-  "a<p>b<font size='10'>c</p>d"
+  "a<p>b<font size='10'>c</p>d",
+  "a<tab>b\t<tab> c"
 ];
 
 for (var i = 0; i < texts.length; i++) {
@@ -79,4 +80,4 @@ for (var i = 0; i < texts.length; i++) {
   }
 }
 
-loadMovie ("FSCommand:quit", "");
+getURL ("FSCommand:quit", "");
commit 06f343aea767df6d2bbc7b2f37eeb007949819b0
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Fri May 2 15:03:07 2008 +0300

    Implement <tab> tag for HTML input in TextFields

diff --git a/swfdec/swfdec_text_field_movie_html.c b/swfdec/swfdec_text_field_movie_html.c
index a1b0738..1315f12 100644
--- a/swfdec/swfdec_text_field_movie_html.c
+++ b/swfdec/swfdec_text_field_movie_html.c
@@ -359,6 +359,9 @@ swfdec_text_field_movie_html_parse_tag (ParserData *data, const char *p)
     SwfdecAsObject *object;
     SwfdecAsValue val;
 
+    if (name_length == 3 && !g_strncasecmp (name, "tab", 3))
+      data->text = g_string_append_c (data->text, '\t');
+
     if (data->multiline) {
       if (name_length == 2 && !g_strncasecmp (name, "br", 2))
       {
commit 2b6e8f629e16006c1e718474f2a38cf3aa70e1a6
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Apr 30 14:36:05 2008 +0300

    Make parse_statement_list return the block

diff --git a/vivified/code/vivi_parser.c b/vivified/code/vivi_parser.c
index 6c3c017..77daecb 100644
--- a/vivified/code/vivi_parser.c
+++ b/vivified/code/vivi_parser.c
@@ -122,9 +122,9 @@ typedef ViviCodeValue * (*ParseValueFunction) (ParseData *data);
 typedef ViviCodeValue * (*ParseValueStatementFunction) (ParseData *data, ViviCodeStatement **statement);
 typedef ViviCodeStatement * (*ParseStatementFunction) (ParseData *data);
 
-static void
+static ViviCodeStatement *
 parse_statement_list (ParseData *data, PeekFunction peek,
-    ParseStatementFunction parse, ViviCodeStatement **block, guint separator);
+    ParseStatementFunction parse, guint separator);
 
 static void
 parse_value_statement_list (ParseData *data, PeekFunction peek,
@@ -2627,8 +2627,8 @@ parse_iteration_statement (ParseData *data)
 
     if (try_parse_token (data, TOKEN_VAR)) {
       // FIXME: no in
-      parse_statement_list (data, peek_variable_declaration,
-	  parse_variable_declaration, &pre_statement, TOKEN_COMMA);
+      pre_statement = parse_statement_list (data, peek_variable_declaration,
+	  parse_variable_declaration, TOKEN_COMMA);
       // FIXME: ugly
       // If there was only one VariableDeclaration, get the name for pre_value
       g_assert (VIVI_IS_CODE_BLOCK (pre_statement));
@@ -2865,7 +2865,7 @@ parse_block (ParseData *data)
   parse_token (data, TOKEN_BRACE_LEFT);
 
   if (!try_parse_token (data, TOKEN_BRACE_RIGHT)) {
-    parse_statement_list (data, peek_statement, parse_statement, &statement,
+    statement = parse_statement_list (data, peek_statement, parse_statement,
 	TOKEN_NONE);
     parse_token (data, TOKEN_BRACE_RIGHT);
   } else {
@@ -2887,8 +2887,8 @@ parse_variable_statement (ParseData *data)
   ViviCodeStatement *statement;
 
   parse_token (data, TOKEN_VAR);
-  parse_statement_list (data, peek_variable_declaration,
-      parse_variable_declaration, &statement, TOKEN_COMMA);
+  statement = parse_statement_list (data, peek_variable_declaration,
+      parse_variable_declaration, TOKEN_COMMA);
   parse_automatic_semicolon (data);
 
   return statement;
@@ -3001,8 +3001,8 @@ parse_function_definition (ParseData *data, gboolean name_required)
   parse_token (data, TOKEN_BRACE_LEFT);
 
   vivi_parser_start_level (data);
-  parse_statement_list (data, peek_source_element, parse_source_element,
-      &body, TOKEN_NONE);
+  body = parse_statement_list (data, peek_source_element, parse_source_element,
+      TOKEN_NONE);
   vivi_parser_end_level (data);
 
   parse_token (data, TOKEN_BRACE_RIGHT);
@@ -3082,8 +3082,8 @@ parse_program (ParseData *data)
   g_assert (data->level == NULL);
   vivi_parser_start_level (data);
 
-  parse_statement_list (data, peek_source_element, parse_source_element,
-      &statement, TOKEN_NONE);
+  statement = parse_statement_list (data, peek_source_element,
+      parse_source_element, TOKEN_NONE);
   if (!try_parse_token (data, TOKEN_NONE))
     vivi_parser_error_unexpected (data, ERROR_TOKEN_STATEMENT);
 
@@ -3095,25 +3095,27 @@ parse_program (ParseData *data)
 
 // parsing
 
-static void
+static ViviCodeStatement *
 parse_statement_list (ParseData *data, PeekFunction peek,
-    ParseStatementFunction parse, ViviCodeStatement **block, guint separator)
+    ParseStatementFunction parse, guint separator)
 {
   ViviCodeStatement *statement;
+  ViviCodeStatement *block;
 
   g_assert (data != NULL);
   g_assert (peek != NULL);
   g_assert (parse != NULL);
-  g_assert (block != NULL);
 
-  *block = vivi_code_block_new ();
+  block = vivi_code_block_new ();
 
   do {
     statement = parse (data);
-    vivi_code_block_add_statement (VIVI_CODE_BLOCK (*block), statement);
+    vivi_code_block_add_statement (VIVI_CODE_BLOCK (block), statement);
     g_object_unref (statement);
   } while ((separator == TOKEN_NONE || try_parse_token (data, separator)) &&
       peek (data));
+
+  return block;
 }
 
 static void
commit 138a335f4d9c61412baca459603f0403aedb5db4
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Apr 30 14:29:32 2008 +0300

    Parse unary + and - operators and Number built-in call

diff --git a/vivified/code/vivi_code_defaults.h b/vivified/code/vivi_code_defaults.h
index 6486c3f..28759ac 100644
--- a/vivified/code/vivi_code_defaults.h
+++ b/vivified/code/vivi_code_defaults.h
@@ -87,6 +87,7 @@ DEFAULT_BUILTIN_VALUE_CALL (AsciiToChar,	ascii_to_char,	"chr")
 DEFAULT_BUILTIN_VALUE_CALL (GetVariable,	get_variable,	"eval")
 DEFAULT_BUILTIN_VALUE_CALL (ToInteger,		to_integer,	"int")
 DEFAULT_BUILTIN_VALUE_CALL (StringLength,	string_length,	"length")
+DEFAULT_BUILTIN_VALUE_CALL (ToNumber,		to_number,	"Number")
 DEFAULT_BUILTIN_VALUE_CALL (CharToAscii,	char_to_ascii,	"ord")
 DEFAULT_BUILTIN_VALUE_CALL (Random,		random,		"random")
 DEFAULT_BUILTIN_VALUE_CALL (TargetPath,		target_path,	"targetPath")
diff --git a/vivified/code/vivi_parser.c b/vivified/code/vivi_parser.c
index 5791175..6c3c017 100644
--- a/vivified/code/vivi_parser.c
+++ b/vivified/code/vivi_parser.c
@@ -1505,6 +1505,7 @@ static const BuiltinCall builtin_calls[] = {
   { "getTimer",    vivi_code_get_timer_new, NULL, NULL },
   { "int",         NULL, vivi_code_to_integer_new, NULL },
   { "length",      NULL, vivi_code_string_length_new, NULL },
+  { "Number",      NULL, vivi_code_to_number_new, NULL },
   { "ord",         NULL, vivi_code_char_to_ascii_new, NULL },
   { "random",      NULL, vivi_code_random_new, NULL },
   { "substring",   NULL, NULL, parse_substring },
@@ -1983,9 +1984,42 @@ parse_unary_expression (ParseData *data, ViviCodeStatement **statement)
 	  vivi_parser_assignment_new (value, tmp));
       g_object_unref (tmp);
       break;
-    /*case TOKEN_PLUS:
+    case TOKEN_PLUS:
+      vivi_parser_scanner_get_next_token (data->scanner);
+
+      value = parse_unary_expression (data, statement);
+
+      if (!VIVI_IS_CODE_NUMBER (value)) {
+	tmp = value;
+	value = vivi_code_to_number_new (tmp);
+	g_object_unref (tmp);
+      }
+      break;
     case TOKEN_MINUS:
-    case TOKEN_BITWISE_NOT:*/
+      vivi_parser_scanner_get_next_token (data->scanner);
+
+      value = parse_unary_expression (data, statement);
+
+      if (VIVI_IS_CODE_NUMBER (value)) {
+	tmp = value;
+	value = vivi_code_number_new (
+	    -vivi_code_number_get_value (VIVI_CODE_NUMBER (tmp)));
+	g_object_unref (tmp);
+      } else {
+	ViviCodeValue *number;
+
+	tmp = value;
+	value = vivi_code_to_number_new (tmp);
+	g_object_unref (tmp);
+
+	number = vivi_code_number_new (-1);
+	tmp = value;
+	value = vivi_code_multiply_new (number, tmp);
+	g_object_unref (tmp);
+	g_object_unref (number);
+      }
+      break;
+    //case TOKEN_BITWISE_NOT:
     case TOKEN_LOGICAL_NOT:
       vivi_parser_start_code_token (data);
 
commit a8820bb8ed292ad84b2942a1d2fe1001b45fb8cd
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Apr 30 13:48:45 2008 +0300

    Add hints for ViviCodeNumber to change the way it's compiled to asm

diff --git a/vivified/code/vivi_code_number.c b/vivified/code/vivi_code_number.c
index f909200..b2f4060 100644
--- a/vivified/code/vivi_code_number.c
+++ b/vivified/code/vivi_code_number.c
@@ -43,9 +43,38 @@ vivi_code_number_compile (ViviCodeToken *token, ViviCodeAssembler *assembler)
 {
   ViviCodeNumber *number = VIVI_CODE_NUMBER (token);
   ViviCodeAsm *code;
+  ViviCodeNumberHint hint;
 
   code = vivi_code_asm_push_new ();
-  vivi_code_asm_push_add_double (VIVI_CODE_ASM_PUSH (code), number->value);
+
+  if (number->hint == VIVI_CODE_NUMBER_HINT_UNDEFINED) {
+    if (swfdec_as_double_to_integer (number->value) == number->value) {
+      hint = VIVI_CODE_NUMBER_HINT_INT;
+    } else {
+      hint = VIVI_CODE_NUMBER_HINT_DOUBLE;
+    }
+  } else {
+    hint = number->hint;
+  }
+
+  // FIXME: warning/error when conversion isn't accurate?
+  switch (hint) {
+    case VIVI_CODE_NUMBER_HINT_INT:
+      vivi_code_asm_push_add_integer (VIVI_CODE_ASM_PUSH (code),
+	  swfdec_as_double_to_integer (number->value));
+      break;
+    case VIVI_CODE_NUMBER_HINT_FLOAT:
+      vivi_code_asm_push_add_float (VIVI_CODE_ASM_PUSH (code),
+	  (float)number->value);
+      break;
+    case VIVI_CODE_NUMBER_HINT_DOUBLE:
+      vivi_code_asm_push_add_double (VIVI_CODE_ASM_PUSH (code), number->value);
+      break;
+    case VIVI_CODE_NUMBER_HINT_UNDEFINED:
+    default:
+      g_assert_not_reached ();
+  }
+
   vivi_code_assembler_add_code (assembler, code);
   g_object_unref (code);
 }
@@ -83,3 +112,20 @@ vivi_code_number_get_value (ViviCodeNumber *number)
   return number->value;
 }
 
+void
+vivi_code_number_set_hint (ViviCodeNumber *number, ViviCodeNumberHint hint)
+{
+  g_return_if_fail (VIVI_IS_CODE_NUMBER (number));
+  g_return_if_fail (hint <= VIVI_CODE_NUMBER_HINT_INT);
+
+  number->hint = hint;
+}
+
+ViviCodeNumberHint
+vivi_code_number_get_hint(ViviCodeNumber *number)
+{
+  g_return_val_if_fail (VIVI_IS_CODE_NUMBER (number),
+      VIVI_CODE_NUMBER_HINT_UNDEFINED);
+
+  return number->hint;
+}
diff --git a/vivified/code/vivi_code_number.h b/vivified/code/vivi_code_number.h
index 943041e..f9c6d18 100644
--- a/vivified/code/vivi_code_number.h
+++ b/vivified/code/vivi_code_number.h
@@ -24,6 +24,12 @@
 
 G_BEGIN_DECLS
 
+typedef enum {
+  VIVI_CODE_NUMBER_HINT_UNDEFINED,
+  VIVI_CODE_NUMBER_HINT_DOUBLE,
+  VIVI_CODE_NUMBER_HINT_FLOAT,
+  VIVI_CODE_NUMBER_HINT_INT
+} ViviCodeNumberHint;
 
 typedef struct _ViviCodeNumber ViviCodeNumber;
 typedef struct _ViviCodeNumberClass ViviCodeNumberClass;
@@ -40,6 +46,7 @@ struct _ViviCodeNumber
   ViviCodeConstant	constant;
 
   double		value;
+  ViviCodeNumberHint	hint;
 };
 
 struct _ViviCodeNumberClass
@@ -53,6 +60,10 @@ ViviCodeValue *	vivi_code_number_new		(double			value);
 
 double		vivi_code_number_get_value	(ViviCodeNumber *	number);
 
+void		vivi_code_number_set_hint	(ViviCodeNumber *	number,
+						 ViviCodeNumberHint	hint);
+ViviCodeNumberHint vivi_code_number_get_hint	(ViviCodeNumber *	number);
+
 
 G_END_DECLS
 #endif
diff --git a/vivified/code/vivi_decompiler.c b/vivified/code/vivi_decompiler.c
index 98757d3..eb51427 100644
--- a/vivified/code/vivi_decompiler.c
+++ b/vivified/code/vivi_decompiler.c
@@ -154,6 +154,8 @@ vivi_decompile_push (ViviDecompilerBlock *block, ViviDecompilerState *state,
 	}
       case 1: /* float */
 	val = vivi_code_number_new (swfdec_bits_get_float (&bits));
+	vivi_code_number_set_hint (VIVI_CODE_NUMBER (val),
+	    VIVI_CODE_NUMBER_HINT_FLOAT);
 	break;
       case 2: /* null */
 	val = vivi_code_null_new ();
@@ -170,9 +172,13 @@ vivi_decompile_push (ViviDecompilerBlock *block, ViviDecompilerState *state,
 	break;
       case 6: /* double */
 	val = vivi_code_number_new (swfdec_bits_get_double (&bits));
+	vivi_code_number_set_hint (VIVI_CODE_NUMBER (val),
+	    VIVI_CODE_NUMBER_HINT_DOUBLE);
 	break;
       case 7: /* 32bit int */
 	val = vivi_code_number_new (swfdec_bits_get_s32 (&bits));
+	vivi_code_number_set_hint (VIVI_CODE_NUMBER (val),
+	    VIVI_CODE_NUMBER_HINT_INT);
 	break;
       case 8: /* 8bit ConstantPool address */
       case 9: /* 16bit ConstantPool address */
commit b830ecf0ed31ac095029af51759e9b012210a572
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Apr 30 13:38:01 2008 +0300

    Fix printing of numbers in ViviCodeNumber too

diff --git a/vivified/code/vivi_code_number.c b/vivified/code/vivi_code_number.c
index 01dc54a..f909200 100644
--- a/vivified/code/vivi_code_number.c
+++ b/vivified/code/vivi_code_number.c
@@ -32,11 +32,10 @@ static void
 vivi_code_number_print (ViviCodeToken *token, ViviCodePrinter *printer)
 {
   ViviCodeNumber *number = VIVI_CODE_NUMBER (token);
-  char *s;
+  char s[G_ASCII_DTOSTR_BUF_SIZE];
 
-  s = g_strdup_printf ("%g", number->value);
+  g_ascii_dtostr (s, G_ASCII_DTOSTR_BUF_SIZE, number->value);
   vivi_code_printer_print (printer, s);
-  g_free (s);
 }
 
 static void
commit 351844c29168d4c4fceb142e99ec421b4ed6b611
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Apr 30 13:33:20 2008 +0300

    Implement the parsing of push asm statement

diff --git a/vivified/code/vivi_parser.c b/vivified/code/vivi_parser.c
index 51ef9a9..5791175 100644
--- a/vivified/code/vivi_parser.c
+++ b/vivified/code/vivi_parser.c
@@ -30,6 +30,7 @@
 
 #include "vivi_code_and.h"
 #include "vivi_code_asm_code_default.h"
+#include "vivi_code_asm_push.h"
 #include "vivi_code_assignment.h"
 #include "vivi_code_binary_default.h"
 #include "vivi_code_block.h"
@@ -693,6 +694,19 @@ parse_numeric_value (ParseData *data)
   }
 }
 
+static int
+parse_integer_value (ParseData *data)
+{
+  double number = peek_numeric_value (data);
+
+  if (swfdec_as_double_to_integer (number) != number)
+    vivi_parser_error (data, "Expected integer, got double");
+
+  vivi_parser_scanner_get_next_token (data->scanner);
+
+  return swfdec_as_double_to_integer (number);
+}
+
 static gboolean
 peek_numeric (ParseData *data)
 {
@@ -1043,9 +1057,101 @@ parse_variable_declaration (ParseData *data)
 // asm functions
 
 static ViviCodeAsm *
-parse_asm_if (ParseData *data)
+parse_asm_push (ParseData *data)
 {
-  return NULL;
+  ViviCodeAsmPush *push;
+
+  push = VIVI_CODE_ASM_PUSH (vivi_code_asm_push_new ());
+
+  if (try_parse_restricted_semicolon (data)) {
+    // TODO: warning?
+    return VIVI_CODE_ASM (push);
+  }
+
+  do {
+    switch ((guint) vivi_parser_scanner_peek_next_token (data->scanner)) {
+      case TOKEN_STRING:
+	vivi_code_asm_push_add_string (push, parse_string_value (data));
+	break;
+      case TOKEN_NUMBER:
+	{
+	  double number = parse_numeric_value (data);
+	  if (peek_token (data, TOKEN_IDENTIFIER) &&
+	      g_ascii_strcasecmp (peek_identifier_value (data), "i") == 0) {
+	    vivi_parser_scanner_get_next_token (data->scanner);
+	    // TODO: add warning if losing accuracy
+	    vivi_code_asm_push_add_integer (push,
+		swfdec_as_double_to_integer (number));
+	  } else if (peek_token (data, TOKEN_IDENTIFIER) &&
+	      g_ascii_strcasecmp (peek_identifier_value (data), "f") == 0) {
+	    vivi_parser_scanner_get_next_token (data->scanner);
+	    // TODO: add warning if losing accuracy
+	    vivi_code_asm_push_add_float (push, (float)number);
+	  } else if (peek_token (data, TOKEN_IDENTIFIER) &&
+	      g_ascii_strcasecmp (peek_identifier_value (data), "d") == 0) {
+	    vivi_parser_scanner_get_next_token (data->scanner);
+	    vivi_code_asm_push_add_double (push, number);
+	  } else {
+	    if (swfdec_as_double_to_integer (number) == number) {
+	      vivi_code_asm_push_add_integer (push,
+		  swfdec_as_double_to_integer (number));
+	    } else {
+	      vivi_code_asm_push_add_double (push, number);
+	    }
+	  }
+	}
+	break;
+      case TOKEN_BOOLEAN:
+	vivi_code_asm_push_add_boolean (push, parse_boolean_value (data));
+	break;
+      case TOKEN_NULL:
+	vivi_parser_scanner_get_next_token (data->scanner);
+	vivi_code_asm_push_add_null (push);
+	break;
+      case TOKEN_UNDEFINED:
+	vivi_parser_scanner_get_next_token (data->scanner);
+	vivi_code_asm_push_add_undefined (push);
+	break;
+      case TOKEN_IDENTIFIER:
+	{
+	  const char *identifier = parse_identifier_value (data);
+	  if (g_ascii_strcasecmp (identifier, "pool") == 0) {
+	    int number = parse_integer_value (data);
+	    if (number < 0 || number > G_MAXUINT16) {
+	      vivi_parser_error (data, "Invalid pool index: %i", number);
+	      number = 0;
+	    }
+	    if (number < 256) {
+	      vivi_code_asm_push_add_pool (push, number);
+	    } else {
+	      vivi_code_asm_push_add_pool_big (push, number);
+	    }
+	  } else if (g_ascii_strcasecmp (identifier, "reg") == 0) {
+	    int number = parse_integer_value (data);
+	    if (number < 0 || number >= 256) {
+	      vivi_parser_error (data, "Invalid register number: %i", number);
+	      number = 0;
+	    }
+	    vivi_code_asm_push_add_register (push, number);
+	  } else {
+	    vivi_parser_error (data, "Invalid identifier in push: %s",
+		identifier);
+	    vivi_code_asm_push_add_undefined (push);
+	  }
+	}
+	break;
+      default:
+	vivi_parser_error (data, "Invalid token in push: %s",
+	    vivi_parser_scanner_token_name (
+	      vivi_parser_scanner_get_next_token (data->scanner)));
+	vivi_code_asm_push_add_undefined (push);
+	break;
+    }
+  } while (try_parse_token (data, TOKEN_COMMA));
+
+  parse_automatic_semicolon (data);
+
+  return VIVI_CODE_ASM (push);
 }
 
 typedef ViviCodeAsm *(*AsmConstructor) (void);
@@ -1062,7 +1168,7 @@ static const AsmStatement asm_statements[] = {
   { G_STRINGIFY (underscore_name), vivi_code_asm_ ## underscore_name ## _new, NULL },
 #include "vivi_code_defaults.h"
 #undef DEFAULT_ASM
-  { "if", NULL, parse_asm_if }
+  { "push", NULL, parse_asm_push }
 };
 #if 0
 DEFAULT_ASM (GotoFrame, goto_frame, SWFDEC_AS_ACTION_GOTO_FRAME)
commit adaadbb335117b3a08d833b3fa30b7b2a2814d51
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Apr 30 13:32:26 2008 +0300

    Fix the printing of doubles and floats for AsmPush

diff --git a/vivified/code/vivi_code_asm_push.c b/vivified/code/vivi_code_asm_push.c
index add3da3..e21f9f1 100644
--- a/vivified/code/vivi_code_asm_push.c
+++ b/vivified/code/vivi_code_asm_push.c
@@ -86,9 +86,14 @@ vivi_code_asm_push_print (ViviCodeToken *token, ViviCodePrinter*printer)
 	g_free (s2);
 	break;
       case VIVI_CODE_CONSTANT_FLOAT:
-	s = g_strdup_printf ("%.ff", swfdec_bits_get_float (&bits));
-	vivi_code_printer_print (printer, s);
-	g_free (s);
+	{
+	  s = g_malloc (G_ASCII_DTOSTR_BUF_SIZE);
+	  g_ascii_dtostr (s, G_ASCII_DTOSTR_BUF_SIZE,
+	      swfdec_bits_get_float (&bits));
+	  vivi_code_printer_print (printer, s);
+	  vivi_code_printer_print (printer, "f");
+	  g_free (s);
+	}
 	break;
       case VIVI_CODE_CONSTANT_NULL:
 	vivi_code_printer_print (printer, "null");
@@ -105,9 +110,15 @@ vivi_code_asm_push_print (ViviCodeToken *token, ViviCodePrinter*printer)
 	vivi_code_printer_print (printer, swfdec_bits_get_u8 (&bits) ? "true" : "false");
 	break;
       case VIVI_CODE_CONSTANT_DOUBLE:
-	s = g_strdup_printf ("%.g", swfdec_bits_get_double (&bits));
-	vivi_code_printer_print (printer, s);
-	g_free (s);
+	{
+	  double number = swfdec_bits_get_double (&bits);
+	  s = g_malloc (G_ASCII_DTOSTR_BUF_SIZE);
+	  g_ascii_dtostr (s, G_ASCII_DTOSTR_BUF_SIZE, number);
+	  vivi_code_printer_print (printer, s);
+	  if (number == swfdec_as_double_to_integer (number))
+	    vivi_code_printer_print (printer, "d");
+	  g_free (s);
+	}
 	break;
       case VIVI_CODE_CONSTANT_INTEGER:
 	s = g_strdup_printf ("%d", swfdec_bits_get_s32 (&bits));
commit 8c32cbf2a95ab42fbc5d9b5a8b101b4f70c74a86
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Apr 30 09:42:36 2008 +0300

    Make peek check two elements for asm and built-in calls/statements

diff --git a/vivified/code/vivi_parser.c b/vivified/code/vivi_parser.c
index 5a8f556..51ef9a9 100644
--- a/vivified/code/vivi_parser.c
+++ b/vivified/code/vivi_parser.c
@@ -1122,10 +1122,17 @@ parse_asm_code (ParseData *data)
 static gboolean
 peek_asm_statement (ParseData *data)
 {
+  const ViviParserValue *value;
+
   if (!peek_token (data, TOKEN_IDENTIFIER))
     return FALSE;
 
-  return (g_ascii_strcasecmp (peek_identifier_value (data), "asm") == 0);
+  if (g_ascii_strcasecmp (peek_identifier_value (data), "asm") != 0)
+    return FALSE;
+
+  value = vivi_parser_scanner_get_value (data->scanner, 2);
+
+  return (value->token == TOKEN_BRACE_LEFT);
 }
 
 static ViviCodeStatement *
@@ -1404,13 +1411,17 @@ peek_builtin_call (ParseData *data)
 {
   guint i;
   const char *identifier;
+  const ViviParserValue *value;
 
   if (!peek_token (data, TOKEN_IDENTIFIER))
     return FALSE;
 
   identifier = vivi_parser_scanner_get_value (data->scanner, 1)->value.v_identifier;
 
-  // TODO: Check that ( follows?
+  value = vivi_parser_scanner_get_value (data->scanner, 2);
+
+  if (value->token != TOKEN_PARENTHESIS_LEFT)
+    return FALSE;
 
   for (i = 0; i < G_N_ELEMENTS (builtin_calls); i++) {
     if (g_ascii_strcasecmp (identifier, builtin_calls[i].name) == 0)
@@ -1465,13 +1476,17 @@ peek_builtin_statement (ParseData *data)
 {
   guint i;
   const char *identifier;
+  const ViviParserValue *value;
 
   if (!peek_token (data, TOKEN_IDENTIFIER))
     return FALSE;
 
   identifier = peek_identifier_value (data);
 
-  // TODO: Check that ( follows?
+  value = vivi_parser_scanner_get_value (data->scanner, 2);
+
+  if (value->token != TOKEN_PARENTHESIS_LEFT)
+    return FALSE;
 
   for (i = 0; i < G_N_ELEMENTS (builtin_statements); i++) {
     if (g_ascii_strcasecmp (identifier, builtin_statements[i].name) == 0)
commit 45405ffd9c9fc81036927276bc93434824113b75
Author: Pekka Lampila <pekka.lampila at iki.fi>
Date:   Wed Apr 30 09:35:28 2008 +0300

    Small fixes/cleanups to the scanner

diff --git a/vivified/code/vivi_parser.c b/vivified/code/vivi_parser.c
index 4ca6ccb..5a8f556 100644
--- a/vivified/code/vivi_parser.c
+++ b/vivified/code/vivi_parser.c
@@ -620,7 +620,8 @@ parse_null (ParseData *data)
 G_GNUC_UNUSED static gboolean
 peek_boolean_value (ParseData *data)
 {
-  const ViviParserValue *value = vivi_parser_scanner_get_value (data->scanner, 1);
+  const ViviParserValue *value =
+    vivi_parser_scanner_get_value (data->scanner, 1);
 
   if (value->token == TOKEN_BOOLEAN) {
     return value->value.v_boolean;
@@ -633,7 +634,7 @@ static gboolean
 parse_boolean_value (ParseData *data)
 {
   const ViviParserValue *value;
-  
+
   parse_token (data, TOKEN_BOOLEAN);
 
   value = vivi_parser_scanner_get_value (data->scanner, 0);
@@ -667,7 +668,8 @@ parse_boolean (ParseData *data)
 G_GNUC_UNUSED static double
 peek_numeric_value (ParseData *data)
 {
-  const ViviParserValue *value = vivi_parser_scanner_get_value (data->scanner, 1);
+  const ViviParserValue *value =
+    vivi_parser_scanner_get_value (data->scanner, 1);
 
   if (value->token == TOKEN_NUMBER) {
     return value->value.v_number;
@@ -714,7 +716,9 @@ parse_numeric (ParseData *data)
 G_GNUC_UNUSED static const char *
 peek_string_value (ParseData *data)
 {
-  const ViviParserValue *value = vivi_parser_scanner_get_value (data->scanner, 1);
+  const ViviParserValue *value =
+    vivi_parser_scanner_get_value (data->scanner, 1);
+
   if (value->token == TOKEN_STRING) {
     return value->value.v_string->str;
   } else {
@@ -805,7 +809,8 @@ parse_literal (ParseData *data)
 static const char *
 peek_identifier_value (ParseData *data)
 {
-  const ViviParserValue *value = vivi_parser_scanner_get_value (data->scanner, 1);
+  const ViviParserValue *value =
+    vivi_parser_scanner_get_value (data->scanner, 1);
 
   if (value->token == TOKEN_IDENTIFIER) {
     return value->value.v_identifier;
@@ -818,6 +823,7 @@ static const char *
 parse_identifier_value (ParseData *data)
 {
   const ViviParserValue *value;
+
   parse_token (data, TOKEN_IDENTIFIER);
 
   value = vivi_parser_scanner_get_value (data->scanner, 0);
@@ -1043,7 +1049,7 @@ parse_asm_if (ParseData *data)
 }
 
 typedef ViviCodeAsm *(*AsmConstructor) (void);
-typedef ViviCodeAsm * (*ParseAsmFunction) (ParseData *data);
+typedef ViviCodeAsm *(*ParseAsmFunction) (ParseData *data);
 
 typedef struct {
   const char *			name;
@@ -1099,8 +1105,6 @@ parse_asm_code (ParseData *data)
     }
     if (i >= G_N_ELEMENTS (asm_statements)) {
       vivi_parser_error (data, "Unknown asm statement: %s", identifier);
-      // FIXME
-      vivi_parser_scanner_get_next_token (data->scanner);
       i = 0;
     }
     g_free (identifier);
@@ -2925,7 +2929,8 @@ parse_program (ParseData *data)
 
   parse_statement_list (data, peek_source_element, parse_source_element,
       &statement, TOKEN_NONE);
-  parse_token (data, TOKEN_NONE);
+  if (!try_parse_token (data, TOKEN_NONE))
+    vivi_parser_error_unexpected (data, ERROR_TOKEN_STATEMENT);
 
   vivi_parser_end_level (data);
   g_assert (data->level == NULL);


More information about the Swfdec-commits mailing list