OSDN Git Service

* Added test code of the @charset rules.
authorkonn <konn@1a406e8e-add9-4483-a2c8-d8cac5b7c224>
Sat, 5 Jul 2008 10:58:55 +0000 (10:58 +0000)
committerkonn <konn@1a406e8e-add9-4483-a2c8-d8cac5b7c224>
Sat, 5 Jul 2008 10:58:55 +0000 (10:58 +0000)
  * Added @charset iconv rutine.

git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/branches/sandbox@2803 1a406e8e-add9-4483-a2c8-d8cac5b7c224

src/css/include/scss.h
src/css/include/scss_iconv.h [new file with mode: 0644]
src/css/include/scss_string.h
src/css/src/Makefile
src/css/src/Makefile.am
src/css/src/Makefile.in
src/css/src/main.c
src/css/src/strip_quote.c [new file with mode: 0644]
src/css/test/unit/charset/test_charset.c

index ada5e4e..ab1fcae 100644 (file)
@@ -20,6 +20,7 @@
 #include "apr_pools.h"
 #include "apr_strings.h"
 #include "scss_node.h"
+#include "scss_iconv.h"
 
 #define ROOT_NODE_SIGNATURE "<rootNode>"
 
diff --git a/src/css/include/scss_iconv.h b/src/css/include/scss_iconv.h
new file mode 100644 (file)
index 0000000..b8ee9e6
--- /dev/null
@@ -0,0 +1,24 @@
+/*
+ * Copyright (C) 2008 Atsushi Konno All rights reserved.
+ * Copyright (C) 2008 QSDN,Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#if !defined(__SCSS_ICONV_H__)
+#define __SCSS_ICONV_H__
+
+#include "apr_pools.h"
+
+extern char * scss_iconv(apr_pool_t *pool, const char *src, apr_size_t *len, const char *from, const char *to, apr_status_t *rv, char **err_msg);
+
+#endif
index 5da7f10..e8ac28c 100644 (file)
@@ -48,6 +48,15 @@ extern int scss_ignore_space(const char *s, int len, apr_size_t *nl_counter);
  */
 extern char *scss_trim(apr_pool_t *pool, const char *s);
 
+/**
+ * strip quote.
+ *
+ * @param pool - use pool object.
+ * @param s    - target string.
+ * @return stripped string.
+ */
+extern char *scss_strip_quote(apr_pool_t *pool, const char *s);
+
 
 
 
index cbde1db..3b04bd9 100644 (file)
@@ -55,7 +55,8 @@ libscss_la_LIBADD =
 am_libscss_la_OBJECTS = libscss_la-main.lo libscss_la-ignore_sp.lo \
        libscss_la-starts_with.lo libscss_la-dump_nodes.lo \
        libscss_la-sac.lo libscss_la-trim.lo libscss_la-create_node.lo \
-       libscss_la-doc.lo
+       libscss_la-doc.lo libscss_la-strip_quote.lo \
+       libscss_la-iconv.lo
 libscss_la_OBJECTS = $(am_libscss_la_OBJECTS)
 libscss_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libscss_la_CFLAGS) \
@@ -198,7 +199,9 @@ libscss_la_SOURCES = main.c \
   sac.c \
   trim.c \
   create_node.c \
-  doc.c
+  doc.c \
+  strip_quote.c \
+  iconv.c
 
 libscss_la_CFLAGS = -O2 -prefer-pic -I. -I../include -I./serf
 AM_CFLAGS = -g -O2  -I/usr/include/apr-1.0   -pipe -Wall -g -O2 -pthread  -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE  -I/usr/include/apr-1.0 -I/usr/include/postgresql -O2 -prefer-pic -I. -I../include 
@@ -275,10 +278,12 @@ distclean-compile:
 include ./$(DEPDIR)/libscss_la-create_node.Plo
 include ./$(DEPDIR)/libscss_la-doc.Plo
 include ./$(DEPDIR)/libscss_la-dump_nodes.Plo
+include ./$(DEPDIR)/libscss_la-iconv.Plo
 include ./$(DEPDIR)/libscss_la-ignore_sp.Plo
 include ./$(DEPDIR)/libscss_la-main.Plo
 include ./$(DEPDIR)/libscss_la-sac.Plo
 include ./$(DEPDIR)/libscss_la-starts_with.Plo
