OSDN Git Service

* Added Simple SAC interface.
authorkonn <konn@1a406e8e-add9-4483-a2c8-d8cac5b7c224>
Tue, 1 Jul 2008 17:07:02 +0000 (17:07 +0000)
committerkonn <konn@1a406e8e-add9-4483-a2c8-d8cac5b7c224>
Tue, 1 Jul 2008 17:07:02 +0000 (17:07 +0000)
git-svn-id: svn+ssh://svn.sourceforge.jp/svnroot/modchxj/mod_chxj/branches/sandbox@2777 1a406e8e-add9-4483-a2c8-d8cac5b7c224

13 files changed:
src/css/include/scss.h
src/css/include/scss_node.h [new file with mode: 0644]
src/css/include/scss_sac.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/create_node.c [new file with mode: 0644]
src/css/src/main.c
src/css/src/sac.c [new file with mode: 0644]
src/css/src/trim.c [new file with mode: 0644]
src/css/test/Makefile
src/css/test/example-1.c

index bae0e29..1d2223a 100644 (file)
@@ -1,39 +1,31 @@
-
+/*
+ * 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_H__)
 #define __SCSS_H__
 
 #include "apr_pools.h"
 #include "apr_strings.h"
+#include "scss_node.h"
 
 #define ROOT_NODE_SIGNATURE "<rootNode>"
 
 typedef struct _SCSSDoc_t SCSSDoc_t;
 typedef SCSSDoc_t *SCSSDocPtr_t;
 
-
-
-typedef enum _SCSSType_t SCSSType_t;
-enum _SCSSType_t {
-  SCSSTYPE_STYLESHEET = 0,
-  SCSSTYPE_ATKEYWORD = 1,
-  SCSSTYPE_SELECTOR,
-  SCSSTYPE_PROPERTY,
-};
-
-
-typedef struct _SCSSNode_t SCSSNode_t;
-typedef SCSSNode_t *SCSSNodePtr_t;
-
-struct _SCSSNode_t {
-  SCSSType_t type; 
-  SCSSNodePtr_t next;
-  SCSSNodePtr_t *ref;
-  SCSSNodePtr_t child;
-  char *name;
-  char *value1;
-  char *value2;
-};
-
 struct _SCSSDoc_t {
   apr_pool_t *pool;
   SCSSNodePtr_t rootNode;
@@ -46,6 +38,8 @@ struct _SCSSDoc_t {
 #define IS_PROPERTY(X)   ((X)->type == SCSSTYPE_PROPERTY  )
 
 
+#include "scss_sac.h"
+
 /**
  * for DEBUG. dump Node tree.
  *
diff --git a/src/css/include/scss_node.h b/src/css/include/scss_node.h
new file mode 100644 (file)
index 0000000..49e050f
--- /dev/null
@@ -0,0 +1,51 @@
+/*
+ * 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_NODE_H__)
+#define __SCSS_NODE_H__
+
+#include "apr_pools.h"
+
+typedef enum _SCSSType_t SCSSType_t;
+enum _SCSSType_t {
+  SCSSTYPE_STYLESHEET = 0,
+  SCSSTYPE_ATKEYWORD = 1,
+  SCSSTYPE_SELECTOR,
+  SCSSTYPE_PROPERTY,
+};
+
+
+typedef struct _SCSSNode_t SCSSNode_t;
+typedef SCSSNode_t *SCSSNodePtr_t;
+
+struct _SCSSNode_t {
+  SCSSType_t type;
+  SCSSNodePtr_t next;
+  SCSSNodePtr_t *ref;
+  SCSSNodePtr_t child;
+  char *name;
+  char *value1;
+  char *value2;
+};
+
+/**
+ * create new node.
+ *
+ * @param pool - use pool object.
+ * @return SCSSNode Object.
+ */
+extern SCSSNodePtr_t scss_create_node(apr_pool_t *pool);
+#endif
diff --git a/src/css/include/scss_sac.h b/src/css/include/scss_sac.h
new file mode 100644 (file)
index 0000000..d57db60
--- /dev/null
@@ -0,0 +1,90 @@
+/*
+ * 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_SAC_H__)
+#define __SCSS_SAC_H__
+
+typedef struct _SCSSParser_t SCSSParser_t;
+typedef struct _SCSSParser_t *SCSSParserPtr_t;
+typedef struct _SCSSSACHandler_t SCSSSACHandler_t;
+typedef struct _SCSSSACHandler_t *SCSSSACHandlerPtr_t;
+
+struct _SCSSParser_t {
+  SCSSDocPtr_t        doc;
+  SCSSSACHandlerPtr_t handler;
+  void                *userData;
+};
+
+
+#define MEDIA_TYPE_NUM   (10)
+
+typedef void (*SCSSSAC_import_fn)(SCSSParserPtr_t parser, 
+                 const char *uri,
+                 const char **media,
+                 const char *defaultNamespaceURI);
+
+typedef void (*SCSSSAC_startDocument_fn)(SCSSParserPtr_t parser);
+typedef void (*SCSSSAC_endDocument_fn)(SCSSParserPtr_t parser);
+typedef void (*SCSSSAC_startMedia_fn)(SCSSParserPtr_t parser, const char **media);
+typedef void (*SCSSSAC_endMedia_fn)(SCSSParserPtr_t parser, const char **media);
+typedef void (*SCSSSAC_startPage_fn)(SCSSParserPtr_t parser, const char *name, const char *pseudoPage);
+typedef void (*SCSSSAC_endPage_fn)(SCSSParserPtr_t parser, const char *name, const char *pseudoPage);
+typedef void (*SCSSSAC_startFontFace_fn)(SCSSParserPtr_t parser);
+typedef void (*SCSSSAC_endFontFace_fn)(SCSSParserPtr_t parser);
+typedef void (*SCSSSAC_startSelector_fn)(SCSSParserPtr_t parser, SCSSNodePtr_t selectors);
+typedef void (*SCSSSAC_endSelector_fn)(SCSSParserPtr_t parser, SCSSNodePtr_t selectors);
+typedef void (*SCSSSAC_property_fn)(SCSSParserPtr_t parser, const char *propertyName, const char *value, int impotant);
+
+/**
+ * SAC Handlers.
+ */
+struct _SCSSSACHandler_t {
+  SCSSSAC_startDocument_fn startDocument;
+  SCSSSAC_endDocument_fn   endDocument;
+  SCSSSAC_import_fn        import;
+  SCSSSAC_startMedia_fn    startMedia;
+  SCSSSAC_endMedia_fn      endMedia;
+  SCSSSAC_startPage_fn     startPage;
+  SCSSSAC_endPage_fn       endPage;
+  SCSSSAC_startFontFace_fn startFontFace;
+  SCSSSAC_endFontFace_fn   endFontFace;
+  SCSSSAC_startSelector_fn startSelector;
+  SCSSSAC_endSelector_fn   endSelector;
+  SCSSSAC_property_fn      property;
+};
+
+
+/**
+ * create SAC Parser from buffer.
+ *
+ * @param pool - parent pool.
+ * @param buf - buffer (CSS data).
+ * @param defaultEncoding - encoding(see iconv)
+ */
+extern SCSSParserPtr_t scss_parser_new_from_buf(apr_pool_t *pool, const char *buf, char *defaultEncoding);
+
+/**
+ * create new SAC Handler.
+ */
+extern SCSSSACHandlerPtr_t scss_doc_handler_new(SCSSParserPtr_t parser);
+
+extern const char *scss_get_perser_version(SCSSParserPtr_t parser);
+
+/**
+ * do parse.
+ */
+extern int scss_parse_stylesheet(SCSSParserPtr_t parser);
+#endif
index f786c47..f3587dc 100644 (file)
@@ -17,6 +17,8 @@
 #if !defined(__SCSS_STRING_H__)
 #define __SCSS_STRING_H__
 
