node->next->ref = node->ref; \
} while (0)
-#define PASS_COMMENT(S) \
+#define PASS_COMMENT(S,NL) \
if (*(S) == '/' && *((S) + 1) == '*') { \
- (S) = s_pass_comment((S)); \
+ (S) = s_pass_comment((S),(NL)); \
continue; \
}
}
static SCSSDocPtr_t s_create_doc(apr_pool_t *ppool);
-static char *s_cut_ident(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len);
-static const char *s_pass_comment(const char *s);
-static char *s_cut_before_next_semicoron_or_block(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len);
-static char *s_cut_before_white_space_or_semicoron(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len);
-static char *s_cut_before_block_closer(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len);
-static char *s_cut_before_semicoron(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len);
+static char *s_cut_ident(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter);
+static const char *s_pass_comment(const char *s, apr_size_t *nl_counter);
+static char *s_cut_before_next_semicoron_or_block(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter);
+static char *s_cut_before_white_space_or_semicoron(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter);
+static char *s_cut_before_block_closer(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter);
+static char *s_cut_before_semicoron(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter);
static void s_add_child_node(SCSSDocPtr_t doc, SCSSNodePtr_t nowNode, SCSSNodePtr_t node);
-static char *s_get_one_selector(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len);
+static char *s_get_one_selector(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter);
static char *s_replace_refstring(SCSSDocPtr_t doc, const char *s);
static void s_get_property_list(SCSSDocPtr_t doc, SCSSNodePtr_t nowNode, const char *s);
-static char *s_cut_url_function(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len);
+static char *s_cut_url_function(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter);
+static void s_default_error_log(void *userData, const char *func, const char *fname, int line, int srcline, char *fmt, ...);
+SCSSParserError_fn scss_parser_error = s_default_error_log;
SCSSDocPtr_t
scss_parser(apr_pool_t *ppool, const char *src)
int len;
SCSSDocPtr_t doc;
apr_size_t pass_len;
+ apr_size_t nl_counter = 1;
doc = s_create_doc(ppool);
while (*s) {
- int pass = scss_ignore_space(src, len);
+ int pass = scss_ignore_space(src, len, &nl_counter);
if (pass) {
s += pass;
continue;
char *value2 = "";
s++;
atnode->type = SCSSTYPE_ATKEYWORD;
- name = apr_psprintf(doc->pool, "@%s", s_cut_ident(doc, s, &pass_len));
+ atnode->line = nl_counter;
+ name = apr_psprintf(doc->pool, "@%s", s_cut_ident(doc, s, &pass_len, &nl_counter));
s += pass_len;
if (strcasecmp(name, "@import") == 0) {
- value1 = scss_trim(doc->pool, s_cut_before_white_space_or_semicoron(doc, s, &pass_len));
- if (scss_starts_with(value1, "url")) {
- value1 = scss_trim(doc->pool, s_cut_url_function(doc, s, &pass_len));
- s += pass_len;
- }
- else {
- s += pass_len + 1;
- }
- if (*s != ';') {
- value2 = scss_trim(doc->pool, s_cut_before_semicoron(doc, s, &pass_len));
- s += pass_len + 1;
+ if (! *s) {
+ /* XXX ERROR XXX */
+ scss_parser_error(doc->userData, __func__,__FILE__,__LINE__,nl_counter,"@import parse error");
+ value1 = apr_pstrdup(doc->pool, "");
+ value2 = apr_pstrdup(doc->pool, "all");
}
else {
- value2 = apr_pstrdup(doc->pool, "all");
+ value1 = scss_trim(doc->pool, s_cut_before_white_space_or_semicoron(doc, s, &pass_len, &nl_counter));
+ if (scss_starts_with(value1, "url")) {
+ value1 = scss_trim(doc->pool, s_cut_url_function(doc, s, &pass_len, &nl_counter));
+ s += pass_len;
+ }
+ else {
+ s += pass_len + 1;
+ }
+ if (*s != ';') {
+ value2 = scss_trim(doc->pool, s_cut_before_semicoron(doc, s, &pass_len, &nl_counter));
+ s += pass_len + 1;
+ }
+ else {
+ value2 = apr_pstrdup(doc->pool, "all");
+ }
}
}
else if (strcasecmp(name, "@media") == 0) {
- value2 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len));
+ value2 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len, &nl_counter));
s += pass_len + 1;
if (*s == '{') {
- value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
+ value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len, &nl_counter));
s += pass_len + 1;
- char *one_selector = s_get_one_selector(doc, value1, &pass_len);
+ char *one_selector = s_get_one_selector(doc, value1, &pass_len, &nl_counter);
while (*one_selector) {
SCSSNodePtr_t selector_node = scss_create_node(doc->pool);
selector_node->type = SCSSTYPE_SELECTOR;
selector_node->name = one_selector;
+ selector_node->line = nl_counter;
value1 += pass_len;
if (*value1 == '{') value1++;
- selector_node->value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, value1, &pass_len));
+ selector_node->value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, value1, &pass_len, &nl_counter));
s_get_property_list(doc, selector_node, selector_node->value1);
s_add_child_node(doc, atnode, selector_node);
value1 += pass_len;
value1 = scss_trim(doc->pool, value1);
if (*value1 == '}') value1++;
- one_selector = s_get_one_selector(doc, value1, &pass_len);
+ one_selector = s_get_one_selector(doc, value1, &pass_len, &nl_counter);
}
}
else {
}
}
else if (strcasecmp(name, "@charset") == 0) {
- value1 = scss_trim(doc->pool, s_cut_before_semicoron(doc, s, &pass_len));
+ value1 = scss_trim(doc->pool, s_cut_before_semicoron(doc, s, &pass_len, &nl_counter));
s += pass_len + 1;
}
else if (strcasecmp(name, "@page") == 0) {
- value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len));
+ value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len, &nl_counter));
s += pass_len + 1;
if (*s == '{') {
- value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
+ value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len, &nl_counter));
s += pass_len + 1;
}
else {
}
}
else if (strcasecmp(name, "@page:first") == 0) {
- value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len));
+ value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len, &nl_counter));
s += pass_len + 1;
if (*s == '{') {
- value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
+ value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len, &nl_counter));
s += pass_len + 1;
}
else {
}
}
else if (strcasecmp(name, "@page:right") == 0) {
- value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len));
+ value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len, &nl_counter));
s += pass_len + 1;
value2 = apr_pstrdup(doc->pool, "right");
if (*s == '{') {
- value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
+ value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len, &nl_counter));
s += pass_len + 1;
}
else {
}
}
else if (strcasecmp(name, "@page:left") == 0) {
- value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len));
+ value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len, &nl_counter));
s += pass_len + 1;
if (*s == '{') {
- value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
+ value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len, &nl_counter));
s += pass_len + 1;
}
else {
}
}
else if (strcasecmp(name, "@font-face") == 0) {
- s_cut_before_next_semicoron_or_block(doc, s, &pass_len);
+ s_cut_before_next_semicoron_or_block(doc, s, &pass_len, &nl_counter);
s += pass_len + 1;
if (*s == '{') {
- value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
+ value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len, &nl_counter));
s += pass_len + 1;
}
else {
}
}
else {
- value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len));
+ value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len, &nl_counter));
s += pass_len + 1;
}
atnode->name = apr_pstrdup(doc->pool, name);
s_add_child_node(doc, doc->rootNode, atnode);
}
else if (! is_white_space(*s)) {
- PASS_COMMENT(s);
- char *one_selector = s_get_one_selector(doc, s, &pass_len);
+ PASS_COMMENT(s, &nl_counter);
+ char *one_selector = s_get_one_selector(doc, s, &pass_len, &nl_counter);
if (*one_selector) {
SCSSNodePtr_t selector_node = scss_create_node(doc->pool);
+ selector_node->line = nl_counter;
selector_node->type = SCSSTYPE_SELECTOR;
selector_node->name = one_selector;
s += pass_len;
if (*s == '{') s++;
- selector_node->value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, s, &pass_len));
+ selector_node->value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, s, &pass_len, &nl_counter));
s_get_property_list(doc, selector_node, selector_node->value1);
s_add_child_node(doc, doc->rootNode, selector_node);
s += pass_len + 1;
static char *
-s_cut_ident(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len)
+s_cut_ident(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter)
{
const char *spos = s;
char *ret;
int npos;
+ apr_size_t counter = 0;
while (*s) {
- PASS_COMMENT(s);
+ if (!is_white_space(*s)) break;
+ if (*s == '\n') (*nl_counter)++;
+ s++;
+ }
+ while (*s) {
+ PASS_COMMENT(s, &counter);
if (is_white_space(*s)) {
break;
}
+ if (*s == ';' || *s == '{' || *s == '}') break;
s++;
}
*pass_len = s - spos;
+ *nl_counter += counter;
+
ret = apr_palloc(doc->pool, *pass_len + 1);
s = spos;
npos = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
if (is_white_space(*s)) {
break;
}
+ if (*s == ';' || *s == '{' || *s == '}') break;
ret[npos++] = *s;
s++;
}
static const char *
-s_pass_comment(const char *s)
+s_pass_comment(const char *s, apr_size_t *nl_counter)
{
+ apr_size_t counter = 0;
while(*s) {
if (*s == '*' && *(s+1) == '/') {
++s;
return ++s;
}
+ if (*s == '\n') counter++;
s++;
}
+ *nl_counter += counter;
return s;
}
static char *
-s_cut_before_next_semicoron_or_block(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len)
+s_cut_before_next_semicoron_or_block(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter)
{
const char *spos = s;
char *ret;
int npos;
int sq, dq;
+ apr_size_t counter = 0;
sq = dq = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
JUDGE_STRINGS(s);
if (!sq && !dq && (*s == '{' || *s == ';')) {
break;
s++;
}
+ *nl_counter += counter;
*pass_len = s - spos - 1;
ret = apr_palloc(doc->pool, *pass_len + 1);
npos = 0;
sq = dq = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
JUDGE_STRINGS(s);
if (!sq && !dq && (*s == '{' || *s == ';')) {
break;
}
static char *
-s_cut_before_block_closer(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len)
+s_cut_before_block_closer(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter)
{
const char *spos = s;
char *ret;
int npos;
int nest = 0;
int dq, sq;
+ apr_size_t counter = 0;
dq = sq = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
JUDGE_STRINGS(s);
if (!sq && !dq && *s == '{') {
nest++;
s++;
}
+ *nl_counter += counter;
*pass_len = s - spos - 1;
ret = apr_palloc(doc->pool, *pass_len + 1);
npos = 0;
dq = sq = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
JUDGE_STRINGS(s);
if (!sq && !dq && *s == '{') {
nest++;
static char *
-s_cut_before_white_space_or_semicoron(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len)
+s_cut_before_white_space_or_semicoron(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter)
{
const char *spos = s;
char *ret;
int npos;
int sq, dq;
+ apr_size_t counter = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
if (! is_white_space(*s)) {
break;
}
dq = sq = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
JUDGE_STRINGS(s);
if (!sq && !dq && is_white_space(*s)) {
break;
s++;
}
+ *nl_counter += counter;
*pass_len = s - spos - 1;
ret = apr_palloc(doc->pool, *pass_len + 1);
npos = 0;
dq = sq = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
if (! is_white_space(*s)) {
break;
}
s++;
}
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
JUDGE_STRINGS(s);
if (!dq && !sq && is_white_space(*s)) {
break;
static char *
-s_cut_before_semicoron(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len)
+s_cut_before_semicoron(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter)
{
const char *spos = s;
char *ret;
int npos;
int sq = 0;
int dq = 0;
+ apr_size_t counter = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
if (! is_white_space(*s)) {
break;
}
}
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
JUDGE_STRINGS(s);
if (*s == ';' && ! dq && ! sq) {
break;
s++;
}
+ *nl_counter += counter;
*pass_len = s - spos - 1;
ret = apr_palloc(doc->pool, *pass_len + 1);
npos = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
if (! is_white_space(*s)) {
break;
}
}
sq = dq = 0;
while (*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
JUDGE_STRINGS(s);
if (! dq && ! sq && *s == ';') {
break;
}
else {
SCSSNodePtr_t sentinelNode = scss_create_node(doc->pool);
+ sentinelNode->type = SCSSTYPE_SENTINEL;
+ sentinelNode->name = apr_pstrdup(doc->pool, "<sentinel>");
nowNode->child = sentinelNode;
list_insert(node, sentinelNode);
}
static char *
-s_get_one_selector(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len)
+s_get_one_selector(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter)
{
const char *spos = s;
char *cand;
int npos;
int dq = 0;
int sq = 0;
+ apr_size_t counter = 0;
while(*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
if (*s == '\\') {
s += 2;
continue;
}
while(*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
JUDGE_STRINGS(s);
if (! sq && !dq && *s == '{') {
break;
}
s++;
}
+ *nl_counter += counter;
*pass_len = s - spos;
+
cand = apr_palloc(doc->pool, *pass_len + 1);
memcpy(cand, spos, *pass_len);
cand[*pass_len] = 0;
static char *
-s_cut_url_function(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len)
+s_cut_url_function(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_size_t *nl_counter)
{
const char *spos = s;
int pcnt = 0;
+ apr_size_t counter = 0;
while(*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
if (*s == '\\') {
s += 2;
continue;
if (! is_white_space(*s)) {
break;
}
+ if (*s == '\n') counter++;
s++;
}
while(*s) {
- PASS_COMMENT(s);
+ PASS_COMMENT(s, &counter);
if (*s == '\\') {
s += 2;
continue;
if (*s == '(') {
pcnt++;
}
+ if (*s == '\n') counter++;
s++;
}
*pass_len = s - spos;
+ *nl_counter += counter;
+
char *ret = apr_palloc(doc->pool, *pass_len + 1);
memcpy(ret, spos, *pass_len);
ret[*pass_len] = 0;
return ret;
}
+
+
+static void
+s_default_error_log(void *userData, const char *func, const char *fname, int line, int srcline, char *fmt, ...)
+{
+ va_list ap;
+ va_start(ap, fmt);
+ fprintf(stderr, "func:[%s] file:[%s] line:[%d] srcline:[%d] ", func, fname, line, srcline);
+ vfprintf(stderr, fmt, ap);
+ va_end(ap);
+ fprintf(stderr, "\n");
+}
--- /dev/null
+#include <CUnit/CUnit.h>
+#include <CUnit/Console.h>
+#include <CUnit/Basic.h>
+#include <stdio.h>
+#include "scss.h"
+
+
+
+void test_import_001();
+void test_import_002();
+void test_import_003();
+/* pend */
+
+int
+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, "@import 001", test_import_001);
+ CU_add_test(atkeyword_suite, "@import 002", test_import_002);
+ CU_add_test(atkeyword_suite, "@import 003", test_import_003);
+ /* aend */
+
+ CU_basic_run_tests();
+ CU_cleanup_registry();
+
+ return(0);
+}
+
+
+void test_import_001()
+{
+#define TEST_STRING "@import"
+ SCSSDocPtr_t doc;
+ apr_pool_t *pool;
+
+ fprintf(stderr, "start %s\n", __func__);
+ apr_initialize();
+ apr_pool_create(&pool, NULL);
+
+ doc = scss_parser(pool, TEST_STRING);
+
+ CU_ASSERT(doc != NULL);
+ CU_ASSERT(doc->rootNode != NULL);
+ CU_ASSERT(doc->rootNode->type == SCSSTYPE_STYLESHEET);
+ CU_ASSERT(doc->rootNode->child != NULL);
+ CU_ASSERT(doc->rootNode->child->name != NULL);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->name, "<sentinel>") == 0);
+ CU_ASSERT(doc->rootNode->child->next != NULL);
+ CU_ASSERT(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
+ CU_ASSERT(doc->rootNode->child->next->name != NULL);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->name, "@import") == 0);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->value1, "") == 0);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->value2, "all") == 0);
+ CU_ASSERT(doc->rootNode->child->next->next == doc->rootNode->child);
+ CU_ASSERT(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
+ CU_ASSERT(doc->rootNode->child->next->child == NULL);
+
+
+ apr_terminate();
+ fprintf(stderr, "end %s\n", __func__);
+#undef TEST_STRING
+}
+void test_import_002()
+{
+#define TEST_STRING "@import@import"
+ SCSSDocPtr_t doc;
+ apr_pool_t *pool;
+
+ fprintf(stderr, "start %s\n", __func__);
+ apr_initialize();
+ apr_pool_create(&pool, NULL);
+
+ doc = scss_parser(pool, TEST_STRING);
+
+ CU_ASSERT(doc != NULL);
+ CU_ASSERT(doc->rootNode != NULL);
+ CU_ASSERT(doc->rootNode->type == SCSSTYPE_STYLESHEET);
+ CU_ASSERT(doc->rootNode->child != NULL);
+ CU_ASSERT(doc->rootNode->child->name != NULL);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->name, "<sentinel>") == 0);
+ CU_ASSERT(doc->rootNode->child->next != NULL);
+ CU_ASSERT(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
+ CU_ASSERT(doc->rootNode->child->next->name != NULL);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->name, "@import@import") == 0);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->value1, "") == 0);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->value2, "") == 0);
+ CU_ASSERT(doc->rootNode->child->next->next == doc->rootNode->child);
+ CU_ASSERT(doc->rootNode->child->next->ref == &doc->rootNode->child->next);
+ CU_ASSERT(doc->rootNode->child->next->child == NULL);
+
+
+ apr_terminate();
+ fprintf(stderr, "end %s\n", __func__);
+#undef TEST_STRING
+}
+void test_import_003()
+{
+#define TEST_STRING "@import;@import"
+ SCSSDocPtr_t doc;
+ apr_pool_t *pool;
+
+ fprintf(stderr, "start %s\n", __func__);
+ apr_initialize();
+ apr_pool_create(&pool, NULL);
+
+ doc = scss_parser(pool, TEST_STRING);
+
+ CU_ASSERT(doc != NULL);
+ CU_ASSERT(doc->rootNode != NULL);
+ CU_ASSERT(doc->rootNode->type == SCSSTYPE_STYLESHEET);
+ CU_ASSERT(doc->rootNode->child != NULL);
+ CU_ASSERT(doc->rootNode->child->name != NULL);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->name, "<sentinel>") == 0);
+ CU_ASSERT(doc->rootNode->child->next != NULL);
+ CU_ASSERT(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD);
+ CU_ASSERT(doc->rootNode->child->next->name != NULL);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->name, "@import") == 0);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->value1, "") == 0);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->value2, "all") == 0);
+ CU_ASSERT(doc->rootNode->child->next->next != NULL);
+ CU_ASSERT(doc->rootNode->child->next->next->type == SCSSTYPE_ATKEYWORD);
+ CU_ASSERT(doc->rootNode->child->next->next->name != NULL);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->next->name, "@import") == 0);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->next->value1, "") == 0);
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->next->value2, "all") == 0);
+
+
+ apr_terminate();
+ fprintf(stderr, "end %s\n", __func__);
+#undef TEST_STRING
+}
+/*
+ * vim:ts=2 et
+ */