+include ./$(DEPDIR)/libscss_la-strip_quote.Plo
 include ./$(DEPDIR)/libscss_la-trim.Plo
 
 .c.o:
@@ -358,6 +363,20 @@ libscss_la-doc.lo: doc.c
 #      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
 #      $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -c -o libscss_la-doc.lo `test -f 'doc.c' || echo '$(srcdir)/'`doc.c
 
+libscss_la-strip_quote.lo: strip_quote.c
+       $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -MT libscss_la-strip_quote.lo -MD -MP -MF $(DEPDIR)/libscss_la-strip_quote.Tpo -c -o libscss_la-strip_quote.lo `test -f 'strip_quote.c' || echo '$(srcdir)/'`strip_quote.c
+       mv -f $(DEPDIR)/libscss_la-strip_quote.Tpo $(DEPDIR)/libscss_la-strip_quote.Plo
+#      source='strip_quote.c' object='libscss_la-strip_quote.lo' libtool=yes \
+#      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#      $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -c -o libscss_la-strip_quote.lo `test -f 'strip_quote.c' || echo '$(srcdir)/'`strip_quote.c
+
+libscss_la-iconv.lo: iconv.c
+       $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -MT libscss_la-iconv.lo -MD -MP -MF $(DEPDIR)/libscss_la-iconv.Tpo -c -o libscss_la-iconv.lo `test -f 'iconv.c' || echo '$(srcdir)/'`iconv.c
+       mv -f $(DEPDIR)/libscss_la-iconv.Tpo $(DEPDIR)/libscss_la-iconv.Plo
+#      source='iconv.c' object='libscss_la-iconv.lo' libtool=yes \
+#      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) \
+#      $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -c -o libscss_la-iconv.lo `test -f 'iconv.c' || echo '$(srcdir)/'`iconv.c
+
 mostlyclean-libtool:
        -rm -f *.lo
 
index 0bfa4c6..a31f0ba 100644 (file)
@@ -5,7 +5,9 @@ libscss_la_SOURCES = main.c \
   sac.c \
   trim.c \
   create_node.c \
-  doc.c
+  doc.c \
+  strip_quote.c \
+  iconv.c
 
 libscss_la_CFLAGS = -O2 -prefer-pic -I. -I../include -I./serf
 AM_CFLAGS = @CFLAGS@ -O2 -prefer-pic -I. -I../include 
index 6898c4e..57c2e3d 100644 (file)
@@ -55,7 +55,8 @@ libscss_la_LIBADD =
 am_libscss_la_OBJECTS = libscss_la-main.lo libscss_la-ignore_sp.lo \
        libscss_la-starts_with.lo libscss_la-dump_nodes.lo \
        libscss_la-sac.lo libscss_la-trim.lo libscss_la-create_node.lo \
-       libscss_la-doc.lo
+       libscss_la-doc.lo libscss_la-strip_quote.lo \
+       libscss_la-iconv.lo
 libscss_la_OBJECTS = $(am_libscss_la_OBJECTS)
 libscss_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libscss_la_CFLAGS) \
@@ -198,7 +199,9 @@ libscss_la_SOURCES = main.c \
   sac.c \
   trim.c \
   create_node.c \
-  doc.c
+  doc.c \
+  strip_quote.c \
+  iconv.c
 
 libscss_la_CFLAGS = -O2 -prefer-pic -I. -I../include -I./serf
 AM_CFLAGS = @CFLAGS@ -O2 -prefer-pic -I. -I../include 
@@ -275,10 +278,12 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-create_node.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-doc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-dump_nodes.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-iconv.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-ignore_sp.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-main.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-sac.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-starts_with.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-strip_quote.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-trim.Plo@am__quote@
 
 .c.o:
@@ -358,6 +363,20 @@ libscss_la-doc.lo: doc.c
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@  $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -c -o libscss_la-doc.lo `test -f 'doc.c' || echo '$(srcdir)/'`doc.c
 