+#include "apr_pools.h"
+
 /**
  * Count white-space.
  * @param str       strings.
@@ -37,6 +39,18 @@ extern int scss_starts_with(const char *s, const char *w);
  */
 extern int scss_ignore_space(const char *s, int len);
 
+/**
+ * trim string.
+ *
+ * @param pool - use pool object.
+ * @param s    - target string.
+ * @return trimed string.
+ */
+extern char *scss_trim(apr_pool_t *pool, const char *s);
+
+
+
+
 #if !defined is_white_space
 #define is_white_space(c)   (' '  == (unsigned char)(c&0xff)  \
                           || '\t' == (unsigned char)(c&0xff)  \
index 6c2099e..cbb5796 100644 (file)
@@ -53,7 +53,8 @@ libLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(lib_LTLIBRARIES)
 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-starts_with.lo libscss_la-dump_nodes.lo \
+       libscss_la-sac.lo libscss_la-trim.lo libscss_la-create_node.lo
 libscss_la_OBJECTS = $(am_libscss_la_OBJECTS)
 libscss_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libscss_la_CFLAGS) \
@@ -192,7 +193,10 @@ top_srcdir = ..
 libscss_la_SOURCES = main.c \
   ignore_sp.c \
   starts_with.c  \
-  dump_nodes.c
+  dump_nodes.c \
+  sac.c \
+  trim.c \
+  create_node.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 
@@ -266,10 +270,13 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
+include ./$(DEPDIR)/libscss_la-create_node.Plo
 include ./$(DEPDIR)/libscss_la-dump_nodes.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-trim.Plo
 
 .c.o:
        $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -320,6 +327,27 @@ libscss_la-dump_nodes.lo: dump_nodes.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-dump_nodes.lo `test -f 'dump_nodes.c' || echo '$(srcdir)/'`dump_nodes.c
 
+libscss_la-sac.lo: sac.c
+       $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -MT libscss_la-sac.lo -MD -MP -MF $(DEPDIR)/libscss_la-sac.Tpo -c -o libscss_la-sac.lo `test -f 'sac.c' || echo '$(srcdir)/'`sac.c
+       mv -f $(DEPDIR)/libscss_la-sac.Tpo $(DEPDIR)/libscss_la-sac.Plo
+#      source='sac.c' object='libscss_la-sac.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-sac.lo `test -f 'sac.c' || echo '$(srcdir)/'`sac.c
+
+libscss_la-trim.lo: trim.c
+       $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -MT libscss_la-trim.lo -MD -MP -MF $(DEPDIR)/libscss_la-trim.Tpo -c -o libscss_la-trim.lo `test -f 'trim.c' || echo '$(srcdir)/'`trim.c
+       mv -f $(DEPDIR)/libscss_la-trim.Tpo $(DEPDIR)/libscss_la-trim.Plo
+#      source='trim.c' object='libscss_la-trim.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-trim.lo `test -f 'trim.c' || echo '$(srcdir)/'`trim.c
+
+libscss_la-create_node.lo: create_node.c
+       $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libscss_la_CFLAGS) $(CFLAGS) -MT libscss_la-create_node.lo -MD -MP -MF $(DEPDIR)/libscss_la-create_node.Tpo -c -o libscss_la-create_node.lo `test -f 'create_node.c' || echo '$(srcdir)/'`create_node.c
+       mv -f $(DEPDIR)/libscss_la-create_node.Tpo $(DEPDIR)/libscss_la-create_node.Plo
+#      source='create_node.c' object='libscss_la-create_node.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-create_node.lo `test -f 'create_node.c' || echo '$(srcdir)/'`create_node.c
+
 mostlyclean-libtool:
        -rm -f *.lo
 
