diff options
author | lexborisov <lex.borisov@gmail.com> | 2016-10-13 01:17:35 +0300 |
---|---|---|
committer | lexborisov <lex.borisov@gmail.com> | 2016-10-13 01:17:35 +0300 |
commit | e459b9e004b71f9b18cf559a65de421e72c243a9 (patch) | |
tree | b3648406f6aa869ac750f276eda991611b2be709 | |
parent | e7c2cc454c93bff0f95650cae5a94e672f9092c1 (diff) |
Added serialization for all
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 Binary files differindex 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 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); |