+libscss_la-strip_quote.lo: strip_quote.c
+@am__fastdepCC_TRUE@   $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -MT libscss_la-strip_quote.lo -MD -MP -MF $(DEPDIR)/libscss_la-strip_quote.Tpo -c -o libscss_la-strip_quote.lo `test -f 'strip_quote.c' || echo '$(srcdir)/'`strip_quote.c
+@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/libscss_la-strip_quote.Tpo $(DEPDIR)/libscss_la-strip_quote.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='strip_quote.c' object='libscss_la-strip_quote.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -c -o libscss_la-strip_quote.lo `test -f 'strip_quote.c' || echo '$(srcdir)/'`strip_quote.c
+
+libscss_la-iconv.lo: iconv.c
+@am__fastdepCC_TRUE@   $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -MT libscss_la-iconv.lo -MD -MP -MF $(DEPDIR)/libscss_la-iconv.Tpo -c -o libscss_la-iconv.lo `test -f 'iconv.c' || echo '$(srcdir)/'`iconv.c
+@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/libscss_la-iconv.Tpo $(DEPDIR)/libscss_la-iconv.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='iconv.c' object='libscss_la-iconv.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@  $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -c -o libscss_la-iconv.lo `test -f 'iconv.c' || echo '$(srcdir)/'`iconv.c
+
 mostlyclean-libtool:
        -rm -f *.lo
 
index 73e2075..5c91454 100644 (file)
@@ -182,7 +182,19 @@ scss_parser(SCSSDocPtr_t doc, apr_pool_t *ppool,  const char *src)
       }
       else if (strcasecmp(name, "@charset") == 0) {
         value1 = scss_trim(doc->pool, s_cut_before_semicoron(doc, s, &pass_len, &nl_counter));
+        value1 = scss_strip_quote(doc->pool, value1);
         s += pass_len + 1;
+        if (strcasecmp(value1, "UTF-8") != 0) {
+          apr_size_t enc_len = strlen(s);
+          apr_status_t rv = 0;
+          char *err_msg;
+          char *dst;
+          dst = scss_iconv(doc->pool, s, &enc_len, value1, "UTF-8", &rv, &err_msg);
+          if (rv != 0) {
+            scss_parser_error(doc->userData, __func__,__FILE__,__LINE__,(s - pass_len - 1), nl_counter, err_msg);
+          }
+          s = dst;
+        }
       }
       else if (strcasecmp(name, "@page") == 0) {
         value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len, &nl_counter));
diff --git a/src/css/src/strip_quote.c b/src/css/src/strip_quote.c
new file mode 100644 (file)
index 0000000..bb339f4
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2005-2008 Atsushi Konno All rights reserved.
+ * Copyright (C) 2005 QSDN,Inc. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "scss_string.h"
+#include "apr_strings.h"
+
+char *
+scss_strip_quote(apr_pool_t *pool, const char *s)
+{
+  char *ss;
+  int len;
+  
+
+  if (! s) return apr_pstrdup(pool, "");
+  ss = apr_pstrdup(pool, s);
+  if (*ss == '\'' || *ss == '"') {
+    ss++;
+    len = strlen(ss);
+    if (ss[len-1] == '\'' || ss[len-1] == '"') {
+      ss[len-1] = 0;
+    }
+    return ss;
+  }
+
+  return ss;
+}
+/*
+ * vim:ts=2 et
+ */
index 9726839..153596a 100644 (file)
@@ -9,17 +9,16 @@
 #define CU_ASSERT_STRING_EQUAL_GOTO_END(X, Y) do { CU_ASSERT_STRING_EQUAL((X),(Y)); if (CU_get_number_of_failures() != 0) goto end; } while (0)
 
 
-void test_media_001();
-void test_media_002();
-void test_media_003();
-void test_media_004();
-void test_media_005();
-void test_media_006();
-void test_media_007();
-void test_media_008();
-void test_media_009();
-void test_media_010();
-void test_media_011();
+void test_charset_001();
+void test_charset_002();
+void test_charset_003();
+void test_charset_004();
+void test_charset_005();
+void test_charset_006();
+void test_charset_007();
+void test_charset_008();
+void test_charset_009();
+void test_charset_010();
 /* pend */
 
 int
@@ -28,17 +27,16 @@ main()
   CU_pSuite atkeyword_suite;
   CU_initialize_registry();
   atkeyword_suite = CU_add_suite("test Simple CSS(is based CSS2 but not CSS2)  Parser", NULL, NULL);