@@ -508,7 +536,6 @@ uninstall-am: uninstall-libLTLIBRARIES
 clean:
        rm -fr .libs
        rm -f *.o *.lo *.la
-       rm -rf .deps
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
index 2056b59..81b8553 100644 (file)
@@ -1,7 +1,10 @@
 libscss_la_SOURCES = main.c \
   ignore_sp.c \
   starts_with.c  \
-  dump_nodes.c
+  dump_nodes.c \
+  sac.c \
+  trim.c \
+  create_node.c
 
 libscss_la_CFLAGS = -O2 -prefer-pic -I. -I../include -I./serf
 AM_CFLAGS = @CFLAGS@ -O2 -prefer-pic -I. -I../include 
@@ -12,4 +15,3 @@ lib_LTLIBRARIES = libscss.la
 clean:
        rm -fr .libs
        rm -f *.o *.lo *.la
-       rm -rf .deps
index 5acbf7f..6a08b4d 100644 (file)
@@ -53,7 +53,8 @@ libLTLIBRARIES_INSTALL = $(INSTALL)
 LTLIBRARIES = $(lib_LTLIBRARIES)
 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-starts_with.lo libscss_la-dump_nodes.lo \
+       libscss_la-sac.lo libscss_la-trim.lo libscss_la-create_node.lo
 libscss_la_OBJECTS = $(am_libscss_la_OBJECTS)
 libscss_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
        $(LIBTOOLFLAGS) --mode=link $(CCLD) $(libscss_la_CFLAGS) \
@@ -192,7 +193,10 @@ top_srcdir = @top_srcdir@
 libscss_la_SOURCES = main.c \
   ignore_sp.c \
   starts_with.c  \
-  dump_nodes.c
+  dump_nodes.c \
+  sac.c \
+  trim.c \
+  create_node.c
 
 libscss_la_CFLAGS = -O2 -prefer-pic -I. -I../include -I./serf
 AM_CFLAGS = @CFLAGS@ -O2 -prefer-pic -I. -I../include 
@@ -266,10 +270,13 @@ mostlyclean-compile:
 distclean-compile:
        -rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libscss_la-create_node.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-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-trim.Plo@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@   $(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -320,6 +327,27 @@ libscss_la-dump_nodes.lo: dump_nodes.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-dump_nodes.lo `test -f 'dump_nodes.c' || echo '$(srcdir)/'`dump_nodes.c
 
+libscss_la-sac.lo: sac.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-sac.lo -MD -MP -MF $(DEPDIR)/libscss_la-sac.Tpo -c -o libscss_la-sac.lo `test -f 'sac.c' || echo '$(srcdir)/'`sac.c
+@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/libscss_la-sac.Tpo $(DEPDIR)/libscss_la-sac.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='sac.c' object='libscss_la-sac.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-sac.lo `test -f 'sac.c' || echo '$(srcdir)/'`sac.c
+
+libscss_la-trim.lo: trim.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-trim.lo -MD -MP -MF $(DEPDIR)/libscss_la-trim.Tpo -c -o libscss_la-trim.lo `test -f 'trim.c' || echo '$(srcdir)/'`trim.c
+@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/libscss_la-trim.Tpo $(DEPDIR)/libscss_la-trim.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='trim.c' object='libscss_la-trim.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-trim.lo `test -f 'trim.c' || echo '$(srcdir)/'`trim.c
+
+libscss_la-create_node.lo: create_node.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-create_node.lo -MD -MP -MF $(DEPDIR)/libscss_la-create_node.Tpo -c -o libscss_la-create_node.lo `test -f 'create_node.c' || echo '$(srcdir)/'`create_node.c
+@am__fastdepCC_TRUE@   mv -f $(DEPDIR)/libscss_la-create_node.Tpo $(DEPDIR)/libscss_la-create_node.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@      source='create_node.c' object='libscss_la-create_node.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-create_node.lo `test -f 'create_node.c' || echo '$(srcdir)/'`create_node.c
+
 mostlyclean-libtool:
        -rm -f *.lo
 
@@ -508,7 +536,6 @@ uninstall-am: uninstall-libLTLIBRARIES
 clean:
        rm -fr .libs
        rm -f *.o *.lo *.la
-       rm -rf .deps
 # Tell versions [3.59,3.63) of GNU make to not export all variables.
 # Otherwise a system limit (for SysV at least) may be exceeded.
 .NOEXPORT:
diff --git a/src/css/src/create_node.c b/src/css/src/create_node.c
new file mode 100644 (file)
index 0000000..78bd6a0
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * 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_node.h"
+
+SCSSNodePtr_t
+scss_create_node(apr_pool_t *pool)
+{
+  SCSSNodePtr_t node;
+  node = apr_palloc(pool, sizeof(SCSSNode_t));
+
+  node->type      = SCSSTYPE_STYLESHEET; 
+  node->next      = node;
+  node->ref       = &node->next;
+  node->child     = NULL;
+  node->name      = NULL;
+  node->value1    = NULL;
+  node->value2    = NULL;
+
+  return node;
+}
+/*
+ * vim:ts=2 et
+ */
index 097eb43..673c281 100644 (file)
     }                     
 
 static SCSSDocPtr_t s_create_doc(apr_pool_t *ppool);
-static SCSSNodePtr_t s_create_node(apr_pool_t *pool);
 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_trim(SCSSDocPtr_t doc, const char *s);
 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_replace_refstring(SCSSDocPtr_t doc, const char *s);
