#include "scss_sac.h"
-typedef void (*SCSSParserError_fn)(void *userData, const char *func, const char *fname, int line, int srcline, char *fmt, ...);
+typedef void (*SCSSParserError_fn)(void *userData, const char *func, const char *fname, int line, const char *src, int srcline, char *fmt, ...);
* @return SCSSDoc_t object.
*/
extern SCSSDocPtr_t scss_create_doc(apr_pool_t *pool);
+
+/**
+ * set user data.
+ *
+ * @param doc - SCSSDoc Object.
+ * @param userData - user's data.
+ */
+extern void scss_doc_set_user_data(SCSSDocPtr_t doc, void *userData);
#endif
struct _SCSSParser_t {
SCSSDocPtr_t doc;
SCSSSACHandlerPtr_t handler;
- void *userData;
};
* do parse.
*/
extern int scss_parse_stylesheet(SCSSParserPtr_t parser);
+
+
+/**
+ * get user's data.
+ *
+ * @param parser - SCSSParser_t Object.
+ * @return user's data if any.
+ */
+extern void *scss_get_user_data(SCSSParserPtr_t parser);
+
+
+/**
+ * set user's data.
+ *
+ * @param parser - SCSSParser_t Object.
+ * @param userData - user's data.
+ */
+extern void scss_set_user_data(SCSSParserPtr_t parser, void *userData);
#endif
{
register int ii;
register char *sp;
+ apr_size_t counter = 0;
if (! s)
return 0;
return 0;
sp = (char *)s;
+ counter = *nl_counter;
+
for(ii=0;
*sp && is_white_space(*sp) && ii<len;
ii++, sp++)
- if (*sp == '\n') (*nl_counter)++;
+ if (*sp == '\n') counter++;
+ *nl_counter = counter;
return (sp - s);
}
/*
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, 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, ...);
+static void s_default_error_log(void *userData, const char *func, const char *fname, int line, const char *src, int srcline, char *fmt, ...);
SCSSParserError_fn scss_parser_error = s_default_error_log;
while (*s) {
- int pass = scss_ignore_space(src, len, &nl_counter);
+ int pass = scss_ignore_space(s, len, &nl_counter);
if (pass) {
s += pass;
continue;
if (strcasecmp(name, "@import") == 0) {
if (! *s) {
/* XXX ERROR XXX */
- scss_parser_error(doc->userData, __func__,__FILE__,__LINE__,nl_counter,"@import parse error");
+ scss_parser_error(doc->userData, __func__,__FILE__,__LINE__,(s - pass_len - 1), nl_counter ,"@import parse error");
value1 = apr_pstrdup(doc->pool, "");
value2 = apr_pstrdup(doc->pool, "all");
}
}
s++;
}
- *nl_counter += counter;
+ *nl_counter = counter + *nl_counter;
*pass_len = s - spos;
cand = apr_palloc(doc->pool, *pass_len + 1);
int pcnt = 0;
apr_size_t counter = 0;
+ counter = *nl_counter;
while(*s) {
PASS_COMMENT(s, &counter);
if (*s == '\\') {
}
*pass_len = s - spos;
- *nl_counter += counter;
+ *nl_counter = counter;
char *ret = apr_palloc(doc->pool, *pass_len + 1);
memcpy(ret, spos, *pass_len);
static void
-s_default_error_log(void *userData, const char *func, const char *fname, int line, int srcline, char *fmt, ...)
+s_default_error_log(void *userData, const char *func, const char *fname, int line, const char *src, 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);
+ fprintf(stderr, "func:[%s] file:[%s] line:[%d] src:[%.*s] srcline:[%d]", func, fname, line, 10, src, srcline);
vfprintf(stderr, fmt, ap);
va_end(ap);
fprintf(stderr, "\n");
}
+
+void
+scss_doc_set_user_data(SCSSDocPtr_t doc, void *userData)
+{
+ doc->userData = userData;
+}
}
return headNode;
}
+
+
+void *
+scss_get_user_data(SCSSParserPtr_t parser)
+{
+ if (parser->doc) {
+ return parser->doc->userData;
+ }
+ return NULL;
+}
+
+
+void
+scss_set_user_data(SCSSParserPtr_t parser, void *userData)
+{
+ if (parser->doc) {
+ parser->doc->userData = userData;
+ }
+}
/*
* vim:ts=2 et
*/
#include "scss.h"
+#define CU_ASSERT_OR_GOTO_END(X) { CU_ASSERT((X)); if (CU_get_number_of_failures() != 0) goto end; }
+
void test_import_001();
void test_import_002();
void test_import_003();
+void test_import_004();
+void test_import_005();
/* pend */
int
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);
+ CU_add_test(atkeyword_suite, "@import 004", test_import_004);
+ CU_add_test(atkeyword_suite, "@import 005", test_import_005);
/* aend */
CU_basic_run_tests();
fprintf(stderr, "end %s\n", __func__);
#undef TEST_STRING
}
+void test_import_004()
+{
+#define TEST_STRING "@import\n;@import"
+ 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(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
+}
+void test_import_005()
+{
+#define TEST_STRING "\n\n@import\n/*abc*/abc /*abc*/all;\n@import"
+ 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(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(doc->rootNode->child->next != NULL); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(doc->rootNode->child->next->type == SCSSTYPE_ATKEYWORD); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(doc->rootNode->child->next->name != NULL); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->name, "@import") == 0); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->value1, "abc") == 0); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->value2, "all") == 0); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(doc->rootNode->child->next->next != NULL); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(doc->rootNode->child->next->next->type == SCSSTYPE_ATKEYWORD); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(doc->rootNode->child->next->next->name != NULL); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->next->name, "@import") == 0); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->next->value1, "") == 0); if (CU_get_number_of_failures() != 0) goto end;
+ CU_ASSERT(strcasecmp(doc->rootNode->child->next->next->value2, "all") == 0); if (CU_get_number_of_failures() != 0) goto end;
+
+
+end:
+ apr_terminate();
+ fprintf(stderr, "end %s\n", __func__);
+#undef TEST_STRING
+}
/*
* vim:ts=2 et
*/