-  CU_add_test(atkeyword_suite, "@media 001",  test_media_001);
-  CU_add_test(atkeyword_suite, "@media 002",  test_media_002);
-  CU_add_test(atkeyword_suite, "@media 003",  test_media_003);
-  CU_add_test(atkeyword_suite, "@media 004",  test_media_004);
-  CU_add_test(atkeyword_suite, "@media 005",  test_media_005);
-  CU_add_test(atkeyword_suite, "@media 006",  test_media_006);
-  CU_add_test(atkeyword_suite, "@media 007",  test_media_007);
-  CU_add_test(atkeyword_suite, "@media 008",  test_media_008);
-  CU_add_test(atkeyword_suite, "@media 009",  test_media_009);
-  CU_add_test(atkeyword_suite, "@media 010",  test_media_010);
-  CU_add_test(atkeyword_suite, "@media 011",  test_media_011);
+  CU_add_test(atkeyword_suite, "@charset 001",  test_charset_001);
+  CU_add_test(atkeyword_suite, "@charset 002",  test_charset_002);
+  CU_add_test(atkeyword_suite, "@charset 003",  test_charset_003);
+  CU_add_test(atkeyword_suite, "@charset 004",  test_charset_004);
+  CU_add_test(atkeyword_suite, "@charset 005",  test_charset_005);
+  CU_add_test(atkeyword_suite, "@charset 006",  test_charset_006);
+  CU_add_test(atkeyword_suite, "@charset 007",  test_charset_007);
+  CU_add_test(atkeyword_suite, "@charset 008",  test_charset_008);
+  CU_add_test(atkeyword_suite, "@charset 009",  test_charset_009);
+  CU_add_test(atkeyword_suite, "@charset 010",  test_charset_010);
   /* aend */
 
   CU_basic_run_tests();
@@ -48,9 +46,9 @@ main()
 }
 
 
-void test_media_001()
+void test_charset_001()
 {
-#define TEST_STRING "@media"
+#define TEST_STRING "@charset"
   SCSSDocPtr_t doc;
   apr_pool_t *pool;
 
@@ -70,9 +68,9 @@ void test_media_001()
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@charset") == 0);
   CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "all") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child == NULL);
@@ -83,9 +81,9 @@ end:
   fprintf(stderr, "end %s\n", __func__);
 #undef TEST_STRING
 }
-void test_media_002()
+void test_charset_002()
 {
-#define TEST_STRING "@media all {}"
+#define TEST_STRING "@charset \"UTF-8\""
   SCSSDocPtr_t doc;
   apr_pool_t *pool;
 
@@ -105,9 +103,9 @@ void test_media_002()
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "all") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@charset") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "UTF-8") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child == NULL);
@@ -118,9 +116,9 @@ end:
   fprintf(stderr, "end %s\n", __func__);
 #undef TEST_STRING
 }
-void test_media_003()
+void test_charset_003()
 {
-#define TEST_STRING "@media handheld { br {display:none}}"
+#define TEST_STRING "@charset \"UTF-8\";"
   SCSSDocPtr_t doc;
   apr_pool_t *pool;
 
@@ -140,29 +138,12 @@ void test_media_003()
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "br {display:none}") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "handheld") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@charset") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "UTF-8") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_SELECTOR);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->name,   "br");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value1, "display:none");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value2, "");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next == doc->rootNode->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->ref == &doc->rootNode->child->next->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->name,   "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->value1, "none");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next == doc->rootNode->child->next->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->ref == &doc->rootNode->child->next->child->next->child->next);
-
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child == NULL);
 
 
 end:
@@ -170,9 +151,9 @@ end:
   fprintf(stderr, "end %s\n", __func__);
 #undef TEST_STRING
 }
-void test_media_004()
+void test_charset_004()
 {
-#define TEST_STRING "\n\n@media handheld { br {display:none}}"
+#define TEST_STRING "@charset\n \"UTF-8\";"
   SCSSDocPtr_t doc;
   apr_pool_t *pool;
 
@@ -192,29 +173,12 @@ void test_media_004()
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "br {display:none}") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "handheld") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@charset") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "UTF-8") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_SELECTOR);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->name,   "br");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value1, "display:none");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value2, "");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next == doc->rootNode->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->ref == &doc->rootNode->child->next->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->name,   "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->value1, "none");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next == doc->rootNode->child->next->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->ref == &doc->rootNode->child->next->child->next->child->next);
-
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child == NULL);
 
 
 end:
@@ -222,9 +186,9 @@ end:
   fprintf(stderr, "end %s\n", __func__);
 #undef TEST_STRING
 }