@@ -96,7 +94,7 @@ scss_parser(apr_pool_t *ppool,  const char *src)
       continue;
     }
     if (*s == '@') {
-      SCSSNodePtr_t atnode = s_create_node(doc->pool);
+      SCSSNodePtr_t atnode = scss_create_node(doc->pool);
       char *name;
       char *value1 = "";
       char *value2 = "";
@@ -105,16 +103,16 @@ scss_parser(apr_pool_t *ppool,  const char *src)
       name  = apr_psprintf(doc->pool, "@%s", s_cut_ident(doc, s, &pass_len));
       s += pass_len;
       if (strcasecmp(name, "@import") == 0) {
-        value1 = s_trim(doc, s_cut_before_white_space_or_semicoron(doc, s, &pass_len));
+        value1 = scss_trim(doc->pool, s_cut_before_white_space_or_semicoron(doc, s, &pass_len));
         if (scss_starts_with(value1, "url")) {
-          value1 = s_trim(doc, s_cut_url_function(doc, s, &pass_len));
+          value1 = scss_trim(doc->pool, s_cut_url_function(doc, s, &pass_len));
           s += pass_len;
         }
         else {
           s += pass_len + 1;
         }
         if (*s != ';') {
-          value2 = s_trim(doc, s_cut_before_semicoron(doc, s, &pass_len));
+          value2 = scss_trim(doc->pool, s_cut_before_semicoron(doc, s, &pass_len));
           s += pass_len + 1;
         }
         else {
@@ -122,19 +120,26 @@ scss_parser(apr_pool_t *ppool,  const char *src)
         }
       }
       else if (strcasecmp(name, "@media") == 0) {
-        value2 = s_trim(doc, 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));
         s += pass_len + 1;
         if (*s == '{') {
-          value1 = s_trim(doc, s_cut_before_block_closer(doc, ++s, &pass_len));
+          value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
           s += pass_len + 1;
-          SCSSNodePtr_t selector_node = s_create_node(doc->pool);
-          selector_node->type = SCSSTYPE_SELECTOR;
-          selector_node->name = s_get_one_selector(doc, value1, &pass_len);
-          value1 += pass_len;
-          if (*value1 == '{') value1++;
-          selector_node->value1 = s_trim(doc, s_cut_before_block_closer(doc, value1, &pass_len));
-          s_get_property_list(doc, selector_node, selector_node->value1);
-          s_add_child_node(doc, atnode, selector_node);
+          char *one_selector = s_get_one_selector(doc, value1, &pass_len);
+          while (*one_selector) {
+            SCSSNodePtr_t selector_node = scss_create_node(doc->pool);
+            selector_node->type = SCSSTYPE_SELECTOR;
+            selector_node->name = one_selector;
+            value1 += pass_len;
+            if (*value1 == '{') value1++;
+            selector_node->value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, value1, &pass_len));
+            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);
+          }
         }
         else {
           /* ERROR */
@@ -144,14 +149,57 @@ scss_parser(apr_pool_t *ppool,  const char *src)
         }
       }
       else if (strcasecmp(name, "@charset") == 0) {
-        value1 = s_trim(doc, s_cut_before_semicoron(doc, s, &pass_len));
+        value1 = scss_trim(doc->pool, s_cut_before_semicoron(doc, s, &pass_len));
         s += pass_len + 1;
       }
       else if (strcasecmp(name, "@page") == 0) {
-        value2 = s_trim(doc, 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));
         s += pass_len + 1;
         if (*s == '{') {
-          value1 = s_trim(doc, s_cut_before_block_closer(doc, ++s, &pass_len));
+          value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
+          s += pass_len + 1;
+        }
+        else {
+          /* ERROR */
+          value2 = "";
+          value1 = "";
+          name   = "";
+        }
+      }
+      else if (strcasecmp(name, "@page:first") == 0) {
+        value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len));
+        s += pass_len + 1;
+        if (*s == '{') {
+          value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
+          s += pass_len + 1;
+        }
+        else {
+          /* ERROR */
+          value2 = "";
+          value1 = "";
+          name   = "";
+        }
+      }
+      else if (strcasecmp(name, "@page:right") == 0) {
+        value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len));
+        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));
+          s += pass_len + 1;
+        }
+        else {
+          /* ERROR */
+          value2 = "";
+          value1 = "";
+          name   = "";
+        }
+      }
+      else if (strcasecmp(name, "@page:left") == 0) {
+        value1 = scss_trim(doc->pool, s_cut_before_next_semicoron_or_block(doc, s, &pass_len));
+        s += pass_len + 1;
+        if (*s == '{') {
+          value2 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
           s += pass_len + 1;
         }
         else {
@@ -165,7 +213,7 @@ scss_parser(apr_pool_t *ppool,  const char *src)
         s_cut_before_next_semicoron_or_block(doc, s, &pass_len);
         s += pass_len + 1;
         if (*s == '{') {
-          value1 = s_trim(doc, s_cut_before_block_closer(doc, ++s, &pass_len));
+          value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, ++s, &pass_len));
           s += pass_len + 1;
         }
         else {
@@ -176,7 +224,7 @@ scss_parser(apr_pool_t *ppool,  const char *src)
         }
       }
       else {
-        value1 = s_trim(doc, 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));
         s += pass_len + 1;
       }
       atnode->name = apr_pstrdup(doc->pool, name);
