OSDN Git Service

* Changed error_log interface.
authorkonn <konn@1a406e8e-add9-4483-a2c8-d8cac5b7c224>
Wed, 2 Jul 2008 18:03:29 +0000 (18:03 +0000)
committerkonn <konn@1a406e8e-add9-4483-a2c8-d8cac5b7c224>
Wed, 2 Jul 2008 18:03:29 +0000 (18:03 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/branches/sandbox@2781 1a406e8e-add9-4483-a2c8-d8cac5b7c224

src/css/include/scss.h
src/css/include/scss_sac.h
src/css/src/ignore_sp.c
src/css/src/main.c
src/css/src/sac.c
src/css/test/unit/import/test_import.c

index 2e3b0c6..ada5e4e 100644 (file)
@@ -43,7 +43,7 @@ struct _SCSSDoc_t {
 
 #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, ...);
 
 
 
@@ -77,4 +77,12 @@ extern SCSSParserError_fn scss_parser_error;
  * @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
index d57db60..69296af 100644 (file)
@@ -25,7 +25,6 @@ typedef struct _SCSSSACHandler_t *SCSSSACHandlerPtr_t;
 struct _SCSSParser_t {
   SCSSDocPtr_t        doc;
   SCSSSACHandlerPtr_t handler;
-  void                *userData;
 };
 
 
@@ -87,4 +86,22 @@ extern const char *scss_get_perser_version(SCSSParserPtr_t parser);
  * 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
index 7939e03..2176fcb 100644 (file)
@@ -24,6 +24,7 @@ scss_ignore_space(const char *s, int len, apr_size_t *nl_counter)
 {
   register int ii;
   register char *sp;
+  apr_size_t counter = 0;
 
   if (! s) 
     return 0;
@@ -31,11 +32,14 @@ scss_ignore_space(const char *s, int len, apr_size_t *nl_counter)
     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);
 }
 /*
index f585b82..8032e87 100644 (file)
@@ -84,7 +84,7 @@ static char *s_get_one_selector(SCSSDocPtr_t doc, const char *s, apr_size_t *pas
 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;
 
@@ -103,7 +103,7 @@ scss_parser(SCSSDocPtr_t doc, apr_pool_t *ppool,  const char *src)
 
   
   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;
@@ -121,7 +121,7 @@ scss_parser(SCSSDocPtr_t doc, apr_pool_t *ppool,  const char *src)
       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");
         }
@@ -589,7 +589,7 @@ s_get_one_selector(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_si
     }
     s++;
   }
-  *nl_counter += counter;
+  *nl_counter = counter + *nl_counter;
   *pass_len = s - spos;
 
   cand = apr_palloc(doc->pool, *pass_len + 1);
@@ -736,6 +736,7 @@ s_cut_url_function(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_si
   int pcnt = 0;
   apr_size_t counter = 0;
 
+  counter = *nl_counter;
   while(*s) {
     PASS_COMMENT(s, &counter);
     if (*s == '\\') {
@@ -770,7 +771,7 @@ s_cut_url_function(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_si
   }
 
   *pass_len = s - spos;
-  *nl_counter += counter;
+  *nl_counter = counter;
 
   char *ret = apr_palloc(doc->pool, *pass_len + 1);
   memcpy(ret, spos, *pass_len);
@@ -780,12 +781,18 @@ s_cut_url_function(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len, apr_si
 
 
 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;
+}
index 332fc81..63ca111 100644 (file)
@@ -310,6 +310,25 @@ s_get_selectors_list(apr_pool_t *pool, const char *src)
   }
   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
  */
index 66627b8..cb486b3 100644 (file)
@@ -5,10 +5,14 @@
 #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
@@ -20,6 +24,8 @@ main()
   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();
@@ -134,6 +140,81 @@ void test_import_003()
   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
  */