-void test_media_005()
+void test_charset_005()
 {
-#define TEST_STRING "@/*abc*/media handheld { br {display:none}}"
+#define TEST_STRING "\n\n@charset\n \"UTF-8\";"
   SCSSDocPtr_t doc;
   apr_pool_t *pool;
 
@@ -244,29 +208,12 @@ void test_media_005()
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "br {display:none}") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "handheld") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@charset") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "UTF-8") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_SELECTOR);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->name,   "br");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value1, "display:none");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value2, "");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next == doc->rootNode->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->ref == &doc->rootNode->child->next->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->name,   "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->value1, "none");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next == doc->rootNode->child->next->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->ref == &doc->rootNode->child->next->child->next->child->next);
-
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child == NULL);
 
 
 end:
@@ -274,9 +221,9 @@ end:
   fprintf(stderr, "end %s\n", __func__);
 #undef TEST_STRING
 }
-void test_media_006()
+void test_charset_006()
 {
-#define TEST_STRING "@media/*abc*/ handheld { br {display:none}}"
+#define TEST_STRING "\n\n@c/*abc*/harset\n \"UTF-8\";"
   SCSSDocPtr_t doc;
   apr_pool_t *pool;
 
@@ -296,29 +243,12 @@ void test_media_006()
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "br {display:none}") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "handheld") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@charset") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "UTF-8") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_SELECTOR);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->name,   "br");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value1, "display:none");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value2, "");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next == doc->rootNode->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->ref == &doc->rootNode->child->next->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->name,   "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->value1, "none");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next == doc->rootNode->child->next->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->ref == &doc->rootNode->child->next->child->next->child->next);
-
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child == NULL);
 
 
 end:
@@ -326,9 +256,9 @@ end:
   fprintf(stderr, "end %s\n", __func__);
 #undef TEST_STRING
 }
-void test_media_007()
+void test_charset_007()
 {
-#define TEST_STRING "@media\nhandheld { br {display:none}}"
+#define TEST_STRING "\n\n@c/*abc*/harset\n \"UTF-8"
   SCSSDocPtr_t doc;
   apr_pool_t *pool;
 
@@ -348,29 +278,12 @@ void test_media_007()
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "br {display:none}") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "handheld") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@charset") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "UTF-8") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_SELECTOR);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->name,   "br");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value1, "display:none");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value2, "");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next == doc->rootNode->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->ref == &doc->rootNode->child->next->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->name,   "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->value1, "none");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next == doc->rootNode->child->next->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->ref == &doc->rootNode->child->next->child->next->child->next);
-
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child == NULL);
 
 
 end:
@@ -378,9 +291,9 @@ end:
   fprintf(stderr, "end %s\n", __func__);
 #undef TEST_STRING
 }
-void test_media_008()
+void test_charset_008()
 {
-#define TEST_STRING "@media handheld, print { br {display:none}}"
+#define TEST_STRING "@charset \"CP932\";br { \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8:none }"
   SCSSDocPtr_t doc;
   apr_pool_t *pool;
 
@@ -400,29 +313,20 @@ void test_media_008()
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "br {display:none}") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "handheld, print") == 0);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_SELECTOR);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->name,   "br");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value1, "display:none");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value2, "");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next == doc->rootNode->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->ref == &doc->rootNode->child->next->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->name,   "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->value1, "none");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next == doc->rootNode->child->next->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->ref == &doc->rootNode->child->next->child->next->child->next);
-
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@charset") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "CP932") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next != NULL);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->type == SCSSTYPE_SELECTOR);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->name != NULL);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->name, "br") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->value1, "あいうえお:none") == 0);
+
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->next == doc->rootNode->child);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->ref == &doc->rootNode->child->next->next);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child != NULL);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->child->next->name, "あいうえお") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->child->next->value1, "none") == 0);
 
 
 end:
@@ -430,9 +334,9 @@ end:
   fprintf(stderr, "end %s\n", __func__);
 #undef TEST_STRING
 }