@@ -185,16 +233,18 @@ scss_parser(apr_pool_t *ppool,  const char *src)
       s_add_child_node(doc, doc->rootNode, atnode);
     }
     else if (! is_white_space(*s)) {
-      SCSSNodePtr_t selector_node = s_create_node(doc->pool);
-      /* selector */
-      selector_node->type = SCSSTYPE_SELECTOR;
-      selector_node->name = s_get_one_selector(doc, s, &pass_len);
-      s += pass_len;
-      if (*s == '{') s++;
-      selector_node->value1 = s_trim(doc, s_cut_before_block_closer(doc, s, &pass_len));
-      s_get_property_list(doc, selector_node, selector_node->value1);
-      s_add_child_node(doc, doc->rootNode, selector_node);
-      s += pass_len + 1;
+      char *one_selector = s_get_one_selector(doc, s, &pass_len);
+      if (*one_selector) {
+        SCSSNodePtr_t selector_node = scss_create_node(doc->pool);
+        selector_node->type = SCSSTYPE_SELECTOR;
+        selector_node->name = s_get_one_selector(doc, s, &pass_len);
+        s += pass_len;
+        if (*s == '{') s++;
+        selector_node->value1 = scss_trim(doc->pool, s_cut_before_block_closer(doc, s, &pass_len));
+        s_get_property_list(doc, selector_node, selector_node->value1);
+        s_add_child_node(doc, doc->rootNode, selector_node);
+        s += pass_len + 1;
+      }
     }
     s++;
   }
@@ -230,24 +280,6 @@ s_create_doc(apr_pool_t *ppool)
 }
 
 
-static SCSSNodePtr_t
-s_create_node(apr_pool_t *pool)
-{
-  SCSSNodePtr_t node;
-  node = apr_palloc(pool, sizeof(SCSSNode_t));
-
-  node->type      = SCSSTYPE_STYLESHEET; 
-  node->next      = node;
-  node->ref       = &node->next;
-  node->child     = NULL;
-  node->name      = NULL;
-  node->value1    = NULL;
-  node->value2    = NULL;
-
-  return node;
-}
-
-
 static char *
 s_cut_ident(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len)
 {
@@ -498,7 +530,7 @@ s_add_child_node(SCSSDocPtr_t doc, SCSSNodePtr_t nowNode, SCSSNodePtr_t node)
     list_insert(node, nowNode->child);
   }
   else {
-    SCSSNodePtr_t sentinelNode = s_create_node(doc->pool);
+    SCSSNodePtr_t sentinelNode = scss_create_node(doc->pool);
     nowNode->child = sentinelNode;
     list_insert(node, sentinelNode);
   }
@@ -506,24 +538,6 @@ s_add_child_node(SCSSDocPtr_t doc, SCSSNodePtr_t nowNode, SCSSNodePtr_t node)
 
 
 static char *
