-
+/*
+ * 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;
#define IS_PROPERTY(X) ((X)->type == SCSSTYPE_PROPERTY )
+#include "scss_sac.h"
+
/**
* for DEBUG. dump Node tree.
*
--- /dev/null
+/*
+ * 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
--- /dev/null
+/*
+ * 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
#if !defined(__SCSS_STRING_H__)
#define __SCSS_STRING_H__
+#include "apr_pools.h"
+
/**
* Count white-space.
* @param str strings.
*/
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) \
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) \
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
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 $@ $<
# 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
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:
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
clean:
rm -fr .libs
rm -f *.o *.lo *.la
- rm -rf .deps
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) \
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
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 $@ $<
@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
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:
--- /dev/null
+/*
+ * 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
+ */
}
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);
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 = "";
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 {
}
}
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 */
}
}
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 {
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 {
}
}
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);
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++;
}
}
-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)
{
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);
}
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;
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;
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;
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, "");
--- /dev/null
+/*
+ * 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
+ */
--- /dev/null
+/*
+ * 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
+ */
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
#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