-void test_media_009()
+void test_charset_009()
 {
-#define TEST_STRING "@media handheld { br {display:none;display2:none2}}"
+#define TEST_STRING "@charset \"UTF-8\";br { \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8:none }"
   SCSSDocPtr_t doc;
   apr_pool_t *pool;
 
@@ -452,34 +356,20 @@ void test_media_009()
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "br {display:none;display2:none2}") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "handheld") == 0);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_SELECTOR);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->name,   "br");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value1, "display:none;display2:none2");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value2, "");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next == doc->rootNode->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->ref == &doc->rootNode->child->next->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->name,   "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->value1, "none");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->next->name,   "display2");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->next->value1, "none2");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next->next == doc->rootNode->child->next->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next->ref == &doc->rootNode->child->next->child->next->child->next->next);
-
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@charset") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "UTF-8") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next != NULL);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->type == SCSSTYPE_SELECTOR);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->name != NULL);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->name, "br") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->value1, "\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x3a\x6e\x6f\x6e\x65") == 0);
+
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->next == doc->rootNode->child);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->ref == &doc->rootNode->child->next->next);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child != NULL);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->child->next->name, "\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->child->next->value1, "none") == 0);
 
 
 end:
@@ -487,9 +377,9 @@ end:
   fprintf(stderr, "end %s\n", __func__);
 #undef TEST_STRING
 }
-void test_media_010()
+void test_charset_010()
 {
-#define TEST_STRING "@media handheld { br {display:none}\nhr {display:none}}"
+#define TEST_STRING "@charset \"UTF-8\";\nbr { \x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8:none }"
   SCSSDocPtr_t doc;
   apr_pool_t *pool;
 
@@ -509,95 +399,21 @@ void test_media_010()
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
   CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "br {display:none}\nhr {display:none}") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "handheld") == 0);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_SELECTOR);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->name,   "br");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value1, "display:none");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value2, "");
-  /* br's property check */
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->name,   "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->value1, "none");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next == doc->rootNode->child->next->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->ref  == &doc->rootNode->child->next->child->next->child->next);
-
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next->type == SCSSTYPE_SELECTOR);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->next->name,   "hr");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->next->value1, "display:none");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->next->value2, "");
-  /* hr's property check */
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next->child->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->next->child->next->name,   "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->next->child->next->value1, "none");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next->child->next->next == doc->rootNode->child->next->child->next->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next->child->next->ref  == &doc->rootNode->child->next->child->next->next->child->next);
-
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next->next == doc->rootNode->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next->ref == &doc->rootNode->child->next->child->next->next);
-
-end:
-  apr_terminate();
-  fprintf(stderr, "end %s\n", __func__);
-#undef TEST_STRING
-}
-void test_media_011()
-{
-#define TEST_STRING "@media handheld { br {display"
-  SCSSDocPtr_t doc;
-  apr_pool_t *pool;
-
-  fprintf(stderr, "start %s\n", __func__);
-  apr_initialize();
-  apr_pool_create(&pool, NULL);
-
-  doc = scss_create_doc(pool);
-  scss_parser(doc, pool,  TEST_STRING);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@charset") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "UTF-8") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next != NULL);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->type == SCSSTYPE_SELECTOR);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->name != NULL);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->name, "br") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->value1, "\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8\x3a\x6e\x6f\x6e\x65") == 0);
+
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->next == doc->rootNode->child);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->ref == &doc->rootNode->child->next->next);
+  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next->child != NULL);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->child->next->name, "\x82\xa0\x82\xa2\x82\xa4\x82\xa6\x82\xa8") == 0);
+  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->next->child->next->value1, "none") == 0);
 
-  CU_ASSERT_OR_GOTO_END(doc != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->type == SCSSTYPE_STYLESHEET);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->name, "<sentinel>") == 0);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->name != NULL);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->name, "@media") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value1, "br {display") == 0);
-  CU_ASSERT_OR_GOTO_END(strcasecmp(doc->rootNode->child->next->value2, "handheld") == 0);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->next == doc->rootNode->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->type == SCSSTYPE_SELECTOR);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->name,   "br");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value1, "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->value2, "");
-  /* br's property check */
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child != NULL);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->type == SCSSTYPE_PROPERTY);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->name != NULL);
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->name,   "display");
-  CU_ASSERT_STRING_EQUAL_GOTO_END(doc->rootNode->child->next->child->next->child->next->value1, "");
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->next == doc->rootNode->child->next->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->child->next->ref  == &doc->rootNode->child->next->child->next->child->next);
-
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->next == doc->rootNode->child->next->child);
-  CU_ASSERT_OR_GOTO_END(doc->rootNode->child->next->child->next->ref == &doc->rootNode->child->next->child->next);
 
 end:
   apr_terminate();