-s_trim(SCSSDocPtr_t doc, const char *s)
-{
-  char *ss = apr_pstrdup(doc->pool, s);
-  int len = strlen(s);
-  int ii;
-
-  ii = 0;
-  for (ii = 0;is_white_space(*ss) && ii < len; ss++, ii++);
-
-  ii = strlen(ss);
-  for(;is_white_space(ss[ii-1]) && ii > 0; ii--);
-
-  ss[ii] = '\0';
-
-  return ss;
-}
-
-static char *
 s_get_one_selector(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len)
 {
   const char *spos = s;
@@ -556,7 +570,7 @@ s_get_one_selector(SCSSDocPtr_t doc, const char *s, apr_size_t *pass_len)
   cand = apr_palloc(doc->pool, *pass_len + 1);
   memcpy(cand, spos, *pass_len);
   cand[*pass_len] = 0;
-  cand = s_trim(doc, cand);
+  cand = scss_trim(doc->pool, cand);
   ret = apr_palloc(doc->pool, *pass_len + 1);
   spos = cand;
   npos = 0;
@@ -620,10 +634,10 @@ s_get_property_list(SCSSDocPtr_t doc, SCSSNodePtr_t nowNode, const char *s)
     char *pstat2;
     char *key = apr_strtok(pair, ":", &pstat2);
     char *val = apr_strtok(NULL, ":", &pstat2);
-    key = s_trim(doc, key);
-    val = s_trim(doc, val);
+    key = scss_trim(doc->pool, key);
+    val = scss_trim(doc->pool, val);
 
-    SCSSNodePtr_t node = s_create_node(doc->pool);
+    SCSSNodePtr_t node = scss_create_node(doc->pool);
     node->name   = key;
     node->value1 = val;
     node->value2 = NULL;
@@ -642,7 +656,7 @@ s_replace_refstring(SCSSDocPtr_t doc, const char *s)
   int npos;
   apr_pool_t *pool = doc->pool;
 
-  ss = (char *)s_trim(doc, s);
+  ss = (char *)scss_trim(doc->pool, s);
   if (! ss) return apr_pstrdup(pool, "");
   if (! *ss) return apr_pstrdup(pool, "");
 
diff --git a/src/css/src/sac.c b/src/css/src/sac.c
new file mode 100644 (file)
index 0000000..d85c793
--- /dev/null
@@ -0,0 +1,311 @@
+/*
+ * 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.
+ */
+#include "scss.h"
+#include "scss_string.h"
+
+static int s_parse_stylesheet(SCSSParserPtr_t parser, SCSSNodePtr_t node);
+static char *s_get_import_url(SCSSParserPtr_t parser, SCSSNodePtr_t node);
+static char **s_get_import_media(SCSSParserPtr_t parser, SCSSNodePtr_t node);
+static char **s_get_media_list(SCSSParserPtr_t parser, SCSSNodePtr_t node);
+static SCSSNodePtr_t s_get_selectors_list(apr_pool_t *pool, const char *src);
+
+#define JUDGE_STRINGS(S)  \
+    if (*(S) == '\\') {   \
+      (S) +=2;            \
+      continue;           \
+    }                     \
+    if (*(S) == '"') {    \
+      if (! sq) {         \
+        if (! dq) dq = 1; \
+        else      dq = 0; \
+      }                   \
+    }                     \
+    if (*(S) == '\'') {   \
+      if (! dq) {         \
+        if (! sq) sq = 1; \
+        else      sq = 0; \
+      }                   \
+    }
+#undef list_insert
+
+#define list_insert(node, point) do {           \
+    node->ref  = point->ref;                    \
+    *node->ref = node;                          \
+    node->next = point;                         \
+    point->ref = &node->next;                   \
+} while (0)
+
+
+SCSSParserPtr_t 
+scss_parser_new_from_buf(apr_pool_t *pool, const char *buf, char *defaultEncoding)
+{
+  SCSSParserPtr_t parser;
+  SCSSDocPtr_t doc;
+
+  doc    = scss_parser(pool,  buf);
+  parser = (SCSSParserPtr_t)apr_palloc(doc->pool, sizeof(*parser));
+  parser->doc = doc;
+  parser->handler = NULL;
+  return parser;
+}
+
+SCSSSACHandlerPtr_t 
+scss_doc_handler_new(SCSSParserPtr_t parser)
+{
+  SCSSSACHandlerPtr_t handler;
+
+  handler = (SCSSSACHandlerPtr_t)apr_palloc(parser->doc->pool, sizeof(*handler));
+  memset(handler, 0, sizeof(*handler));
+  parser->handler = handler;
+  return handler;
+}
+
+const char *
+scss_get_perser_version(SCSSParserPtr_t parser)
+{
+  return "http://www.w3.org/TR/REC-CSS2";
+}
+
+int 
+scss_parse_stylesheet(SCSSParserPtr_t parser)
+{
+  int ret;
+  if (parser->handler->startDocument) {
+    parser->handler->startDocument(parser);
+  }
+  ret = s_parse_stylesheet(parser, parser->doc->rootNode->child);
+
+  if (parser->handler->endDocument) {
+    parser->handler->endDocument(parser);
+  }
+  return ret;
+}
+
+
+static int
+s_parse_stylesheet(SCSSParserPtr_t parser, SCSSNodePtr_t node)
+{
+  SCSSNodePtr_t curNode;
+  int ret;
+
+  if (! node) return 0;
+
+  for (curNode = node->next; curNode != node; curNode = curNode->next) {
+    if (IS_ATKEYWORD(curNode)) {
+      if (strcasecmp(curNode->name, "@import") == 0) {
+        if (parser->handler->import) {
+          char *url = s_get_import_url(parser, curNode);
+          char **media = s_get_import_media(parser, curNode);
+          parser->handler->import(parser, url, (const char **)media, "");
+        }
+      }
+      else if (strcasecmp(curNode->name, "@media") == 0) {
+        char **media = s_get_media_list(parser, curNode);
+        if (parser->handler->startMedia) {
+          parser->handler->startMedia(parser, (const char **)media);
+        }
+        ret = s_parse_stylesheet(parser, curNode->child);
+        if (ret) {
+          return ret;
+        }
+        if (parser->handler->endMedia) {
+          parser->handler->endMedia(parser, (const char **)media);
+        }
+      }
+      else if (strcasecmp(curNode->name, "@page") == 0) {
+        if (parser->handler->startPage) {
+          parser->handler->startPage(parser, curNode->value1, "");
+        }
+        ret = s_parse_stylesheet(parser, curNode->child);
+        if (ret) {
+          return ret;
+        }
+        if (parser->handler->endPage) {
+          parser->handler->endPage(parser, curNode->value1, "");
+        }
+      }
+      else if (strcasecmp(curNode->name, "@page:first") == 0) {
+        if (parser->handler->startPage) {
+          parser->handler->startPage(parser, curNode->value1, ":first");
+        }
+        ret = s_parse_stylesheet(parser, curNode->child);
+        if (ret) {
+          return ret;
+        }
+        if (parser->handler->endPage) {
+          parser->handler->endPage(parser, curNode->value1, ":first");
+        }
+      }
+      else if (strcasecmp(curNode->name, "@page:right") == 0) {
+        if (parser->handler->startPage) {
+          parser->handler->startPage(parser, curNode->value1, ":right");
+        }
+        ret = s_parse_stylesheet(parser, curNode->child);
+        if (ret) {
+          return ret;
+        }
+        if (parser->handler->endPage) {
+          parser->handler->endPage(parser, curNode->value1, ":right");
+        }
+      }
+      else if (strcasecmp(curNode->name, "@page:left") == 0) {
+        if (parser->handler->startPage) {
+          parser->handler->startPage(parser, curNode->value1, ":left");
+        }
+        ret = s_parse_stylesheet(parser, curNode->child);
+        if (ret) {
+          return ret;
+        }
+        if (parser->handler->endPage) {
+          parser->handler->endPage(parser, curNode->value1, ":left");
+        }
+      }
+      else if (strcasecmp(curNode->name, "@font-face") == 0) {
+        if (parser->handler->startFontFace) {
+          parser->handler->startFontFace(parser);
+        }
+        ret = s_parse_stylesheet(parser, curNode->child);
+        if (ret) {
+          return ret;
+        }
+        if (parser->handler->endFontFace) {
+          parser->handler->endFontFace(parser);
+        }
+      }
+    }
+    else if (IS_SELECTOR(curNode)) {
+      SCSSNodePtr_t selectors = s_get_selectors_list(parser->doc->pool, curNode->name);
+      if (parser->handler->startSelector) {
+        parser->handler->startSelector(parser, selectors);
+      }
+      ret = s_parse_stylesheet(parser, curNode->child);
+      if (ret) {
+        return ret;
+      }
+      if (parser->handler->endSelector) {
+        parser->handler->endSelector(parser, selectors);
+      }
+    }
+    else if (IS_PROPERTY(curNode)) {
+      if (parser->handler->property) {
+        parser->handler->property(parser, curNode->name, curNode->value1, (curNode->value2 != NULL));
+      }
+    }
+  }
+  return 0;
+}
+
+
+static char *
+s_get_import_url(SCSSParserPtr_t parser, SCSSNodePtr_t node)
+{
+  char *ret;
+  char *src = apr_pstrdup(parser->doc->pool, node->value1);
+  char *spos;
+  if (scss_starts_with(src, "url")) {
+    src += 3;
+  }
+  while(*src) {
+    if (! is_white_space(*src)) break;
+    src++;
+  }
+  int pc = 0;
+  int dq, sq;
+
+  dq = sq = 0;
+  spos = src;
+  while(*src) {
+    JUDGE_STRINGS(src); 
+    if (!dq && !sq && !pc && *src == '(') {
+      pc++;
+      src++;
+      spos = src;
+      continue;
+    }
+    if (!dq && !sq && pc && *src == ')') {
+      pc--;
+      if (! pc) {
+        break;
+      }
+    }
+    src++;
+  }
+
+  ret = apr_palloc(parser->doc->pool, src - spos + 1);
+  memcpy(ret, spos, src - spos);
+  ret[src-spos] = 0;
+  return ret;
+}
+
+static char **
+s_get_import_media(SCSSParserPtr_t parser, SCSSNodePtr_t node)
+{
+  int ii;
+  char **media = (char **)apr_palloc(parser->doc->pool, sizeof(char *) * MEDIA_TYPE_NUM);
+  for (ii=0; ii<MEDIA_TYPE_NUM;ii++) {
+    media[ii] = NULL;
+  }
+
+  char *pstat;
+  char *src = apr_pstrdup(parser->doc->pool, node->value2);
+  ii = 0;
+  while(1) {
+    char *tmp = apr_strtok(src, ",", &pstat);
+    if (!tmp) {
+      break;
+    }
+    src = NULL;
+    media[ii] = scss_trim(parser->doc->pool, tmp);
+    if (++ii>=MEDIA_TYPE_NUM) break;
+  }
+  return media;
+}
+
+
+static char **
+s_get_media_list(SCSSParserPtr_t parser, SCSSNodePtr_t node)
+{
+  return s_get_import_media(parser, node);
+}
+
+static SCSSNodePtr_t
+s_get_selectors_list(apr_pool_t *pool, const char *src)
+{
+  char *s = apr_pstrdup(pool, src);
+  char *pstat;
+  SCSSNodePtr_t headNode;
+
+  headNode = scss_create_node(pool);
+
+  while(1) {
+    char *one = apr_strtok(s, ",", &pstat);
+    if (!one) {
+      break;
+    }
+    s = NULL;
+    one = scss_trim(pool, one);
+    if (*one) {
+      SCSSNodePtr_t node = scss_create_node(pool);
+      node->name = one;
+      list_insert(node, headNode);
+    }
+  }
+  return headNode;
+}
+/*
+ * vim:ts=2 et
+ */
diff --git a/src/css/src/trim.c b/src/css/src/trim.c
new file mode 100644 (file)
index 0000000..3e461d4
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * 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_trim(apr_pool_t *pool, const char *s)
+{
+  char *ss = apr_pstrdup(pool, s);
+  int len = strlen(s);
+  int ii;
+
+  ii = 0;
+  for (ii = 0;is_white_space(*ss) && ii < len; ss++, ii++);
+
+  ii = strlen(ss);
+  for(;is_white_space(ss[ii-1]) && ii > 0; ii--);
+
+  ss[ii] = '\0';
+
+  return ss;
+}
+/*
+ * vim:ts=2 et
+ */
index 60ca992..8e953b5 100644 (file)
@@ -2,3 +2,6 @@ all: example-1
 
 example-1: example-1.c
        gcc -DLINUX=2 -D_REENTRANT -D_GNU_SOURCE -D_LARGEFILE64_SOURCE -o example-1 example-1.c ../src/.libs/libscss.a -I../include `apr-1-config --includes` `apr-1-config --libs` -lapr-1
