Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/lexborisov/Modest.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlexborisov <lex.borisov@gmail.com>2016-10-13 01:17:35 +0300
committerlexborisov <lex.borisov@gmail.com>2016-10-13 01:17:35 +0300
commite459b9e004b71f9b18cf559a65de421e72c243a9 (patch)
treeb3648406f6aa869ac750f276eda991611b2be709
parente7c2cc454c93bff0f95650cae5a94e672f9092c1 (diff)
Added serialization for all
-rw-r--r--devel/osx/Modest.xcodeproj/project.pbxproj58
-rw-r--r--devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstatebin70142 -> 77412 bytes
-rw-r--r--devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/WorkspaceSettings.xcsettings16
-rw-r--r--devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme1
-rw-r--r--devel/osx/Modest/main.c22
-rw-r--r--examples/declarations/style_attr_low_level.c8
-rw-r--r--examples/selectors/selectors_low_level.c8
-rw-r--r--include/mycss/an_plus_b.h2
-rw-r--r--include/mycss/declaration/entry.h3
-rw-r--r--include/mycss/declaration/serialization.h48
-rw-r--r--include/mycss/declaration/serialization_resources.h312
-rw-r--r--include/mycss/myosi.h1
-rw-r--r--include/mycss/namespace/init.h3
-rw-r--r--include/mycss/namespace/serialization.h39
-rw-r--r--include/mycss/property/const.h28
-rw-r--r--include/mycss/property/parser.h3
-rw-r--r--include/mycss/property/serialization.h40
-rw-r--r--include/mycss/property/shared.h3
-rw-r--r--include/mycss/selectors/init.h4
-rw-r--r--include/mycss/selectors/serialization.h41
-rw-r--r--include/mycss/stylesheet.h3
-rw-r--r--include/mycss/values/serialization.h4
-rw-r--r--include/mycss/values/values.h17
-rw-r--r--source/mycss/an_plus_b.c22
-rw-r--r--source/mycss/an_plus_b.h2
-rw-r--r--source/mycss/declaration/entry.c29
-rw-r--r--source/mycss/declaration/entry.h3
-rw-r--r--source/mycss/declaration/parser.c2
-rw-r--r--source/mycss/declaration/serialization.c118
-rw-r--r--source/mycss/declaration/serialization.h48
-rw-r--r--source/mycss/declaration/serialization_resources.h312
-rw-r--r--source/mycss/declaration/state.c4
-rw-r--r--source/mycss/myosi.h1
-rw-r--r--source/mycss/namespace/init.c47
-rw-r--r--source/mycss/namespace/init.h3
-rw-r--r--source/mycss/namespace/serialization.c73
-rw-r--r--source/mycss/namespace/serialization.h39
-rw-r--r--source/mycss/property/const.h28
-rw-r--r--source/mycss/property/init.c31
-rw-r--r--source/mycss/property/parser.c151
-rw-r--r--source/mycss/property/parser.h3
-rw-r--r--source/mycss/property/serialization.c56
-rw-r--r--source/mycss/property/serialization.h40
-rw-r--r--source/mycss/property/shared.c29
-rw-r--r--source/mycss/property/shared.h3
-rw-r--r--source/mycss/selectors/init.c219
-rw-r--r--source/mycss/selectors/init.h4
-rw-r--r--source/mycss/selectors/serialization.c275
-rw-r--r--source/mycss/selectors/serialization.h41
-rw-r--r--source/mycss/stylesheet.c4
-rw-r--r--source/mycss/stylesheet.h3
-rw-r--r--source/mycss/values/serialization.c30
-rw-r--r--source/mycss/values/serialization.h4
-rw-r--r--source/mycss/values/values.h17
54 files changed, 1866 insertions, 439 deletions
diff --git a/devel/osx/Modest.xcodeproj/project.pbxproj b/devel/osx/Modest.xcodeproj/project.pbxproj
index 45ad0e4..d865719 100644
--- a/devel/osx/Modest.xcodeproj/project.pbxproj
+++ b/devel/osx/Modest.xcodeproj/project.pbxproj
@@ -11,6 +11,9 @@
0E0239811D9FE8EC0084A81A /* type.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E02397F1D9FE8EC0084A81A /* type.c */; };
0E0239851D9FEAB90084A81A /* node.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E0239831D9FEAB90084A81A /* node.c */; };
0E0239881D9FEBE10084A81A /* modest.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E0239861D9FEBE10084A81A /* modest.c */; };
+ 0E0C918C1DAECB56007A0501 /* serialization.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E0C918A1DAECB56007A0501 /* serialization.c */; };
+ 0E0C918F1DAED006007A0501 /* serialization.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E0C918D1DAED006007A0501 /* serialization.c */; };
+ 0E0C91921DAED0F5007A0501 /* serialization.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E0C91901DAED0F5007A0501 /* serialization.c */; };
0E5AA4BD1DA9689700FF5358 /* shared.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E5AA4BB1DA9689700FF5358 /* shared.c */; };
0E750EE31D9AF1D500337E9B /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750EE21D9AF1D500337E9B /* main.c */; };
0E750EF81D9AF25300337E9B /* finder.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750EEE1D9AF25300337E9B /* finder.c */; };
@@ -96,6 +99,7 @@
0E7510031D9AF27F00337E9B /* mcsync.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FE01D9AF27F00337E9B /* mcsync.c */; };
0E7510041D9AF27F00337E9B /* mctree.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FE21D9AF27F00337E9B /* mctree.c */; };
0E7510051D9AF27F00337E9B /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E750FE51D9AF27F00337E9B /* utils.c */; };
+ 0E818EF61DAE6F8F005B0C77 /* serialization.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E818EF41DAE6F8F005B0C77 /* serialization.c */; };
0EF808A31D9FF3BC001AF6EF /* sheet.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF808A11D9FF3BC001AF6EF /* sheet.c */; };
0EF808A61DA08BBE001AF6EF /* map.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF808A41DA08BBE001AF6EF /* map.c */; };
/* End PBXBuildFile section */
@@ -121,6 +125,12 @@
0E0239841D9FEAB90084A81A /* node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = node.h; path = ../../../source/modest/node/node.h; sourceTree = "<group>"; };
0E0239861D9FEBE10084A81A /* modest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = modest.c; path = ../../../source/modest/modest.c; sourceTree = "<group>"; };
0E0239871D9FEBE10084A81A /* modest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = modest.h; path = ../../../source/modest/modest.h; sourceTree = "<group>"; };
+ 0E0C918A1DAECB56007A0501 /* serialization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = serialization.c; sourceTree = "<group>"; };
+ 0E0C918B1DAECB56007A0501 /* serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialization.h; sourceTree = "<group>"; };
+ 0E0C918D1DAED006007A0501 /* serialization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = serialization.c; sourceTree = "<group>"; };
+ 0E0C918E1DAED006007A0501 /* serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialization.h; sourceTree = "<group>"; };
+ 0E0C91901DAED0F5007A0501 /* serialization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = serialization.c; sourceTree = "<group>"; };
+ 0E0C91911DAED0F5007A0501 /* serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialization.h; sourceTree = "<group>"; };
0E5AA4BB1DA9689700FF5358 /* shared.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = shared.c; sourceTree = "<group>"; };
0E5AA4BC1DA9689700FF5358 /* shared.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = shared.h; sourceTree = "<group>"; };
0E750EDF1D9AF1D500337E9B /* Modest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Modest; sourceTree = BUILT_PRODUCTS_DIR; };
@@ -316,6 +326,9 @@
0E750FE41D9AF27F00337E9B /* resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resources.h; sourceTree = "<group>"; };
0E750FE51D9AF27F00337E9B /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utils.c; path = ../../source/myhtml/utils.c; sourceTree = "<group>"; };
0E750FE61D9AF27F00337E9B /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../source/myhtml/utils.h; sourceTree = "<group>"; };
+ 0E818EF41DAE6F8F005B0C77 /* serialization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = serialization.c; sourceTree = "<group>"; };
+ 0E818EF51DAE6F8F005B0C77 /* serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = serialization.h; sourceTree = "<group>"; };
+ 0E818EF71DAE6FEE005B0C77 /* serialization_resources.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = serialization_resources.h; sourceTree = "<group>"; };
0EF808A11D9FF3BC001AF6EF /* sheet.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = sheet.c; sourceTree = "<group>"; };
0EF808A21D9FF3BC001AF6EF /* sheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sheet.h; sourceTree = "<group>"; };
0EF808A41DA08BBE001AF6EF /* map.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = map.c; sourceTree = "<group>"; };
@@ -457,8 +470,7 @@
0E750EEA1D9AF22500337E9B /* mycss */ = {
isa = PBXGroup;
children = (
- 0E750F261D9AF27200337E9B /* an_plus_b.c */,
- 0E750F271D9AF27200337E9B /* an_plus_b.h */,
+ 0E750F411D9AF27200337E9B /* myosi.h */,
0E750F281D9AF27200337E9B /* api.h */,
0E750F291D9AF27200337E9B /* check.c */,
0E750F2A1D9AF27200337E9B /* check.h */,
@@ -468,7 +480,6 @@
0E750F381D9AF27200337E9B /* entry.h */,
0E750F3F1D9AF27200337E9B /* mycss.c */,
0E750F401D9AF27200337E9B /* mycss.h */,
- 0E750F411D9AF27200337E9B /* myosi.h */,
0E750F421D9AF27200337E9B /* mystring.c */,
0E750F431D9AF27200337E9B /* mystring.h */,
0E750F4C1D9AF27200337E9B /* parser.c */,
@@ -482,12 +493,14 @@
0E750F721D9AF27200337E9B /* tokenizer_resource.h */,
0E750F731D9AF27200337E9B /* tokenizer.c */,
0E750F741D9AF27200337E9B /* tokenizer.h */,
+ 0E750F271D9AF27200337E9B /* an_plus_b.h */,
+ 0E750F261D9AF27200337E9B /* an_plus_b.c */,
0E750F561D9AF27200337E9B /* selectors */,
+ 0E750F751D9AF27200337E9B /* values */,
0E750F4E1D9AF27200337E9B /* property */,
0E750F441D9AF27200337E9B /* namespace */,
0E750F391D9AF27200337E9B /* media */,
0E750F2D1D9AF27200337E9B /* declaration */,
- 0E750F751D9AF27200337E9B /* values */,
);
name = mycss;
sourceTree = "<group>";
@@ -559,6 +572,9 @@
0E750F331D9AF27200337E9B /* parser.c */,
0E750F361D9AF27200337E9B /* state.h */,
0E750F351D9AF27200337E9B /* state.c */,
+ 0E818EF51DAE6F8F005B0C77 /* serialization.h */,
+ 0E818EF41DAE6F8F005B0C77 /* serialization.c */,
+ 0E818EF71DAE6FEE005B0C77 /* serialization_resources.h */,
);
name = declaration;
path = ../../source/mycss/declaration;
@@ -580,13 +596,15 @@
0E750F441D9AF27200337E9B /* namespace */ = {
isa = PBXGroup;
children = (
- 0E750F451D9AF27200337E9B /* init.c */,
- 0E750F461D9AF27200337E9B /* init.h */,
0E750F471D9AF27200337E9B /* myosi.h */,
- 0E750F481D9AF27200337E9B /* parser.c */,
+ 0E750F461D9AF27200337E9B /* init.h */,
+ 0E750F451D9AF27200337E9B /* init.c */,
0E750F491D9AF27200337E9B /* parser.h */,
- 0E750F4A1D9AF27200337E9B /* state.c */,
+ 0E750F481D9AF27200337E9B /* parser.c */,
0E750F4B1D9AF27200337E9B /* state.h */,
+ 0E750F4A1D9AF27200337E9B /* state.c */,
+ 0E0C91911DAED0F5007A0501 /* serialization.h */,
+ 0E0C91901DAED0F5007A0501 /* serialization.c */,
);
name = namespace;
path = ../../source/mycss/namespace;
@@ -604,6 +622,8 @@
0E5AA4BC1DA9689700FF5358 /* shared.h */,
0E5AA4BB1DA9689700FF5358 /* shared.c */,
0E750F551D9AF27200337E9B /* resources.h */,
+ 0E0C918B1DAECB56007A0501 /* serialization.h */,
+ 0E0C918A1DAECB56007A0501 /* serialization.c */,
);
name = property;
path = ../../source/mycss/property;
@@ -633,6 +653,8 @@
0E750F6A1D9AF27200337E9B /* value.h */,
0E750F691D9AF27200337E9B /* value.c */,
0E750F6B1D9AF27200337E9B /* value_resource.h */,
+ 0E0C918E1DAED006007A0501 /* serialization.h */,
+ 0E0C918D1DAED006007A0501 /* serialization.c */,
);
name = selectors;
path = ../../source/mycss/selectors;
@@ -641,16 +663,16 @@
0E750F751D9AF27200337E9B /* values */ = {
isa = PBXGroup;
children = (
- 0E750F761D9AF27200337E9B /* consume.c */,
+ 0E750F7F1D9AF27200337E9B /* values.h */,
+ 0E750F7E1D9AF27200337E9B /* values.c */,
0E750F771D9AF27200337E9B /* consume.h */,
- 0E750F781D9AF27200337E9B /* resources.h */,
- 0E750F791D9AF27200337E9B /* serialization.c */,
- 0E750F7A1D9AF27200337E9B /* serialization.h */,
- 0E750F7B1D9AF27200337E9B /* units.c */,
+ 0E750F761D9AF27200337E9B /* consume.c */,
0E750F7C1D9AF27200337E9B /* units.h */,
+ 0E750F7B1D9AF27200337E9B /* units.c */,
0E750F7D1D9AF27200337E9B /* units_resources.h */,
- 0E750F7E1D9AF27200337E9B /* values.c */,
- 0E750F7F1D9AF27200337E9B /* values.h */,
+ 0E750F781D9AF27200337E9B /* resources.h */,
+ 0E750F7A1D9AF27200337E9B /* serialization.h */,
+ 0E750F791D9AF27200337E9B /* serialization.c */,
);
name = values;
path = ../../source/mycss/values;
@@ -770,6 +792,7 @@
0E750FF61D9AF27F00337E9B /* tag_init.c in Sources */,
0E750F8E1D9AF27200337E9B /* state.c in Sources */,
0EF808A31D9FF3BC001AF6EF /* sheet.c in Sources */,
+ 0E0C918C1DAECB56007A0501 /* serialization.c in Sources */,
0E750FFE1D9AF27F00337E9B /* tree.c in Sources */,
0E750FEE1D9AF27F00337E9B /* mynamespace.c in Sources */,
0E7510021D9AF27F00337E9B /* mcsimple.c in Sources */,
@@ -780,6 +803,7 @@
0E750F9B1D9AF27200337E9B /* tokenizer_end.c in Sources */,
0E750F851D9AF27200337E9B /* parser.c in Sources */,
0E750F871D9AF27200337E9B /* entry.c in Sources */,
+ 0E818EF61DAE6F8F005B0C77 /* serialization.c in Sources */,
0E0239811D9FE8EC0084A81A /* type.c in Sources */,
0E750F811D9AF27200337E9B /* check.c in Sources */,
0E750EF91D9AF25300337E9B /* match.c in Sources */,
@@ -810,6 +834,7 @@
0EF808A61DA08BBE001AF6EF /* map.c in Sources */,
0E750F8F1D9AF27200337E9B /* parser.c in Sources */,
0E750FA11D9AF27200337E9B /* values.c in Sources */,
+ 0E0C918F1DAED006007A0501 /* serialization.c in Sources */,
0E750FED1D9AF27F00337E9B /* myhtml.c in Sources */,
0E750F821D9AF27200337E9B /* convert.c in Sources */,
0E750FE91D9AF27F00337E9B /* data_process.c in Sources */,
@@ -820,6 +845,7 @@
0E750F1E1D9AF26300337E9B /* maxp.c in Sources */,
0E750F8A1D9AF27200337E9B /* mycss.c in Sources */,
0E750FEB1D9AF27F00337E9B /* encoding.c in Sources */,
+ 0E0C91921DAED0F5007A0501 /* serialization.c in Sources */,
0E750F1D1D9AF26300337E9B /* loca.c in Sources */,
0E750F9C1D9AF27200337E9B /* tokenizer_global.c in Sources */,
0E0239731D9D97150084A81A /* thread.c in Sources */,
@@ -921,7 +947,7 @@
0E750EE71D9AF1D500337E9B /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
- GCC_OPTIMIZATION_LEVEL = 2;
+ GCC_OPTIMIZATION_LEVEL = 0;
HEADER_SEARCH_PATHS = ../../source;
OTHER_CFLAGS = (
"-DMyHTML_WITH_PERF",
diff --git a/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate b/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate
index d10c344..1dc91d3 100644
--- a/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate
+++ b/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
diff --git a/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/WorkspaceSettings.xcsettings b/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/WorkspaceSettings.xcsettings
new file mode 100644
index 0000000..dd7403b
--- /dev/null
+++ b/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/WorkspaceSettings.xcsettings
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>BuildLocationStyle</key>
+ <string>UseAppPreferences</string>
+ <key>CustomBuildLocationType</key>
+ <string>RelativeToDerivedData</string>
+ <key>DerivedDataLocationStyle</key>
+ <string>Default</string>
+ <key>IssueFilterStyle</key>
+ <string>ShowActiveSchemeOnly</string>
+ <key>LiveSourceIssuesEnabled</key>
+ <true/>
+</dict>
+</plist>
diff --git a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme
index 1489c6a..02b36c5 100644
--- a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme
+++ b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme
@@ -49,6 +49,7 @@
useCustomWorkingDirectory = "NO"
ignoresPersistentStateOnLaunch = "NO"
debugDocumentVersioning = "YES"
+ enableAddressSanitizer = "YES"
debugServiceExtension = "internal"
allowLocationSimulation = "YES">
<BuildableProductRunnable
diff --git a/devel/osx/Modest/main.c b/devel/osx/Modest/main.c
index c2bb498..b689163 100644
--- a/devel/osx/Modest/main.c
+++ b/devel/osx/Modest/main.c
@@ -22,6 +22,7 @@
#include "mycss/mycss.h"
#include "modest/modest.h"
+#include "mycss/selectors/serialization.h"
#include "mycss/declaration/init.h"
#include "modest/finder/finder.h"
#include "modest/finder/thread.h"
@@ -50,6 +51,11 @@ struct res_data load_data(const char* filename)
return res;
}
+void serialization_callback(const char* data, size_t len, void* ctx)
+{
+ printf("%.*s", (int)len, data);
+}
+
myhtml_tree_t * myhtml(const char* data, size_t data_size, bool is_file, bool print_result, myhtml_callback_tree_node_f cai, void* cai_ctx)
{
setbuf(stdout, NULL);
@@ -123,7 +129,7 @@ mycss_entry_t * mycss(const char* data, size_t data_size, bool is_file, bool pri
if(print_result) {
printf("\n");
mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(entry);
- mycss_selectors_print_list(entry->selectors, stylesheet->sel_list_first, stdout);
+ mycss_selectors_serialization_list(entry->selectors, stylesheet->sel_list_first, serialization_callback, NULL);
printf("\n------------\nMyCSS Information:\n");
printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL));
@@ -147,9 +153,11 @@ void print_tree_after_all(modest_t* modest, myhtml_tree_t* myhtml_tree, myhtml_t
if(m_node) {
printf("\tstyles: ");
+
if(m_node->stylesheet->width.raw.declaration) {
- mycss_declaration_entry_print(mycss_entry->declaration, m_node->stylesheet->width.raw.declaration, stdout);
+ mycss_declaration_serialization_entry(mycss_entry, m_node->stylesheet->width.raw.declaration, serialization_callback, NULL);
}
+
printf("\n");
}
@@ -189,18 +197,18 @@ int main(int argc, const char * argv[]) {
//char *css_f = "/new/C-git/bootstrap.css";
char *html = "<fff>sdsd<aaaa id=hash class=best><div a1><menu class=\"lalala\" id=\"menu-id\" b1><span span1><div a2></div></div><menu class=\"be\" id=\"menu\" b1><span span2></aaaa><a href=\"\" sec></a><div div1><div div2></div><div div3></div><div div4></div></div><p p1><p p2><p p3><p p4>";
- char *css = "lala, bebe, sss {width: 10px}";
+ char *css = "div {padding: 10px 10 3em 0 !important; padding-bottom: 130px !important; padding-top: 18888pt !important; padding-left: 1em !important; padding-right: !important 20%;} div {width: 20px;}";
char *selector = "menu";
modest_t *modest = modest_create();
modest_status_t status = modest_init(modest);
- myhtml_tree_t *myhtml_tree = myhtml(html_f, strlen(html_f), true, false, modest_callback_for_create_mnode, (void*)modest);
- mycss_entry_t *mycss_entry = mycss(css_f, strlen(css_f), true, true);
+// myhtml_tree_t *myhtml_tree = myhtml(html_f, strlen(html_f), true, false, modest_callback_for_create_mnode, (void*)modest);
+// mycss_entry_t *mycss_entry = mycss(css_f, strlen(css_f), true, true);
-// myhtml_tree_t *myhtml_tree = myhtml(html, strlen(html), false, true, modest_callback_for_create_mnode, (void*)modest);
-// mycss_entry_t *mycss_entry = mycss(css, strlen(css), false, true);
+ myhtml_tree_t *myhtml_tree = myhtml(html, strlen(html), false, true, modest_callback_for_create_mnode, (void*)modest);
+ mycss_entry_t *mycss_entry = mycss(css, strlen(css), false, true);
mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(mycss_entry);
diff --git a/examples/declarations/style_attr_low_level.c b/examples/declarations/style_attr_low_level.c
index 8f099c3..febeed0 100644
--- a/examples/declarations/style_attr_low_level.c
+++ b/examples/declarations/style_attr_low_level.c
@@ -27,6 +27,7 @@
#include <mycss/selectors/init.h>
#include <mycss/declaration/init.h>
#include <mycss/declaration/entry.h>
+#include "mycss/declaration/serialization.h"
myhtml_tree_t * parse_html(const char* data, size_t data_size)
{
@@ -41,6 +42,11 @@ myhtml_tree_t * parse_html(const char* data, size_t data_size)
return tree;
}
+void serialization_callback(const char* data, size_t len, void* ctx)
+{
+ printf("%.*s", (int)len, data);
+}
+
mycss_entry_t * create_css_parser(void)
{
// base init
@@ -93,7 +99,7 @@ int main(int argc, const char * argv[])
fprintf(stdout, "\tNode: ");
myhtml_tree_print_node(html_tree, node, stdout);
fprintf(stdout, "\tDeclaration: ");
- mycss_declaration_entries_print(css_entry->declaration, dec_entry, stdout);
+ mycss_declaration_serialization_entries(css_entry, dec_entry, serialization_callback, NULL);
fprintf(stdout, "\n\n");
}
}
diff --git a/examples/selectors/selectors_low_level.c b/examples/selectors/selectors_low_level.c
index 0ef1cce..c6a2afc 100644
--- a/examples/selectors/selectors_low_level.c
+++ b/examples/selectors/selectors_low_level.c
@@ -26,6 +26,7 @@
#include <mycss/mycss.h>
#include <mycss/selectors/init.h>
#include <modest/finder/finder.h>
+#include "mycss/selectors/serialization.h"
myhtml_tree_t * parse_html(const char* data, size_t data_size)
{
@@ -40,6 +41,11 @@ myhtml_tree_t * parse_html(const char* data, size_t data_size)
return tree;
}
+void serialization_callback(const char* data, size_t len, void* ctx)
+{
+ printf("%.*s", (int)len, data);
+}
+
mycss_entry_t * create_css_parser(void)
{
// base init
@@ -86,7 +92,7 @@ int main(int argc, const char * argv[])
fprintf(stdout, "\n");
fprintf(stdout, "Selector:\n\t");
- mycss_selectors_print_list(css_entry->selectors, list, stdout);
+ mycss_selectors_serialization_list(css_entry->selectors, list, serialization_callback, NULL);
fprintf(stdout, "\n");
printf("\nFound result:\n");
diff --git a/include/mycss/an_plus_b.h b/include/mycss/an_plus_b.h
index 8e3df84..b3d72e5 100644
--- a/include/mycss/an_plus_b.h
+++ b/include/mycss/an_plus_b.h
@@ -53,7 +53,7 @@ mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_create(mycss_entry_t* entry);
void mycss_an_plus_b_entry_clean_all(mycss_an_plus_b_entry_t* anb_entry);
mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_destroy(mycss_entry_t* entry, mycss_an_plus_b_entry_t* anb_entry, bool self_destroy);
-void mycss_an_plus_b_print(mycss_an_plus_b_entry_t* anb_entry, FILE* fh);
+void mycss_an_plus_b_serialization(mycss_an_plus_b_entry_t* anb_entry, mycss_callback_serialization_f callback, void* context);
void mycss_an_plus_b_parser_expectations_error(mycss_entry_t* entry);
diff --git a/include/mycss/declaration/entry.h b/include/mycss/declaration/entry.h
index 1b97569..bc365fb 100644
--- a/include/mycss/declaration/entry.h
+++ b/include/mycss/declaration/entry.h
@@ -42,9 +42,6 @@ void mycss_declaration_entry_append_to_current(mycss_declaration_t* declaration,
void mycss_declaration_entry_remove(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry);
mycss_declaration_entry_t * mycss_declaration_entry_delete(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry);
-void mycss_declaration_entry_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry, FILE* fh);
-void mycss_declaration_entries_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* first_dec_entry, FILE* fh);
-
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/include/mycss/declaration/serialization.h b/include/mycss/declaration/serialization.h
new file mode 100644
index 0000000..f527ab1
--- /dev/null
+++ b/include/mycss/declaration/serialization.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#ifndef MyHTML_MyCSS_DECLARATION_SERIALIZATION_H
+#define MyHTML_MyCSS_DECLARATION_SERIALIZATION_H
+#pragma once
+
+#include <mycss/declaration/myosi.h>
+#include <mycss/values/values.h>
+#include <mycss/property/init.h>
+#include <mycss/property/serialization.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef bool (*mycss_declaration_serialization_f)(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry,
+ mycss_callback_serialization_f callback, void* context);
+
+bool mycss_declaration_serialization_entry(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context);
+void mycss_declaration_serialization_entries(mycss_entry_t* entry, mycss_declaration_entry_t* first_dec_entry, mycss_callback_serialization_f callback, void* context);
+
+bool mycss_declaration_serialization_undef(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context);
+bool mycss_declaration_serialization_padding(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context);
+bool mycss_declaration_serialization_padding_x(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* MyHTML_MyCSS_DECLARATION_SERIALIZATION_H */
diff --git a/include/mycss/declaration/serialization_resources.h b/include/mycss/declaration/serialization_resources.h
new file mode 100644
index 0000000..34225c7
--- /dev/null
+++ b/include/mycss/declaration/serialization_resources.h
@@ -0,0 +1,312 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#ifndef MyHTML_MyCSS_DECLARATION_SERIALIZATION_RESOURCES_H
+#define MyHTML_MyCSS_DECLARATION_SERIALIZATION_RESOURCES_H
+#pragma once
+
+static mycss_declaration_serialization_f mycss_declaration_serialization_map_by_type[] =
+{
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_padding,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_padding_x,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef
+};
+
+
+#endif /* MyHTML_MyCSS_DECLARATION_SERIALIZATION_RESOURCES_H */
diff --git a/include/mycss/myosi.h b/include/mycss/myosi.h
index 630fa4b..5692eb7 100644
--- a/include/mycss/myosi.h
+++ b/include/mycss/myosi.h
@@ -263,6 +263,7 @@ typedef mycss_token_t * (*mycss_token_ready_callback_f)(mycss_entry_t* entry, my
typedef size_t (*mycss_string_process_state_f)(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res);
typedef bool (*mycss_parser_token_f)(mycss_entry_t* entry, mycss_token_t* token, bool last_response);
typedef bool (*mycss_an_plus_b_state_f)(mycss_entry_t* entry, mycss_an_plus_b_t* anb, mycss_an_plus_b_entry_t* anb_entry, mycss_token_t* token);
+typedef void (*mycss_callback_serialization_f)(const char* buffer, size_t size, void* ctx);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/include/mycss/namespace/init.h b/include/mycss/namespace/init.h
index 79d9486..0f1669a 100644
--- a/include/mycss/namespace/init.h
+++ b/include/mycss/namespace/init.h
@@ -54,9 +54,6 @@ const char * mycss_namespace_name_by_id(mycss_namespace_t* ns, mctree_t* name_tr
mycss_namespace_entry_t * mycss_namespace_entry_by_name(mycss_namespace_t *ns, mctree_t* name_tree, const char* ns_name, size_t length, bool case_insensitive);
const char * mycss_namespace_name_by_entry(mycss_namespace_entry_t* ns_entry, mctree_t* name_tree, size_t* length, bool* is_default);
-void mycss_namespace_print(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, FILE* fh, bool with_vbar);
-void mycss_namespace_print_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, FILE* fh);
-
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/include/mycss/namespace/serialization.h b/include/mycss/namespace/serialization.h
new file mode 100644
index 0000000..0dd5c15
--- /dev/null
+++ b/include/mycss/namespace/serialization.h
@@ -0,0 +1,39 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#ifndef MyHTML_MyCSS_NAMESPACE_SERIALIZATION_H
+#define MyHTML_MyCSS_NAMESPACE_SERIALIZATION_H
+#pragma once
+
+#include <mycss/entry.h>
+#include <mycss/namespace/myosi.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void mycss_namespace_serialization_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_callback_serialization_f callback, void* context);
+void mycss_namespace_serialization_entry(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, mycss_callback_serialization_f callback, void* context, bool with_vbar);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* MyHTML_MyCSS_NAMESPACE_SERIALIZATION_H */
diff --git a/include/mycss/property/const.h b/include/mycss/property/const.h
index 357d0b4..4c3e762 100644
--- a/include/mycss/property/const.h
+++ b/include/mycss/property/const.h
@@ -1791,6 +1791,34 @@ enum mycss_property_overflow_y {
}
typedef mycss_property_overflow_y_t;
+enum mycss_property_padding_bottom {
+ MyCSS_PROPERTY_PADDING_BOTTOM_INHERIT = 0x008f,
+ MyCSS_PROPERTY_PADDING_BOTTOM_LENGTH = 0x00ad,
+ MyCSS_PROPERTY_PADDING_BOTTOM_PERCENTAGE = 0x00fd
+}
+typedef mycss_property_padding_bottom_t;
+
+enum mycss_property_padding_left {
+ MyCSS_PROPERTY_PADDING_LEFT_INHERIT = 0x008f,
+ MyCSS_PROPERTY_PADDING_LEFT_LENGTH = 0x00ad,
+ MyCSS_PROPERTY_PADDING_LEFT_PERCENTAGE = 0x00fd
+}
+typedef mycss_property_padding_left_t;
+
+enum mycss_property_padding_right {
+ MyCSS_PROPERTY_PADDING_RIGHT_INHERIT = 0x008f,
+ MyCSS_PROPERTY_PADDING_RIGHT_LENGTH = 0x00ad,
+ MyCSS_PROPERTY_PADDING_RIGHT_PERCENTAGE = 0x00fd
+}
+typedef mycss_property_padding_right_t;
+
+enum mycss_property_padding_top {
+ MyCSS_PROPERTY_PADDING_TOP_INHERIT = 0x008f,
+ MyCSS_PROPERTY_PADDING_TOP_LENGTH = 0x00ad,
+ MyCSS_PROPERTY_PADDING_TOP_PERCENTAGE = 0x00fd
+}
+typedef mycss_property_padding_top_t;
+
enum mycss_property_pause_after {
MyCSS_PROPERTY_PAUSE_AFTER_MEDIUM = 0x00c4,
MyCSS_PROPERTY_PAUSE_AFTER_NONE = 0x00da,
diff --git a/include/mycss/property/parser.h b/include/mycss/property/parser.h
index a418825..d3f3242 100644
--- a/include/mycss/property/parser.h
+++ b/include/mycss/property/parser.h
@@ -26,9 +26,10 @@
#include <mycss/property/shared.h>
#include <mycss/values/consume.h>
#include <mycss/values/values.h>
+#include <mycss/declaration/entry.h>
#ifdef __cplusplus
-//extern "C" {
+extern "C" {
#endif
bool mycss_property_parser_undef(mycss_entry_t* entry, mycss_token_t* token, bool last_response);
diff --git a/include/mycss/property/serialization.h b/include/mycss/property/serialization.h
new file mode 100644
index 0000000..748d52d
--- /dev/null
+++ b/include/mycss/property/serialization.h
@@ -0,0 +1,40 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#ifndef MyHTML_MyCSS_PROPERTY_SERIALIZATION_H
+#define MyHTML_MyCSS_PROPERTY_SERIALIZATION_H
+#pragma once
+
+#include <mycss/property/myosi.h>
+#include <mycss/property/init.h>
+#include <mycss/values/serialization.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void mycss_property_serialization_type_name(mycss_property_type_t prop_type, mycss_callback_serialization_f callback, void* context);
+void mycss_property_serialization_value(unsigned int value_type, void* value, mycss_callback_serialization_f callback, void* context);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* MyHTML_MyCSS_PROPERTY_SERIALIZATION_H */
diff --git a/include/mycss/property/shared.h b/include/mycss/property/shared.h
index 7ff0ee8..8e1508a 100644
--- a/include/mycss/property/shared.h
+++ b/include/mycss/property/shared.h
@@ -32,7 +32,8 @@ extern "C" {
bool mycss_property_shared_switch_to_find_important(mycss_entry_t* entry);
bool mycss_property_shared_switch_to_parse_error(mycss_entry_t* entry);
-bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, bool last_response);
+bool mycss_property_shared_check_declaration_end(mycss_entry_t* entry, mycss_token_t* token);
+bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, mycss_declaration_entry_t* dec_entry);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/include/mycss/selectors/init.h b/include/mycss/selectors/init.h
index 91346fa..0004125 100644
--- a/include/mycss/selectors/init.h
+++ b/include/mycss/selectors/init.h
@@ -46,10 +46,6 @@ mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* se
mycss_selectors_entry_t * mycss_selectors_entry_find_first(mycss_selectors_entry_t* selector);
-void mycss_selectors_print_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, FILE* fh);
-void mycss_selectors_print_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh);
-void mycss_selectors_print_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh);
-
mycss_selectors_entry_t * mycss_selectors_entry_create(mycss_selectors_t* selectors);
mycss_selectors_entries_list_t * mycss_selectors_entries_list_create(mycss_selectors_t* selectors);
diff --git a/include/mycss/selectors/serialization.h b/include/mycss/selectors/serialization.h
new file mode 100644
index 0000000..e2038d5
--- /dev/null
+++ b/include/mycss/selectors/serialization.h
@@ -0,0 +1,41 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#ifndef MyHTML_MyCSS_SELECTORS_SERIALIZATION_H
+#define MyHTML_MyCSS_SELECTORS_SERIALIZATION_H
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <mycss/selectors/myosi.h>
+#include <mycss/namespace/serialization.h>
+#include <mycss/declaration/serialization.h>
+
+void mycss_selectors_serialization_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_callback_serialization_f callback, void* context);
+bool mycss_selectors_serialization_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, mycss_callback_serialization_f callback, void* context);
+bool mycss_selectors_serialization_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_callback_serialization_f callback, void* context);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* MyHTML_MyCSS_SELECTORS_SERIALIZATION_H */
diff --git a/include/mycss/stylesheet.h b/include/mycss/stylesheet.h
index a2b6d13..523d3d1 100644
--- a/include/mycss/stylesheet.h
+++ b/include/mycss/stylesheet.h
@@ -26,6 +26,7 @@
#include <mycss/entry.h>
#include <mycss/namespace/myosi.h>
#include <mycss/selectors/myosi.h>
+#include <mycss/selectors/serialization.h>
#ifdef __cplusplus
extern "C" {
@@ -48,7 +49,7 @@ mycss_status_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry
mycss_status_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet);
mycss_stylesheet_t * mycss_stylesheet_destroy(mycss_stylesheet_t* stylesheet, bool self_destroy);
-void mycss_stylesheet_print(mycss_stylesheet_t* stylesheet, FILE* fh);
+void mycss_stylesheet_serialization(mycss_stylesheet_t* stylesheet, mycss_callback_serialization_f callback, void* context);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/include/mycss/values/serialization.h b/include/mycss/values/serialization.h
index 98819f8..78cf5d8 100644
--- a/include/mycss/values/serialization.h
+++ b/include/mycss/values/serialization.h
@@ -28,8 +28,8 @@ extern "C" {
#include <mycss/values/values.h>
-void mycss_serialization_length(mycss_values_length_t* value, FILE* fh);
-void mycss_serialization_percentage(mycss_values_percentage_t* value, FILE* fh);
+void mycss_values_serialization_length(mycss_values_length_t* value, mycss_callback_serialization_f callback, void* context);
+void mycss_values_serialization_percentage(mycss_values_percentage_t* value, mycss_callback_serialization_f callback, void* context);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/include/mycss/values/values.h b/include/mycss/values/values.h
index b68b45f..dd23fac 100644
--- a/include/mycss/values/values.h
+++ b/include/mycss/values/values.h
@@ -30,6 +30,17 @@
extern "C" {
#endif
+typedef struct mycss_values_shorthand_four mycss_values_shorthand_four_t;
+typedef struct mycss_values_percentage mycss_values_percentage_t;
+typedef struct mycss_values_length mycss_values_length_t;
+
+struct mycss_values_shorthand_four {
+ void* one;
+ void* two;
+ void* three;
+ void* four;
+};
+
struct mycss_values_length {
union {
int i;
@@ -38,8 +49,7 @@ struct mycss_values_length {
bool is_float;
mycss_units_type_t type;
-}
-typedef mycss_values_length_t;
+};
struct mycss_values_percentage {
union {
@@ -48,8 +58,7 @@ struct mycss_values_percentage {
};
bool is_float;
-}
-typedef mycss_values_percentage_t;
+};
void * mycss_values_create(mycss_entry_t* entry, size_t size);
diff --git a/source/mycss/an_plus_b.c b/source/mycss/an_plus_b.c
index 269ceb4..c8b1b8f 100644
--- a/source/mycss/an_plus_b.c
+++ b/source/mycss/an_plus_b.c
@@ -88,22 +88,30 @@ void mycss_an_plus_b_parser_expectations_error(mycss_entry_t* entry)
}
/////////////////////////////////////////////////////////
-//// An+B Print
+//// An+B Serialization
////
/////////////////////////////////////////////////////////
-void mycss_an_plus_b_print(mycss_an_plus_b_entry_t* anb_entry, FILE* fh)
+void mycss_an_plus_b_serialization(mycss_an_plus_b_entry_t* anb_entry, mycss_callback_serialization_f callback, void* context)
{
+ char data[512];
+
if(anb_entry->a != 0) {
- fprintf(fh, "%ld", anb_entry->a);
+ int len = snprintf(data, 512, "%ld", anb_entry->a);
+
+ if(len > 0)
+ callback(data, (size_t)len, context);
}
- fprintf(fh, "n");
+ callback("n", 1, context);
if(anb_entry->b != 0) {
if(anb_entry->b >= 0)
- fprintf(fh, "+%ld", anb_entry->b);
- else
- fprintf(fh, "%ld", anb_entry->b);
+ callback("+", 1, context);
+
+ int len = snprintf(data, 512, "%ld", anb_entry->b);
+
+ if(len > 0)
+ callback(data, (size_t)len, context);
}
}
diff --git a/source/mycss/an_plus_b.h b/source/mycss/an_plus_b.h
index c34fb89..fd52aa8 100644
--- a/source/mycss/an_plus_b.h
+++ b/source/mycss/an_plus_b.h
@@ -53,7 +53,7 @@ mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_create(mycss_entry_t* entry);
void mycss_an_plus_b_entry_clean_all(mycss_an_plus_b_entry_t* anb_entry);
mycss_an_plus_b_entry_t * mycss_an_plus_b_entry_destroy(mycss_entry_t* entry, mycss_an_plus_b_entry_t* anb_entry, bool self_destroy);
-void mycss_an_plus_b_print(mycss_an_plus_b_entry_t* anb_entry, FILE* fh);
+void mycss_an_plus_b_serialization(mycss_an_plus_b_entry_t* anb_entry, mycss_callback_serialization_f callback, void* context);
void mycss_an_plus_b_parser_expectations_error(mycss_entry_t* entry);
diff --git a/source/mycss/declaration/entry.c b/source/mycss/declaration/entry.c
index 6682b66..3e9ad29 100644
--- a/source/mycss/declaration/entry.c
+++ b/source/mycss/declaration/entry.c
@@ -23,7 +23,9 @@
mycss_declaration_entry_t * mycss_declaration_entry_create(mycss_declaration_t* declaration, myhtml_status_t* status)
{
- return mcobject_malloc(declaration->mcobject_entries, status);
+ mycss_declaration_entry_t *dec_entry = mcobject_malloc(declaration->mcobject_entries, status);
+ memset(dec_entry, 0, sizeof(mycss_declaration_entry_t));
+ return dec_entry;
}
void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry)
@@ -35,9 +37,9 @@ void mycss_declaration_entry_clean(mycss_declaration_entry_t* entry)
entry->flags = MyCSS_DECLARATION_FLAGS_UNDEF;
}
-void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* entry)
+void mycss_declaration_entry_clean_all(mycss_declaration_entry_t* dec_entry)
{
- memset(entry, 0, sizeof(mycss_declaration_entry_t));
+ memset(dec_entry, 0, sizeof(mycss_declaration_entry_t));
}
void mycss_declaration_entry_destroy(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry)
@@ -93,25 +95,4 @@ mycss_declaration_entry_t * mycss_declaration_entry_last(mycss_declaration_t* de
return declaration->entry_last;
}
-void mycss_declaration_entry_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry, FILE* fh)
-{
- mycss_property_print(dec_entry->type, fh);
- fprintf(fh, ": ");
- mycss_property_value_print(dec_entry->value_type, dec_entry->value, fh);
-}
-
-void mycss_declaration_entries_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* first_dec_entry, FILE* fh)
-{
- while(first_dec_entry) {
- mycss_declaration_entry_print(declaration, first_dec_entry, fh);
-
- if(first_dec_entry->next) {
- fprintf(fh, "; ");
- } else {
- fprintf(fh, ";");
- }
-
- first_dec_entry = first_dec_entry->next;
- }
-}
diff --git a/source/mycss/declaration/entry.h b/source/mycss/declaration/entry.h
index d791a60..f67f382 100644
--- a/source/mycss/declaration/entry.h
+++ b/source/mycss/declaration/entry.h
@@ -42,9 +42,6 @@ void mycss_declaration_entry_append_to_current(mycss_declaration_t* declaration,
void mycss_declaration_entry_remove(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry);
mycss_declaration_entry_t * mycss_declaration_entry_delete(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry);
-void mycss_declaration_entry_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* dec_entry, FILE* fh);
-void mycss_declaration_entries_print(mycss_declaration_t* declaration, mycss_declaration_entry_t* first_dec_entry, FILE* fh);
-
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/source/mycss/declaration/parser.c b/source/mycss/declaration/parser.c
index 1ad927f..3789537 100644
--- a/source/mycss/declaration/parser.c
+++ b/source/mycss/declaration/parser.c
@@ -33,8 +33,6 @@ void mycss_declaration_parser_ident(mycss_entry_t* entry, mycss_token_t* token)
if(dec_entry == NULL || (dec_entry->flags & MyCSS_DECLARATION_FLAGS_BAD) == 0) {
dec_entry = mycss_declaration_entry_create(entry->declaration, NULL);
- mycss_declaration_entry_clean_all(dec_entry);
-
mycss_declaration_entry_append_to_current(entry->declaration, dec_entry);
}
else
diff --git a/source/mycss/declaration/serialization.c b/source/mycss/declaration/serialization.c
new file mode 100644
index 0000000..957638f
--- /dev/null
+++ b/source/mycss/declaration/serialization.c
@@ -0,0 +1,118 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#include "mycss/declaration/serialization.h"
+#include "mycss/declaration/serialization_resources.h"
+
+static void mycss_declaration_serialization_important_if_need(mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context)
+{
+ if(dec_entry->is_important) {
+ callback(" !important", 11, context);
+ }
+}
+
+bool mycss_declaration_serialization_entry(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry,
+ mycss_callback_serialization_f callback, void* context)
+{
+ mycss_property_serialization_type_name(dec_entry->type, callback, context);
+
+ callback(": ", 2, context);
+
+ return mycss_declaration_serialization_map_by_type[ dec_entry->type ](entry, dec_entry, callback, context);
+}
+
+void mycss_declaration_serialization_entries(mycss_entry_t* entry, mycss_declaration_entry_t* first_dec_entry,
+ mycss_callback_serialization_f callback, void* context)
+{
+ while(first_dec_entry) {
+ mycss_declaration_serialization_entry(entry, first_dec_entry, callback, context);
+
+ if(first_dec_entry->next)
+ callback("; ", 2, context);
+ else
+ callback(";", 1, context);
+
+ first_dec_entry = first_dec_entry->next;
+ }
+}
+
+bool mycss_declaration_serialization_undef(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry,
+ mycss_callback_serialization_f callback, void* context)
+{
+ if(dec_entry->value == NULL)
+ return false;
+
+ mycss_property_serialization_value(dec_entry->value_type, dec_entry->value, callback, context);
+ mycss_declaration_serialization_important_if_need(dec_entry, callback, context);
+
+ return true;
+}
+
+bool mycss_declaration_serialization_padding(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry,
+ mycss_callback_serialization_f callback, void* context)
+{
+ if(dec_entry->value == NULL)
+ return false;
+
+ mycss_values_shorthand_four_t *value = (mycss_values_shorthand_four_t*)dec_entry->value;
+ mycss_declaration_entry_t *tmp;
+
+ if(value->one) {
+ tmp = (mycss_declaration_entry_t*)value->one;
+ mycss_property_serialization_value(tmp->value_type, tmp->value, callback, context);
+ }
+
+ if(value->two) {
+ callback(" ", 1, context);
+
+ tmp = (mycss_declaration_entry_t*)value->two;
+ mycss_property_serialization_value(tmp->value_type, tmp->value, callback, context);
+ }
+
+ if(value->three) {
+ callback(" ", 1, context);
+
+ tmp = (mycss_declaration_entry_t*)value->three;
+ mycss_property_serialization_value(tmp->value_type, tmp->value, callback, context);
+ }
+
+ if(value->four) {
+ callback(" ", 1, context);
+
+ tmp = (mycss_declaration_entry_t*)value->four;
+ mycss_property_serialization_value(tmp->value_type, tmp->value, callback, context);
+ }
+
+ mycss_declaration_serialization_important_if_need(dec_entry, callback, context);
+
+ return true;
+}
+
+bool mycss_declaration_serialization_padding_x(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry,
+ mycss_callback_serialization_f callback, void* context)
+{
+ if(dec_entry->value == NULL)
+ return false;
+
+ mycss_property_serialization_value(dec_entry->value_type, dec_entry->value, callback, context);
+ mycss_declaration_serialization_important_if_need(dec_entry, callback, context);
+
+ return true;
+}
diff --git a/source/mycss/declaration/serialization.h b/source/mycss/declaration/serialization.h
new file mode 100644
index 0000000..bdbf575
--- /dev/null
+++ b/source/mycss/declaration/serialization.h
@@ -0,0 +1,48 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#ifndef MyHTML_MyCSS_DECLARATION_SERIALIZATION_H
+#define MyHTML_MyCSS_DECLARATION_SERIALIZATION_H
+#pragma once
+
+#include "mycss/declaration/myosi.h"
+#include "mycss/values/values.h"
+#include "mycss/property/init.h"
+#include "mycss/property/serialization.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef bool (*mycss_declaration_serialization_f)(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry,
+ mycss_callback_serialization_f callback, void* context);
+
+bool mycss_declaration_serialization_entry(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context);
+void mycss_declaration_serialization_entries(mycss_entry_t* entry, mycss_declaration_entry_t* first_dec_entry, mycss_callback_serialization_f callback, void* context);
+
+bool mycss_declaration_serialization_undef(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context);
+bool mycss_declaration_serialization_padding(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context);
+bool mycss_declaration_serialization_padding_x(mycss_entry_t* entry, mycss_declaration_entry_t* dec_entry, mycss_callback_serialization_f callback, void* context);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* MyHTML_MyCSS_DECLARATION_SERIALIZATION_H */
diff --git a/source/mycss/declaration/serialization_resources.h b/source/mycss/declaration/serialization_resources.h
new file mode 100644
index 0000000..34225c7
--- /dev/null
+++ b/source/mycss/declaration/serialization_resources.h
@@ -0,0 +1,312 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#ifndef MyHTML_MyCSS_DECLARATION_SERIALIZATION_RESOURCES_H
+#define MyHTML_MyCSS_DECLARATION_SERIALIZATION_RESOURCES_H
+#pragma once
+
+static mycss_declaration_serialization_f mycss_declaration_serialization_map_by_type[] =
+{
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_padding,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_padding_x,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef,
+ mycss_declaration_serialization_undef
+};
+
+
+#endif /* MyHTML_MyCSS_DECLARATION_SERIALIZATION_RESOURCES_H */
diff --git a/source/mycss/declaration/state.c b/source/mycss/declaration/state.c
index b90ba70..4909262 100644
--- a/source/mycss/declaration/state.c
+++ b/source/mycss/declaration/state.c
@@ -133,7 +133,9 @@ bool mycss_declaration_state_colon_delim_after_important(mycss_entry_t* entry, m
}
default: {
if(token->type == entry->declaration->ending_token) {
- entry->parser = entry->parser_original;
+ mycss_entry_parser_list_pop(entry);
+ mycss_declaration_parser_end(entry, token);
+
return true;
}
diff --git a/source/mycss/myosi.h b/source/mycss/myosi.h
index 124918f..6154012 100644
--- a/source/mycss/myosi.h
+++ b/source/mycss/myosi.h
@@ -263,6 +263,7 @@ typedef mycss_token_t * (*mycss_token_ready_callback_f)(mycss_entry_t* entry, my
typedef size_t (*mycss_string_process_state_f)(myhtml_string_t* str, const char* data, size_t length, size_t size, mycss_string_res_t *out_res);
typedef bool (*mycss_parser_token_f)(mycss_entry_t* entry, mycss_token_t* token, bool last_response);
typedef bool (*mycss_an_plus_b_state_f)(mycss_entry_t* entry, mycss_an_plus_b_t* anb, mycss_an_plus_b_entry_t* anb_entry, mycss_token_t* token);
+typedef void (*mycss_callback_serialization_f)(const char* buffer, size_t size, void* ctx);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/source/mycss/namespace/init.c b/source/mycss/namespace/init.c
index 07bc5ce..7283328 100644
--- a/source/mycss/namespace/init.c
+++ b/source/mycss/namespace/init.c
@@ -289,51 +289,4 @@ mycss_namespace_entry_t * mycss_namespace_entry_by_name(mycss_namespace_t *ns, m
return (mycss_namespace_entry_t*)(name_tree->nodes[ idx ].value);
}
-void mycss_namespace_print_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, FILE* fh)
-{
- mycss_namespace_entry_t* ns_entry = ns_stylesheet->entry_first;
-
- while(ns_entry) {
- fprintf(fh, "@namespace");
-
- if(ns_entry->name && ns_entry->name->length) {
- fprintf(fh, " %s", ns_entry->name->data);
- }
-
- if(ns_entry->url && ns_entry->url->length) {
- fprintf(fh, " \"%s\"", ns_entry->url->data);
- }
-
- fprintf(fh, ";\n");
-
- ns_entry = ns_entry->next;
- }
-}
-
-void mycss_namespace_print(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, FILE* fh, bool with_vbar)
-{
- if(ns_entry->name && ns_entry->name->length) {
- const char *ns_name = ns_entry->name->data;
-
- fprintf(fh, "%s", ns_name);
- }
- else if(ns_entry->ns_id == MyHTML_NAMESPACE_ANY)
- return; //fprintf(fh, "*");
- else if(ns_entry->ns_id == MyHTML_NAMESPACE_UNDEF) {
- /* some print */
- }
- else {
- if(ns_entry->ns_id < MyHTML_NAMESPACE_LAST_ENTRY) {
- const char *ns_name = myhtml_namespace_name_by_id(ns_entry->ns_id, NULL);
- fprintf(fh, "<default=%s>", ns_name);
- }
- else {
- fprintf(fh, "<default>");
- }
- }
-
- if(with_vbar)
- fprintf(fh, "|");
-}
-
diff --git a/source/mycss/namespace/init.h b/source/mycss/namespace/init.h
index 0ade454..528e8a3 100644
--- a/source/mycss/namespace/init.h
+++ b/source/mycss/namespace/init.h
@@ -54,9 +54,6 @@ const char * mycss_namespace_name_by_id(mycss_namespace_t* ns, mctree_t* name_tr
mycss_namespace_entry_t * mycss_namespace_entry_by_name(mycss_namespace_t *ns, mctree_t* name_tree, const char* ns_name, size_t length, bool case_insensitive);
const char * mycss_namespace_name_by_entry(mycss_namespace_entry_t* ns_entry, mctree_t* name_tree, size_t* length, bool* is_default);
-void mycss_namespace_print(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, FILE* fh, bool with_vbar);
-void mycss_namespace_print_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, FILE* fh);
-
#ifdef __cplusplus
} /* extern "C" */
#endif
diff --git a/source/mycss/namespace/serialization.c b/source/mycss/namespace/serialization.c
new file mode 100644
index 0000000..1dc60d1
--- /dev/null
+++ b/source/mycss/namespace/serialization.c
@@ -0,0 +1,73 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#include "mycss/namespace/serialization.h"
+
+void mycss_namespace_serialization_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_callback_serialization_f callback, void* context)
+{
+ mycss_namespace_entry_t* ns_entry = ns_stylesheet->entry_first;
+
+ while(ns_entry) {
+ callback("@namespace", 10, context);
+
+ if(ns_entry->name && ns_entry->name->length) {
+ callback(ns_entry->name->data, ns_entry->name->length, context);
+ }
+
+ if(ns_entry->url && ns_entry->url->length) {
+ callback("\"", 1, context);
+ callback(ns_entry->url->data, ns_entry->url->length, context);
+ callback("\"", 1, context);
+ }
+
+ callback(";", 1, context);
+
+ ns_entry = ns_entry->next;
+ }
+}
+
+void mycss_namespace_serialization_entry(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, mycss_callback_serialization_f callback, void* context, bool with_vbar)
+{
+ if(ns_entry->name && ns_entry->name->length) {
+ callback(ns_entry->name->data, ns_entry->name->length, context);
+ }
+ else if(ns_entry->ns_id == MyHTML_NAMESPACE_ANY)
+ return; //fprintf(fh, "*");
+ else if(ns_entry->ns_id == MyHTML_NAMESPACE_UNDEF) {
+ /* some print */
+ }
+ else {
+ if(ns_entry->ns_id < MyHTML_NAMESPACE_LAST_ENTRY) {
+ callback("<default=", 9, context);
+
+ const char *ns_name = myhtml_namespace_name_by_id(ns_entry->ns_id, NULL);
+ callback(ns_name, strlen(ns_name), context);
+
+ callback(">", 1, context);
+ }
+ else {
+ callback("<default>", 9, context);
+ }
+ }
+
+ if(with_vbar)
+ callback("|", 1, context);
+}
+
diff --git a/source/mycss/namespace/serialization.h b/source/mycss/namespace/serialization.h
new file mode 100644
index 0000000..1e87f3e
--- /dev/null
+++ b/source/mycss/namespace/serialization.h
@@ -0,0 +1,39 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#ifndef MyHTML_MyCSS_NAMESPACE_SERIALIZATION_H
+#define MyHTML_MyCSS_NAMESPACE_SERIALIZATION_H
+#pragma once
+
+#include "mycss/entry.h"
+#include "mycss/namespace/myosi.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void mycss_namespace_serialization_stylesheet(mycss_namespace_stylesheet_t* ns_stylesheet, mycss_callback_serialization_f callback, void* context);
+void mycss_namespace_serialization_entry(mycss_namespace_t* ns, mycss_namespace_entry_t* ns_entry, mycss_callback_serialization_f callback, void* context, bool with_vbar);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* MyHTML_MyCSS_NAMESPACE_SERIALIZATION_H */
diff --git a/source/mycss/property/const.h b/source/mycss/property/const.h
index 357d0b4..4c3e762 100644
--- a/source/mycss/property/const.h
+++ b/source/mycss/property/const.h
@@ -1791,6 +1791,34 @@ enum mycss_property_overflow_y {
}
typedef mycss_property_overflow_y_t;
+enum mycss_property_padding_bottom {
+ MyCSS_PROPERTY_PADDING_BOTTOM_INHERIT = 0x008f,
+ MyCSS_PROPERTY_PADDING_BOTTOM_LENGTH = 0x00ad,
+ MyCSS_PROPERTY_PADDING_BOTTOM_PERCENTAGE = 0x00fd
+}
+typedef mycss_property_padding_bottom_t;
+
+enum mycss_property_padding_left {
+ MyCSS_PROPERTY_PADDING_LEFT_INHERIT = 0x008f,
+ MyCSS_PROPERTY_PADDING_LEFT_LENGTH = 0x00ad,
+ MyCSS_PROPERTY_PADDING_LEFT_PERCENTAGE = 0x00fd
+}
+typedef mycss_property_padding_left_t;
+
+enum mycss_property_padding_right {
+ MyCSS_PROPERTY_PADDING_RIGHT_INHERIT = 0x008f,
+ MyCSS_PROPERTY_PADDING_RIGHT_LENGTH = 0x00ad,
+ MyCSS_PROPERTY_PADDING_RIGHT_PERCENTAGE = 0x00fd
+}
+typedef mycss_property_padding_right_t;
+
+enum mycss_property_padding_top {
+ MyCSS_PROPERTY_PADDING_TOP_INHERIT = 0x008f,
+ MyCSS_PROPERTY_PADDING_TOP_LENGTH = 0x00ad,
+ MyCSS_PROPERTY_PADDING_TOP_PERCENTAGE = 0x00fd
+}
+typedef mycss_property_padding_top_t;
+
enum mycss_property_pause_after {
MyCSS_PROPERTY_PAUSE_AFTER_MEDIUM = 0x00c4,
MyCSS_PROPERTY_PAUSE_AFTER_NONE = 0x00da,
diff --git a/source/mycss/property/init.c b/source/mycss/property/init.c
index 56fb165..3b8169b 100644
--- a/source/mycss/property/init.c
+++ b/source/mycss/property/init.c
@@ -106,35 +106,4 @@ mycss_property_value_t mycss_property_value_type_by_name(const char *name, size_
return MyCSS_PROPERTY_VALUE_UNDEF;
}
-void mycss_property_print(mycss_property_type_t prop_type, FILE* fh)
-{
- if(prop_type >= MyCSS_PROPERTY_TYPE_LAST_ENTRY)
- return;
-
- fprintf(fh, "%s", mycss_property_index_type_name[prop_type]);
-}
-
-void mycss_property_value_print(unsigned int value_type, void* value, FILE* fh)
-{
- switch (value_type) {
- case MyCSS_PROPERTY_VALUE_LENGTH:
- mycss_serialization_length(value, fh);
- break;
-
- case MyCSS_PROPERTY_VALUE_PERCENTAGE:
- mycss_serialization_percentage(value, fh);
- break;
-
- default:
- {
- if(value_type >= MyCSS_PROPERTY_VALUE_LAST_ENTRY)
- break;
-
- fprintf(fh, "%s", mycss_property_index_type_value[value_type]);
-
- break;
- }
- }
-}
-
diff --git a/source/mycss/property/parser.c b/source/mycss/property/parser.c
index 9bb554c..a22a06e 100644
--- a/source/mycss/property/parser.c
+++ b/source/mycss/property/parser.c
@@ -29,16 +29,138 @@ bool mycss_property_parser_undef(mycss_entry_t* entry, mycss_token_t* token, boo
return mycss_property_shared_switch_to_parse_error(entry);
}
+/* width height */
bool mycss_property_parser_width(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
{
- return mycss_property_shared_length(entry, token, last_response);
+ if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE)
+ return true;
+
+ if(mycss_property_shared_length(entry, token, entry->declaration->entry_last))
+ return mycss_property_shared_switch_to_find_important(entry);
+
+ return mycss_property_shared_switch_to_parse_error(entry);
}
bool mycss_property_parser_height(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
{
- return mycss_property_shared_length(entry, token, last_response);
+ if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE)
+ return true;
+
+ if(mycss_property_shared_length(entry, token, entry->declaration->entry_last))
+ return mycss_property_shared_switch_to_find_important(entry);
+
+ return mycss_property_shared_switch_to_parse_error(entry);
+}
+
+/* padding */
+bool mycss_property_parser_padding(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
+{
+ if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE)
+ return true;
+
+ mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last;
+
+ if(dec_entry->value == NULL)
+ dec_entry->value = mycss_values_create(entry, sizeof(mycss_values_shorthand_four_t));
+
+ mycss_values_shorthand_four_t *value = dec_entry->value;
+
+ if(mycss_property_shared_check_declaration_end(entry, token)) {
+ if(value->one == NULL) {
+ mycss_values_destroy(entry, value);
+ return mycss_property_shared_switch_to_parse_error(entry);
+ }
+
+ return true;
+ }
+
+ if(value->one == NULL) {
+ value->one = mycss_declaration_entry_create(entry->declaration, NULL);
+
+ if(mycss_property_shared_length(entry, token, value->one) == false) {
+ mycss_declaration_entry_destroy(entry->declaration, value->one);
+ dec_entry->value = mycss_values_destroy(entry, value);
+
+ return mycss_property_shared_switch_to_parse_error(entry);
+ }
+ }
+ else if(value->two == NULL) {
+ value->two = mycss_declaration_entry_create(entry->declaration, NULL);
+
+ if(mycss_property_shared_length(entry, token, value->two) == false) {
+ mycss_declaration_entry_destroy(entry->declaration, value->one);
+ mycss_declaration_entry_destroy(entry->declaration, value->two);
+ dec_entry->value = mycss_values_destroy(entry, value);
+
+ return mycss_property_shared_switch_to_parse_error(entry);
+ }
+ }
+ else if(value->three == NULL) {
+ value->three = mycss_declaration_entry_create(entry->declaration, NULL);
+
+ if(mycss_property_shared_length(entry, token, value->three) == false) {
+ mycss_declaration_entry_destroy(entry->declaration, value->one);
+ mycss_declaration_entry_destroy(entry->declaration, value->two);
+ mycss_declaration_entry_destroy(entry->declaration, value->three);
+ dec_entry->value = mycss_values_destroy(entry, value);
+
+ return mycss_property_shared_switch_to_parse_error(entry);
+ }
+ }
+ else if(value->four == NULL) {
+ value->four = mycss_declaration_entry_create(entry->declaration, NULL);
+
+ if(mycss_property_shared_length(entry, token, value->four) == false) {
+ mycss_declaration_entry_destroy(entry->declaration, value->one);
+ mycss_declaration_entry_destroy(entry->declaration, value->two);
+ mycss_declaration_entry_destroy(entry->declaration, value->three);
+ mycss_declaration_entry_destroy(entry->declaration, value->four);
+ dec_entry->value = mycss_values_destroy(entry, value);
+
+ return mycss_property_shared_switch_to_parse_error(entry);
+ }
+
+ return mycss_property_shared_switch_to_find_important(entry);
+ }
+
+ return true;
+}
+
+static bool mycss_property_parser_padding_X(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
+{
+ if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE)
+ return true;
+
+ mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last;
+
+ if(mycss_property_shared_length(entry, token, dec_entry) == false)
+ return mycss_property_shared_switch_to_parse_error(entry);
+
+ return mycss_property_shared_switch_to_find_important(entry);
+}
+
+bool mycss_property_parser_padding_bottom(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
+{
+ return mycss_property_parser_padding_X(entry, token, last_response);
+}
+
+bool mycss_property_parser_padding_left(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
+{
+ return mycss_property_parser_padding_X(entry, token, last_response);
+}
+
+bool mycss_property_parser_padding_right(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
+{
+ return mycss_property_parser_padding_X(entry, token, last_response);
}
+bool mycss_property_parser_padding_top(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
+{
+ return mycss_property_parser_padding_X(entry, token, last_response);
+}
+
+/* */
+
/* not yet */
bool mycss_property_parser_align_content(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
{
@@ -935,31 +1057,6 @@ bool mycss_property_parser_overflow_y(mycss_entry_t* entry, mycss_token_t* token
return mycss_property_shared_switch_to_parse_error(entry);
}
-bool mycss_property_parser_padding(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
-{
- return mycss_property_shared_switch_to_parse_error(entry);
-}
-
-bool mycss_property_parser_padding_bottom(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
-{
- return mycss_property_shared_switch_to_parse_error(entry);
-}
-
-bool mycss_property_parser_padding_left(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
-{
- return mycss_property_shared_switch_to_parse_error(entry);
-}
-
-bool mycss_property_parser_padding_right(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
-{
- return mycss_property_shared_switch_to_parse_error(entry);
-}
-
-bool mycss_property_parser_padding_top(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
-{
- return mycss_property_shared_switch_to_parse_error(entry);
-}
-
bool mycss_property_parser_pause(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
{
return mycss_property_shared_switch_to_parse_error(entry);
diff --git a/source/mycss/property/parser.h b/source/mycss/property/parser.h
index f6913f2..fc8a061 100644
--- a/source/mycss/property/parser.h
+++ b/source/mycss/property/parser.h
@@ -26,9 +26,10 @@
#include "mycss/property/shared.h"
#include "mycss/values/consume.h"
#include "mycss/values/values.h"
+#include "mycss/declaration/entry.h"
#ifdef __cplusplus
-//extern "C" {
+extern "C" {
#endif
bool mycss_property_parser_undef(mycss_entry_t* entry, mycss_token_t* token, bool last_response);
diff --git a/source/mycss/property/serialization.c b/source/mycss/property/serialization.c
new file mode 100644
index 0000000..bb1daa4
--- /dev/null
+++ b/source/mycss/property/serialization.c
@@ -0,0 +1,56 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#include "mycss/property/serialization.h"
+#include "mycss/property/resources.h"
+
+void mycss_property_serialization_type_name(mycss_property_type_t prop_type, mycss_callback_serialization_f callback, void* context)
+{
+ if(prop_type >= MyCSS_PROPERTY_TYPE_LAST_ENTRY)
+ return;
+
+ const char* name = mycss_property_index_type_name[prop_type];
+ callback(name, strlen(name), context);
+}
+
+void mycss_property_serialization_value(unsigned int value_type, void* value, mycss_callback_serialization_f callback, void* context)
+{
+ switch (value_type) {
+ case MyCSS_PROPERTY_VALUE_LENGTH:
+ mycss_values_serialization_length(value, callback, context);
+ break;
+
+ case MyCSS_PROPERTY_VALUE_PERCENTAGE:
+ mycss_values_serialization_percentage(value, callback, context);
+ break;
+
+ default:
+ {
+ if(value_type >= MyCSS_PROPERTY_VALUE_LAST_ENTRY)
+ break;
+
+ const char* text_value = mycss_property_index_type_value[value_type];
+ callback(text_value, strlen(text_value), context);
+
+ break;
+ }
+ }
+}
+
diff --git a/source/mycss/property/serialization.h b/source/mycss/property/serialization.h
new file mode 100644
index 0000000..2f1abb7
--- /dev/null
+++ b/source/mycss/property/serialization.h
@@ -0,0 +1,40 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#ifndef MyHTML_MyCSS_PROPERTY_SERIALIZATION_H
+#define MyHTML_MyCSS_PROPERTY_SERIALIZATION_H
+#pragma once
+
+#include "mycss/property/myosi.h"
+#include "mycss/property/init.h"
+#include "mycss/values/serialization.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void mycss_property_serialization_type_name(mycss_property_type_t prop_type, mycss_callback_serialization_f callback, void* context);
+void mycss_property_serialization_value(unsigned int value_type, void* value, mycss_callback_serialization_f callback, void* context);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* MyHTML_MyCSS_PROPERTY_SERIALIZATION_H */
diff --git a/source/mycss/property/shared.c b/source/mycss/property/shared.c
index c8f0997..b6b32eb 100644
--- a/source/mycss/property/shared.c
+++ b/source/mycss/property/shared.c
@@ -32,13 +32,28 @@ bool mycss_property_shared_switch_to_parse_error(mycss_entry_t* entry)
return false;
}
-bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
+bool mycss_property_shared_check_declaration_end(mycss_entry_t* entry, mycss_token_t* token)
{
- if(token->type == MyCSS_TOKEN_TYPE_WHITESPACE)
+ if(token->type == MyCSS_TOKEN_TYPE_SEMICOLON) {
+ entry->parser = mycss_declaration_state_data;
return true;
+ }
+ else if(token->type == MyCSS_TOKEN_TYPE_DELIM && *token->data == '!') {
+ entry->parser = mycss_declaration_state_colon_important;
+ return true;
+ }
+ else if(token->type == entry->declaration->ending_token) {
+ mycss_entry_parser_list_pop(entry);
+ mycss_declaration_parser_end(entry, token);
+
+ return true;
+ }
- mycss_declaration_entry_t* dec_entry = entry->declaration->entry_last;
-
+ return false;
+}
+
+bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, mycss_declaration_entry_t* dec_entry)
+{
void *value = NULL;
mycss_values_entry_set(entry, &value);
@@ -61,14 +76,14 @@ bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, bo
if(dec_entry->value_type != MyCSS_PROPERTY_WIDTH_AUTO &&
dec_entry->value_type != MyCSS_PROPERTY_WIDTH_INHERIT)
{
- return mycss_property_shared_switch_to_parse_error(entry);
+ return false;
}
}
else {
- return mycss_property_shared_switch_to_parse_error(entry);
+ return false;
}
- return mycss_property_shared_switch_to_find_important(entry);
+ return true;
}
bool mycss_property_shared_line_width(mycss_entry_t* entry, mycss_token_t* token, bool last_response)
diff --git a/source/mycss/property/shared.h b/source/mycss/property/shared.h
index f265675..cdace6b 100644
--- a/source/mycss/property/shared.h
+++ b/source/mycss/property/shared.h
@@ -32,7 +32,8 @@ extern "C" {
bool mycss_property_shared_switch_to_find_important(mycss_entry_t* entry);
bool mycss_property_shared_switch_to_parse_error(mycss_entry_t* entry);
-bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, bool last_response);
+bool mycss_property_shared_check_declaration_end(mycss_entry_t* entry, mycss_token_t* token);
+bool mycss_property_shared_length(mycss_entry_t* entry, mycss_token_t* token, mycss_declaration_entry_t* dec_entry);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/source/mycss/selectors/init.c b/source/mycss/selectors/init.c
index 9ee8660..8abffc3 100644
--- a/source/mycss/selectors/init.c
+++ b/source/mycss/selectors/init.c
@@ -19,7 +19,6 @@
*/
#include "mycss/selectors/init.h"
-#include "mycss/selectors/myosi_resource.h"
#include "mycss/selectors/value_resource.h"
mycss_selectors_t * mycss_selectors_create(void)
@@ -247,222 +246,4 @@ void mycss_selectors_entry_append_to_current(mycss_selectors_t* selectors, mycss
selectors->entry_last = selector;
}
-void mycss_selectors_print_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh)
-{
- switch(selector->type) {
- case MyCSS_SELECTORS_TYPE_ELEMENT: {
- if(selector->ns_entry)
- mycss_namespace_print(selectors->ref_entry->ns, selector->ns_entry, fh, true);
-
- if(selector->key)
- fprintf(fh, "%s", selector->key->data);
- break;
- }
- case MyCSS_SELECTORS_TYPE_ATTRIBUTE: {
- fprintf(fh, "[");
-
- if(selector->ns_entry)
- mycss_namespace_print(selectors->ref_entry->ns, selector->ns_entry, fh, true);
-
- if(selector->key)
- fprintf(fh, "%s", selector->key->data);
-
- if(selector->value == NULL) {
- fprintf(fh, "]");
- break;
- }
-
- fprintf(fh, " %s ", mycss_selectors_resource_matcher_names_map[ mycss_selector_value_attribute(selector->value)->match ]);
-
- if(mycss_selector_value_attribute(selector->value)->value) {
- fprintf(fh, "%s", mycss_selector_value_attribute(selector->value)->value->data);
- }
-
- if(mycss_selector_value_attribute(selector->value)->mod & MyCSS_SELECTORS_MOD_I) {
- fprintf(fh, " i");
- }
-
- fprintf(fh, "]");
-
- break;
- }
- case MyCSS_SELECTORS_TYPE_ID: {
- if(selector->key)
- fprintf(fh, "#%s", selector->key->data);
- break;
- }
- case MyCSS_SELECTORS_TYPE_CLASS: {
- if(selector->key)
- fprintf(fh, ".%s", selector->key->data);
- break;
- }
- case MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION: {
- if(selector->key)
- fprintf(fh, ":%s", selector->key->data);
-
- fprintf(fh, "(");
-
- switch (selector->sub_type) {
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_HAS:
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NOT:
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES:
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_CURRENT:
- if(selector->value)
- mycss_selectors_print_list(selectors, selector->value, fh);
- break;
-
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_CHILD:
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD:
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_COLUMN:
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_COLUMN:
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE:
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE:
- if(selector->value) {
- mycss_an_plus_b_print(selector->value, fh);
-
- if(mycss_selector_value_an_plus_b(selector->value)->of) {
- fprintf(fh, " of ");
- mycss_selectors_print_list(selectors, mycss_selector_value_an_plus_b(selector->value)->of, fh);
- }
- }
-
- break;
-
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DROP: {
- mycss_selectors_function_drop_type_t drop_val = mycss_selector_value_drop(selector->value);
-
- if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_ACTIVE) {
- fprintf(fh, "active");
-
- if(drop_val != MyCSS_SELECTORS_FUNCTION_DROP_TYPE_ACTIVE)
- fprintf(fh, " || ");
- }
-
- if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_VALID) {
- fprintf(fh, "valid");
-
- if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_INVALID)
- fprintf(fh, " || ");
- }
-
- if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_INVALID) {
- fprintf(fh, "invalid");
- }
-
- break;
- }
-
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DIR: {
- if(selector->value)
- fprintf(fh, "%s", mycss_selector_value_string(selector->value)->data);
-
- break;
- }
-
- case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LANG: {
- if(selector->value) {
- mycss_selectors_value_lang_t *lang = mycss_selector_value_lang(selector->value);
-
- while(lang) {
- fprintf(fh, "%s", lang->str.data);
-
- if(lang->next)
- fprintf(fh, ", ");
-
- lang = lang->next;
- }
-
- }
-
- break;
- }
-
- default:
- break;
- }
-
- fprintf(fh, ")");
-
- break;
- }
-
- case MyCSS_SELECTORS_TYPE_PSEUDO_CLASS: {
- fprintf(fh, ":");
-
- if(selector->key)
- fprintf(fh, "%s", selector->key->data);
-
- break;
- }
-
- case MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT: {
- fprintf(fh, "::");
-
- if(selector->key)
- fprintf(fh, "%s", selector->key->data);
-
- break;
- }
-
- default: {
- if(selector->key)
- fprintf(fh, "%s", selector->key->data);
-
- fprintf(fh, "^U");
- break;
- }
- };
-
- if(selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_UNKNOWN)
- fprintf(fh, "^UST");
-
- if(selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD)
- fprintf(fh, "^B");
-}
-
-void mycss_selectors_print_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh)
-{
- while(selector) {
- if(selector->combinator == MyCSS_SELECTORS_COMBINATOR_DESCENDANT)
- fprintf(fh, " ");
- else if(selector->combinator == MyCSS_SELECTORS_COMBINATOR_UNDEF) {
- /* fprintf(fh, "") */
- }
- else
- fprintf(fh, " %s ", mycss_selectors_resource_combinator_names_map[ selector->combinator ]);
-
- mycss_selectors_print_selector(selectors, selector, fh);
-
- selector = selector->next;
- }
-}
-
-void mycss_selectors_print_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, FILE* fh)
-{
- while(selectors_list) {
- for(size_t i = 0; i < selectors_list->entries_list_length; i++) {
- mycss_selectors_entries_list_t *entries = &selectors_list->entries_list[i];
- mycss_selectors_print_chain(selectors, entries->entry, fh);
-
- if((i + 1) != selectors_list->entries_list_length)
- fprintf(fh, ", ");
- }
-
- if(selectors_list->declaration_entry) {
- fprintf(fh, " {");
- mycss_declaration_entries_print(selectors->ref_entry->declaration, selectors_list->declaration_entry, fh);
- fprintf(fh, "}");
- }
-
- if(selectors_list->flags == MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) {
- fprintf(fh, "^BAD_SELECTOR_LIST");
- }
-
- if(selectors_list->next) {
- fprintf(fh, "\n");
- }
-
- selectors_list = selectors_list->next;
- }
-}
diff --git a/source/mycss/selectors/init.h b/source/mycss/selectors/init.h
index f71c14e..6fb47d9 100644
--- a/source/mycss/selectors/init.h
+++ b/source/mycss/selectors/init.h
@@ -46,10 +46,6 @@ mycss_selectors_list_t * mycss_selectors_parse_by_function(mycss_selectors_t* se
mycss_selectors_entry_t * mycss_selectors_entry_find_first(mycss_selectors_entry_t* selector);
-void mycss_selectors_print_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, FILE* fh);
-void mycss_selectors_print_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh);
-void mycss_selectors_print_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, FILE* fh);
-
mycss_selectors_entry_t * mycss_selectors_entry_create(mycss_selectors_t* selectors);
mycss_selectors_entries_list_t * mycss_selectors_entries_list_create(mycss_selectors_t* selectors);
diff --git a/source/mycss/selectors/serialization.c b/source/mycss/selectors/serialization.c
new file mode 100644
index 0000000..81498f2
--- /dev/null
+++ b/source/mycss/selectors/serialization.c
@@ -0,0 +1,275 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#include "mycss/selectors/serialization.h"
+#include "mycss/selectors/myosi_resource.h"
+
+void mycss_selectors_serialization_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector,
+ mycss_callback_serialization_f callback, void* context)
+{
+ while(selector) {
+ if(selector->combinator == MyCSS_SELECTORS_COMBINATOR_DESCENDANT)
+ callback(" ", 1, context);
+ else if(selector->combinator == MyCSS_SELECTORS_COMBINATOR_UNDEF) {
+ /* fprintf(fh, "") */
+ }
+ else {
+ callback(" ", 1, context);
+
+ const char *comb_name = mycss_selectors_resource_combinator_names_map[ selector->combinator ];
+ callback(comb_name, strlen(comb_name), context);
+
+ callback(" ", 1, context);
+ }
+
+ mycss_selectors_serialization_selector(selectors, selector, callback, context);
+
+ selector = selector->next;
+ }
+}
+
+bool mycss_selectors_serialization_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list,
+ mycss_callback_serialization_f callback, void* context)
+{
+ while(selectors_list) {
+ for(size_t i = 0; i < selectors_list->entries_list_length; i++)
+ {
+ mycss_selectors_entries_list_t *entries = &selectors_list->entries_list[i];
+ mycss_selectors_serialization_chain(selectors, entries->entry, callback, context);
+
+ if((i + 1) != selectors_list->entries_list_length)
+ callback(", ", 2, context);
+ }
+
+ if(selectors_list->declaration_entry) {
+ callback(" {", 2, context);
+ mycss_declaration_serialization_entries(selectors->ref_entry, selectors_list->declaration_entry, callback, context);
+ callback("}", 1, context);
+ }
+
+ if(selectors_list->flags == MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) {
+ callback("^BAD_SELECTOR_LIST", 18, context);
+ }
+
+ if(selectors_list->next)
+ callback("\n", 1, context);
+
+ selectors_list = selectors_list->next;
+ }
+
+ return true;
+}
+
+bool mycss_selectors_serialization_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector,
+ mycss_callback_serialization_f callback, void* context)
+{
+ switch(selector->type) {
+ case MyCSS_SELECTORS_TYPE_ELEMENT: {
+ if(selector->ns_entry)
+ mycss_namespace_serialization_entry(selectors->ref_entry->ns, selector->ns_entry, callback, context, true);
+
+ if(selector->key)
+ callback(selector->key->data, selector->key->length, context);
+
+ break;
+ }
+ case MyCSS_SELECTORS_TYPE_ATTRIBUTE: {
+ callback("[", 1, context);
+
+ if(selector->ns_entry)
+ mycss_namespace_serialization_entry(selectors->ref_entry->ns, selector->ns_entry, callback, context, true);
+
+ if(selector->key)
+ callback(selector->key->data, selector->key->length, context);
+
+ if(selector->value == NULL) {
+ callback("]", 1, context);
+ break;
+ }
+
+ /* match value: =, |=, ~=... */
+ callback(" ", 1, context);
+
+ const char *match_name = mycss_selectors_resource_matcher_names_map[ mycss_selector_value_attribute(selector->value)->match ];
+ callback(match_name, strlen(match_name), context);
+
+ callback(" ", 1, context);
+
+ /* value */
+ if(mycss_selector_value_attribute(selector->value)->value) {
+ myhtml_string_t *str_value = mycss_selector_value_attribute(selector->value)->value;
+ callback(str_value->data, str_value->length, context);
+ }
+
+ /* modificator */
+ if(mycss_selector_value_attribute(selector->value)->mod & MyCSS_SELECTORS_MOD_I) {
+ callback(" i", 2, context);
+ }
+
+ callback("]", 1, context);
+ break;
+ }
+ case MyCSS_SELECTORS_TYPE_ID: {
+ if(selector->key) {
+ callback("#", 1, context);
+ callback(selector->key->data, selector->key->length, context);
+ }
+
+ break;
+ }
+ case MyCSS_SELECTORS_TYPE_CLASS: {
+ if(selector->key) {
+ callback(".", 1, context);
+ callback(selector->key->data, selector->key->length, context);
+ }
+
+ break;
+ }
+ case MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION: {
+ if(selector->key) {
+ callback(":", 1, context);
+ callback(selector->key->data, selector->key->length, context);
+ }
+
+ callback("(", 1, context);
+
+ switch (selector->sub_type) {
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_HAS:
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NOT:
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES:
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_CURRENT:
+ if(selector->value)
+ mycss_selectors_serialization_list(selectors, selector->value, callback, context);
+
+ break;
+
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_CHILD:
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_CHILD:
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_COLUMN:
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_COLUMN:
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_OF_TYPE:
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NTH_LAST_OF_TYPE:
+ if(selector->value) {
+ mycss_an_plus_b_serialization(selector->value, callback, context);
+
+ if(mycss_selector_value_an_plus_b(selector->value)->of) {
+ callback(" of ", 4, context);
+ mycss_selectors_serialization_list(selectors, mycss_selector_value_an_plus_b(selector->value)->of, callback, context);
+ }
+ }
+
+ break;
+
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DROP: {
+ mycss_selectors_function_drop_type_t drop_val = mycss_selector_value_drop(selector->value);
+
+ if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_ACTIVE) {
+ callback("active", 6, context);
+
+ if(drop_val != MyCSS_SELECTORS_FUNCTION_DROP_TYPE_ACTIVE)
+ callback(" || ", 4, context);
+ }
+
+ if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_VALID) {
+ callback("valid", 5, context);
+
+ if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_INVALID)
+ callback(" || ", 4, context);
+ }
+
+ if(drop_val & MyCSS_SELECTORS_FUNCTION_DROP_TYPE_INVALID)
+ callback("invalid", 7, context);
+
+ break;
+ }
+
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_DIR:
+ {
+ if(selector->value) {
+ myhtml_string_t *str_fname = mycss_selector_value_string(selector->value);
+ callback(str_fname->data, str_fname->length, context);
+ }
+
+ break;
+ }
+
+ case MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LANG: {
+ if(selector->value) {
+ mycss_selectors_value_lang_t *lang = mycss_selector_value_lang(selector->value);
+
+ while(lang) {
+ callback(lang->str.data, lang->str.length, context);
+
+ if(lang->next)
+ callback(", ", 2, context);
+
+ lang = lang->next;
+ }
+
+ }
+
+ break;
+ }
+
+ default:
+ break;
+ }
+
+ callback(")", 1, context);
+ break;
+ }
+
+ case MyCSS_SELECTORS_TYPE_PSEUDO_CLASS: {
+ callback(":", 1, context);
+
+ if(selector->key)
+ callback(selector->key->data, selector->key->length, context);
+
+ break;
+ }
+
+ case MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT: {
+ callback("::", 2, context);
+
+ if(selector->key)
+ callback(selector->key->data, selector->key->length, context);
+
+ break;
+ }
+
+ default: {
+ if(selector->key)
+ callback(selector->key->data, selector->key->length, context);
+
+ callback("^U", 2, context);
+ break;
+ }
+ };
+
+ if(selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_UNKNOWN)
+ callback("^UST", 4, context);
+
+ if(selector->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD)
+ callback("^B", 2, context);
+
+ return true;
+}
+
+
diff --git a/source/mycss/selectors/serialization.h b/source/mycss/selectors/serialization.h
new file mode 100644
index 0000000..7d9d0cc
--- /dev/null
+++ b/source/mycss/selectors/serialization.h
@@ -0,0 +1,41 @@
+/*
+ Copyright (C) 2016 Alexander Borisov
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+ Author: lex.borisov@gmail.com (Alexander Borisov)
+*/
+
+#ifndef MyHTML_MyCSS_SELECTORS_SERIALIZATION_H
+#define MyHTML_MyCSS_SELECTORS_SERIALIZATION_H
+#pragma once
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "mycss/selectors/myosi.h"
+#include "mycss/namespace/serialization.h"
+#include "mycss/declaration/serialization.h"
+
+void mycss_selectors_serialization_chain(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_callback_serialization_f callback, void* context);
+bool mycss_selectors_serialization_list(mycss_selectors_t* selectors, mycss_selectors_list_t* selectors_list, mycss_callback_serialization_f callback, void* context);
+bool mycss_selectors_serialization_selector(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector, mycss_callback_serialization_f callback, void* context);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif
+
+#endif /* MyHTML_MyCSS_SELECTORS_SERIALIZATION_H */
diff --git a/source/mycss/stylesheet.c b/source/mycss/stylesheet.c
index 0f8a5c9..dc998c0 100644
--- a/source/mycss/stylesheet.c
+++ b/source/mycss/stylesheet.c
@@ -60,9 +60,9 @@ mycss_stylesheet_t * mycss_stylesheet_destroy(mycss_stylesheet_t* stylesheet, bo
}
/* print */
-void mycss_stylesheet_print(mycss_stylesheet_t* stylesheet, FILE* fh)
+void mycss_stylesheet_serialization(mycss_stylesheet_t* stylesheet, mycss_callback_serialization_f callback, void* context)
{
- mycss_selectors_print_list(stylesheet->entry->selectors, stylesheet->sel_list_first, fh);
+ mycss_selectors_serialization_list(stylesheet->entry->selectors, stylesheet->sel_list_first, callback, context);
}
diff --git a/source/mycss/stylesheet.h b/source/mycss/stylesheet.h
index b3d0209..dd7d8a9 100644
--- a/source/mycss/stylesheet.h
+++ b/source/mycss/stylesheet.h
@@ -26,6 +26,7 @@
#include "mycss/entry.h"
#include "mycss/namespace/myosi.h"
#include "mycss/selectors/myosi.h"
+#include "mycss/selectors/serialization.h"
#ifdef __cplusplus
extern "C" {
@@ -48,7 +49,7 @@ mycss_status_t mycss_stylesheet_init(mycss_stylesheet_t* stylesheet, mycss_entry
mycss_status_t mycss_stylesheet_clean_all(mycss_stylesheet_t* stylesheet);
mycss_stylesheet_t * mycss_stylesheet_destroy(mycss_stylesheet_t* stylesheet, bool self_destroy);
-void mycss_stylesheet_print(mycss_stylesheet_t* stylesheet, FILE* fh);
+void mycss_stylesheet_serialization(mycss_stylesheet_t* stylesheet, mycss_callback_serialization_f callback, void* context);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/source/mycss/values/serialization.c b/source/mycss/values/serialization.c
index fa995ec..807e9c7 100644
--- a/source/mycss/values/serialization.c
+++ b/source/mycss/values/serialization.c
@@ -21,27 +21,43 @@
#include "mycss/values/serialization.h"
#include "mycss/values/units_resources.h"
-void mycss_serialization_length(mycss_values_length_t* value, FILE* fh)
+static void mycss_values_serialization_to_callback(const char* data, size_t len, mycss_callback_serialization_f callback, void* context)
{
+ if(len > 0)
+ callback(data, len, context);
+}
+
+void mycss_values_serialization_length(mycss_values_length_t* value, mycss_callback_serialization_f callback, void* context)
+{
+ char buff[512];
+
if(value->is_float) {
- fprintf(fh, "%0.4f", value->f);
+ int len = snprintf(buff, 512, "%0.4f", value->f);
+ mycss_values_serialization_to_callback(buff, len, callback, context);
}
else {
- fprintf(fh, "%d", value->i);
+ int len = snprintf(buff, 512, "%d", value->i);
+ mycss_values_serialization_to_callback(buff, len, callback, context);
}
if(value->type < MyCSS_UNIT_TYPE_LAST_ENTRY) {
- fprintf(fh, "%s", mycss_units_index_name[ value->type ]);
+ const char* name = mycss_units_index_name[ value->type ];
+ callback(name, strlen(name), context);
}
}
-void mycss_serialization_percentage(mycss_values_percentage_t* value, FILE* fh)
+void mycss_values_serialization_percentage(mycss_values_percentage_t* value, mycss_callback_serialization_f callback, void* context)
{
+ char buff[512];
+
if(value->is_float) {
- fprintf(fh, "%0.4f%%", value->f);
+ int len = snprintf(buff, 512, "%0.4f%%", value->f);
+ mycss_values_serialization_to_callback(buff, len, callback, context);
}
else {
- fprintf(fh, "%d%%", value->i);
+ int len = snprintf(buff, 512, "%d%%", value->i);
+ mycss_values_serialization_to_callback(buff, len, callback, context);
}
}
+
diff --git a/source/mycss/values/serialization.h b/source/mycss/values/serialization.h
index 5398142..b0aefa9 100644
--- a/source/mycss/values/serialization.h
+++ b/source/mycss/values/serialization.h
@@ -28,8 +28,8 @@ extern "C" {
#include "mycss/values/values.h"
-void mycss_serialization_length(mycss_values_length_t* value, FILE* fh);
-void mycss_serialization_percentage(mycss_values_percentage_t* value, FILE* fh);
+void mycss_values_serialization_length(mycss_values_length_t* value, mycss_callback_serialization_f callback, void* context);
+void mycss_values_serialization_percentage(mycss_values_percentage_t* value, mycss_callback_serialization_f callback, void* context);
#ifdef __cplusplus
} /* extern "C" */
diff --git a/source/mycss/values/values.h b/source/mycss/values/values.h
index 2d74db5..22574ec 100644
--- a/source/mycss/values/values.h
+++ b/source/mycss/values/values.h
@@ -30,6 +30,17 @@
extern "C" {
#endif
+typedef struct mycss_values_shorthand_four mycss_values_shorthand_four_t;
+typedef struct mycss_values_percentage mycss_values_percentage_t;
+typedef struct mycss_values_length mycss_values_length_t;
+
+struct mycss_values_shorthand_four {
+ void* one;
+ void* two;
+ void* three;
+ void* four;
+};
+
struct mycss_values_length {
union {
int i;
@@ -38,8 +49,7 @@ struct mycss_values_length {
bool is_float;
mycss_units_type_t type;
-}
-typedef mycss_values_length_t;
+};
struct mycss_values_percentage {
union {
@@ -48,8 +58,7 @@ struct mycss_values_percentage {
};
bool is_float;
-}
-typedef mycss_values_percentage_t;
+};
void * mycss_values_create(mycss_entry_t* entry, size_t size);