+
+clean:
+       rm example-1
index 56b14f3..5d18d8b 100644 (file)
 #include "scss.h"
 #include "apr.h"
 #include "apr_pools.h"
+#include <stdio.h>
 
+static void s_import(SCSSParserPtr_t parser, const char *uri, const char **media, const char *defaultNamespaceURI);
 
+static void s_start_document(SCSSParserPtr_t parser);
+static void s_end_document(SCSSParserPtr_t parser);
+static void s_start_media(SCSSParserPtr_t parser, const char **media);
+static void s_end_media(SCSSParserPtr_t parser, const char **media);
+static void s_start_page(SCSSParserPtr_t parser, const char *name, const char *pseudoPage);
+static void s_end_page(SCSSParserPtr_t parser, const char *name, const char *pseudoPage);
+static void s_start_font_face(SCSSParserPtr_t parser);
+static void s_end_font_face(SCSSParserPtr_t parser);
+static void s_start_selector(SCSSParserPtr_t parser, SCSSNodePtr_t selectors);
+static void s_end_selector(SCSSParserPtr_t parser, SCSSNodePtr_t selectors);
+static void s_property(SCSSParserPtr_t parser, const char *propertyName, const char *value, int important);
+
+static int level = 0;
 int
 main(int argc, char *argv[])
 {
-  SCSSDocPtr_t doc;
-  char *s = "@import url(aaa.css);";
+  SCSSParserPtr_t parser;
+  SCSSSACHandlerPtr_t handler;
+  char *s = "@import url(aaa.css) handheld, tty, all;\n"
+            "@media handheld, print {\n"
+            "}\n"
+            "@media all {\n"
+            " br+a { color: #ff0000; }\n"
+            " br,a { color: #ff0000; }\n"
+            "}\n"
+            "@page { margin-top: 2ch; }\n"
+            "@page abc { margin-top: 2ch; }\n"
+            "@font-face { margin-top: 2ch; }\n"
+            "a,br { margin-top: 2ch; }\n"
+            "br { margin-top: 2ch; }\n"
+            "hr > center { margin-top: 2ch; }\n";
 
+  /* 1) APR initialize */
   apr_initialize();
-  doc = scss_parser(NULL,  s);
 
-  scss_dump_nodes(doc);
+  /* 2) create parser object */
+  parser = scss_parser_new_from_buf(NULL, s, "");
+
+  /* 3) create handler object */
+  handler = scss_doc_handler_new(parser);
+
+  /* 4) register handler */
+  handler->startDocument = s_start_document;
+  handler->endDocument   = s_end_document;
+  handler->import        = s_import;
+  handler->startMedia    = s_start_media;
+  handler->endMedia      = s_end_media;
+  handler->startPage     = s_start_page;
+  handler->endPage       = s_end_page;
+  handler->startFontFace = s_start_font_face;
+  handler->endFontFace   = s_end_font_face;
+  handler->startSelector = s_start_selector;
+  handler->endSelector   = s_end_selector;
+  handler->property      = s_property;
 
+  /* 5) do parse. */
+  scss_parse_stylesheet(parser);
+
+  /* 6) APR terminate */
   apr_terminate();
   return 0;
 }
+
+static void print_level()
+{
+  int ii;
+  for (ii=0; ii<level;ii++) fprintf(stderr, "+");
+}
+
+static void 
+s_import(SCSSParserPtr_t parser, const char *uri, const char **media, const char *defaultNamespaceURI) 
+{
+  int ii;
+  print_level(); fprintf(stderr, "IMPORT\n");
+  print_level(); fprintf(stderr, "\turi:[%s]\n", uri);
+  for (ii=0; ii < MEDIA_TYPE_NUM; ii++) {
+    if (media[ii]) {
+      print_level(); fprintf(stderr, "\tmedia:[%s]\n", media[ii]);
+    }
+  }
+}
+
+
+static void
+s_start_document(SCSSParserPtr_t parser)
+{
+  fprintf(stderr, "START DOCUMENT\n");
+  level++;
+}
+
+
+static void
+s_end_document(SCSSParserPtr_t parser)
+{
+  level--;
+  fprintf(stderr, "END DOCUMENT\n");
+}
+
+
+
+static void
+s_start_media(SCSSParserPtr_t parser, const char **media)
+{
+  int ii;
+  print_level(); fprintf(stderr, "START MEDIA\n");
+  for (ii=0; ii < MEDIA_TYPE_NUM; ii++) {
+    if (media[ii]) {
+      print_level(); fprintf(stderr, "\tmedia:[%s]\n", media[ii]);
+    }
+  }
+  level++;
+}
+
+static void
+s_end_media(SCSSParserPtr_t parser, const char **media)
+{
+  int ii;
+  level--;
+  print_level(); fprintf(stderr, "END MEDIA\n");
+  for (ii=0; ii < MEDIA_TYPE_NUM; ii++) {
+    if (media[ii]) {
+      print_level(); fprintf(stderr, "\tmedia:[%s]\n", media[ii]);
+    }
+  }
+}
+
+
+
+static void
+s_start_page(SCSSParserPtr_t parser, const char *name, const char *pseudoPage)
+{
+  print_level(); fprintf(stderr, "START PAGE\n");
+  print_level(); fprintf(stderr, "\tname:[%s]\n", name);
+  print_level(); fprintf(stderr, "\tpseudo:[%s]\n", pseudoPage);
+  level++;
+}
+
+static void
+s_end_page(SCSSParserPtr_t parser, const char *name, const char *pseudoPage)
+{
+  level--;
+  print_level(); fprintf(stderr, "END PAGE\n");
+  print_level(); fprintf(stderr, "\tname:[%s]\n", name);
+  print_level(); fprintf(stderr, "\tpseudo:[%s]\n", pseudoPage);
+}
+
+static void
+s_start_font_face(SCSSParserPtr_t parser)
+{
+  print_level(); fprintf(stderr, "START FONT-PAGE\n");
+  ++level;
+}
+static void
+s_end_font_face(SCSSParserPtr_t parser)
+{
+  --level;
+  print_level(); fprintf(stderr, "START FONT-PAGE\n");
+}
+
+static void
+s_start_selector(SCSSParserPtr_t parser, SCSSNodePtr_t selectors)
+{
+  SCSSNodePtr_t curNode;
+  print_level(); fprintf(stderr, "START SELECTOR\n");
+  for (curNode = selectors->next; curNode != selectors; curNode = curNode->next) {
+    print_level(); fprintf(stderr, "\tname:[%s]\n", curNode->name);
+  }
+  level++; 
+}
+static void
+s_end_selector(SCSSParserPtr_t parser, SCSSNodePtr_t selectors)
+{
+  SCSSNodePtr_t curNode;
+  level--;
+  print_level(); fprintf(stderr, "END SELECTOR\n");
+  for (curNode = selectors->next; curNode != selectors; curNode = curNode->next) {
+    print_level(); fprintf(stderr, "\tname:[%s]\n", curNode->name);
+  }
+}
+
+static void
+s_property(SCSSParserPtr_t parser, const char *propertyName, const char *value, int important)
+{
+  print_level(); fprintf(stderr, "PROPERTY\n");
+  print_level(); fprintf(stderr, "\tname:[%s]\n", propertyName);
+  print_level(); fprintf(stderr, "\tvalue:[%s]\n", value);
+  print_level(); fprintf(stderr, "\timportant:[%d]\n", important);
+}
+#if 0
+typedef void (*SCSSSAC_startSelector_fn)(SCSSParserPtr_t parser, SCSSNodePtr_t selectors);
+typedef void (*SCSSSAC_endSelector_fn)(SCSSParserPtr_t parser, SCSSNodePtr_t selectors);
+typedef void (*SCSSSAC_property_fn)(SCSSParserPtr_t parser, const char *propertyName, const char *value, int impotant);
+#endif