diff options
author | lexborisov <lex.borisov@gmail.com> | 2016-10-07 20:47:31 +0300 |
---|---|---|
committer | lexborisov <lex.borisov@gmail.com> | 2016-10-07 20:47:31 +0300 |
commit | f7f6e338fd84f03bbd7b33729dbbdba9311137e3 (patch) | |
tree | 01c6660cbdca75e7c2f729df10a555f7efc47414 | |
parent | 581c8587cade0485be46e507ad43b4a0d8c3c720 (diff) |
work in progress! Create Threads for find html nodes by selectors.
72 files changed, 2336 insertions, 1742 deletions
diff --git a/devel/osx/Modest.xcodeproj/project.pbxproj b/devel/osx/Modest.xcodeproj/project.pbxproj deleted file mode 100644 index 82a9049..0000000 --- a/devel/osx/Modest.xcodeproj/project.pbxproj +++ /dev/null @@ -1,884 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 0E465ABA1CFC4BC500CA7D65 /* main.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E465AB91CFC4BC500CA7D65 /* main.c */; }; - 0E4A5E721D7563E3006B3D7A /* callback.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E3F1D7563E3006B3D7A /* callback.c */; }; - 0E4A5E731D7563E3006B3D7A /* charef.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E421D7563E3006B3D7A /* charef.c */; }; - 0E4A5E741D7563E3006B3D7A /* data_process.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E441D7563E3006B3D7A /* data_process.c */; }; - 0E4A5E751D7563E3006B3D7A /* encoding_detect.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E481D7563E3006B3D7A /* encoding_detect.c */; }; - 0E4A5E761D7563E3006B3D7A /* encoding.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E4A1D7563E3006B3D7A /* encoding.c */; }; - 0E4A5E771D7563E3006B3D7A /* incoming.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E4C1D7563E3006B3D7A /* incoming.c */; }; - 0E4A5E781D7563E3006B3D7A /* myhtml.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E4E1D7563E3006B3D7A /* myhtml.c */; }; - 0E4A5E791D7563E3006B3D7A /* mynamespace.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E511D7563E3006B3D7A /* mynamespace.c */; }; - 0E4A5E7A1D7563E3006B3D7A /* myosi.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E531D7563E3006B3D7A /* myosi.c */; }; - 0E4A5E7B1D7563E3006B3D7A /* mystring.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E551D7563E3006B3D7A /* mystring.c */; }; - 0E4A5E7C1D7563E3006B3D7A /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E571D7563E3006B3D7A /* parser.c */; }; - 0E4A5E7D1D7563E3006B3D7A /* perf.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E591D7563E3006B3D7A /* perf.c */; }; - 0E4A5E7E1D7563E3006B3D7A /* rules.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E5A1D7563E3006B3D7A /* rules.c */; }; - 0E4A5E7F1D7563E3006B3D7A /* stream.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E5C1D7563E3006B3D7A /* stream.c */; }; - 0E4A5E801D7563E3006B3D7A /* tag_init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E5F1D7563E3006B3D7A /* tag_init.c */; }; - 0E4A5E811D7563E3006B3D7A /* tag.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E601D7563E3006B3D7A /* tag.c */; }; - 0E4A5E821D7563E3006B3D7A /* thread.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E621D7563E3006B3D7A /* thread.c */; }; - 0E4A5E831D7563E3006B3D7A /* token.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E641D7563E3006B3D7A /* token.c */; }; - 0E4A5E841D7563E3006B3D7A /* tokenizer_doctype.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E661D7563E3006B3D7A /* tokenizer_doctype.c */; }; - 0E4A5E851D7563E3006B3D7A /* tokenizer_end.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E681D7563E3006B3D7A /* tokenizer_end.c */; }; - 0E4A5E861D7563E3006B3D7A /* tokenizer_script.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E6A1D7563E3006B3D7A /* tokenizer_script.c */; }; - 0E4A5E871D7563E3006B3D7A /* tokenizer.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E6C1D7563E3006B3D7A /* tokenizer.c */; }; - 0E4A5E881D7563E3006B3D7A /* tree.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E6E1D7563E3006B3D7A /* tree.c */; }; - 0E4A5E891D7563E3006B3D7A /* utils.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E701D7563E3006B3D7A /* utils.c */; }; - 0E4A5E981D7563F7006B3D7A /* mchar_async.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E8B1D7563F7006B3D7A /* mchar_async.c */; }; - 0E4A5E991D7563F7006B3D7A /* mcobject_async.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E8D1D7563F7006B3D7A /* mcobject_async.c */; }; - 0E4A5E9A1D7563F7006B3D7A /* mcobject.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E8F1D7563F7006B3D7A /* mcobject.c */; }; - 0E4A5E9B1D7563F7006B3D7A /* mcsimple.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E911D7563F7006B3D7A /* mcsimple.c */; }; - 0E4A5E9C1D7563F7006B3D7A /* mcsync.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E931D7563F7006B3D7A /* mcsync.c */; }; - 0E4A5E9D1D7563F7006B3D7A /* mctree.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E951D7563F7006B3D7A /* mctree.c */; }; - 0E4A5EB81D75643A006B3D7A /* an_plus_b.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5E9F1D75643A006B3D7A /* an_plus_b.c */; }; - 0E4A5EB91D75643A006B3D7A /* check.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EA21D75643A006B3D7A /* check.c */; }; - 0E4A5EBA1D75643A006B3D7A /* convert.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EA41D75643A006B3D7A /* convert.c */; }; - 0E4A5EBB1D75643A006B3D7A /* entry.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EA61D75643A006B3D7A /* entry.c */; }; - 0E4A5EBC1D75643A006B3D7A /* mycss.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EA81D75643A006B3D7A /* mycss.c */; }; - 0E4A5EBD1D75643A006B3D7A /* mystring.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EAB1D75643A006B3D7A /* mystring.c */; }; - 0E4A5EBE1D75643A006B3D7A /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EAD1D75643A006B3D7A /* parser.c */; }; - 0E4A5EBF1D75643A006B3D7A /* stylesheet.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EAF1D75643A006B3D7A /* stylesheet.c */; }; - 0E4A5EC01D75643A006B3D7A /* tokenizer_end.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EB11D75643A006B3D7A /* tokenizer_end.c */; }; - 0E4A5EC11D75643A006B3D7A /* tokenizer_global.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EB31D75643A006B3D7A /* tokenizer_global.c */; }; - 0E4A5EC21D75643A006B3D7A /* tokenizer.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EB61D75643A006B3D7A /* tokenizer.c */; }; - 0E4A5EDC1D756469006B3D7A /* function_parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EC71D756469006B3D7A /* function_parser.c */; }; - 0E4A5EDD1D756469006B3D7A /* function.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5ECA1D756469006B3D7A /* function.c */; }; - 0E4A5EDE1D756469006B3D7A /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5ECC1D756469006B3D7A /* init.c */; }; - 0E4A5EDF1D756469006B3D7A /* list.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5ECE1D756469006B3D7A /* list.c */; }; - 0E4A5EE01D756469006B3D7A /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5ED21D756469006B3D7A /* parser.c */; }; - 0E4A5EE11D756469006B3D7A /* pseudo.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5ED51D756469006B3D7A /* pseudo.c */; }; - 0E4A5EE21D756469006B3D7A /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5ED71D756469006B3D7A /* state.c */; }; - 0E4A5EE31D756469006B3D7A /* value.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EDA1D756469006B3D7A /* value.c */; }; - 0E4A5EEB1D756473006B3D7A /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EE41D756473006B3D7A /* init.c */; }; - 0E4A5EEC1D756473006B3D7A /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EE71D756473006B3D7A /* parser.c */; }; - 0E4A5EED1D756473006B3D7A /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EE91D756473006B3D7A /* state.c */; }; - 0E4A5EF31D75648C006B3D7A /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EEE1D75648C006B3D7A /* init.c */; }; - 0E4A5EF41D75648C006B3D7A /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EF11D75648C006B3D7A /* state.c */; }; - 0E4A5EFE1D756497006B3D7A /* entry.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EF51D756497006B3D7A /* entry.c */; }; - 0E4A5EFF1D756497006B3D7A /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EF71D756497006B3D7A /* init.c */; }; - 0E4A5F001D756497006B3D7A /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EFA1D756497006B3D7A /* parser.c */; }; - 0E4A5F011D756497006B3D7A /* state.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5EFC1D756497006B3D7A /* state.c */; }; - 0E4A5F0B1D7564BB006B3D7A /* init.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F051D7564BB006B3D7A /* init.c */; }; - 0E4A5F0C1D7564BB006B3D7A /* parser.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F081D7564BB006B3D7A /* parser.c */; }; - 0E4A5F171D7564C3006B3D7A /* consume.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F0D1D7564C3006B3D7A /* consume.c */; }; - 0E4A5F181D7564C3006B3D7A /* serialization.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F101D7564C3006B3D7A /* serialization.c */; }; - 0E4A5F191D7564C3006B3D7A /* units.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F131D7564C3006B3D7A /* units.c */; }; - 0E4A5F1A1D7564C3006B3D7A /* values.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F151D7564C3006B3D7A /* values.c */; }; - 0E4A5F371D756542006B3D7A /* cmap.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F1D1D756542006B3D7A /* cmap.c */; }; - 0E4A5F381D756542006B3D7A /* glyf.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F1F1D756542006B3D7A /* glyf.c */; }; - 0E4A5F391D756542006B3D7A /* head.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F211D756542006B3D7A /* head.c */; }; - 0E4A5F3A1D756542006B3D7A /* hhea.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F231D756542006B3D7A /* hhea.c */; }; - 0E4A5F3B1D756542006B3D7A /* hmtx.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F251D756542006B3D7A /* hmtx.c */; }; - 0E4A5F3C1D756542006B3D7A /* loca.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F271D756542006B3D7A /* loca.c */; }; - 0E4A5F3D1D756542006B3D7A /* maxp.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F291D756542006B3D7A /* maxp.c */; }; - 0E4A5F3E1D756542006B3D7A /* myfont.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F2B1D756542006B3D7A /* myfont.c */; }; - 0E4A5F3F1D756542006B3D7A /* name.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F2D1D756542006B3D7A /* name.c */; }; - 0E4A5F401D756542006B3D7A /* os_2.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F2F1D756542006B3D7A /* os_2.c */; }; - 0E4A5F411D756542006B3D7A /* pclt.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F311D756542006B3D7A /* pclt.c */; }; - 0E4A5F421D756542006B3D7A /* vhea.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F331D756542006B3D7A /* vhea.c */; }; - 0E4A5F431D756542006B3D7A /* vmtx.c in Sources */ = {isa = PBXBuildFile; fileRef = 0E4A5F351D756542006B3D7A /* vmtx.c */; }; - 0EBB6F261D6BA22900F75F4A /* match.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EBB6F241D6BA22900F75F4A /* match.c */; }; - 0EBB6F2B1D6D10D500F75F4A /* pseudo_class.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EBB6F291D6D10D500F75F4A /* pseudo_class.c */; }; - 0EC3AF111D66543F00027DDC /* finder.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EC3AF0C1D66543F00027DDC /* finder.c */; }; - 0EC3AF121D66543F00027DDC /* type.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EC3AF0F1D66543F00027DDC /* type.c */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - 0E465AB41CFC4BC500CA7D65 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = /usr/share/man/man1/; - dstSubfolderSpec = 0; - files = ( - ); - runOnlyForDeploymentPostprocessing = 1; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 0E465AB61CFC4BC500CA7D65 /* Modest */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = Modest; sourceTree = BUILT_PRODUCTS_DIR; }; - 0E465AB91CFC4BC500CA7D65 /* main.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = main.c; path = Modest/main.c; sourceTree = "<group>"; }; - 0E4A5E3D1D7563E3006B3D7A /* api_encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = api_encoding.h; path = ../../source/myhtml/api_encoding.h; sourceTree = "<group>"; }; - 0E4A5E3E1D7563E3006B3D7A /* api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = api.h; path = ../../source/myhtml/api.h; sourceTree = "<group>"; }; - 0E4A5E3F1D7563E3006B3D7A /* callback.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = callback.c; path = ../../source/myhtml/callback.c; sourceTree = "<group>"; }; - 0E4A5E401D7563E3006B3D7A /* callback.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = callback.h; path = ../../source/myhtml/callback.h; sourceTree = "<group>"; }; - 0E4A5E411D7563E3006B3D7A /* charef_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = charef_resource.h; path = ../../source/myhtml/charef_resource.h; sourceTree = "<group>"; }; - 0E4A5E421D7563E3006B3D7A /* charef.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = charef.c; path = ../../source/myhtml/charef.c; sourceTree = "<group>"; }; - 0E4A5E431D7563E3006B3D7A /* charef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = charef.h; path = ../../source/myhtml/charef.h; sourceTree = "<group>"; }; - 0E4A5E441D7563E3006B3D7A /* data_process.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = data_process.c; path = ../../source/myhtml/data_process.c; sourceTree = "<group>"; }; - 0E4A5E451D7563E3006B3D7A /* data_process.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = data_process.h; path = ../../source/myhtml/data_process.h; sourceTree = "<group>"; }; - 0E4A5E461D7563E3006B3D7A /* def.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = def.h; path = ../../source/myhtml/def.h; sourceTree = "<group>"; }; - 0E4A5E471D7563E3006B3D7A /* encoding_detect_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding_detect_resource.h; path = ../../source/myhtml/encoding_detect_resource.h; sourceTree = "<group>"; }; - 0E4A5E481D7563E3006B3D7A /* encoding_detect.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = encoding_detect.c; path = ../../source/myhtml/encoding_detect.c; sourceTree = "<group>"; }; - 0E4A5E491D7563E3006B3D7A /* encoding_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding_resource.h; path = ../../source/myhtml/encoding_resource.h; sourceTree = "<group>"; }; - 0E4A5E4A1D7563E3006B3D7A /* encoding.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = encoding.c; path = ../../source/myhtml/encoding.c; sourceTree = "<group>"; }; - 0E4A5E4B1D7563E3006B3D7A /* encoding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = encoding.h; path = ../../source/myhtml/encoding.h; sourceTree = "<group>"; }; - 0E4A5E4C1D7563E3006B3D7A /* incoming.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = incoming.c; path = ../../source/myhtml/incoming.c; sourceTree = "<group>"; }; - 0E4A5E4D1D7563E3006B3D7A /* incoming.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = incoming.h; path = ../../source/myhtml/incoming.h; sourceTree = "<group>"; }; - 0E4A5E4E1D7563E3006B3D7A /* myhtml.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = myhtml.c; path = ../../source/myhtml/myhtml.c; sourceTree = "<group>"; }; - 0E4A5E4F1D7563E3006B3D7A /* myhtml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myhtml.h; path = ../../source/myhtml/myhtml.h; sourceTree = "<group>"; }; - 0E4A5E501D7563E3006B3D7A /* mynamespace_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mynamespace_resource.h; path = ../../source/myhtml/mynamespace_resource.h; sourceTree = "<group>"; }; - 0E4A5E511D7563E3006B3D7A /* mynamespace.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mynamespace.c; path = ../../source/myhtml/mynamespace.c; sourceTree = "<group>"; }; - 0E4A5E521D7563E3006B3D7A /* mynamespace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mynamespace.h; path = ../../source/myhtml/mynamespace.h; sourceTree = "<group>"; }; - 0E4A5E531D7563E3006B3D7A /* myosi.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = myosi.c; path = ../../source/myhtml/myosi.c; sourceTree = "<group>"; }; - 0E4A5E541D7563E3006B3D7A /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/myhtml/myosi.h; sourceTree = "<group>"; }; - 0E4A5E551D7563E3006B3D7A /* mystring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mystring.c; path = ../../source/myhtml/mystring.c; sourceTree = "<group>"; }; - 0E4A5E561D7563E3006B3D7A /* mystring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mystring.h; path = ../../source/myhtml/mystring.h; sourceTree = "<group>"; }; - 0E4A5E571D7563E3006B3D7A /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../source/myhtml/parser.c; sourceTree = "<group>"; }; - 0E4A5E581D7563E3006B3D7A /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../source/myhtml/parser.h; sourceTree = "<group>"; }; - 0E4A5E591D7563E3006B3D7A /* perf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = perf.c; path = ../../source/myhtml/perf.c; sourceTree = "<group>"; }; - 0E4A5E5A1D7563E3006B3D7A /* rules.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = rules.c; path = ../../source/myhtml/rules.c; sourceTree = "<group>"; }; - 0E4A5E5B1D7563E3006B3D7A /* rules.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = rules.h; path = ../../source/myhtml/rules.h; sourceTree = "<group>"; }; - 0E4A5E5C1D7563E3006B3D7A /* stream.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stream.c; path = ../../source/myhtml/stream.c; sourceTree = "<group>"; }; - 0E4A5E5D1D7563E3006B3D7A /* stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stream.h; path = ../../source/myhtml/stream.h; sourceTree = "<group>"; }; - 0E4A5E5E1D7563E3006B3D7A /* tag_const.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tag_const.h; path = ../../source/myhtml/tag_const.h; sourceTree = "<group>"; }; - 0E4A5E5F1D7563E3006B3D7A /* tag_init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tag_init.c; path = ../../source/myhtml/tag_init.c; sourceTree = "<group>"; }; - 0E4A5E601D7563E3006B3D7A /* tag.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tag.c; path = ../../source/myhtml/tag.c; sourceTree = "<group>"; }; - 0E4A5E611D7563E3006B3D7A /* tag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tag.h; path = ../../source/myhtml/tag.h; sourceTree = "<group>"; }; - 0E4A5E621D7563E3006B3D7A /* thread.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = thread.c; path = ../../source/myhtml/thread.c; sourceTree = "<group>"; }; - 0E4A5E631D7563E3006B3D7A /* thread.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = thread.h; path = ../../source/myhtml/thread.h; sourceTree = "<group>"; }; - 0E4A5E641D7563E3006B3D7A /* token.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = token.c; path = ../../source/myhtml/token.c; sourceTree = "<group>"; }; - 0E4A5E651D7563E3006B3D7A /* token.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = token.h; path = ../../source/myhtml/token.h; sourceTree = "<group>"; }; - 0E4A5E661D7563E3006B3D7A /* tokenizer_doctype.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_doctype.c; path = ../../source/myhtml/tokenizer_doctype.c; sourceTree = "<group>"; }; - 0E4A5E671D7563E3006B3D7A /* tokenizer_doctype.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_doctype.h; path = ../../source/myhtml/tokenizer_doctype.h; sourceTree = "<group>"; }; - 0E4A5E681D7563E3006B3D7A /* tokenizer_end.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_end.c; path = ../../source/myhtml/tokenizer_end.c; sourceTree = "<group>"; }; - 0E4A5E691D7563E3006B3D7A /* tokenizer_end.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_end.h; path = ../../source/myhtml/tokenizer_end.h; sourceTree = "<group>"; }; - 0E4A5E6A1D7563E3006B3D7A /* tokenizer_script.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_script.c; path = ../../source/myhtml/tokenizer_script.c; sourceTree = "<group>"; }; - 0E4A5E6B1D7563E3006B3D7A /* tokenizer_script.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_script.h; path = ../../source/myhtml/tokenizer_script.h; sourceTree = "<group>"; }; - 0E4A5E6C1D7563E3006B3D7A /* tokenizer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer.c; path = ../../source/myhtml/tokenizer.c; sourceTree = "<group>"; }; - 0E4A5E6D1D7563E3006B3D7A /* tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer.h; path = ../../source/myhtml/tokenizer.h; sourceTree = "<group>"; }; - 0E4A5E6E1D7563E3006B3D7A /* tree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tree.c; path = ../../source/myhtml/tree.c; sourceTree = "<group>"; }; - 0E4A5E6F1D7563E3006B3D7A /* tree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tree.h; path = ../../source/myhtml/tree.h; sourceTree = "<group>"; }; - 0E4A5E701D7563E3006B3D7A /* utils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = utils.c; path = ../../source/myhtml/utils.c; sourceTree = "<group>"; }; - 0E4A5E711D7563E3006B3D7A /* utils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = utils.h; path = ../../source/myhtml/utils.h; sourceTree = "<group>"; }; - 0E4A5E8B1D7563F7006B3D7A /* mchar_async.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mchar_async.c; path = ../../source/myhtml/utils/mchar_async.c; sourceTree = "<group>"; }; - 0E4A5E8C1D7563F7006B3D7A /* mchar_async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mchar_async.h; path = ../../source/myhtml/utils/mchar_async.h; sourceTree = "<group>"; }; - 0E4A5E8D1D7563F7006B3D7A /* mcobject_async.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcobject_async.c; path = ../../source/myhtml/utils/mcobject_async.c; sourceTree = "<group>"; }; - 0E4A5E8E1D7563F7006B3D7A /* mcobject_async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcobject_async.h; path = ../../source/myhtml/utils/mcobject_async.h; sourceTree = "<group>"; }; - 0E4A5E8F1D7563F7006B3D7A /* mcobject.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcobject.c; path = ../../source/myhtml/utils/mcobject.c; sourceTree = "<group>"; }; - 0E4A5E901D7563F7006B3D7A /* mcobject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcobject.h; path = ../../source/myhtml/utils/mcobject.h; sourceTree = "<group>"; }; - 0E4A5E911D7563F7006B3D7A /* mcsimple.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcsimple.c; path = ../../source/myhtml/utils/mcsimple.c; sourceTree = "<group>"; }; - 0E4A5E921D7563F7006B3D7A /* mcsimple.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcsimple.h; path = ../../source/myhtml/utils/mcsimple.h; sourceTree = "<group>"; }; - 0E4A5E931D7563F7006B3D7A /* mcsync.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mcsync.c; path = ../../source/myhtml/utils/mcsync.c; sourceTree = "<group>"; }; - 0E4A5E941D7563F7006B3D7A /* mcsync.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mcsync.h; path = ../../source/myhtml/utils/mcsync.h; sourceTree = "<group>"; }; - 0E4A5E951D7563F7006B3D7A /* mctree.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mctree.c; path = ../../source/myhtml/utils/mctree.c; sourceTree = "<group>"; }; - 0E4A5E961D7563F7006B3D7A /* mctree.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mctree.h; path = ../../source/myhtml/utils/mctree.h; sourceTree = "<group>"; }; - 0E4A5E971D7563F7006B3D7A /* resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resources.h; path = ../../source/myhtml/utils/resources.h; sourceTree = "<group>"; }; - 0E4A5E9F1D75643A006B3D7A /* an_plus_b.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = an_plus_b.c; path = ../../source/mycss/an_plus_b.c; sourceTree = "<group>"; }; - 0E4A5EA01D75643A006B3D7A /* an_plus_b.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = an_plus_b.h; path = ../../source/mycss/an_plus_b.h; sourceTree = "<group>"; }; - 0E4A5EA11D75643A006B3D7A /* api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = api.h; path = ../../source/mycss/api.h; sourceTree = "<group>"; }; - 0E4A5EA21D75643A006B3D7A /* check.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = check.c; path = ../../source/mycss/check.c; sourceTree = "<group>"; }; - 0E4A5EA31D75643A006B3D7A /* check.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = check.h; path = ../../source/mycss/check.h; sourceTree = "<group>"; }; - 0E4A5EA41D75643A006B3D7A /* convert.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = convert.c; path = ../../source/mycss/convert.c; sourceTree = "<group>"; }; - 0E4A5EA51D75643A006B3D7A /* convert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = convert.h; path = ../../source/mycss/convert.h; sourceTree = "<group>"; }; - 0E4A5EA61D75643A006B3D7A /* entry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = entry.c; path = ../../source/mycss/entry.c; sourceTree = "<group>"; }; - 0E4A5EA71D75643A006B3D7A /* entry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = entry.h; path = ../../source/mycss/entry.h; sourceTree = "<group>"; }; - 0E4A5EA81D75643A006B3D7A /* mycss.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mycss.c; path = ../../source/mycss/mycss.c; sourceTree = "<group>"; }; - 0E4A5EA91D75643A006B3D7A /* mycss.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mycss.h; path = ../../source/mycss/mycss.h; sourceTree = "<group>"; }; - 0E4A5EAA1D75643A006B3D7A /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/mycss/myosi.h; sourceTree = "<group>"; }; - 0E4A5EAB1D75643A006B3D7A /* mystring.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = mystring.c; path = ../../source/mycss/mystring.c; sourceTree = "<group>"; }; - 0E4A5EAC1D75643A006B3D7A /* mystring.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = mystring.h; path = ../../source/mycss/mystring.h; sourceTree = "<group>"; }; - 0E4A5EAD1D75643A006B3D7A /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../source/mycss/parser.c; sourceTree = "<group>"; }; - 0E4A5EAE1D75643A006B3D7A /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../source/mycss/parser.h; sourceTree = "<group>"; }; - 0E4A5EAF1D75643A006B3D7A /* stylesheet.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = stylesheet.c; path = ../../source/mycss/stylesheet.c; sourceTree = "<group>"; }; - 0E4A5EB01D75643A006B3D7A /* stylesheet.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = stylesheet.h; path = ../../source/mycss/stylesheet.h; sourceTree = "<group>"; }; - 0E4A5EB11D75643A006B3D7A /* tokenizer_end.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_end.c; path = ../../source/mycss/tokenizer_end.c; sourceTree = "<group>"; }; - 0E4A5EB21D75643A006B3D7A /* tokenizer_end.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_end.h; path = ../../source/mycss/tokenizer_end.h; sourceTree = "<group>"; }; - 0E4A5EB31D75643A006B3D7A /* tokenizer_global.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer_global.c; path = ../../source/mycss/tokenizer_global.c; sourceTree = "<group>"; }; - 0E4A5EB41D75643A006B3D7A /* tokenizer_global.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_global.h; path = ../../source/mycss/tokenizer_global.h; sourceTree = "<group>"; }; - 0E4A5EB51D75643A006B3D7A /* tokenizer_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer_resource.h; path = ../../source/mycss/tokenizer_resource.h; sourceTree = "<group>"; }; - 0E4A5EB61D75643A006B3D7A /* tokenizer.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tokenizer.c; path = ../../source/mycss/tokenizer.c; sourceTree = "<group>"; }; - 0E4A5EB71D75643A006B3D7A /* tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = tokenizer.h; path = ../../source/mycss/tokenizer.h; sourceTree = "<group>"; }; - 0E4A5EC71D756469006B3D7A /* function_parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = function_parser.c; path = ../../source/mycss/selectors/function_parser.c; sourceTree = "<group>"; }; - 0E4A5EC81D756469006B3D7A /* function_parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = function_parser.h; path = ../../source/mycss/selectors/function_parser.h; sourceTree = "<group>"; }; - 0E4A5EC91D756469006B3D7A /* function_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = function_resource.h; path = ../../source/mycss/selectors/function_resource.h; sourceTree = "<group>"; }; - 0E4A5ECA1D756469006B3D7A /* function.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = function.c; path = ../../source/mycss/selectors/function.c; sourceTree = "<group>"; }; - 0E4A5ECB1D756469006B3D7A /* function.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = function.h; path = ../../source/mycss/selectors/function.h; sourceTree = "<group>"; }; - 0E4A5ECC1D756469006B3D7A /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = init.c; path = ../../source/mycss/selectors/init.c; sourceTree = "<group>"; }; - 0E4A5ECD1D756469006B3D7A /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = init.h; path = ../../source/mycss/selectors/init.h; sourceTree = "<group>"; }; - 0E4A5ECE1D756469006B3D7A /* list.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = list.c; path = ../../source/mycss/selectors/list.c; sourceTree = "<group>"; }; - 0E4A5ECF1D756469006B3D7A /* list.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = list.h; path = ../../source/mycss/selectors/list.h; sourceTree = "<group>"; }; - 0E4A5ED01D756469006B3D7A /* myosi_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi_resource.h; path = ../../source/mycss/selectors/myosi_resource.h; sourceTree = "<group>"; }; - 0E4A5ED11D756469006B3D7A /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/mycss/selectors/myosi.h; sourceTree = "<group>"; }; - 0E4A5ED21D756469006B3D7A /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../source/mycss/selectors/parser.c; sourceTree = "<group>"; }; - 0E4A5ED31D756469006B3D7A /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../source/mycss/selectors/parser.h; sourceTree = "<group>"; }; - 0E4A5ED41D756469006B3D7A /* pseudo_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pseudo_resource.h; path = ../../source/mycss/selectors/pseudo_resource.h; sourceTree = "<group>"; }; - 0E4A5ED51D756469006B3D7A /* pseudo.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pseudo.c; path = ../../source/mycss/selectors/pseudo.c; sourceTree = "<group>"; }; - 0E4A5ED61D756469006B3D7A /* pseudo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pseudo.h; path = ../../source/mycss/selectors/pseudo.h; sourceTree = "<group>"; }; - 0E4A5ED71D756469006B3D7A /* state.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = state.c; path = ../../source/mycss/selectors/state.c; sourceTree = "<group>"; }; - 0E4A5ED81D756469006B3D7A /* state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = state.h; path = ../../source/mycss/selectors/state.h; sourceTree = "<group>"; }; - 0E4A5ED91D756469006B3D7A /* value_resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = value_resource.h; path = ../../source/mycss/selectors/value_resource.h; sourceTree = "<group>"; }; - 0E4A5EDA1D756469006B3D7A /* value.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = value.c; path = ../../source/mycss/selectors/value.c; sourceTree = "<group>"; }; - 0E4A5EDB1D756469006B3D7A /* value.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = value.h; path = ../../source/mycss/selectors/value.h; sourceTree = "<group>"; }; - 0E4A5EE41D756473006B3D7A /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = init.c; path = ../../source/mycss/namespace/init.c; sourceTree = "<group>"; }; - 0E4A5EE51D756473006B3D7A /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = init.h; path = ../../source/mycss/namespace/init.h; sourceTree = "<group>"; }; - 0E4A5EE61D756473006B3D7A /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/mycss/namespace/myosi.h; sourceTree = "<group>"; }; - 0E4A5EE71D756473006B3D7A /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../source/mycss/namespace/parser.c; sourceTree = "<group>"; }; - 0E4A5EE81D756473006B3D7A /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../source/mycss/namespace/parser.h; sourceTree = "<group>"; }; - 0E4A5EE91D756473006B3D7A /* state.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = state.c; path = ../../source/mycss/namespace/state.c; sourceTree = "<group>"; }; - 0E4A5EEA1D756473006B3D7A /* state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = state.h; path = ../../source/mycss/namespace/state.h; sourceTree = "<group>"; }; - 0E4A5EEE1D75648C006B3D7A /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = init.c; path = ../../source/mycss/media/init.c; sourceTree = "<group>"; }; - 0E4A5EEF1D75648C006B3D7A /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = init.h; path = ../../source/mycss/media/init.h; sourceTree = "<group>"; }; - 0E4A5EF01D75648C006B3D7A /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/mycss/media/myosi.h; sourceTree = "<group>"; }; - 0E4A5EF11D75648C006B3D7A /* state.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = state.c; path = ../../source/mycss/media/state.c; sourceTree = "<group>"; }; - 0E4A5EF21D75648C006B3D7A /* state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = state.h; path = ../../source/mycss/media/state.h; sourceTree = "<group>"; }; - 0E4A5EF51D756497006B3D7A /* entry.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = entry.c; path = ../../source/mycss/declaration/entry.c; sourceTree = "<group>"; }; - 0E4A5EF61D756497006B3D7A /* entry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = entry.h; path = ../../source/mycss/declaration/entry.h; sourceTree = "<group>"; }; - 0E4A5EF71D756497006B3D7A /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = init.c; path = ../../source/mycss/declaration/init.c; sourceTree = "<group>"; }; - 0E4A5EF81D756497006B3D7A /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = init.h; path = ../../source/mycss/declaration/init.h; sourceTree = "<group>"; }; - 0E4A5EF91D756497006B3D7A /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/mycss/declaration/myosi.h; sourceTree = "<group>"; }; - 0E4A5EFA1D756497006B3D7A /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../source/mycss/declaration/parser.c; sourceTree = "<group>"; }; - 0E4A5EFB1D756497006B3D7A /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../source/mycss/declaration/parser.h; sourceTree = "<group>"; }; - 0E4A5EFC1D756497006B3D7A /* state.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = state.c; path = ../../source/mycss/declaration/state.c; sourceTree = "<group>"; }; - 0E4A5EFD1D756497006B3D7A /* state.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = state.h; path = ../../source/mycss/declaration/state.h; sourceTree = "<group>"; }; - 0E4A5F041D7564BB006B3D7A /* const.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = const.h; path = ../../source/mycss/property/const.h; sourceTree = "<group>"; }; - 0E4A5F051D7564BB006B3D7A /* init.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = init.c; path = ../../source/mycss/property/init.c; sourceTree = "<group>"; }; - 0E4A5F061D7564BB006B3D7A /* init.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = init.h; path = ../../source/mycss/property/init.h; sourceTree = "<group>"; }; - 0E4A5F071D7564BB006B3D7A /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/mycss/property/myosi.h; sourceTree = "<group>"; }; - 0E4A5F081D7564BB006B3D7A /* parser.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = parser.c; path = ../../source/mycss/property/parser.c; sourceTree = "<group>"; }; - 0E4A5F091D7564BB006B3D7A /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = parser.h; path = ../../source/mycss/property/parser.h; sourceTree = "<group>"; }; - 0E4A5F0A1D7564BB006B3D7A /* resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resources.h; path = ../../source/mycss/property/resources.h; sourceTree = "<group>"; }; - 0E4A5F0D1D7564C3006B3D7A /* consume.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = consume.c; path = ../../source/mycss/values/consume.c; sourceTree = "<group>"; }; - 0E4A5F0E1D7564C3006B3D7A /* consume.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = consume.h; path = ../../source/mycss/values/consume.h; sourceTree = "<group>"; }; - 0E4A5F0F1D7564C3006B3D7A /* resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resources.h; path = ../../source/mycss/values/resources.h; sourceTree = "<group>"; }; - 0E4A5F101D7564C3006B3D7A /* serialization.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = serialization.c; path = ../../source/mycss/values/serialization.c; sourceTree = "<group>"; }; - 0E4A5F111D7564C3006B3D7A /* serialization.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = serialization.h; path = ../../source/mycss/values/serialization.h; sourceTree = "<group>"; }; - 0E4A5F121D7564C3006B3D7A /* units_resources.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = units_resources.h; path = ../../source/mycss/values/units_resources.h; sourceTree = "<group>"; }; - 0E4A5F131D7564C3006B3D7A /* units.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = units.c; path = ../../source/mycss/values/units.c; sourceTree = "<group>"; }; - 0E4A5F141D7564C3006B3D7A /* units.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = units.h; path = ../../source/mycss/values/units.h; sourceTree = "<group>"; }; - 0E4A5F151D7564C3006B3D7A /* values.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = values.c; path = ../../source/mycss/values/values.c; sourceTree = "<group>"; }; - 0E4A5F161D7564C3006B3D7A /* values.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = values.h; path = ../../source/mycss/values/values.h; sourceTree = "<group>"; }; - 0E4A5F1C1D756542006B3D7A /* myosi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/myfont/myosi.h; sourceTree = "<group>"; }; - 0E4A5F1D1D756542006B3D7A /* cmap.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cmap.c; path = ../../source/myfont/cmap.c; sourceTree = "<group>"; }; - 0E4A5F1E1D756542006B3D7A /* cmap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = cmap.h; path = ../../source/myfont/cmap.h; sourceTree = "<group>"; }; - 0E4A5F1F1D756542006B3D7A /* glyf.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = glyf.c; path = ../../source/myfont/glyf.c; sourceTree = "<group>"; }; - 0E4A5F201D756542006B3D7A /* glyf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = glyf.h; path = ../../source/myfont/glyf.h; sourceTree = "<group>"; }; - 0E4A5F211D756542006B3D7A /* head.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = head.c; path = ../../source/myfont/head.c; sourceTree = "<group>"; }; - 0E4A5F221D756542006B3D7A /* head.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = head.h; path = ../../source/myfont/head.h; sourceTree = "<group>"; }; - 0E4A5F231D756542006B3D7A /* hhea.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hhea.c; path = ../../source/myfont/hhea.c; sourceTree = "<group>"; }; - 0E4A5F241D756542006B3D7A /* hhea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hhea.h; path = ../../source/myfont/hhea.h; sourceTree = "<group>"; }; - 0E4A5F251D756542006B3D7A /* hmtx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hmtx.c; path = ../../source/myfont/hmtx.c; sourceTree = "<group>"; }; - 0E4A5F261D756542006B3D7A /* hmtx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hmtx.h; path = ../../source/myfont/hmtx.h; sourceTree = "<group>"; }; - 0E4A5F271D756542006B3D7A /* loca.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = loca.c; path = ../../source/myfont/loca.c; sourceTree = "<group>"; }; - 0E4A5F281D756542006B3D7A /* loca.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = loca.h; path = ../../source/myfont/loca.h; sourceTree = "<group>"; }; - 0E4A5F291D756542006B3D7A /* maxp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = maxp.c; path = ../../source/myfont/maxp.c; sourceTree = "<group>"; }; - 0E4A5F2A1D756542006B3D7A /* maxp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = maxp.h; path = ../../source/myfont/maxp.h; sourceTree = "<group>"; }; - 0E4A5F2B1D756542006B3D7A /* myfont.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = myfont.c; path = ../../source/myfont/myfont.c; sourceTree = "<group>"; }; - 0E4A5F2C1D756542006B3D7A /* myfont.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = myfont.h; path = ../../source/myfont/myfont.h; sourceTree = "<group>"; }; - 0E4A5F2D1D756542006B3D7A /* name.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = name.c; path = ../../source/myfont/name.c; sourceTree = "<group>"; }; - 0E4A5F2E1D756542006B3D7A /* name.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = name.h; path = ../../source/myfont/name.h; sourceTree = "<group>"; }; - 0E4A5F2F1D756542006B3D7A /* os_2.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = os_2.c; path = ../../source/myfont/os_2.c; sourceTree = "<group>"; }; - 0E4A5F301D756542006B3D7A /* os_2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = os_2.h; path = ../../source/myfont/os_2.h; sourceTree = "<group>"; }; - 0E4A5F311D756542006B3D7A /* pclt.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pclt.c; path = ../../source/myfont/pclt.c; sourceTree = "<group>"; }; - 0E4A5F321D756542006B3D7A /* pclt.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pclt.h; path = ../../source/myfont/pclt.h; sourceTree = "<group>"; }; - 0E4A5F331D756542006B3D7A /* vhea.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vhea.c; path = ../../source/myfont/vhea.c; sourceTree = "<group>"; }; - 0E4A5F341D756542006B3D7A /* vhea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vhea.h; path = ../../source/myfont/vhea.h; sourceTree = "<group>"; }; - 0E4A5F351D756542006B3D7A /* vmtx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = vmtx.c; path = ../../source/myfont/vmtx.c; sourceTree = "<group>"; }; - 0E4A5F361D756542006B3D7A /* vmtx.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = vmtx.h; path = ../../source/myfont/vmtx.h; sourceTree = "<group>"; }; - 0EBB6F241D6BA22900F75F4A /* match.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = match.c; path = ../../source/modest/finder/match.c; sourceTree = "<group>"; }; - 0EBB6F251D6BA22900F75F4A /* match.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = match.h; path = ../../source/modest/finder/match.h; sourceTree = "<group>"; }; - 0EBB6F271D6BA8B500F75F4A /* myosi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/modest/finder/myosi.h; sourceTree = "<group>"; }; - 0EBB6F281D6BAE3100F75F4A /* myosi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = myosi.h; path = ../../source/modest/myosi.h; sourceTree = "<group>"; }; - 0EBB6F291D6D10D500F75F4A /* pseudo_class.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = pseudo_class.c; path = ../../source/modest/finder/pseudo_class.c; sourceTree = "<group>"; }; - 0EBB6F2A1D6D10D500F75F4A /* pseudo_class.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = pseudo_class.h; path = ../../source/modest/finder/pseudo_class.h; sourceTree = "<group>"; }; - 0EC3AF0C1D66543F00027DDC /* finder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = finder.c; path = ../../source/modest/finder/finder.c; sourceTree = "<group>"; }; - 0EC3AF0D1D66543F00027DDC /* finder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = finder.h; path = ../../source/modest/finder/finder.h; sourceTree = "<group>"; }; - 0EC3AF0E1D66543F00027DDC /* resource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = resource.h; path = ../../source/modest/finder/resource.h; sourceTree = "<group>"; }; - 0EC3AF0F1D66543F00027DDC /* type.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = type.c; path = ../../source/modest/finder/type.c; sourceTree = "<group>"; }; - 0EC3AF101D66543F00027DDC /* type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = type.h; path = ../../source/modest/finder/type.h; sourceTree = "<group>"; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 0E465AB31CFC4BC500CA7D65 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0E465AAD1CFC4BC500CA7D65 = { - isa = PBXGroup; - children = ( - 0E465AB91CFC4BC500CA7D65 /* main.c */, - 0E8499A61D22B6270027A80B /* modest */, - 0E4A5F1B1D756507006B3D7A /* myfont */, - 0E4A5E9E1D756413006B3D7A /* mycss */, - 0E4A5E3C1D7563C1006B3D7A /* myhtml */, - 0E465AB71CFC4BC500CA7D65 /* Products */, - ); - sourceTree = "<group>"; - }; - 0E465AB71CFC4BC500CA7D65 /* Products */ = { - isa = PBXGroup; - children = ( - 0E465AB61CFC4BC500CA7D65 /* Modest */, - ); - name = Products; - sourceTree = "<group>"; - }; - 0E4A5E3C1D7563C1006B3D7A /* myhtml */ = { - isa = PBXGroup; - children = ( - 0E4A5E3E1D7563E3006B3D7A /* api.h */, - 0E4A5E541D7563E3006B3D7A /* myosi.h */, - 0E4A5E531D7563E3006B3D7A /* myosi.c */, - 0E4A5E3D1D7563E3006B3D7A /* api_encoding.h */, - 0E4A5E3F1D7563E3006B3D7A /* callback.c */, - 0E4A5E401D7563E3006B3D7A /* callback.h */, - 0E4A5E411D7563E3006B3D7A /* charef_resource.h */, - 0E4A5E421D7563E3006B3D7A /* charef.c */, - 0E4A5E431D7563E3006B3D7A /* charef.h */, - 0E4A5E441D7563E3006B3D7A /* data_process.c */, - 0E4A5E451D7563E3006B3D7A /* data_process.h */, - 0E4A5E461D7563E3006B3D7A /* def.h */, - 0E4A5E471D7563E3006B3D7A /* encoding_detect_resource.h */, - 0E4A5E481D7563E3006B3D7A /* encoding_detect.c */, - 0E4A5E491D7563E3006B3D7A /* encoding_resource.h */, - 0E4A5E4A1D7563E3006B3D7A /* encoding.c */, - 0E4A5E4B1D7563E3006B3D7A /* encoding.h */, - 0E4A5E4C1D7563E3006B3D7A /* incoming.c */, - 0E4A5E4D1D7563E3006B3D7A /* incoming.h */, - 0E4A5E4E1D7563E3006B3D7A /* myhtml.c */, - 0E4A5E4F1D7563E3006B3D7A /* myhtml.h */, - 0E4A5E501D7563E3006B3D7A /* mynamespace_resource.h */, - 0E4A5E511D7563E3006B3D7A /* mynamespace.c */, - 0E4A5E521D7563E3006B3D7A /* mynamespace.h */, - 0E4A5E551D7563E3006B3D7A /* mystring.c */, - 0E4A5E561D7563E3006B3D7A /* mystring.h */, - 0E4A5E571D7563E3006B3D7A /* parser.c */, - 0E4A5E581D7563E3006B3D7A /* parser.h */, - 0E4A5E591D7563E3006B3D7A /* perf.c */, - 0E4A5E5A1D7563E3006B3D7A /* rules.c */, - 0E4A5E5B1D7563E3006B3D7A /* rules.h */, - 0E4A5E5C1D7563E3006B3D7A /* stream.c */, - 0E4A5E5D1D7563E3006B3D7A /* stream.h */, - 0E4A5E5E1D7563E3006B3D7A /* tag_const.h */, - 0E4A5E5F1D7563E3006B3D7A /* tag_init.c */, - 0E4A5E601D7563E3006B3D7A /* tag.c */, - 0E4A5E611D7563E3006B3D7A /* tag.h */, - 0E4A5E621D7563E3006B3D7A /* thread.c */, - 0E4A5E631D7563E3006B3D7A /* thread.h */, - 0E4A5E641D7563E3006B3D7A /* token.c */, - 0E4A5E651D7563E3006B3D7A /* token.h */, - 0E4A5E661D7563E3006B3D7A /* tokenizer_doctype.c */, - 0E4A5E671D7563E3006B3D7A /* tokenizer_doctype.h */, - 0E4A5E681D7563E3006B3D7A /* tokenizer_end.c */, - 0E4A5E691D7563E3006B3D7A /* tokenizer_end.h */, - 0E4A5E6A1D7563E3006B3D7A /* tokenizer_script.c */, - 0E4A5E6B1D7563E3006B3D7A /* tokenizer_script.h */, - 0E4A5E6C1D7563E3006B3D7A /* tokenizer.c */, - 0E4A5E6D1D7563E3006B3D7A /* tokenizer.h */, - 0E4A5E6E1D7563E3006B3D7A /* tree.c */, - 0E4A5E6F1D7563E3006B3D7A /* tree.h */, - 0E4A5E701D7563E3006B3D7A /* utils.c */, - 0E4A5E711D7563E3006B3D7A /* utils.h */, - 0E4A5E8A1D7563E8006B3D7A /* utils */, - ); - name = myhtml; - sourceTree = "<group>"; - }; - 0E4A5E8A1D7563E8006B3D7A /* utils */ = { - isa = PBXGroup; - children = ( - 0E4A5E8B1D7563F7006B3D7A /* mchar_async.c */, - 0E4A5E8C1D7563F7006B3D7A /* mchar_async.h */, - 0E4A5E8D1D7563F7006B3D7A /* mcobject_async.c */, - 0E4A5E8E1D7563F7006B3D7A /* mcobject_async.h */, - 0E4A5E8F1D7563F7006B3D7A /* mcobject.c */, - 0E4A5E901D7563F7006B3D7A /* mcobject.h */, - 0E4A5E911D7563F7006B3D7A /* mcsimple.c */, - 0E4A5E921D7563F7006B3D7A /* mcsimple.h */, - 0E4A5E931D7563F7006B3D7A /* mcsync.c */, - 0E4A5E941D7563F7006B3D7A /* mcsync.h */, - 0E4A5E951D7563F7006B3D7A /* mctree.c */, - 0E4A5E961D7563F7006B3D7A /* mctree.h */, - 0E4A5E971D7563F7006B3D7A /* resources.h */, - ); - name = utils; - sourceTree = "<group>"; - }; - 0E4A5E9E1D756413006B3D7A /* mycss */ = { - isa = PBXGroup; - children = ( - 0E4A5EA11D75643A006B3D7A /* api.h */, - 0E4A5EAA1D75643A006B3D7A /* myosi.h */, - 0E4A5E9F1D75643A006B3D7A /* an_plus_b.c */, - 0E4A5EA01D75643A006B3D7A /* an_plus_b.h */, - 0E4A5EA21D75643A006B3D7A /* check.c */, - 0E4A5EA31D75643A006B3D7A /* check.h */, - 0E4A5EA41D75643A006B3D7A /* convert.c */, - 0E4A5EA51D75643A006B3D7A /* convert.h */, - 0E4A5EA61D75643A006B3D7A /* entry.c */, - 0E4A5EA71D75643A006B3D7A /* entry.h */, - 0E4A5EA81D75643A006B3D7A /* mycss.c */, - 0E4A5EA91D75643A006B3D7A /* mycss.h */, - 0E4A5EAB1D75643A006B3D7A /* mystring.c */, - 0E4A5EAC1D75643A006B3D7A /* mystring.h */, - 0E4A5EAD1D75643A006B3D7A /* parser.c */, - 0E4A5EAE1D75643A006B3D7A /* parser.h */, - 0E4A5EAF1D75643A006B3D7A /* stylesheet.c */, - 0E4A5EB01D75643A006B3D7A /* stylesheet.h */, - 0E4A5EB11D75643A006B3D7A /* tokenizer_end.c */, - 0E4A5EB21D75643A006B3D7A /* tokenizer_end.h */, - 0E4A5EB31D75643A006B3D7A /* tokenizer_global.c */, - 0E4A5EB41D75643A006B3D7A /* tokenizer_global.h */, - 0E4A5EB51D75643A006B3D7A /* tokenizer_resource.h */, - 0E4A5EB61D75643A006B3D7A /* tokenizer.c */, - 0E4A5EB71D75643A006B3D7A /* tokenizer.h */, - 0E4A5F031D7564AE006B3D7A /* values */, - 0E4A5F021D7564A4006B3D7A /* property */, - 0E4A5EC61D756453006B3D7A /* declaration */, - 0E4A5EC51D75644D006B3D7A /* media */, - 0E4A5EC41D756447006B3D7A /* namespace */, - 0E4A5EC31D756440006B3D7A /* selectors */, - ); - name = mycss; - sourceTree = "<group>"; - }; - 0E4A5EC31D756440006B3D7A /* selectors */ = { - isa = PBXGroup; - children = ( - 0E4A5EC71D756469006B3D7A /* function_parser.c */, - 0E4A5EC81D756469006B3D7A /* function_parser.h */, - 0E4A5EC91D756469006B3D7A /* function_resource.h */, - 0E4A5ECA1D756469006B3D7A /* function.c */, - 0E4A5ECB1D756469006B3D7A /* function.h */, - 0E4A5ECC1D756469006B3D7A /* init.c */, - 0E4A5ECD1D756469006B3D7A /* init.h */, - 0E4A5ECE1D756469006B3D7A /* list.c */, - 0E4A5ECF1D756469006B3D7A /* list.h */, - 0E4A5ED01D756469006B3D7A /* myosi_resource.h */, - 0E4A5ED11D756469006B3D7A /* myosi.h */, - 0E4A5ED21D756469006B3D7A /* parser.c */, - 0E4A5ED31D756469006B3D7A /* parser.h */, - 0E4A5ED41D756469006B3D7A /* pseudo_resource.h */, - 0E4A5ED51D756469006B3D7A /* pseudo.c */, - 0E4A5ED61D756469006B3D7A /* pseudo.h */, - 0E4A5ED71D756469006B3D7A /* state.c */, - 0E4A5ED81D756469006B3D7A /* state.h */, - 0E4A5ED91D756469006B3D7A /* value_resource.h */, - 0E4A5EDA1D756469006B3D7A /* value.c */, - 0E4A5EDB1D756469006B3D7A /* value.h */, - ); - name = selectors; - sourceTree = "<group>"; - }; - 0E4A5EC41D756447006B3D7A /* namespace */ = { - isa = PBXGroup; - children = ( - 0E4A5EE41D756473006B3D7A /* init.c */, - 0E4A5EE51D756473006B3D7A /* init.h */, - 0E4A5EE61D756473006B3D7A /* myosi.h */, - 0E4A5EE71D756473006B3D7A /* parser.c */, - 0E4A5EE81D756473006B3D7A /* parser.h */, - 0E4A5EE91D756473006B3D7A /* state.c */, - 0E4A5EEA1D756473006B3D7A /* state.h */, - ); - name = namespace; - sourceTree = "<group>"; - }; - 0E4A5EC51D75644D006B3D7A /* media */ = { - isa = PBXGroup; - children = ( - 0E4A5EEE1D75648C006B3D7A /* init.c */, - 0E4A5EEF1D75648C006B3D7A /* init.h */, - 0E4A5EF01D75648C006B3D7A /* myosi.h */, - 0E4A5EF11D75648C006B3D7A /* state.c */, - 0E4A5EF21D75648C006B3D7A /* state.h */, - ); - name = media; - sourceTree = "<group>"; - }; - 0E4A5EC61D756453006B3D7A /* declaration */ = { - isa = PBXGroup; - children = ( - 0E4A5EF51D756497006B3D7A /* entry.c */, - 0E4A5EF61D756497006B3D7A /* entry.h */, - 0E4A5EF71D756497006B3D7A /* init.c */, - 0E4A5EF81D756497006B3D7A /* init.h */, - 0E4A5EF91D756497006B3D7A /* myosi.h */, - 0E4A5EFA1D756497006B3D7A /* parser.c */, - 0E4A5EFB1D756497006B3D7A /* parser.h */, - 0E4A5EFC1D756497006B3D7A /* state.c */, - 0E4A5EFD1D756497006B3D7A /* state.h */, - ); - name = declaration; - sourceTree = "<group>"; - }; - 0E4A5F021D7564A4006B3D7A /* property */ = { - isa = PBXGroup; - children = ( - 0E4A5F041D7564BB006B3D7A /* const.h */, - 0E4A5F051D7564BB006B3D7A /* init.c */, - 0E4A5F061D7564BB006B3D7A /* init.h */, - 0E4A5F071D7564BB006B3D7A /* myosi.h */, - 0E4A5F081D7564BB006B3D7A /* parser.c */, - 0E4A5F091D7564BB006B3D7A /* parser.h */, - 0E4A5F0A1D7564BB006B3D7A /* resources.h */, - ); - name = property; - sourceTree = "<group>"; - }; - 0E4A5F031D7564AE006B3D7A /* values */ = { - isa = PBXGroup; - children = ( - 0E4A5F0D1D7564C3006B3D7A /* consume.c */, - 0E4A5F0E1D7564C3006B3D7A /* consume.h */, - 0E4A5F0F1D7564C3006B3D7A /* resources.h */, - 0E4A5F101D7564C3006B3D7A /* serialization.c */, - 0E4A5F111D7564C3006B3D7A /* serialization.h */, - 0E4A5F121D7564C3006B3D7A /* units_resources.h */, - 0E4A5F131D7564C3006B3D7A /* units.c */, - 0E4A5F141D7564C3006B3D7A /* units.h */, - 0E4A5F151D7564C3006B3D7A /* values.c */, - 0E4A5F161D7564C3006B3D7A /* values.h */, - ); - name = values; - sourceTree = "<group>"; - }; - 0E4A5F1B1D756507006B3D7A /* myfont */ = { - isa = PBXGroup; - children = ( - 0E4A5F1C1D756542006B3D7A /* myosi.h */, - 0E4A5F2C1D756542006B3D7A /* myfont.h */, - 0E4A5F2B1D756542006B3D7A /* myfont.c */, - 0E4A5F1E1D756542006B3D7A /* cmap.h */, - 0E4A5F1D1D756542006B3D7A /* cmap.c */, - 0E4A5F201D756542006B3D7A /* glyf.h */, - 0E4A5F1F1D756542006B3D7A /* glyf.c */, - 0E4A5F221D756542006B3D7A /* head.h */, - 0E4A5F211D756542006B3D7A /* head.c */, - 0E4A5F241D756542006B3D7A /* hhea.h */, - 0E4A5F231D756542006B3D7A /* hhea.c */, - 0E4A5F261D756542006B3D7A /* hmtx.h */, - 0E4A5F251D756542006B3D7A /* hmtx.c */, - 0E4A5F281D756542006B3D7A /* loca.h */, - 0E4A5F271D756542006B3D7A /* loca.c */, - 0E4A5F2A1D756542006B3D7A /* maxp.h */, - 0E4A5F291D756542006B3D7A /* maxp.c */, - 0E4A5F2E1D756542006B3D7A /* name.h */, - 0E4A5F2D1D756542006B3D7A /* name.c */, - 0E4A5F301D756542006B3D7A /* os_2.h */, - 0E4A5F2F1D756542006B3D7A /* os_2.c */, - 0E4A5F321D756542006B3D7A /* pclt.h */, - 0E4A5F311D756542006B3D7A /* pclt.c */, - 0E4A5F341D756542006B3D7A /* vhea.h */, - 0E4A5F331D756542006B3D7A /* vhea.c */, - 0E4A5F361D756542006B3D7A /* vmtx.h */, - 0E4A5F351D756542006B3D7A /* vmtx.c */, - ); - name = myfont; - sourceTree = "<group>"; - }; - 0E5E4B8C1D6502F60030ECA0 /* finder */ = { - isa = PBXGroup; - children = ( - 0EBB6F271D6BA8B500F75F4A /* myosi.h */, - 0EC3AF0D1D66543F00027DDC /* finder.h */, - 0EC3AF0C1D66543F00027DDC /* finder.c */, - 0EC3AF101D66543F00027DDC /* type.h */, - 0EC3AF0F1D66543F00027DDC /* type.c */, - 0EBB6F2A1D6D10D500F75F4A /* pseudo_class.h */, - 0EBB6F291D6D10D500F75F4A /* pseudo_class.c */, - 0EBB6F251D6BA22900F75F4A /* match.h */, - 0EBB6F241D6BA22900F75F4A /* match.c */, - 0EC3AF0E1D66543F00027DDC /* resource.h */, - ); - name = finder; - sourceTree = "<group>"; - }; - 0E8499A61D22B6270027A80B /* modest */ = { - isa = PBXGroup; - children = ( - 0EBB6F281D6BAE3100F75F4A /* myosi.h */, - 0E5E4B8C1D6502F60030ECA0 /* finder */, - ); - name = modest; - sourceTree = "<group>"; - }; -/* End PBXGroup section */ - -/* Begin PBXNativeTarget section */ - 0E465AB51CFC4BC500CA7D65 /* Modest */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0E465ABD1CFC4BC500CA7D65 /* Build configuration list for PBXNativeTarget "Modest" */; - buildPhases = ( - 0E465AB21CFC4BC500CA7D65 /* Sources */, - 0E465AB31CFC4BC500CA7D65 /* Frameworks */, - 0E465AB41CFC4BC500CA7D65 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Modest; - productName = Modest; - productReference = 0E465AB61CFC4BC500CA7D65 /* Modest */; - productType = "com.apple.product-type.tool"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0E465AAE1CFC4BC500CA7D65 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0730; - ORGANIZATIONNAME = "Alexander Borisov"; - TargetAttributes = { - 0E465AB51CFC4BC500CA7D65 = { - CreatedOnToolsVersion = 7.3.1; - }; - }; - }; - buildConfigurationList = 0E465AB11CFC4BC500CA7D65 /* Build configuration list for PBXProject "Modest" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 0E465AAD1CFC4BC500CA7D65; - productRefGroup = 0E465AB71CFC4BC500CA7D65 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 0E465AB51CFC4BC500CA7D65 /* Modest */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXSourcesBuildPhase section */ - 0E465AB21CFC4BC500CA7D65 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0E4A5E811D7563E3006B3D7A /* tag.c in Sources */, - 0E4A5F391D756542006B3D7A /* head.c in Sources */, - 0E4A5F431D756542006B3D7A /* vmtx.c in Sources */, - 0E4A5EE11D756469006B3D7A /* pseudo.c in Sources */, - 0E4A5E9B1D7563F7006B3D7A /* mcsimple.c in Sources */, - 0E4A5EBD1D75643A006B3D7A /* mystring.c in Sources */, - 0E4A5E781D7563E3006B3D7A /* myhtml.c in Sources */, - 0E4A5E9A1D7563F7006B3D7A /* mcobject.c in Sources */, - 0E4A5EDE1D756469006B3D7A /* init.c in Sources */, - 0E4A5E991D7563F7006B3D7A /* mcobject_async.c in Sources */, - 0E4A5E7A1D7563E3006B3D7A /* myosi.c in Sources */, - 0E4A5F411D756542006B3D7A /* pclt.c in Sources */, - 0E4A5E881D7563E3006B3D7A /* tree.c in Sources */, - 0E4A5EBC1D75643A006B3D7A /* mycss.c in Sources */, - 0E4A5F0B1D7564BB006B3D7A /* init.c in Sources */, - 0E4A5F1A1D7564C3006B3D7A /* values.c in Sources */, - 0E4A5E731D7563E3006B3D7A /* charef.c in Sources */, - 0E4A5F0C1D7564BB006B3D7A /* parser.c in Sources */, - 0E4A5EBF1D75643A006B3D7A /* stylesheet.c in Sources */, - 0E4A5E7E1D7563E3006B3D7A /* rules.c in Sources */, - 0E4A5EEC1D756473006B3D7A /* parser.c in Sources */, - 0E4A5EE21D756469006B3D7A /* state.c in Sources */, - 0E4A5E9D1D7563F7006B3D7A /* mctree.c in Sources */, - 0E4A5F421D756542006B3D7A /* vhea.c in Sources */, - 0E4A5E7D1D7563E3006B3D7A /* perf.c in Sources */, - 0E4A5EFE1D756497006B3D7A /* entry.c in Sources */, - 0E4A5EDF1D756469006B3D7A /* list.c in Sources */, - 0E4A5E861D7563E3006B3D7A /* tokenizer_script.c in Sources */, - 0EC3AF111D66543F00027DDC /* finder.c in Sources */, - 0E4A5EEB1D756473006B3D7A /* init.c in Sources */, - 0E4A5E831D7563E3006B3D7A /* token.c in Sources */, - 0E4A5F001D756497006B3D7A /* parser.c in Sources */, - 0E4A5EF41D75648C006B3D7A /* state.c in Sources */, - 0E465ABA1CFC4BC500CA7D65 /* main.c in Sources */, - 0EBB6F261D6BA22900F75F4A /* match.c in Sources */, - 0E4A5E891D7563E3006B3D7A /* utils.c in Sources */, - 0E4A5E7C1D7563E3006B3D7A /* parser.c in Sources */, - 0E4A5EF31D75648C006B3D7A /* init.c in Sources */, - 0E4A5EC01D75643A006B3D7A /* tokenizer_end.c in Sources */, - 0E4A5EBB1D75643A006B3D7A /* entry.c in Sources */, - 0E4A5E981D7563F7006B3D7A /* mchar_async.c in Sources */, - 0E4A5F3B1D756542006B3D7A /* hmtx.c in Sources */, - 0E4A5E771D7563E3006B3D7A /* incoming.c in Sources */, - 0EC3AF121D66543F00027DDC /* type.c in Sources */, - 0E4A5E791D7563E3006B3D7A /* mynamespace.c in Sources */, - 0E4A5F371D756542006B3D7A /* cmap.c in Sources */, - 0E4A5F401D756542006B3D7A /* os_2.c in Sources */, - 0E4A5E721D7563E3006B3D7A /* callback.c in Sources */, - 0E4A5E9C1D7563F7006B3D7A /* mcsync.c in Sources */, - 0E4A5F3C1D756542006B3D7A /* loca.c in Sources */, - 0E4A5EB91D75643A006B3D7A /* check.c in Sources */, - 0E4A5F3E1D756542006B3D7A /* myfont.c in Sources */, - 0E4A5EBE1D75643A006B3D7A /* parser.c in Sources */, - 0E4A5EDC1D756469006B3D7A /* function_parser.c in Sources */, - 0E4A5F381D756542006B3D7A /* glyf.c in Sources */, - 0E4A5F011D756497006B3D7A /* state.c in Sources */, - 0E4A5F3F1D756542006B3D7A /* name.c in Sources */, - 0E4A5F3A1D756542006B3D7A /* hhea.c in Sources */, - 0E4A5EE01D756469006B3D7A /* parser.c in Sources */, - 0E4A5E761D7563E3006B3D7A /* encoding.c in Sources */, - 0E4A5EDD1D756469006B3D7A /* function.c in Sources */, - 0E4A5F171D7564C3006B3D7A /* consume.c in Sources */, - 0E4A5EE31D756469006B3D7A /* value.c in Sources */, - 0E4A5E851D7563E3006B3D7A /* tokenizer_end.c in Sources */, - 0E4A5E801D7563E3006B3D7A /* tag_init.c in Sources */, - 0E4A5F181D7564C3006B3D7A /* serialization.c in Sources */, - 0EBB6F2B1D6D10D500F75F4A /* pseudo_class.c in Sources */, - 0E4A5F3D1D756542006B3D7A /* maxp.c in Sources */, - 0E4A5EC21D75643A006B3D7A /* tokenizer.c in Sources */, - 0E4A5EBA1D75643A006B3D7A /* convert.c in Sources */, - 0E4A5E751D7563E3006B3D7A /* encoding_detect.c in Sources */, - 0E4A5EFF1D756497006B3D7A /* init.c in Sources */, - 0E4A5E871D7563E3006B3D7A /* tokenizer.c in Sources */, - 0E4A5F191D7564C3006B3D7A /* units.c in Sources */, - 0E4A5E7B1D7563E3006B3D7A /* mystring.c in Sources */, - 0E4A5E7F1D7563E3006B3D7A /* stream.c in Sources */, - 0E4A5E741D7563E3006B3D7A /* data_process.c in Sources */, - 0E4A5E841D7563E3006B3D7A /* tokenizer_doctype.c in Sources */, - 0E4A5E821D7563E3006B3D7A /* thread.c in Sources */, - 0E4A5EED1D756473006B3D7A /* state.c in Sources */, - 0E4A5EC11D75643A006B3D7A /* tokenizer_global.c in Sources */, - 0E4A5EB81D75643A006B3D7A /* an_plus_b.c in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - 0E465ABB1CFC4BC500CA7D65 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = dwarf; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_NO_COMMON_BLOCKS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = macosx; - }; - name = Debug; - }; - 0E465ABC1CFC4BC500CA7D65 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_IDENTITY = "-"; - COPY_PHASE_STRIP = NO; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - MACOSX_DEPLOYMENT_TARGET = 10.11; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = macosx; - }; - name = Release; - }; - 0E465ABE1CFC4BC500CA7D65 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - GCC_OPTIMIZATION_LEVEL = 0; - HEADER_SEARCH_PATHS = ../../source; - OTHER_CFLAGS = ( - "-DMyHTML_WITH_PERF", - "-DMyHTML_FORCE_RDTSC", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Debug; - }; - 0E465ABF1CFC4BC500CA7D65 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - HEADER_SEARCH_PATHS = ../../source; - OTHER_CFLAGS = ( - "-DMyHTML_WITH_PERF", - "-DMyHTML_FORCE_RDTSC", - ); - PRODUCT_NAME = "$(TARGET_NAME)"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 0E465AB11CFC4BC500CA7D65 /* Build configuration list for PBXProject "Modest" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0E465ABB1CFC4BC500CA7D65 /* Debug */, - 0E465ABC1CFC4BC500CA7D65 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0E465ABD1CFC4BC500CA7D65 /* Build configuration list for PBXNativeTarget "Modest" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0E465ABE1CFC4BC500CA7D65 /* Debug */, - 0E465ABF1CFC4BC500CA7D65 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0E465AAE1CFC4BC500CA7D65 /* Project object */; -} diff --git a/devel/osx/Modest.xcodeproj/project.xcworkspace/xcshareddata/Modest.xcscmblueprint b/devel/osx/Modest.xcodeproj/project.xcworkspace/xcshareddata/Modest.xcscmblueprint deleted file mode 100644 index 8f33de5..0000000 --- a/devel/osx/Modest.xcodeproj/project.xcworkspace/xcshareddata/Modest.xcscmblueprint +++ /dev/null @@ -1,37 +0,0 @@ -{ - "DVTSourceControlWorkspaceBlueprintPrimaryRemoteRepositoryKey" : "E1B815F910EED905C51790F9FFDAA87F3BBEDB13", - "DVTSourceControlWorkspaceBlueprintWorkingCopyRepositoryLocationsKey" : { - - }, - "DVTSourceControlWorkspaceBlueprintWorkingCopyStatesKey" : { - "98733C220E4E0BC91F352AF8F6264AF568DFB45B" : 0, - "B060867C3997F583FF228863A439187BDC805025" : 0, - "E1B815F910EED905C51790F9FFDAA87F3BBEDB13" : 0 - }, - "DVTSourceControlWorkspaceBlueprintIdentifierKey" : "C97D5FDA-7351-45CC-9BB8-26024AE01A22", - "DVTSourceControlWorkspaceBlueprintWorkingCopyPathsKey" : { - "98733C220E4E0BC91F352AF8F6264AF568DFB45B" : "mycss\/", - "B060867C3997F583FF228863A439187BDC805025" : "myhtml\/", - "E1B815F910EED905C51790F9FFDAA87F3BBEDB13" : "Modest\/" - }, - "DVTSourceControlWorkspaceBlueprintNameKey" : "Modest", - "DVTSourceControlWorkspaceBlueprintVersion" : 204, - "DVTSourceControlWorkspaceBlueprintRelativePathToProjectKey" : "devel\/osx\/Modest.xcodeproj", - "DVTSourceControlWorkspaceBlueprintRemoteRepositoriesKey" : [ - { - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/lexborisov\/mycss.git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "98733C220E4E0BC91F352AF8F6264AF568DFB45B" - }, - { - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/lexborisov\/myhtml.git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "B060867C3997F583FF228863A439187BDC805025" - }, - { - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryURLKey" : "https:\/\/github.com\/lexborisov\/Modest.git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositorySystemKey" : "com.apple.dt.Xcode.sourcecontrol.Git", - "DVTSourceControlWorkspaceBlueprintRemoteRepositoryIdentifierKey" : "E1B815F910EED905C51790F9FFDAA87F3BBEDB13" - } - ] -}
\ No newline at end of file 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 differdeleted file mode 100644 index d04547b..0000000 --- a/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate +++ /dev/null diff --git a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist deleted file mode 100644 index 4ddf715..0000000 --- a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ /dev/null @@ -1,23 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<Bucket - type = "1" - version = "2.0"> - <Breakpoints> - <BreakpointProxy - BreakpointExtensionID = "Xcode.Breakpoint.FileBreakpoint"> - <BreakpointContent - shouldBeEnabled = "Yes" - ignoreCount = "0" - continueAfterRunningActions = "No" - filePath = "../../../mycss/source/mycss/tokenizer_global.c" - timestampString = "494176331.483948" - startingColumnNumber = "9223372036854775807" - endingColumnNumber = "9223372036854775807" - startingLineNumber = "457" - endingLineNumber = "457" - landmarkName = "mycss_tokenizer_global_state_string_double_quoted()" - landmarkType = "7"> - </BreakpointContent> - </BreakpointProxy> - </Breakpoints> -</Bucket> 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 47a82aa..02b36c5 100644 --- a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme +++ b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8"?> <Scheme - LastUpgradeVersion = "0730" + LastUpgradeVersion = "0800" version = "1.3"> <BuildAction parallelizeBuildables = "YES" @@ -14,7 +14,7 @@ buildForAnalyzing = "YES"> <BuildableReference BuildableIdentifier = "primary" - BlueprintIdentifier = "0E465AB51CFC4BC500CA7D65" + BlueprintIdentifier = "0E750EDE1D9AF1D500337E9B" BuildableName = "Modest" BlueprintName = "Modest" ReferencedContainer = "container:Modest.xcodeproj"> @@ -32,7 +32,7 @@ <MacroExpansion> <BuildableReference BuildableIdentifier = "primary" - BlueprintIdentifier = "0E465AB51CFC4BC500CA7D65" + BlueprintIdentifier = "0E750EDE1D9AF1D500337E9B" BuildableName = "Modest" BlueprintName = "Modest" ReferencedContainer = "container:Modest.xcodeproj"> @@ -56,7 +56,7 @@ runnableDebuggingMode = "0"> <BuildableReference BuildableIdentifier = "primary" - BlueprintIdentifier = "0E465AB51CFC4BC500CA7D65" + BlueprintIdentifier = "0E750EDE1D9AF1D500337E9B" BuildableName = "Modest" BlueprintName = "Modest" ReferencedContainer = "container:Modest.xcodeproj"> @@ -75,7 +75,7 @@ runnableDebuggingMode = "0"> <BuildableReference BuildableIdentifier = "primary" - BlueprintIdentifier = "0E465AB51CFC4BC500CA7D65" + BlueprintIdentifier = "0E750EDE1D9AF1D500337E9B" BuildableName = "Modest" BlueprintName = "Modest" ReferencedContainer = "container:Modest.xcodeproj"> diff --git a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist index e6d52de..9a3afa2 100644 --- a/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist @@ -12,7 +12,7 @@ </dict> <key>SuppressBuildableAutocreation</key> <dict> - <key>0E465AB51CFC4BC500CA7D65</key> + <key>0E750EDE1D9AF1D500337E9B</key> <dict> <key>primary</key> <true/> diff --git a/devel/osx/Modest/Modest.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/devel/osx/Modest/Modest.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..fe9d885 --- /dev/null +++ b/devel/osx/Modest/Modest.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Workspace + version = "1.0"> + <FileRef + location = "self:Modest.xcodeproj"> + </FileRef> +</Workspace> diff --git a/devel/osx/Modest/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme b/devel/osx/Modest/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme new file mode 100644 index 0000000..13207a4 --- /dev/null +++ b/devel/osx/Modest/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme @@ -0,0 +1,46 @@ +<?xml version="1.0" encoding="UTF-8"?> +<Scheme + LastUpgradeVersion = "0800" + version = "1.3"> + <BuildAction + parallelizeBuildables = "YES" + buildImplicitDependencies = "YES"> + </BuildAction> + <TestAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + shouldUseLaunchSchemeArgsEnv = "YES"> + <Testables> + </Testables> + <AdditionalOptions> + </AdditionalOptions> + </TestAction> + <LaunchAction + buildConfiguration = "Debug" + selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" + selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" + launchStyle = "0" + useCustomWorkingDirectory = "NO" + ignoresPersistentStateOnLaunch = "NO" + debugDocumentVersioning = "YES" + debugServiceExtension = "internal" + allowLocationSimulation = "YES"> + <AdditionalOptions> + </AdditionalOptions> + </LaunchAction> + <ProfileAction + buildConfiguration = "Release" + shouldUseLaunchSchemeArgsEnv = "YES" + savedToolIdentifier = "" + useCustomWorkingDirectory = "NO" + debugDocumentVersioning = "YES"> + </ProfileAction> + <AnalyzeAction + buildConfiguration = "Debug"> + </AnalyzeAction> + <ArchiveAction + buildConfiguration = "Release" + revealArchiveInOrganizer = "YES"> + </ArchiveAction> +</Scheme> diff --git a/devel/osx/Modest/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist b/devel/osx/Modest/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..9a3afa2 --- /dev/null +++ b/devel/osx/Modest/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ +<?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>SchemeUserState</key> + <dict> + <key>Modest.xcscheme</key> + <dict> + <key>orderHint</key> + <integer>0</integer> + </dict> + </dict> + <key>SuppressBuildableAutocreation</key> + <dict> + <key>0E750EDE1D9AF1D500337E9B</key> + <dict> + <key>primary</key> + <true/> + </dict> + </dict> +</dict> +</plist> diff --git a/devel/osx/Modest/main.c b/devel/osx/Modest/main.c deleted file mode 100644 index 2760505..0000000 --- a/devel/osx/Modest/main.c +++ /dev/null @@ -1,188 +0,0 @@ -/* - 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 "myhtml/myhtml.h" -#include "mycss/mycss.h" -#include "mycss/declaration/init.h" -#include "modest/finder/finder.h" - -struct res_data { - char *data; - size_t size; -}; - -struct res_data load_data(const char* filename) -{ - FILE *f = fopen(filename, "rb"); - fseek(f, 0L, SEEK_END); - - long l = ftell(f); - fseek(f, 0L, SEEK_SET); - - char *html = (char*)myhtml_malloc(l); - fread(html, 1, l, f); - - fclose(f); - - struct res_data res = {html, (size_t)l}; - return res; -} - -myhtml_tree_t * myhtml(const char* data, size_t data_size, bool is_file, bool print_result) -{ - setbuf(stdout, NULL); - - myhtml_t* myhtml = myhtml_create(); - myhtml_init(myhtml, MyHTML_OPTIONS_DEFAULT, 1, 0); - - uint64_t all_start = myhtml_hperf_clock(NULL); - uint64_t tree_init_start = myhtml_hperf_clock(NULL); - - myhtml_tree_t* tree = myhtml_tree_create(); - myhtml_tree_init(tree, myhtml); - - uint64_t tree_init_stop = myhtml_hperf_clock(NULL); - uint64_t parse_start = myhtml_hperf_clock(NULL); - - if(is_file) { - struct res_data res = load_data(data); - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, res.data, res.size); - free(res.data); - } - else { - myhtml_parse(tree, MyHTML_ENCODING_UTF_8, data, data_size); - } - - uint64_t parse_stop = myhtml_hperf_clock(NULL); - uint64_t all_stop = myhtml_hperf_clock(NULL); - - if(print_result) { - myhtml_tree_print_node_children(tree, tree->document, stdout, 0); - - printf("\n\nMyHTML Information:\n"); - printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); - myhtml_hperf_print("\tFirst Tree init", tree_init_start, tree_init_stop, stdout); - myhtml_hperf_print("\tParse html", parse_start, parse_stop, stdout); - myhtml_hperf_print("\tTotal", all_start, all_stop, stdout); - printf("\n"); - } - - //myhtml_tree_destroy(tree); - //myhtml_destroy(myhtml); - - return tree; -} - -mycss_entry_t * mycss(const char* data, size_t data_size, bool is_file, bool print_result) -{ - // base init - mycss_t *mycss = mycss_create(); - mycss_status_t status = mycss_init(mycss); - - // currenr entry work init - mycss_entry_t *entry = mycss_entry_create(); - status = mycss_entry_init(mycss, entry); - - uint64_t parse_start = myhtml_hperf_clock(NULL); - - if(is_file) { - struct res_data res = load_data(data); - mycss_parse(entry, MyHTML_ENCODING_UTF_8, res.data, res.size); - free(res.data); - } - else { - mycss_parse(entry, MyHTML_ENCODING_UTF_8, data, data_size); - } - - uint64_t parse_stop = myhtml_hperf_clock(NULL); - - if(print_result) { - printf("\n"); - mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(entry); - mycss_selectors_print_list(entry->selectors, stylesheet->sel_list_first, stdout); - - printf("\n------------\nMyCSS Information:\n"); - printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); - myhtml_hperf_print("\tParse css", parse_start, parse_stop, stdout); - } - - //mycss_entry_destroy(entry, true); - //mycss_destroy(mycss, true); - - return entry; -} - -int main(int argc, const char * argv[]) { - setbuf(stdout, NULL); - - char *html = "<fff>sdsd<aaaa id=hash class=best><div a1><menu class=\"lalala\" id=\"menu-id\" b1><span span1><div a2></div></div><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 *html = "/new/C-git/test_full.html"; - char *css = "img {width: auto\\9; height: auto; max-width: 100%; -ms-interpolation-mode: bicubic;}"; - char *selector = "html|fff >> div"; - - myhtml_tree_t *myhtml_tree = myhtml(html, strlen(html), false, true); - mycss_entry_t *mycss_entry = mycss(css, strlen(css), false, true); - - mycss_stylesheet_t *stylesheet = mycss_entry_stylesheet(mycss_entry); - - /* simple api */ - uint64_t parse_simple_start = myhtml_hperf_clock(NULL); - -// mycss_status_t out_status; -// modest_finder_t *finder = modest_finder_create_simple(myhtml_tree, NULL); -// -// mycss_selectors_list_t *list = mycss_selectors_parse(mycss_entry->selectors, MyHTML_ENCODING_UTF_8, selector, strlen(selector), &out_status); -// myhtml_collection_t *collection = modest_finder_by_selectors_list(finder, list, myhtml_tree->node_html, NULL); -// - uint64_t parse_simple_stop = myhtml_hperf_clock(NULL); -// -// printf("\nPrint simple result:\n"); -// for(size_t i = 0; i < collection->length; i++) { -// myhtml_tree_print_node(myhtml_tree, collection->list[i], stdout); -// } -// -// finder = modest_finder_destroy(finder, true); - - /* full api */ - uint64_t parse_start = myhtml_hperf_clock(NULL); - - myhtml_collection_t* full_collection = NULL; - modest_finder_t *finder_full = modest_finder_by_stylesheet(myhtml_tree, stylesheet, &full_collection, NULL, NULL); - - uint64_t parse_stop = myhtml_hperf_clock(NULL); - - printf("\n\n------------\nInformation:\n"); - printf("\tTicks/sec: %llu\n", (unsigned long long) myhtml_hperf_res(NULL)); - myhtml_hperf_print("\tFound selectors", parse_start, parse_stop, stdout); - myhtml_hperf_print("\tParse and Found Simple selectors", parse_simple_start, parse_simple_stop, stdout); - printf("\n"); - - printf("\nPrint result:\n"); - for(size_t i = 0; i < full_collection->length; i++) { - myhtml_tree_print_node(myhtml_tree, full_collection->list[i], stdout); - } - - printf("\n"); - - modest_finder_destroy(finder_full, true); - - return 0; -} - diff --git a/include/modest/finder/finder.h b/include/modest/finder/finder.h index 9b338b5..b9026b9 100644 --- a/include/modest/finder/finder.h +++ b/include/modest/finder/finder.h @@ -24,15 +24,17 @@ #include <modest/finder/myosi.h> #include <modest/finder/type.h> -#include <mycss/selectors/myosi.h> -#include <mycss/selectors/list.h> #ifdef __cplusplus extern "C" { #endif -typedef bool (*modest_finder_selector_type_f)(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -typedef myhtml_tree_node_t * (*modest_finder_selector_combinator_f)(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +typedef bool (*modest_finder_selector_type_f)(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +typedef myhtml_tree_node_t * (*modest_finder_selector_combinator_f)(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); /* init */ modest_finder_t * modest_finder_create(void); @@ -44,22 +46,52 @@ modest_finder_t * modest_finder_destroy(modest_finder_t* finder, bool self_destr modest_finder_t * modest_finder_create_simple(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet); /* callbacks */ -void modest_finder_callback_found_with_collection(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); -void modest_finder_callback_found_with_bool(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); +void modest_finder_callback_found_with_collection(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, void* ctx); + +void modest_finder_callback_found_with_bool(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, void* ctx); + +void modest_finder_specificity_inc(mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); /* base api */ void modest_finder_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet, myhtml_collection_t** collection, myhtml_tree_node_t* base_node, mycss_selectors_list_t* selector_list); -myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, mycss_selectors_list_t *sel_list, myhtml_tree_node_t* base_node, myhtml_collection_t* collection); +modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet, + myhtml_collection_t** collection, myhtml_tree_node_t* base_node, mycss_selectors_list_t* selector_list); + +myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, mycss_selectors_list_t *sel_list, + myhtml_tree_node_t* base_node, myhtml_collection_t* collection); /* process */ -myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_next_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_next_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/modest/finder/myosi.h b/include/modest/finder/myosi.h index de8df77..0e0d04a 100644 --- a/include/modest/finder/myosi.h +++ b/include/modest/finder/myosi.h @@ -23,8 +23,9 @@ #pragma once #include <modest/myosi.h> -#include <myhtml/myosi.h> #include <mycss/myosi.h> +#include <mycss/selectors/myosi.h> +#include <mycss/selectors/list.h> #ifdef __cplusplus extern "C" { @@ -32,17 +33,19 @@ extern "C" { struct modest_finder typedef modest_finder_t; -typedef void (*modest_finder_callback_f)(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); +typedef void (*modest_finder_callback_f)(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec, void* ctx); typedef bool (*modest_finder_match_f)(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); struct modest_finder { myhtml_tree_t* tree; mycss_stylesheet_t* stylesheet; - - modest_finder_callback_f callback_found; - void* callback_found_ctx; }; +typedef struct modest_finder_thread_declaration modest_finder_thread_declaration_t; +typedef struct modest_finder_thread_entry modest_finder_thread_entry_t; +typedef struct modest_finder_thread_context modest_finder_thread_context_t; +typedef struct modest_finder_thread modest_finder_thread_t; +typedef struct modest_finder_thread_found_context modest_finder_thread_found_context_t; #ifdef __cplusplus } /* extern "C" */ diff --git a/include/modest/finder/pseudo_class.h b/include/modest/finder/pseudo_class.h index e528049..05fd578 100644 --- a/include/modest/finder/pseudo_class.h +++ b/include/modest/finder/pseudo_class.h @@ -23,67 +23,65 @@ #pragma once #include <modest/finder/myosi.h> -#include <mycss/selectors/myosi.h> -#include <mycss/selectors/value.h> #include <modest/finder/finder.h> #ifdef __cplusplus extern "C" { #endif -bool modest_finder_selector_sub_type_pseudo_class_function_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_current(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_dir(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_drop(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_has(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_lang(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_matches(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_not(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_column(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_column(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_dir(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_has(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_lang(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_matches(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_not(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); /* classes */ -bool modest_finder_selector_sub_type_pseudo_class_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_active(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_any_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_blank(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_default(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_disabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_empty(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_enabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_first_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_first_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_focus(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_future(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_hover(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_in_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_indeterminate(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_invalid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_only_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_only_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_optional(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_out_of_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_past(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_placeholder_shown(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_read_only(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_read_write(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_required(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_root(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_scope(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_target(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_user_error(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_valid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_visited(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_active(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_any_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_blank(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_default(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_disabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_empty(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_enabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_first_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_first_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_focus(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_future(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_hover(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_in_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_indeterminate(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_invalid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_only_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_only_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_optional(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_out_of_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_past(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_placeholder_shown(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_read_only(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_read_write(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_required(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_root(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_scope(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_target(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_user_error(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_valid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_visited(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); #ifdef __cplusplus } /* extern "C" */ diff --git a/include/modest/finder/thread.h b/include/modest/finder/thread.h new file mode 100644 index 0000000..a403db8 --- /dev/null +++ b/include/modest/finder/thread.h @@ -0,0 +1,93 @@ +/* + 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 MODEST_FINDER_THREAD_H +#define MODEST_FINDER_THREAD_H +#pragma once + +#include <modest/modest.h> +#include <modest/node/node.h> +#include <modest/style/type.h> +#include <modest/style/map.h> +#include <modest/finder/myosi.h> +#include <modest/finder/finder.h> + +#include <myhtml/thread.h> +#include <myhtml/utils/mcobject_async.h> + +#include <mycss/declaration/myosi.h> + +struct modest_finder_thread_declaration { + mycss_declaration_entry_t* entry; + modest_style_raw_specificity_t raw_spec; + + struct modest_finder_thread_declaration* next; + struct modest_finder_thread_declaration* prev; +}; + +struct modest_finder_thread_entry { + myhtml_tree_node_t* node; + + modest_finder_thread_declaration_t* declaration; + modest_finder_thread_declaration_t* declaration_last; + + struct modest_finder_thread_entry* next; + struct modest_finder_thread_entry* prev; +}; + +struct modest_finder_thread_context { + modest_finder_thread_entry_t* entry; + modest_finder_thread_entry_t* entry_last; + size_t entry_node_id; + size_t declaration_node_id; +}; + +struct modest_finder_thread { + modest_finder_thread_context_t* context_list; + size_t context_list_size; + + mythread_t *thread; + + mcobject_async_t* entry_obj; + mcobject_async_t* declaration_obj; + + /* refs */ + modest_finder_t* finder; + myhtml_tree_node_t* base_node; + mycss_selectors_list_t* selector_list; +}; + +struct modest_finder_thread_found_context { + modest_finder_thread_t* finder_thread; + modest_finder_thread_context_t* context; +}; + + +modest_finder_thread_t * modest_finder_thread_create(void); +modest_status_t modest_finder_thread_init(modest_finder_t* finder, modest_finder_thread_t* finder_thread, size_t thread_count); +void modest_finder_thread_clean(modest_finder_thread_t* finder_thread, bool self_destroy); +modest_finder_thread_t * modest_finder_thread_destroy(modest_finder_thread_t* finder_thread, bool self_destroy); + +modest_status_t modest_finder_thread_process(modest_t* modest, modest_finder_thread_t* finder_thread, myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list); + +void modest_finder_thread_wait_for_all_done(modest_finder_thread_t* finder_thread); +bool modest_finder_thread_spec_is_up(modest_style_raw_specificity_t* spec_f, modest_style_raw_specificity_t* spec_t); + +#endif /* thread_h */ diff --git a/include/modest/finder/type.h b/include/modest/finder/type.h index 4402416..3497852 100644 --- a/include/modest/finder/type.h +++ b/include/modest/finder/type.h @@ -28,23 +28,38 @@ #include <modest/finder/match.h> #include <myhtml/tree.h> #include <myhtml/utils.h> -#include <mycss/selectors/myosi.h> -#include <mycss/selectors/list.h> #include <mycss/selectors/value.h> #ifdef __cplusplus extern "C" { #endif -bool modest_finder_selector_type_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_id(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_attribute(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_pseudo_class_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_pseudo_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_pseudo_element_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_pseudo_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_undef(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_id(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_class(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_attribute(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_pseudo_class_function(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_pseudo_class(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_pseudo_element_function(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_pseudo_element(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); #ifdef __cplusplus diff --git a/include/modest/modest.h b/include/modest/modest.h new file mode 100644 index 0000000..380f71b --- /dev/null +++ b/include/modest/modest.h @@ -0,0 +1,44 @@ +/* + 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 MODEST_H +#define MODEST_H +#pragma once + +#include <modest/myosi.h> +#include <modest/node/node.h> +#include <myhtml/utils/mcobject_async.h> + +struct modest { + mcobject_async_t* mnode_obj; + size_t mnode_node_id; + + mcobject_async_t* mstylesheet_obj; + size_t mstylesheet_node_id; +}; + + +modest_t * modest_create(void); +modest_status_t modest_init(modest_t* modest); +void modest_clean(modest_t* modest); +modest_t * modest_destroy(modest_t* modest, bool self_destroy); + + +#endif /* MODEST_H */ diff --git a/include/modest/myosi.h b/include/modest/myosi.h index 8ba7049..3fafb11 100644 --- a/include/modest/myosi.h +++ b/include/modest/myosi.h @@ -22,6 +22,8 @@ #define MODEST_MYOSI_H #pragma once +#include <myhtml/myosi.h> + #ifdef __cplusplus extern "C" { #endif @@ -46,6 +48,10 @@ enum modest_status { } typedef modest_status_t; +typedef struct modest modest_t; +typedef struct modest_node modest_node_t; +typedef struct modest_style_sheet modest_style_sheet_t; + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/include/modest/node/node.h b/include/modest/node/node.h new file mode 100644 index 0000000..a8e5c35 --- /dev/null +++ b/include/modest/node/node.h @@ -0,0 +1,36 @@ +/* + 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 MODEST_NODE_NODE_H +#define MODEST_NODE_NODE_H +#pragma once + +#include <modest/myosi.h> +#include <modest/modest.h> +#include <modest/style/sheet.h> + +struct modest_node { + modest_style_sheet_t* stylesheet; +}; + +modest_node_t * modest_node_create(modest_t* modest); +modest_status_t modest_node_init(modest_t* modest, modest_node_t *mnode); + +#endif /* MODEST_NODE_NODE_H */ diff --git a/include/modest/style/map.h b/include/modest/style/map.h new file mode 100644 index 0000000..b8062b1 --- /dev/null +++ b/include/modest/style/map.h @@ -0,0 +1,38 @@ +/* + 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 MODEST_STYLE_MAP_H +#define MODEST_STYLE_MAP_H +#pragma once + +#include <modest/myosi.h> +#include <modest/finder/myosi.h> +#include <modest/finder/thread.h> + +typedef void (*modest_style_map_collate_f)(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec); + +void modest_style_map_collate_declaration(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec); + +void modest_style_map_collate_declaration_undef(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec); +void modest_style_map_collate_declaration_height(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec); +void modest_style_map_collate_declaration_width(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec); + + +#endif /* MODEST_STYLE_MAP_H */ diff --git a/include/modest/style/map_resource.h b/include/modest/style/map_resource.h new file mode 100644 index 0000000..89513ce --- /dev/null +++ b/include/modest/style/map_resource.h @@ -0,0 +1,32 @@ +/* + 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 MODEST_STYLE_MAP_RESOURCE_H +#define MODEST_STYLE_MAP_RESOURCE_H +#pragma once + +static const modest_style_map_collate_f modest_style_map_static_collate_declaration[] = +{ + modest_style_map_collate_declaration_undef, + modest_style_map_collate_declaration_height, + modest_style_map_collate_declaration_width +}; + +#endif /* MODEST_STYLE_MAP_RESOURCE_H */ diff --git a/include/modest/style/sheet.h b/include/modest/style/sheet.h new file mode 100644 index 0000000..22e83b0 --- /dev/null +++ b/include/modest/style/sheet.h @@ -0,0 +1,37 @@ +/* + 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 MODEST_STYLE_SHEET_H +#define MODEST_STYLE_SHEET_H +#pragma once + +#include <modest/myosi.h> +#include <modest/modest.h> +#include <modest/style/type.h> + +struct modest_style_sheet { + modest_style_type_length_t width; + modest_style_type_length_t height; +}; + +modest_style_sheet_t * modest_style_sheet_create(modest_t* modest); +modest_status_t modest_style_sheet_init(modest_t* modest, modest_style_sheet_t* m_stylesheet); + +#endif /* MODEST_STYLE_SHEET_H */ diff --git a/include/modest/style/type.h b/include/modest/style/type.h new file mode 100644 index 0000000..1741467 --- /dev/null +++ b/include/modest/style/type.h @@ -0,0 +1,50 @@ +/* + 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 MODEST_STYLE_TYPE_H +#define MODEST_STYLE_TYPE_H +#pragma once + +#include <modest/myosi.h> +#include <mycss/declaration/myosi.h> + +typedef struct modest_style_type_length modest_style_type_length_t; + +typedef struct modest_style_raw modest_style_raw_t; +typedef struct modest_style_raw_specificity modest_style_raw_specificity_t; + +struct modest_style_raw_specificity { + unsigned int x; + unsigned int a; + unsigned int b; + unsigned int c; +}; + +struct modest_style_raw { + mycss_declaration_entry_t* declaration; + modest_style_raw_specificity_t spec; +}; + +struct modest_style_type_length { + float value; + modest_style_raw_t raw; +}; + +#endif /* MODEST_STYLE_TYPE_H */ diff --git a/include/mycss/selectors/init.h b/include/mycss/selectors/init.h index 7f01ac6..91346fa 100644 --- a/include/mycss/selectors/init.h +++ b/include/mycss/selectors/init.h @@ -52,9 +52,9 @@ void mycss_selectors_print_chain(mycss_selectors_t* selectors, mycss_selectors_e mycss_selectors_entry_t * mycss_selectors_entry_create(mycss_selectors_t* selectors); -mycss_selectors_entry_t ** mycss_selectors_entry_list_create(mycss_selectors_t* selectors); -mycss_selectors_entry_t ** mycss_selectors_entry_list_add_one(mycss_selectors_t* selectors, mycss_selectors_entry_t** list, size_t current_size); -mycss_selectors_entry_t ** mycss_selectors_entry_list_destroy(mycss_selectors_t* selectors, mycss_selectors_entry_t** list); +mycss_selectors_entries_list_t * mycss_selectors_entries_list_create(mycss_selectors_t* selectors); +mycss_selectors_entries_list_t * mycss_selectors_entries_list_add_one(mycss_selectors_t* selectors, mycss_selectors_entries_list_t* entries, size_t current_size); +mycss_selectors_entries_list_t * mycss_selectors_entries_list_destroy(mycss_selectors_t* selectors, mycss_selectors_entries_list_t* entries); mycss_selectors_entry_t * mycss_selectors_entry(mycss_selectors_t* selectors); void mycss_selectors_entry_append_to_current(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector); diff --git a/include/mycss/selectors/list.h b/include/mycss/selectors/list.h index a5a532a..1320494 100644 --- a/include/mycss/selectors/list.h +++ b/include/mycss/selectors/list.h @@ -25,14 +25,19 @@ #ifdef __cplusplus extern "C" { #endif - + #include <mycss/entry.h> #include <mycss/selectors/myosi.h> #include <mycss/declaration/myosi.h> +struct mycss_selectors_entries_list { + mycss_selectors_entry_t* entry; + mycss_selectors_specificity_t specificity; +}; + struct mycss_selectors_list { - mycss_selectors_entry_t** selector_list; - size_t selector_list_length; + mycss_selectors_entries_list_t* entries_list; + size_t entries_list_length; mycss_declaration_entry_t* declaration_entry; diff --git a/include/mycss/selectors/myosi.h b/include/mycss/selectors/myosi.h index dabf932..5a05cc3 100644 --- a/include/mycss/selectors/myosi.h +++ b/include/mycss/selectors/myosi.h @@ -28,8 +28,10 @@ extern "C" { typedef struct mycss_selectors mycss_selectors_t; typedef struct mycss_selectors_entry mycss_selectors_entry_t; +typedef struct mycss_selectors_entries_list mycss_selectors_entries_list_t; typedef struct mycss_selectors_list mycss_selectors_list_t; - +typedef struct mycss_selectors_specificity mycss_selectors_specificity_t; + #include <mycss/myosi.h> #include <mycss/mystring.h> #include <mycss/namespace/myosi.h> @@ -184,6 +186,12 @@ enum mycss_selectors_function_drop_type { } typedef mycss_selectors_function_drop_type_t; +struct mycss_selectors_specificity { + unsigned int a; + unsigned int b; + unsigned int c; +}; + struct mycss_selectors { // refs mycss_entry_t* ref_entry; @@ -194,6 +202,7 @@ struct mycss_selectors { mycss_selectors_list_t** list; mycss_selectors_list_t* list_last; + mycss_selectors_specificity_t* specificity; mycss_selectors_combinator_t* combinator; mycss_token_type_t ending_token; @@ -214,9 +223,6 @@ struct mycss_selectors_entry { mycss_selectors_combinator_t combinator; - /* TODO: experimental */ - void* node; - mycss_selectors_entry_t* next; mycss_selectors_entry_t* prev; }; diff --git a/include/myhtml/api.h b/include/myhtml/api.h index a778ea9..4f9821b 100644 --- a/include/myhtml/api.h +++ b/include/myhtml/api.h @@ -36,7 +36,7 @@ #define MyHTML_VERSION_MAJOR 1 #define MyHTML_VERSION_MINOR 0 -#define MyHTML_VERSION_PATCH 3 +#define MyHTML_VERSION_PATCH 4 #include <stdbool.h> #include <stddef.h> @@ -1542,6 +1542,25 @@ myhtml_node_raw_pasition(myhtml_tree_node_t *node); myhtml_position_t myhtml_node_element_pasition(myhtml_tree_node_t *node); +/** + * Get data value from tree node + * + * @param[in] myhtml_tree_node_t* + * + * @return void* + */ +void* +myhtml_node_get_data(myhtml_tree_node_t *node); + +/** + * Set data value to tree node + * + * @param[in] myhtml_tree_node_t* + * @param[in] void* + */ +void +myhtml_node_set_data(myhtml_tree_node_t *node, void* data); + /*********************************************************************************** * * MyHTML_ATTRIBUTE diff --git a/include/myhtml/myhtml.h b/include/myhtml/myhtml.h index a93f162..6845384 100644 --- a/include/myhtml/myhtml.h +++ b/include/myhtml/myhtml.h @@ -177,6 +177,8 @@ const char * myhtml_node_text(myhtml_tree_node_t *node, size_t *length); myhtml_string_t * myhtml_node_string(myhtml_tree_node_t *node); myhtml_position_t myhtml_node_raw_pasition(myhtml_tree_node_t *node); myhtml_position_t myhtml_node_element_pasition(myhtml_tree_node_t *node); +void myhtml_node_set_data(myhtml_tree_node_t *node, void* data); +void * myhtml_node_get_data(myhtml_tree_node_t *node); /* attributes */ myhtml_tree_attr_t * myhtml_attribute_next(myhtml_tree_attr_t *attr); diff --git a/include/myhtml/myosi.h b/include/myhtml/myosi.h index 6d9061e..01061e7 100644 --- a/include/myhtml/myosi.h +++ b/include/myhtml/myosi.h @@ -31,7 +31,7 @@ #define MyHTML_VERSION_MAJOR 1 #define MyHTML_VERSION_MINOR 0 -#define MyHTML_VERSION_PATCH 3 +#define MyHTML_VERSION_PATCH 4 #if (defined(_WIN32) || defined(_WIN64)) && !defined(__WINPTHREADS_VERSION) #define IS_OS_WINDOWS @@ -172,7 +172,8 @@ enum mythread_thread_opt { MyTHREAD_OPT_UNDEF = 0x00, MyTHREAD_OPT_WAIT = 0x01, MyTHREAD_OPT_QUIT = 0x02, - MyTHREAD_OPT_STOP = 0x04 + MyTHREAD_OPT_STOP = 0x04, + MyTHREAD_OPT_DONE = 0x08 } typedef mythread_thread_opt_t; @@ -484,9 +485,6 @@ typedef struct myhtml myhtml_t; // parser state function typedef size_t (*myhtml_tokenizer_state_f)(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); -// parser stream function -typedef void (*mythread_f)(mythread_id_t thread_id, mythread_queue_node_t *qnode); - // parser insertion mode function typedef bool (*myhtml_insertion_f)(myhtml_tree_t* tree, myhtml_token_node_t* token); diff --git a/include/myhtml/parser.h b/include/myhtml/parser.h index 0925bec..8e3c3de 100644 --- a/include/myhtml/parser.h +++ b/include/myhtml/parser.h @@ -33,9 +33,9 @@ extern "C" { #include <myhtml/token.h> #include <myhtml/data_process.h> -void myhtml_parser_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode); -void myhtml_parser_worker(mythread_id_t thread_id, mythread_queue_node_t *qnode); -void myhtml_parser_worker_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode); +void myhtml_parser_stream(mythread_id_t thread_id, void* ctx); +void myhtml_parser_worker(mythread_id_t thread_id, void* ctx); +void myhtml_parser_worker_stream(mythread_id_t thread_id, void* ctx); size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); diff --git a/include/myhtml/thread.h b/include/myhtml/thread.h index e66a15d..43060ee 100644 --- a/include/myhtml/thread.h +++ b/include/myhtml/thread.h @@ -49,6 +49,10 @@ extern "C" { #define MyTHREAD_SEM_NAME "myhtml" +/* functions */ +typedef void (*mythread_callback_before_join_f)(mythread_t* mythread); +typedef void (*mythread_process_f)(void* arg); +typedef void (*mythread_work_f)(mythread_id_t thread_id, void* arg); #ifdef MyHTML_BUILD_WITHOUT_THREADS @@ -58,8 +62,9 @@ struct mythread { #else /* MyHTML_BUILD_WITHOUT_THREADS */ -void mythread_function_stream(void *arg); -void mythread_function_batch(void *arg); +void mythread_function_queue_stream(void *arg); +void mythread_function_queue_batch(void *arg); +void mythread_function(void *arg); // thread struct mythread_context { @@ -73,7 +78,7 @@ struct mythread_context { size_t sem_name_size; - mythread_f func; + mythread_work_f func; volatile size_t t_count; volatile mythread_thread_opt_t opt; @@ -88,6 +93,7 @@ struct mythread_list { pthread_t pth; #endif mythread_context_t data; + mythread_process_f process_func; }; struct mythread_workers_list { @@ -101,7 +107,7 @@ struct mythread { size_t pth_list_size; size_t pth_list_root; - mythread_queue_list_t *queue_list; + void *context; char *sem_prefix; size_t sem_prefix_length; @@ -119,17 +125,17 @@ struct mythread { volatile mythread_thread_opt_t batch_opt; }; -mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_f func, myhtml_status_t *status); -mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_f func, myhtml_status_t *status, size_t count); +mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_process_f process_func, mythread_work_f func, mythread_thread_opt_t opt, myhtml_status_t *status); +mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_process_f process_func, mythread_work_f func, mythread_thread_opt_t opt, myhtml_status_t *status, size_t count); void myhtml_thread_nanosleep(const struct timespec *tomeout); -#endif +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ mythread_t * mythread_create(void); -myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count, size_t queue_size); +myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count); void mythread_clean(mythread_t *mythread); -mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy); +mythread_t * mythread_destroy(mythread_t *mythread, mythread_callback_before_join_f before_join, bool self_destroy); void mythread_stream_quit_all(mythread_t *mythread); void mythread_batch_quit_all(mythread_t *mythread); @@ -138,7 +144,7 @@ void mythread_stream_stop_all(mythread_t *mythread); void mythread_batch_stop_all(mythread_t *mythread); void mythread_stop_all(mythread_t *mythread); -void mythread_wait_all_for_done(mythread_t *mythread); +void mythread_queue_wait_all_for_done(mythread_t *mythread); void mythread_resume_all(mythread_t *mythread); void mythread_suspend_all(mythread_t *mythread); @@ -194,7 +200,11 @@ mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, m #ifndef MyHTML_BUILD_WITHOUT_THREADS -mythread_queue_list_t * mythread_queue_list_create(mythread_t *mythread, myhtml_status_t *status); +mythread_queue_list_t * mythread_queue_list_create(myhtml_status_t *status); +void mythread_queue_list_destroy(mythread_queue_list_t* queue_list); + +size_t mythread_queue_list_get_count(mythread_queue_list_t* queue_list); + mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythread, mythread_queue_t *queue, myhtml_status_t *status); mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t *mythread, mythread_queue_list_entry_t *entry, bool destroy_queue); void mythread_queue_list_entry_clean(mythread_t *mythread, mythread_queue_list_entry_t *entry); diff --git a/include/myhtml/tree.h b/include/myhtml/tree.h index 78ef23a..a17b0a5 100644 --- a/include/myhtml/tree.h +++ b/include/myhtml/tree.h @@ -80,14 +80,15 @@ struct myhtml_tree_node { myhtml_tag_id_t tag_id; enum myhtml_namespace ns; - myhtml_tree_node_t* prev; // предыдущий ид элемента этого же уровня - myhtml_tree_node_t* next; // следеющий ид эелента этого же уровня - myhtml_tree_node_t* child; // ид чилда - myhtml_tree_node_t* parent; // ид родителя + myhtml_tree_node_t* prev; + myhtml_tree_node_t* next; + myhtml_tree_node_t* child; + myhtml_tree_node_t* parent; - myhtml_tree_node_t* last_child; // + myhtml_tree_node_t* last_child; myhtml_token_node_t* token; + void* data; }; enum myhtml_tree_compat_mode { diff --git a/source/modest/Makefile.mk b/source/modest/Makefile.mk index c589dfb..8953864 100644 --- a/source/modest/Makefile.mk +++ b/source/modest/Makefile.mk @@ -1,7 +1,7 @@ find_files_h = $(wildcard $(SRCDIR)/modest/$(dir)/*.h) find_files_c = $(wildcard $(SRCDIR)/modest/$(dir)/*.c) -SUBDIRS := . finder +SUBDIRS := . finder style node HDRS += $(foreach dir,$(SUBDIRS),$(find_files_h)) SRCS += $(foreach dir,$(SUBDIRS),$(find_files_c)) diff --git a/source/modest/finder/finder.c b/source/modest/finder/finder.c index e533d60..acca407 100644 --- a/source/modest/finder/finder.c +++ b/source/modest/finder/finder.c @@ -36,8 +36,7 @@ modest_status_t modest_finder_init(modest_finder_t* finder, myhtml_tree_t* myhtm void modest_finder_clean(modest_finder_t* finder) { - finder->callback_found = NULL; - finder->callback_found_ctx = NULL; + } modest_finder_t * modest_finder_destroy(modest_finder_t* finder, bool self_destroy) @@ -66,15 +65,9 @@ modest_finder_t * modest_finder_create_simple(myhtml_tree_t* myhtml_tree, mycss_ return finder; } -void modest_finder_callback_found_set(modest_finder_t* finder, modest_finder_callback_f callback, void* callback_ctx) -{ - finder->callback_found = callback; - finder->callback_found_ctx = callback_ctx; -} - -void modest_finder_callback_found_with_collection(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx) +void modest_finder_callback_found_with_collection(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec, void* ctx) { - myhtml_collection_t* collection = (myhtml_collection_t*)finder->callback_found_ctx; + myhtml_collection_t* collection = (myhtml_collection_t*)ctx; if(myhtml_collection_check_size(collection, 1, 1024) == MyHTML_STATUS_OK) { collection->list[ collection->length ] = node; @@ -82,7 +75,7 @@ void modest_finder_callback_found_with_collection(modest_finder_t* finder, myhtm } } -void modest_finder_callback_found_with_bool(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx) +void modest_finder_callback_found_with_bool(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec, void* ctx) { bool *is = (bool*)ctx; @@ -90,7 +83,33 @@ void modest_finder_callback_found_with_bool(modest_finder_t* finder, myhtml_tree *is = true; } -modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet, myhtml_collection_t** collection, myhtml_tree_node_t* base_node, mycss_selectors_list_t* selector_list) +void modest_finder_specificity_inc(mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) +{ + switch (selector->type) { + case MyCSS_SELECTORS_TYPE_ID: + spec->a++; + break; + + case MyCSS_SELECTORS_TYPE_CLASS: + case MyCSS_SELECTORS_TYPE_ATTRIBUTE: + case MyCSS_SELECTORS_TYPE_PSEUDO_CLASS_FUNCTION: + case MyCSS_SELECTORS_TYPE_PSEUDO_CLASS: + spec->b++; + break; + + case MyCSS_SELECTORS_TYPE_ELEMENT: + case MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT_FUNCTION: + case MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT: + spec->c++; + break; + default: + break; + } +} + +modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet, + myhtml_collection_t** collection, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list) { if(collection == NULL) return NULL; @@ -133,11 +152,11 @@ modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_ return finder; } - modest_finder_callback_found_set(finder, modest_finder_callback_found_with_collection, *collection); - while(selector_list) { - for(size_t i = 0; i < selector_list->selector_list_length; i++) { - modest_finder_node_combinator_begin(finder, base_node, selector_list->selector_list[i]); + for(size_t i = 0; i < selector_list->entries_list_length; i++) { + mycss_selectors_specificity_t spec = selector_list->entries_list[i].specificity; + + modest_finder_node_combinator_begin(finder, base_node, selector_list, selector_list->entries_list[i].entry, &spec, modest_finder_callback_found_with_collection, *collection); } selector_list = selector_list->next; @@ -146,9 +165,10 @@ modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_ return finder; } -myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, mycss_selectors_list_t *sel_list, myhtml_tree_node_t* base_node, myhtml_collection_t* collection) +myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, mycss_selectors_list_t *selector_list, + myhtml_tree_node_t* base_node, myhtml_collection_t* collection) { - if(finder == NULL || sel_list == NULL || base_node == NULL) + if(finder == NULL || selector_list == NULL || base_node == NULL) return NULL; if(collection == NULL) { @@ -159,10 +179,11 @@ myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, m return NULL; } - modest_finder_callback_found_set(finder, modest_finder_callback_found_with_collection, collection); - - for(size_t i = 0; i < sel_list->selector_list_length; i++) { - modest_finder_node_combinator_begin(finder, base_node, sel_list->selector_list[i]); + for(size_t i = 0; i < selector_list->entries_list_length; i++) { + mycss_selectors_specificity_t spec = selector_list->entries_list[i].specificity; + + modest_finder_node_combinator_begin(finder, base_node, selector_list, selector_list->entries_list[i].entry, &spec, + modest_finder_callback_found_with_collection, collection); } return collection; @@ -170,10 +191,13 @@ myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, m void modest_finder_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) { - modest_finder_node_combinator_begin(finder, base_node, selector); + mycss_selectors_specificity_t spec = {0,0,0}; + modest_finder_node_combinator_begin(finder, base_node, NULL, selector, &spec, NULL, NULL); } -myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx) { if(selector == NULL) return NULL; @@ -182,14 +206,14 @@ myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder while(node) { if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && - modest_finder_static_selector_type_map[selector->type](finder, node, selector)) + modest_finder_static_selector_type_map[selector->type](finder, node, selector, spec)) { if(selector->next == NULL) { - if(finder->callback_found) - finder->callback_found(finder, node, finder->callback_found_ctx); + if(callback_found) + callback_found(finder, node, selector_list, selector, spec, ctx); } else { - myhtml_tree_node_t *find_node = modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector->next); + myhtml_tree_node_t *find_node = modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector_list, selector->next, spec, callback_found, ctx); if(find_node == NULL) { while(node != base_node && node->next == NULL) @@ -221,19 +245,23 @@ myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder } /* some */ -myhtml_tree_node_t * modest_finder_node_combinator_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +myhtml_tree_node_t * modest_finder_node_combinator_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx) { if(selector == NULL) return NULL; + mycss_selectors_specificity_t match_spec = *spec; + if(base_node->tag_id != MyHTML_TAG__TEXT && base_node->tag_id != MyHTML_TAG__COMMENT && - modest_finder_static_selector_type_map[selector->type](finder, base_node, selector)) { + modest_finder_static_selector_type_map[selector->type](finder, base_node, selector, &match_spec)) { if(selector->next == NULL) { - if(finder->callback_found) - finder->callback_found(finder, base_node, finder->callback_found_ctx); + if(callback_found) + callback_found(finder, base_node, selector_list, selector, &match_spec, ctx); } else { - modest_finder_static_selector_combinator_map[selector->next->combinator](finder, base_node, selector->next); + modest_finder_static_selector_combinator_map[selector->next->combinator](finder, base_node, selector_list, selector->next, &match_spec, callback_found, ctx); } } @@ -241,7 +269,9 @@ myhtml_tree_node_t * modest_finder_node_combinator_undef(modest_finder_t* finder } /* E F or E >> F */ -myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx) { if(selector == NULL) return NULL; @@ -249,15 +279,17 @@ myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* f myhtml_tree_node_t *node = base_node->child; while(node) { + mycss_selectors_specificity_t match_spec = *spec; + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && - modest_finder_static_selector_type_map[selector->type](finder, node, selector)) + modest_finder_static_selector_type_map[selector->type](finder, node, selector, &match_spec)) { if(selector->next == NULL) { - if(finder->callback_found) - finder->callback_found(finder, node, finder->callback_found_ctx); + if(callback_found) + callback_found(finder, node, selector_list, selector, &match_spec, ctx); } else { - myhtml_tree_node_t *find_node = modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector->next); + myhtml_tree_node_t *find_node = modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector_list, selector->next, &match_spec, callback_found, ctx); if(find_node == NULL) { while(node != base_node && node->next == NULL) @@ -289,7 +321,9 @@ myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* f } /* E > F */ -myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx) { if(selector == NULL) return NULL; @@ -297,15 +331,17 @@ myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder myhtml_tree_node_t *node = base_node->child; while(node) { + mycss_selectors_specificity_t match_spec = *spec; + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && - modest_finder_static_selector_type_map[selector->type](finder, node, selector)) + modest_finder_static_selector_type_map[selector->type](finder, node, selector, &match_spec)) { if(selector->next == NULL) { - if(finder->callback_found) - finder->callback_found(finder, node, finder->callback_found_ctx); + if(callback_found) + callback_found(finder, node, selector_list ,selector, &match_spec, ctx); } else { - modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector->next); + modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector_list, selector->next, &match_spec, callback_found, ctx); } } @@ -316,32 +352,43 @@ myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder } /* E + F */ -myhtml_tree_node_t * modest_finder_node_combinator_next_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +myhtml_tree_node_t * modest_finder_node_combinator_next_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx) { if(selector == NULL) return NULL; myhtml_tree_node_t *node = base_node->next; - if(base_node->next) { - if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && - modest_finder_static_selector_type_map[selector->type](finder, node, selector)) + while(node) { + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT) { - if(selector->next == NULL) { - if(finder->callback_found) - finder->callback_found(finder, node, finder->callback_found_ctx); - } - else { - modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector->next); + mycss_selectors_specificity_t match_spec = *spec; + + if(modest_finder_static_selector_type_map[selector->type](finder, node, selector, &match_spec)) { + if(selector->next == NULL) { + if(callback_found) + callback_found(finder, node, selector_list, selector, &match_spec, ctx); + } + else { + modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector_list, selector->next, &match_spec, callback_found, ctx); + } } + + break; } + + node = node->next; } return base_node; } /* E ~ F */ -myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx) { if(selector == NULL) return NULL; @@ -349,15 +396,17 @@ myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_find myhtml_tree_node_t *node = base_node->next; while(node) { + mycss_selectors_specificity_t match_spec = *spec; + if(node->tag_id != MyHTML_TAG__TEXT && node->tag_id != MyHTML_TAG__COMMENT && - modest_finder_static_selector_type_map[selector->type](finder, node, selector)) + modest_finder_static_selector_type_map[selector->type](finder, node, selector, &match_spec)) { if(selector->next == NULL) { - if(finder->callback_found) - finder->callback_found(finder, node, finder->callback_found_ctx); + if(callback_found) + callback_found(finder, node, selector_list, selector, &match_spec, ctx); } else { - modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector->next); + modest_finder_static_selector_combinator_map[selector->next->combinator](finder, node, selector_list, selector->next, &match_spec, callback_found, ctx); } } @@ -368,7 +417,9 @@ myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_find } /* E || F */ -myhtml_tree_node_t * modest_finder_node_combinator_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +myhtml_tree_node_t * modest_finder_node_combinator_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx) { if(selector == NULL) return NULL; diff --git a/source/modest/finder/finder.h b/source/modest/finder/finder.h index 04bf1f2..cc5dba5 100644 --- a/source/modest/finder/finder.h +++ b/source/modest/finder/finder.h @@ -24,15 +24,17 @@ #include "modest/finder/myosi.h" #include "modest/finder/type.h" -#include "mycss/selectors/myosi.h" -#include "mycss/selectors/list.h" #ifdef __cplusplus extern "C" { #endif -typedef bool (*modest_finder_selector_type_f)(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -typedef myhtml_tree_node_t * (*modest_finder_selector_combinator_f)(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +typedef bool (*modest_finder_selector_type_f)(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +typedef myhtml_tree_node_t * (*modest_finder_selector_combinator_f)(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); /* init */ modest_finder_t * modest_finder_create(void); @@ -44,22 +46,52 @@ modest_finder_t * modest_finder_destroy(modest_finder_t* finder, bool self_destr modest_finder_t * modest_finder_create_simple(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet); /* callbacks */ -void modest_finder_callback_found_with_collection(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); -void modest_finder_callback_found_with_bool(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); +void modest_finder_callback_found_with_collection(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, void* ctx); + +void modest_finder_callback_found_with_bool(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, void* ctx); + +void modest_finder_specificity_inc(mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); /* base api */ void modest_finder_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet, myhtml_collection_t** collection, myhtml_tree_node_t* base_node, mycss_selectors_list_t* selector_list); -myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, mycss_selectors_list_t *sel_list, myhtml_tree_node_t* base_node, myhtml_collection_t* collection); +modest_finder_t * modest_finder_by_stylesheet(myhtml_tree_t* myhtml_tree, mycss_stylesheet_t *stylesheet, + myhtml_collection_t** collection, myhtml_tree_node_t* base_node, mycss_selectors_list_t* selector_list); + +myhtml_collection_t * modest_finder_by_selectors_list(modest_finder_t* finder, mycss_selectors_list_t *sel_list, + myhtml_tree_node_t* base_node, myhtml_collection_t* collection); /* process */ -myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_next_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -myhtml_tree_node_t * modest_finder_node_combinator_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +myhtml_tree_node_t * modest_finder_node_combinator_begin(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_descendant(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_next_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_following_sibling(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); + +myhtml_tree_node_t * modest_finder_node_combinator_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, + mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, + mycss_selectors_specificity_t* spec, modest_finder_callback_f callback_found, void* ctx); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/modest/finder/myosi.h b/source/modest/finder/myosi.h index 44e3ffa..01de865 100644 --- a/source/modest/finder/myosi.h +++ b/source/modest/finder/myosi.h @@ -23,8 +23,9 @@ #pragma once #include "modest/myosi.h" -#include "myhtml/myosi.h" #include "mycss/myosi.h" +#include "mycss/selectors/myosi.h" +#include "mycss/selectors/list.h" #ifdef __cplusplus extern "C" { @@ -32,17 +33,19 @@ extern "C" { struct modest_finder typedef modest_finder_t; -typedef void (*modest_finder_callback_f)(modest_finder_t* finder, myhtml_tree_node_t* node, void* ctx); +typedef void (*modest_finder_callback_f)(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec, void* ctx); typedef bool (*modest_finder_match_f)(myhtml_token_attr_t* attr, const char* key, size_t key_len, const char* value, size_t value_len, bool case_sensitive); struct modest_finder { myhtml_tree_t* tree; mycss_stylesheet_t* stylesheet; - - modest_finder_callback_f callback_found; - void* callback_found_ctx; }; +typedef struct modest_finder_thread_declaration modest_finder_thread_declaration_t; +typedef struct modest_finder_thread_entry modest_finder_thread_entry_t; +typedef struct modest_finder_thread_context modest_finder_thread_context_t; +typedef struct modest_finder_thread modest_finder_thread_t; +typedef struct modest_finder_thread_found_context modest_finder_thread_found_context_t; #ifdef __cplusplus } /* extern "C" */ diff --git a/source/modest/finder/pseudo_class.c b/source/modest/finder/pseudo_class.c index 9cd9653..7d0fa1c 100644 --- a/source/modest/finder/pseudo_class.c +++ b/source/modest/finder/pseudo_class.c @@ -21,158 +21,142 @@ #include "modest/finder/pseudo_class.h" #include "modest/finder/resource.h" -bool modest_finder_selector_sub_type_pseudo_class_function_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_function_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { mycss_selectors_list_t *list = selector->value; - - modest_finder_callback_f current_callback_found = finder->callback_found; - void *current_ctx = finder->callback_found_ctx; - bool i_found; - finder->callback_found = modest_finder_callback_found_with_bool; - finder->callback_found_ctx = &i_found; - - for(size_t i = 0; i < list->selector_list_length; i++) + for(size_t i = 0; i < list->entries_list_length; i++) { i_found = false; - modest_finder_node_combinator_undef(finder, base_node, list->selector_list[i]); + modest_finder_node_combinator_undef(finder, base_node, NULL, list->entries_list[i].entry, spec, modest_finder_callback_found_with_bool, &i_found); - if(i_found == true) { - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; - + if(i_found == true) return true; - } } - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; - return false; } /* after create render */ -bool modest_finder_selector_sub_type_pseudo_class_function_dir(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_dir(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_function_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_function_has(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_has(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { mycss_selectors_list_t *list = selector->value; - - modest_finder_callback_f current_callback_found = finder->callback_found; - void *current_ctx = finder->callback_found_ctx; - bool i_found; - finder->callback_found = modest_finder_callback_found_with_bool; - finder->callback_found_ctx = &i_found; - - for(size_t i = 0; i < list->selector_list_length; i++) + for(size_t i = 0; i < list->entries_list_length; i++) { i_found = false; - mycss_selectors_entry_t *sel_entry = list->selector_list[i]; + mycss_selectors_entry_t *sel_entry = list->entries_list[i].entry; if(sel_entry->combinator == MyCSS_SELECTORS_COMBINATOR_UNDEF) - modest_finder_node_combinator_descendant(finder, base_node, sel_entry); + modest_finder_node_combinator_descendant(finder, base_node, NULL, sel_entry, spec, modest_finder_callback_found_with_bool, &i_found); else - modest_finder_static_selector_combinator_map[sel_entry->combinator](finder, base_node, sel_entry); + modest_finder_static_selector_combinator_map[sel_entry->combinator](finder, base_node, NULL, sel_entry, spec, modest_finder_callback_found_with_bool, &i_found); - if(i_found == true) { - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; - + if(i_found == true) return true; - } } - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; - return false; } -bool modest_finder_selector_sub_type_pseudo_class_function_lang(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_lang(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_function_matches(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_matches(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { mycss_selectors_list_t *list = selector->value; + bool i_found, is_true = false; - modest_finder_callback_f current_callback_found = finder->callback_found; - void *current_ctx = finder->callback_found_ctx; - - bool i_found; - - finder->callback_found = modest_finder_callback_found_with_bool; - finder->callback_found_ctx = &i_found; - - for(size_t i = 0; i < list->selector_list_length; i++) + for(size_t i = 0; i < list->entries_list_length; i++) { i_found = false; - modest_finder_node_combinator_undef(finder, base_node, list->selector_list[i]); + modest_finder_node_combinator_undef(finder, base_node, NULL, list->entries_list[i].entry, spec, modest_finder_callback_found_with_bool, &i_found); if(i_found == true) { - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; + modest_finder_specificity_inc(list->entries_list[i].entry, spec); - return true; + if(is_true == false) + is_true = true; } } - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; - - return false; + return is_true; } -bool modest_finder_selector_sub_type_pseudo_class_function_not(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_not(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { mycss_selectors_list_t *list = selector->value; - modest_finder_callback_f current_callback_found = finder->callback_found; - void *current_ctx = finder->callback_found_ctx; - bool i_found; + mycss_selectors_specificity_t work_spec = {0, 0, 0}; - finder->callback_found = modest_finder_callback_found_with_bool; - finder->callback_found_ctx = &i_found; - - for(size_t i = 0; i < list->selector_list_length; i++) + for(size_t i = 0; i < list->entries_list_length; i++) { i_found = false; - modest_finder_node_combinator_undef(finder, base_node, list->selector_list[i]); + modest_finder_node_combinator_undef(finder, base_node, NULL, list->entries_list[i].entry, &work_spec, modest_finder_callback_found_with_bool, &i_found); - if(i_found == true) { - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; - + if(i_found == true) return false; + else { + modest_finder_specificity_inc(list->entries_list[i].entry, &work_spec); } } - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; + if(work_spec.a) + spec->a++; + else if(work_spec.b) + spec->b++; + else if(work_spec.c) + spec->c++; return true; } -bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_nth_child_check_selectors(modest_finder_t* finder, bool* i_found, myhtml_tree_node_t* node, mycss_selectors_list_t *list, mycss_selectors_specificity_t* spec) +{ + for(size_t i = 0; i < list->entries_list_length; i++) + { + *i_found = false; + modest_finder_node_combinator_undef(finder, node, NULL, list->entries_list[i].entry, spec, modest_finder_callback_found_with_bool, i_found); + + if(*i_found) { + /* + :nth-child(even of li, .item) has a specificity of (0,1,1)--like + a tag selector plus a pseudo-class--when matched against <li>, + and a specificity of (0,2,0)--like a class selector plus + a pseudo-class--when matched against <li class=item id=foo>. + */ + spec->b++; + modest_finder_specificity_inc(list->entries_list[i].entry, spec); + } + else + return false; + } + + return true; +} + +bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(selector->value == NULL) return NULL; @@ -183,43 +167,33 @@ bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_find myhtml_tree_node_t* node = base_node; if(anb->of) { - modest_finder_callback_f current_callback_found = finder->callback_found; - void *current_ctx = finder->callback_found_ctx; - bool i_found; + mycss_selectors_specificity_t temp_spec = {0, 0, 0}; - finder->callback_found = modest_finder_callback_found_with_bool; - finder->callback_found_ctx = &i_found; + if(spec->b) + spec->b--; - mycss_selectors_list_t *list = anb->of; + if(modest_finder_selector_sub_type_pseudo_class_function_nth_child_check_selectors(finder, &i_found, node, anb->of, spec) == false) + return false; + + node_pos++; + node = node->prev; while(node) { - for(size_t i = 0; i < list->selector_list_length; i++) + for(size_t i = 0; i < anb->of->entries_list_length; i++) { i_found = false; - modest_finder_node_combinator_undef(finder, node, list->selector_list[i]); + modest_finder_node_combinator_undef(finder, node, NULL, anb->of->entries_list[i].entry, &temp_spec, modest_finder_callback_found_with_bool, &i_found); - if(i_found == true) { + if(i_found) { node_pos++; break; } - else if(node_pos == 0) { - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; - - return false; - } } node = node->prev; } - - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; - - if(node_pos == 0) - return false; } else { while(node) { @@ -244,12 +218,12 @@ bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_find return false; } -bool modest_finder_selector_sub_type_pseudo_class_function_nth_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_nth_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(selector->value == NULL) return NULL; @@ -260,43 +234,30 @@ bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest myhtml_tree_node_t* node = base_node; if(anb->of) { - modest_finder_callback_f current_callback_found = finder->callback_found; - void *current_ctx = finder->callback_found_ctx; - bool i_found; + mycss_selectors_specificity_t temp_spec = {0, 0, 0}; - finder->callback_found = modest_finder_callback_found_with_bool; - finder->callback_found_ctx = &i_found; + if(spec->b) + spec->b--; - mycss_selectors_list_t *list = anb->of; + if(modest_finder_selector_sub_type_pseudo_class_function_nth_child_check_selectors(finder, &i_found, node, anb->of, spec) == false) + return false; while(node) { - for(size_t i = 0; i < list->selector_list_length; i++) + for(size_t i = 0; i < anb->of->entries_list_length; i++) { i_found = false; - modest_finder_node_combinator_undef(finder, node, list->selector_list[i]); + modest_finder_node_combinator_undef(finder, node, NULL, anb->of->entries_list[i].entry, &temp_spec, modest_finder_callback_found_with_bool, &i_found); if(i_found == true) { node_pos++; break; } - else if(node_pos == 0) { - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; - - return false; - } } node = node->next; } - - finder->callback_found = current_callback_found; - finder->callback_found_ctx = current_ctx; - - if(node_pos == 0) - return false; } else { while(node) { @@ -321,12 +282,12 @@ bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest return false; } -bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(selector->value == NULL) return NULL; @@ -358,7 +319,7 @@ bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(mode return true; } -bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(selector->value == NULL) return NULL; @@ -391,17 +352,17 @@ bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_fi } /* classes */ -bool modest_finder_selector_sub_type_pseudo_class_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_active(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_active(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_any_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_any_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(base_node->tag_id == MyHTML_TAG_A || base_node->tag_id == MyHTML_TAG_AREA || @@ -414,7 +375,7 @@ bool modest_finder_selector_sub_type_pseudo_class_any_link(modest_finder_t* find return false; } -bool modest_finder_selector_sub_type_pseudo_class_blank(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_blank(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { myhtml_tree_node_t *node = base_node->child; @@ -450,7 +411,7 @@ bool modest_finder_selector_sub_type_pseudo_class_blank(modest_finder_t* finder, return true; } -bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(base_node->tag_id == MyHTML_TAG_INPUT || base_node->tag_id == MyHTML_TAG_MENUITEM) { @@ -486,17 +447,17 @@ bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finde return false; } -bool modest_finder_selector_sub_type_pseudo_class_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_default(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_default(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_disabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_disabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(base_node->token == NULL) return false; @@ -577,12 +538,12 @@ bool modest_finder_selector_sub_type_pseudo_class_disabled(modest_finder_t* find return false; } -bool modest_finder_selector_sub_type_pseudo_class_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_empty(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_empty(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { myhtml_tree_node_t *node = base_node->child; @@ -606,12 +567,12 @@ bool modest_finder_selector_sub_type_pseudo_class_empty(modest_finder_t* finder, return true; } -bool modest_finder_selector_sub_type_pseudo_class_enabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_enabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { - return ~modest_finder_selector_sub_type_pseudo_class_disabled(finder, base_node, selector); + return ~modest_finder_selector_sub_type_pseudo_class_disabled(finder, base_node, selector, spec); } -bool modest_finder_selector_sub_type_pseudo_class_first_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_first_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { myhtml_tree_node_t *node = base_node->prev; @@ -625,7 +586,7 @@ bool modest_finder_selector_sub_type_pseudo_class_first_child(modest_finder_t* f return true; } -bool modest_finder_selector_sub_type_pseudo_class_first_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_first_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { myhtml_tree_node_t *node = base_node->prev; @@ -639,37 +600,37 @@ bool modest_finder_selector_sub_type_pseudo_class_first_of_type(modest_finder_t* return true; } -bool modest_finder_selector_sub_type_pseudo_class_focus(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_focus(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_future(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_future(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_hover(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_hover(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_in_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_in_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_indeterminate(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_indeterminate(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_invalid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_invalid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { myhtml_tree_node_t *node = base_node->next; @@ -683,7 +644,7 @@ bool modest_finder_selector_sub_type_pseudo_class_last_child(modest_finder_t* fi return true; } -bool modest_finder_selector_sub_type_pseudo_class_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { myhtml_tree_node_t *node = base_node->next; @@ -697,7 +658,7 @@ bool modest_finder_selector_sub_type_pseudo_class_last_of_type(modest_finder_t* return true; } -bool modest_finder_selector_sub_type_pseudo_class_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(base_node->tag_id == MyHTML_TAG_A || base_node->tag_id == MyHTML_TAG_AREA || @@ -710,21 +671,21 @@ bool modest_finder_selector_sub_type_pseudo_class_link(modest_finder_t* finder, return false; } -bool modest_finder_selector_sub_type_pseudo_class_only_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_only_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return - modest_finder_selector_sub_type_pseudo_class_first_child(finder, base_node, selector) && - modest_finder_selector_sub_type_pseudo_class_last_child(finder, base_node, selector); + modest_finder_selector_sub_type_pseudo_class_first_child(finder, base_node, selector, spec) && + modest_finder_selector_sub_type_pseudo_class_last_child(finder, base_node, selector, spec); } -bool modest_finder_selector_sub_type_pseudo_class_only_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_only_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return - modest_finder_selector_sub_type_pseudo_class_first_of_type(finder, base_node, selector) && - modest_finder_selector_sub_type_pseudo_class_last_of_type(finder, base_node, selector); + modest_finder_selector_sub_type_pseudo_class_first_of_type(finder, base_node, selector, spec) && + modest_finder_selector_sub_type_pseudo_class_last_of_type(finder, base_node, selector, spec); } -bool modest_finder_selector_sub_type_pseudo_class_optional(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_optional(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(base_node->tag_id == MyHTML_TAG_INPUT || base_node->tag_id == MyHTML_TAG_SELECT || @@ -739,17 +700,17 @@ bool modest_finder_selector_sub_type_pseudo_class_optional(modest_finder_t* find return false; } -bool modest_finder_selector_sub_type_pseudo_class_out_of_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_out_of_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_past(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_past(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_placeholder_shown(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_placeholder_shown(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(base_node->tag_id == MyHTML_TAG_INPUT || base_node->tag_id == MyHTML_TAG_TEXTAREA) @@ -761,15 +722,15 @@ bool modest_finder_selector_sub_type_pseudo_class_placeholder_shown(modest_finde return false; } -bool modest_finder_selector_sub_type_pseudo_class_read_only(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_read_only(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { - if(modest_finder_selector_sub_type_pseudo_class_read_write(finder, base_node, selector)) + if(modest_finder_selector_sub_type_pseudo_class_read_write(finder, base_node, selector, spec)) return false; return true; } -bool modest_finder_selector_sub_type_pseudo_class_read_write(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_read_write(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(base_node->tag_id == MyHTML_TAG_INPUT || base_node->tag_id == MyHTML_TAG_TEXTAREA) @@ -777,13 +738,13 @@ bool modest_finder_selector_sub_type_pseudo_class_read_write(modest_finder_t* fi if(modest_finder_match_attribute_only_key(base_node->token->attr_first, "readonly", 8)) return false; - return ~modest_finder_selector_sub_type_pseudo_class_disabled(finder, base_node, selector); + return ~modest_finder_selector_sub_type_pseudo_class_disabled(finder, base_node, selector, spec); } return false; } -bool modest_finder_selector_sub_type_pseudo_class_required(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_required(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(base_node->tag_id == MyHTML_TAG_INPUT || base_node->tag_id == MyHTML_TAG_SELECT || @@ -796,7 +757,7 @@ bool modest_finder_selector_sub_type_pseudo_class_required(modest_finder_t* find return false; } -bool modest_finder_selector_sub_type_pseudo_class_root(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_root(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(finder->tree->node_html == base_node) return true; @@ -804,27 +765,27 @@ bool modest_finder_selector_sub_type_pseudo_class_root(modest_finder_t* finder, return false; } -bool modest_finder_selector_sub_type_pseudo_class_scope(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_scope(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_target(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_target(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_user_error(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_user_error(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_valid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_valid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_sub_type_pseudo_class_visited(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_sub_type_pseudo_class_visited(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } diff --git a/source/modest/finder/pseudo_class.h b/source/modest/finder/pseudo_class.h index 0986abb..17c682a 100644 --- a/source/modest/finder/pseudo_class.h +++ b/source/modest/finder/pseudo_class.h @@ -23,67 +23,65 @@ #pragma once #include "modest/finder/myosi.h" -#include "mycss/selectors/myosi.h" -#include "mycss/selectors/value.h" #include "modest/finder/finder.h" #ifdef __cplusplus extern "C" { #endif -bool modest_finder_selector_sub_type_pseudo_class_function_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_current(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_dir(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_drop(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_has(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_lang(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_matches(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_not(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_column(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_column(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_function_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_dir(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_has(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_lang(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_matches(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_not(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_column(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_function_nth_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); /* classes */ -bool modest_finder_selector_sub_type_pseudo_class_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_active(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_any_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_blank(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_default(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_disabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_empty(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_enabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_first_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_first_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_focus(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_future(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_hover(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_in_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_indeterminate(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_invalid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_only_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_only_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_optional(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_out_of_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_past(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_placeholder_shown(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_read_only(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_read_write(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_required(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_root(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_scope(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_target(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_user_error(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_valid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_sub_type_pseudo_class_visited(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_sub_type_pseudo_class_undef(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_active(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_any_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_blank(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_checked(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_current(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_default(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_disabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_drop(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_empty(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_enabled(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_first_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_first_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_focus(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_future(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_hover(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_in_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_indeterminate(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_invalid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_last_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_last_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_link(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_only_child(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_only_of_type(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_optional(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_out_of_range(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_past(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_placeholder_shown(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_read_only(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_read_write(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_required(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_root(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_scope(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_target(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_user_error(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_valid(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); +bool modest_finder_selector_sub_type_pseudo_class_visited(modest_finder_t* finder, myhtml_tree_node_t* base_node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); #ifdef __cplusplus } /* extern "C" */ diff --git a/source/modest/finder/thread.c b/source/modest/finder/thread.c new file mode 100644 index 0000000..a40e874 --- /dev/null +++ b/source/modest/finder/thread.c @@ -0,0 +1,401 @@ +/* + 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 "modest/finder/thread.h" + +/* private functions */ +static void modest_finder_thread_stream(mythread_id_t thread_id, void* arg); +static modest_finder_thread_context_t * modest_finder_thread_create_context(modest_finder_thread_t* finder_thread, size_t count); +static void modest_finder_thread_callback_found(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_list_t* selector_list, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec, void* ctx); + +/* basic functions */ +modest_finder_thread_t * modest_finder_thread_create(void) +{ + return (modest_finder_thread_t*)myhtml_calloc(1, sizeof(modest_finder_thread_t)); +} + +modest_status_t modest_finder_thread_init(modest_finder_t* finder, modest_finder_thread_t* finder_thread, size_t thread_count) +{ + finder_thread->finder = finder; + + /* objects for nodes */ + finder_thread->entry_obj = mcobject_async_create(); + if(finder_thread->entry_obj == NULL) + return MODEST_STATUS_OK; + + mcobject_async_status_t mcstatus = mcobject_async_init(finder_thread->entry_obj, 128, 1024, sizeof(modest_finder_thread_entry_t)); + if(mcstatus) + return MODEST_STATUS_OK; + + /* objects for declarations */ + finder_thread->declaration_obj = mcobject_async_create(); + if(finder_thread->declaration_obj == NULL) + return MODEST_STATUS_OK; + + mcstatus = mcobject_async_init(finder_thread->declaration_obj, 128, 1024, sizeof(modest_finder_thread_declaration_t)); + if(mcstatus) + return MODEST_STATUS_OK; + + finder_thread->context_list = modest_finder_thread_create_context(finder_thread, thread_count); + if(finder_thread->context_list == NULL) + return MODEST_STATUS_OK; + + /* create and init threads */ + finder_thread->thread = mythread_create(); + + if(finder_thread->thread == NULL) + return MODEST_STATUS_OK; + + myhtml_status_t status = mythread_init(finder_thread->thread, "lastmac", thread_count); + if(status) { + mythread_destroy(finder_thread->thread, NULL, true); + return MODEST_STATUS_OK; + } + + finder_thread->thread->context = finder_thread; + + /* create threads */ + for(size_t i = finder_thread->thread->pth_list_root; i < finder_thread->thread->pth_list_size; i++) { + myhread_create_stream(finder_thread->thread, mythread_function, modest_finder_thread_stream, MyTHREAD_OPT_UNDEF, &status); + } + + return MODEST_STATUS_OK; +} + +void modest_finder_thread_clean(modest_finder_thread_t* finder_thread, bool self_destroy) +{ + for(size_t i = 1; i < finder_thread->context_list_size; i++) { + mcobject_async_node_clean(finder_thread->entry_obj, finder_thread->context_list[i].entry_node_id); + mcobject_async_node_clean(finder_thread->declaration_obj, finder_thread->context_list[i].declaration_node_id); + } +} + +modest_finder_thread_t * modest_finder_thread_destroy(modest_finder_thread_t* finder_thread, bool self_destroy) +{ + if(finder_thread == NULL) + return NULL; + + finder_thread->entry_obj = mcobject_async_destroy(finder_thread->entry_obj, true); + finder_thread->declaration_obj = mcobject_async_destroy(finder_thread->declaration_obj, true); + + if(finder_thread->thread) { + finder_thread->thread->stream_opt = MyTHREAD_OPT_QUIT; + + for(size_t i = finder_thread->thread->pth_list_root; i < finder_thread->thread->pth_list_size; i++) { + finder_thread->thread->pth_list[i].data.opt = MyTHREAD_OPT_QUIT; + } + + finder_thread->thread = mythread_destroy(finder_thread->thread, NULL, true); + } + + if(finder_thread->context_list) { + myhtml_free(finder_thread->context_list); + + finder_thread->context_list = NULL; + finder_thread->context_list_size = 0; + } + + if(self_destroy) { + myhtml_free(finder_thread); + return NULL; + } + + return finder_thread; +} + +void modest_finder_thread_collate_node(modest_t* modest, myhtml_tree_node_t* node, modest_finder_thread_entry_t* entry) +{ + modest_finder_thread_declaration_t* dec = entry->declaration; + + while(dec) { + modest_style_map_collate_declaration(node, dec); + dec = dec->next; + } +} + +modest_status_t modest_finder_thread_process(modest_t* modest, modest_finder_thread_t* finder_thread, myhtml_tree_t* myhtml_tree, + myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list) +{ + finder_thread->base_node = scope_node; + finder_thread->selector_list = selector_list; + + mythread_resume_all(finder_thread->thread); + modest_finder_thread_wait_for_all_done(finder_thread); + + /* calc result */ + modest_finder_thread_context_t* context_list = finder_thread->context_list; + myhtml_tree_node_t* node = scope_node; + + /* compare results */ + while(node) { + for(size_t i = finder_thread->thread->pth_list_root; i < finder_thread->thread->pth_list_size; i++) + { + modest_finder_thread_context_t* context = &context_list[i]; + modest_finder_thread_entry_t* entry = context->entry; + + while(entry) { + if(entry->node == node) + { + if(entry->next) + entry->next->prev = entry->prev; + else + context->entry_last = entry->prev; + + if(entry->prev) + entry->prev->next = entry->next; + else + context->entry = entry->next; + + modest_finder_thread_collate_node(modest, node, entry); + } + + entry = entry->next; + } + } + + if(node->child) + node = node->child; + else { + while(node != scope_node && node->next == NULL) + node = node->parent; + + if(node == scope_node) + break; + + node = node->next; + } + } + + return MODEST_STATUS_OK; +} + +void modest_finder_thread_wait_for_all_done(modest_finder_thread_t* finder_thread) +{ + const struct timespec tomeout = {0, 0}; + + for (size_t idx = finder_thread->thread->pth_list_root; idx < finder_thread->thread->pth_list_size; idx++) { + while((finder_thread->thread->pth_list[idx].data.opt & MyTHREAD_OPT_DONE) == 0) { + myhtml_thread_nanosleep(&tomeout); + } + } +} + +modest_finder_thread_context_t * modest_finder_thread_create_context(modest_finder_thread_t* finder_thread, size_t count) +{ + /* +1 because threads ids begin 1 */ + count++; + finder_thread->context_list_size = count; + + modest_finder_thread_context_t *ctx = myhtml_calloc(count, sizeof(modest_finder_thread_context_t)); + + if(ctx == NULL) + return NULL; + + mcobject_async_status_t mcstatus; + + for(size_t i = 1; i < count; i++) { + ctx[i].entry_node_id = mcobject_async_node_add(finder_thread->entry_obj, &mcstatus); + + if(mcstatus) { + while(i) { + i--; + mcobject_async_node_delete(finder_thread->entry_obj, ctx[i].entry_node_id); + } + + return NULL; + } + } + + for(size_t i = 1; i < count; i++) { + ctx[i].declaration_node_id = mcobject_async_node_add(finder_thread->declaration_obj, &mcstatus); + + if(mcstatus) { + size_t t = count; + while(t > 1) { + t--; + mcobject_async_node_delete(finder_thread->entry_obj, ctx[t].entry_node_id); + } + + while(i > 1) { + i--; + mcobject_async_node_delete(finder_thread->declaration_obj, ctx[i].declaration_node_id); + } + + return NULL; + } + } + + return ctx; +} + +bool modest_finder_thread_spec_is_up(modest_style_raw_specificity_t* spec_f, modest_style_raw_specificity_t* spec_t) +{ + if(spec_f->x > spec_t->x) + return true; + else if(spec_f->x < spec_t->x) + return false; + + if(spec_f->a > spec_t->a) + return true; + else if(spec_f->a < spec_t->a) + return false; + + if(spec_f->b > spec_t->b) + return true; + else if(spec_f->b < spec_t->b) + return false; + + if(spec_f->c > spec_t->c) + return true; + + return false; +} + +void modest_finder_thread_declaratin_append(modest_finder_thread_found_context_t* found_context, bool is_low_priority, + modest_finder_thread_entry_t* entry, mycss_declaration_entry_t* dec_entry, + modest_style_raw_specificity_t* raw_spec) +{ + if(entry->declaration == NULL) { + entry->declaration = entry->declaration_last = mcobject_async_malloc(found_context->finder_thread->declaration_obj, + found_context->context->declaration_node_id, NULL); + + entry->declaration->entry = dec_entry; + entry->declaration->raw_spec = *raw_spec; + entry->declaration->next = NULL; + entry->declaration->prev = NULL; + + return; + } + + modest_finder_thread_declaration_t* thr_dec = entry->declaration; + + while(thr_dec) { + if(thr_dec->entry->type == dec_entry->type) + { + if(modest_finder_thread_spec_is_up(raw_spec, &thr_dec->raw_spec)) { + thr_dec->entry = dec_entry; + thr_dec->raw_spec = *raw_spec; + } + + return; + } + + thr_dec = thr_dec->next; + } + + thr_dec = mcobject_async_malloc(found_context->finder_thread->declaration_obj, + found_context->context->declaration_node_id, NULL); + + thr_dec->next = NULL; + thr_dec->entry = dec_entry; + thr_dec->raw_spec = *raw_spec; + + entry->declaration_last->next = thr_dec; + thr_dec->prev = entry->declaration_last; + + entry->declaration_last = thr_dec; +} + +void modest_finder_thread_declaratin_list_replace(modest_finder_thread_found_context_t* found_context, + modest_finder_thread_entry_t* entry, mycss_declaration_entry_t* dec_entry, + mycss_selectors_specificity_t* spec) +{ + while(dec_entry) { + modest_style_raw_specificity_t raw_spec = {((unsigned int)dec_entry->is_important), spec->a, spec->b, spec->c}; + + modest_finder_thread_declaratin_append(found_context, false, entry, dec_entry, &raw_spec); + + dec_entry = dec_entry->next; + } +} + +void modest_finder_thread_callback_found(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_list_t* selector_list, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec, void* ctx) +{ + modest_finder_thread_found_context_t* found_context = (modest_finder_thread_found_context_t*)ctx; + modest_finder_thread_context_t* thread_context = found_context->context; + + if(thread_context->entry_last) { + modest_finder_thread_entry_t* entry = thread_context->entry; + + while(entry) + { + if(entry->node == node) { + modest_finder_thread_declaratin_list_replace(found_context, entry, selector_list->declaration_entry, spec); + return; + } + + entry = entry->next; + } + } + + modest_finder_thread_entry_t* entry = mcobject_async_malloc(found_context->finder_thread->entry_obj, thread_context->entry_node_id, NULL); + memset(entry, 0, sizeof(modest_finder_thread_entry_t)); + + entry->node = node; + + modest_finder_thread_declaratin_list_replace(found_context, entry, selector_list->declaration_entry, spec); + + if(thread_context->entry_last) { + entry->prev = thread_context->entry_last; + + thread_context->entry_last->next = entry; + thread_context->entry_last = entry; + } + else { + thread_context->entry_last = thread_context->entry = entry; + } +} + +void modest_finder_thread_stream(mythread_id_t thread_id, void* arg) +{ + mythread_context_t* ctx = (mythread_context_t*)arg; + modest_finder_thread_t* finder_thread = (modest_finder_thread_t*)ctx->mythread->context; + mycss_selectors_list_t* selector_list = finder_thread->selector_list; + + modest_finder_thread_found_context_t found_ctx = {finder_thread, &finder_thread->context_list[ctx->id]}; + + size_t count = 0, counnt_done = ctx->id - 1; + size_t offset = (ctx->mythread->pth_list_size - 1); + + while(selector_list) { + for(size_t i = 0; i < selector_list->entries_list_length; i++) { + + /* split selectors by thread id */ + if(count == counnt_done) { + mycss_selectors_entries_list_t *entries = &selector_list->entries_list[i]; + mycss_selectors_specificity_t spec = entries->specificity; + + modest_finder_node_combinator_begin(finder_thread->finder, finder_thread->base_node, selector_list, + entries->entry, &spec, modest_finder_thread_callback_found, &found_ctx); + + counnt_done += offset; + } + + count++; + } + + selector_list = selector_list->next; + } + + ctx->opt = MyTHREAD_OPT_STOP|MyTHREAD_OPT_DONE; +} + + diff --git a/source/modest/finder/thread.h b/source/modest/finder/thread.h new file mode 100644 index 0000000..3964e26 --- /dev/null +++ b/source/modest/finder/thread.h @@ -0,0 +1,93 @@ +/* + 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 MODEST_FINDER_THREAD_H +#define MODEST_FINDER_THREAD_H +#pragma once + +#include "modest/modest.h" +#include "modest/node/node.h" +#include "modest/style/type.h" +#include "modest/style/map.h" +#include "modest/finder/myosi.h" +#include "modest/finder/finder.h" + +#include "myhtml/thread.h" +#include "myhtml/utils/mcobject_async.h" + +#include "mycss/declaration/myosi.h" + +struct modest_finder_thread_declaration { + mycss_declaration_entry_t* entry; + modest_style_raw_specificity_t raw_spec; + + struct modest_finder_thread_declaration* next; + struct modest_finder_thread_declaration* prev; +}; + +struct modest_finder_thread_entry { + myhtml_tree_node_t* node; + + modest_finder_thread_declaration_t* declaration; + modest_finder_thread_declaration_t* declaration_last; + + struct modest_finder_thread_entry* next; + struct modest_finder_thread_entry* prev; +}; + +struct modest_finder_thread_context { + modest_finder_thread_entry_t* entry; + modest_finder_thread_entry_t* entry_last; + size_t entry_node_id; + size_t declaration_node_id; +}; + +struct modest_finder_thread { + modest_finder_thread_context_t* context_list; + size_t context_list_size; + + mythread_t *thread; + + mcobject_async_t* entry_obj; + mcobject_async_t* declaration_obj; + + /* refs */ + modest_finder_t* finder; + myhtml_tree_node_t* base_node; + mycss_selectors_list_t* selector_list; +}; + +struct modest_finder_thread_found_context { + modest_finder_thread_t* finder_thread; + modest_finder_thread_context_t* context; +}; + + +modest_finder_thread_t * modest_finder_thread_create(void); +modest_status_t modest_finder_thread_init(modest_finder_t* finder, modest_finder_thread_t* finder_thread, size_t thread_count); +void modest_finder_thread_clean(modest_finder_thread_t* finder_thread, bool self_destroy); +modest_finder_thread_t * modest_finder_thread_destroy(modest_finder_thread_t* finder_thread, bool self_destroy); + +modest_status_t modest_finder_thread_process(modest_t* modest, modest_finder_thread_t* finder_thread, myhtml_tree_t* myhtml_tree, myhtml_tree_node_t* scope_node, mycss_selectors_list_t* selector_list); + +void modest_finder_thread_wait_for_all_done(modest_finder_thread_t* finder_thread); +bool modest_finder_thread_spec_is_up(modest_style_raw_specificity_t* spec_f, modest_style_raw_specificity_t* spec_t); + +#endif /* thread_h */ diff --git a/source/modest/finder/type.c b/source/modest/finder/type.c index ad25b9f..e85a3e4 100644 --- a/source/modest/finder/type.c +++ b/source/modest/finder/type.c @@ -21,12 +21,12 @@ #include "modest/finder/type.h" #include "modest/finder/resource.h" -bool modest_finder_selector_type_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_type_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { /* namespace */ if(selector->ns_entry) { @@ -47,7 +47,7 @@ bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_no return false; } -bool modest_finder_selector_type_id(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_type_id(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(node->token == NULL) return false; @@ -58,7 +58,7 @@ bool modest_finder_selector_type_id(modest_finder_t* finder, myhtml_tree_node_t* (finder->tree->compat_mode != MyHTML_TREE_COMPAT_MODE_QUIRKS)); } -bool modest_finder_selector_type_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_type_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(node->token == NULL) return false; @@ -69,7 +69,7 @@ bool modest_finder_selector_type_class(modest_finder_t* finder, myhtml_tree_node (finder->tree->compat_mode != MyHTML_TREE_COMPAT_MODE_QUIRKS)); } -bool modest_finder_selector_type_attribute(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_type_attribute(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { /* namespace */ if(selector->ns_entry) { @@ -97,28 +97,28 @@ bool modest_finder_selector_type_attribute(modest_finder_t* finder, myhtml_tree_ return false; } -bool modest_finder_selector_type_pseudo_class_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_type_pseudo_class_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(selector->sub_type < MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_LAST_ENTRY) - return modest_finder_static_selector_sub_type_pseudo_class_function_map[selector->sub_type](finder, node, selector); + return modest_finder_static_selector_sub_type_pseudo_class_function_map[selector->sub_type](finder, node, selector, spec); return false; } -bool modest_finder_selector_type_pseudo_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_type_pseudo_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { if(selector->sub_type < MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_LAST_ENTRY) - return modest_finder_static_selector_sub_type_pseudo_class_map[selector->sub_type](finder, node, selector); + return modest_finder_static_selector_sub_type_pseudo_class_map[selector->sub_type](finder, node, selector, spec); return false; } -bool modest_finder_selector_type_pseudo_element_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_type_pseudo_element_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } -bool modest_finder_selector_type_pseudo_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector) +bool modest_finder_selector_type_pseudo_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec) { return false; } diff --git a/source/modest/finder/type.h b/source/modest/finder/type.h index edec3e5..9156b47 100644 --- a/source/modest/finder/type.h +++ b/source/modest/finder/type.h @@ -28,23 +28,38 @@ #include "modest/finder/match.h" #include "myhtml/tree.h" #include "myhtml/utils.h" -#include "mycss/selectors/myosi.h" -#include "mycss/selectors/list.h" #include "mycss/selectors/value.h" #ifdef __cplusplus extern "C" { #endif -bool modest_finder_selector_type_undef(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_id(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_attribute(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_pseudo_class_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_pseudo_class(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_pseudo_element_function(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); -bool modest_finder_selector_type_pseudo_element(modest_finder_t* finder, myhtml_tree_node_t* node, mycss_selectors_entry_t* selector); +bool modest_finder_selector_type_undef(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_element(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_id(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_class(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_attribute(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_pseudo_class_function(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_pseudo_class(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_pseudo_element_function(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); + +bool modest_finder_selector_type_pseudo_element(modest_finder_t* finder, myhtml_tree_node_t* node, + mycss_selectors_entry_t* selector, mycss_selectors_specificity_t* spec); #ifdef __cplusplus diff --git a/source/modest/modest.c b/source/modest/modest.c new file mode 100644 index 0000000..770c392 --- /dev/null +++ b/source/modest/modest.c @@ -0,0 +1,86 @@ +/* + 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 "modest/modest.h" + +modest_t * modest_create(void) +{ + return (modest_t*)myhtml_calloc(1, sizeof(modest_t)); +} + +modest_status_t modest_init(modest_t* modest) +{ + /* Modest nodes */ + modest->mnode_obj = mcobject_async_create(); + if(modest->mnode_obj == NULL) + return MODEST_STATUS_OK; + + mcobject_async_status_t mcstatus = mcobject_async_init(modest->mnode_obj, 128, 1024, sizeof(modest_node_t)); + if(mcstatus) + return MODEST_STATUS_OK; + + /* base object node for all modest node objects */ + modest->mnode_node_id = mcobject_async_node_add(modest->mnode_obj, &mcstatus); + + if(mcstatus) + return MODEST_STATUS_OK; + + + /* Modest stylesheet */ + modest->mstylesheet_obj = mcobject_async_create(); + if(modest->mstylesheet_obj == NULL) + return MODEST_STATUS_OK; + + mcstatus = mcobject_async_init(modest->mstylesheet_obj, 128, 1024, sizeof(modest_style_sheet_t)); + if(mcstatus) + return MODEST_STATUS_OK; + + /* base object node for all modest stylesheet objects */ + modest->mstylesheet_node_id = mcobject_async_node_add(modest->mstylesheet_obj, &mcstatus); + + if(mcstatus) + return MODEST_STATUS_OK; + + return MODEST_STATUS_OK; +} + +void modest_clean(modest_t* modest) +{ + mcobject_async_clean(modest->mnode_obj); + mcobject_async_clean(modest->mstylesheet_obj); +} + +modest_t * modest_destroy(modest_t* modest, bool self_destroy) +{ + if(modest == NULL) + return NULL; + + modest->mnode_obj = mcobject_async_destroy(modest->mnode_obj, true); + modest->mstylesheet_obj = mcobject_async_destroy(modest->mstylesheet_obj, true); + + if(self_destroy) { + myhtml_free(modest); + return NULL; + } + + return modest; +} + + diff --git a/source/modest/modest.h b/source/modest/modest.h new file mode 100644 index 0000000..6a1d79c --- /dev/null +++ b/source/modest/modest.h @@ -0,0 +1,44 @@ +/* + 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 MODEST_H +#define MODEST_H +#pragma once + +#include "modest/myosi.h" +#include "modest/node/node.h" +#include "myhtml/utils/mcobject_async.h" + +struct modest { + mcobject_async_t* mnode_obj; + size_t mnode_node_id; + + mcobject_async_t* mstylesheet_obj; + size_t mstylesheet_node_id; +}; + + +modest_t * modest_create(void); +modest_status_t modest_init(modest_t* modest); +void modest_clean(modest_t* modest); +modest_t * modest_destroy(modest_t* modest, bool self_destroy); + + +#endif /* MODEST_H */ diff --git a/source/modest/myosi.h b/source/modest/myosi.h index 8ba7049..d87e201 100644 --- a/source/modest/myosi.h +++ b/source/modest/myosi.h @@ -22,6 +22,8 @@ #define MODEST_MYOSI_H #pragma once +#include "myhtml/myosi.h" + #ifdef __cplusplus extern "C" { #endif @@ -46,6 +48,10 @@ enum modest_status { } typedef modest_status_t; +typedef struct modest modest_t; +typedef struct modest_node modest_node_t; +typedef struct modest_style_sheet modest_style_sheet_t; + #ifdef __cplusplus } /* extern "C" */ #endif diff --git a/source/modest/node/node.c b/source/modest/node/node.c new file mode 100644 index 0000000..14d60a9 --- /dev/null +++ b/source/modest/node/node.c @@ -0,0 +1,46 @@ +/* + 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 "modest/node/node.h" + +modest_node_t * modest_node_create(modest_t* modest) +{ + modest_node_t* mnode = (modest_node_t*)mcobject_async_malloc(modest->mnode_obj, modest->mnode_node_id, NULL); + + if(mnode == NULL) + return NULL; + + memset(mnode, 0, sizeof(modest_node_t)); + + return mnode; +} + +modest_status_t modest_node_init(modest_t* modest, modest_node_t *mnode) +{ + mnode->stylesheet = modest_style_sheet_create(modest); + if(mnode->stylesheet == NULL) + return MODEST_STATUS_OK; + + modest_status_t status = modest_style_sheet_init(modest, mnode->stylesheet); + if(status) + return MODEST_STATUS_OK; + + return MODEST_STATUS_OK; +} diff --git a/source/modest/node/node.h b/source/modest/node/node.h new file mode 100644 index 0000000..380e47f --- /dev/null +++ b/source/modest/node/node.h @@ -0,0 +1,36 @@ +/* + 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 MODEST_NODE_NODE_H +#define MODEST_NODE_NODE_H +#pragma once + +#include "modest/myosi.h" +#include "modest/modest.h" +#include "modest/style/sheet.h" + +struct modest_node { + modest_style_sheet_t* stylesheet; +}; + +modest_node_t * modest_node_create(modest_t* modest); +modest_status_t modest_node_init(modest_t* modest, modest_node_t *mnode); + +#endif /* MODEST_NODE_NODE_H */ diff --git a/source/modest/style/map.c b/source/modest/style/map.c new file mode 100644 index 0000000..9136803 --- /dev/null +++ b/source/modest/style/map.c @@ -0,0 +1,57 @@ +/* + 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 "modest/style/map.h" +#include "modest/style/map_resource.h" + +void modest_style_map_collate_declaration(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec) +{ + if(thr_dec->entry == NULL || thr_dec->entry->type >= MyCSS_PROPERTY_TYPE_LAST_ENTRY) + return; + + modest_style_map_static_collate_declaration[ thr_dec->entry->type ](node, thr_dec); +} + +void modest_style_map_collate_declaration_undef(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec) +{ + +} + +void modest_style_map_collate_declaration_height(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec) +{ +// modest_node_t *m_node = (modest_node_t*)node->data; +// +// if(modest_finder_thread_spec_is_up(&thr_dec->raw_spec, &m_node->stylesheet->height.raw.spec)) { +// m_node->stylesheet->height.raw.declaration = thr_dec->entry; +// m_node->stylesheet->height.raw.spec = thr_dec->raw_spec; +// } +} + +void modest_style_map_collate_declaration_width(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec) +{ + modest_node_t *m_node = (modest_node_t*)node->data; + + if(modest_finder_thread_spec_is_up(&thr_dec->raw_spec, &m_node->stylesheet->width.raw.spec)) { + m_node->stylesheet->width.raw.declaration = thr_dec->entry; + m_node->stylesheet->width.raw.spec = thr_dec->raw_spec; + } +} + + diff --git a/source/modest/style/map.h b/source/modest/style/map.h new file mode 100644 index 0000000..dd2ec79 --- /dev/null +++ b/source/modest/style/map.h @@ -0,0 +1,38 @@ +/* + 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 MODEST_STYLE_MAP_H +#define MODEST_STYLE_MAP_H +#pragma once + +#include "modest/myosi.h" +#include "modest/finder/myosi.h" +#include "modest/finder/thread.h" + +typedef void (*modest_style_map_collate_f)(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec); + +void modest_style_map_collate_declaration(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec); + +void modest_style_map_collate_declaration_undef(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec); +void modest_style_map_collate_declaration_height(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec); +void modest_style_map_collate_declaration_width(myhtml_tree_node_t* node, modest_finder_thread_declaration_t* thr_dec); + + +#endif /* MODEST_STYLE_MAP_H */ diff --git a/source/modest/style/map_resource.h b/source/modest/style/map_resource.h new file mode 100644 index 0000000..89513ce --- /dev/null +++ b/source/modest/style/map_resource.h @@ -0,0 +1,32 @@ +/* + 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 MODEST_STYLE_MAP_RESOURCE_H +#define MODEST_STYLE_MAP_RESOURCE_H +#pragma once + +static const modest_style_map_collate_f modest_style_map_static_collate_declaration[] = +{ + modest_style_map_collate_declaration_undef, + modest_style_map_collate_declaration_height, + modest_style_map_collate_declaration_width +}; + +#endif /* MODEST_STYLE_MAP_RESOURCE_H */ diff --git a/source/modest/style/sheet.c b/source/modest/style/sheet.c new file mode 100644 index 0000000..84ae158 --- /dev/null +++ b/source/modest/style/sheet.c @@ -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) +*/ + +#include "modest/style/sheet.h" + +modest_style_sheet_t * modest_style_sheet_create(modest_t* modest) +{ + modest_style_sheet_t* m_stylesheet = (modest_style_sheet_t*)mcobject_async_malloc(modest->mstylesheet_obj, modest->mstylesheet_node_id, NULL); + + if(m_stylesheet == NULL) + return NULL; + + memset(m_stylesheet, 0, sizeof(modest_style_sheet_t)); + + return m_stylesheet; +} + +modest_status_t modest_style_sheet_init(modest_t* modest, modest_style_sheet_t* m_stylesheet) +{ + return MODEST_STATUS_OK; +} + + diff --git a/source/modest/style/sheet.h b/source/modest/style/sheet.h new file mode 100644 index 0000000..380825b --- /dev/null +++ b/source/modest/style/sheet.h @@ -0,0 +1,37 @@ +/* + 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 MODEST_STYLE_SHEET_H +#define MODEST_STYLE_SHEET_H +#pragma once + +#include "modest/myosi.h" +#include "modest/modest.h" +#include "modest/style/type.h" + +struct modest_style_sheet { + modest_style_type_length_t width; + modest_style_type_length_t height; +}; + +modest_style_sheet_t * modest_style_sheet_create(modest_t* modest); +modest_status_t modest_style_sheet_init(modest_t* modest, modest_style_sheet_t* m_stylesheet); + +#endif /* MODEST_STYLE_SHEET_H */ diff --git a/source/modest/style/type.c b/source/modest/style/type.c new file mode 100644 index 0000000..087c6fe --- /dev/null +++ b/source/modest/style/type.c @@ -0,0 +1,24 @@ +/* + 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 "modest/style/type.h" + + + diff --git a/source/modest/style/type.h b/source/modest/style/type.h new file mode 100644 index 0000000..d408771 --- /dev/null +++ b/source/modest/style/type.h @@ -0,0 +1,50 @@ +/* + 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 MODEST_STYLE_TYPE_H +#define MODEST_STYLE_TYPE_H +#pragma once + +#include "modest/myosi.h" +#include "mycss/declaration/myosi.h" + +typedef struct modest_style_type_length modest_style_type_length_t; + +typedef struct modest_style_raw modest_style_raw_t; +typedef struct modest_style_raw_specificity modest_style_raw_specificity_t; + +struct modest_style_raw_specificity { + unsigned int x; + unsigned int a; + unsigned int b; + unsigned int c; +}; + +struct modest_style_raw { + mycss_declaration_entry_t* declaration; + modest_style_raw_specificity_t spec; +}; + +struct modest_style_type_length { + float value; + modest_style_raw_t raw; +}; + +#endif /* MODEST_STYLE_TYPE_H */ diff --git a/source/mycss/selectors/function_parser.c b/source/mycss/selectors/function_parser.c index d9bb2fe..0f37d08 100644 --- a/source/mycss/selectors/function_parser.c +++ b/source/mycss/selectors/function_parser.c @@ -83,7 +83,7 @@ mycss_selectors_list_t * mycss_selectors_parser_check_selector_list(mycss_select if(list->flags & MyCSS_SELECTORS_FLAGS_SELECTOR_BAD) mycss_selectors_list_destroy_last_empty_selector(selectors, list, true); - if(list->selector_list_length == 0 || list->selector_list[0] == NULL) { + if(list->entries_list_length == 0 || list->entries_list[0].entry == NULL) { return mycss_selectors_list_destroy(selectors, list, true); } @@ -96,8 +96,8 @@ mycss_selectors_list_t * mycss_selectors_parser_check_selector_list(mycss_select /////////////////////////////////////////////////////////// void mycss_selectors_function_parser_not_or_matches_or_current_find_bad_selector(mycss_selectors_list_t* selectors_list) { - for(size_t i = 0; i < selectors_list->selector_list_length; i++) { - mycss_selectors_entry_t* selector = selectors_list->selector_list[i]; + for(size_t i = 0; i < selectors_list->entries_list_length; i++) { + mycss_selectors_entry_t* selector = selectors_list->entries_list[i].entry; while(selector) { if(selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES || @@ -124,6 +124,14 @@ bool mycss_selectors_function_parser_not_or_matches_or_current_parser(mycss_entr selectors->entry_last = mycss_selectors_list_last_entry(parent_list); selectors->list_last = parent_list; + selectors->specificity = &parent_list->entries_list[ (parent_list->entries_list_length - 1) ].specificity; + + if(selectors->specificity && selectors->entry_last && ( + selectors->entry_last->sub_type == MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_MATCHES || + selectors->entry_last->sub_type == MyCSS_SELECTORS_SUB_TYPE_PSEUDO_CLASS_FUNCTION_NOT)) + { + selectors->specificity->b--; + } mycss_selectors_function_parser_not_or_matches_or_current_find_bad_selector(selectors_list); selectors_list = mycss_selectors_parser_check_selector_list(selectors, selectors_list); @@ -160,8 +168,8 @@ bool mycss_selectors_function_parser_not_or_matches_or_current_parser(mycss_entr /////////////////////////////////////////////////////////// void mycss_selectors_function_parser_has_find_bad_selector(mycss_selectors_list_t* selectors_list) { - for(size_t i = 0; i < selectors_list->selector_list_length; i++) { - mycss_selectors_entry_t* selector = selectors_list->selector_list[i]; + for(size_t i = 0; i < selectors_list->entries_list_length; i++) { + mycss_selectors_entry_t* selector = selectors_list->entries_list[i].entry; while(selector) { if(selector->type == MyCSS_SELECTORS_TYPE_PSEUDO_ELEMENT) { @@ -184,6 +192,7 @@ bool mycss_selectors_function_parser_has(mycss_entry_t* entry, mycss_token_t* to selectors->entry_last = mycss_selectors_list_last_entry(parent_list); selectors->list_last = parent_list; + selectors->specificity = &parent_list->entries_list[ (parent_list->entries_list_length - 1) ].specificity; mycss_selectors_function_parser_has_find_bad_selector(selectors_list); selectors_list = mycss_selectors_parser_check_selector_list(selectors, selectors_list); @@ -310,6 +319,7 @@ bool mycss_selectors_function_parser_nth_with_selectors_need_of_after(mycss_entr selectors->list_last = parent_list; selectors->entry_last = mycss_selectors_list_last_entry(parent_list); + selectors->specificity = &parent_list->entries_list[ (parent_list->entries_list_length - 1) ].specificity; if(selectors_list == NULL) { if(selectors->entry_last) { diff --git a/source/mycss/selectors/init.c b/source/mycss/selectors/init.c index addb419..9ee8660 100644 --- a/source/mycss/selectors/init.c +++ b/source/mycss/selectors/init.c @@ -199,29 +199,29 @@ void * mycss_selectors_entry_value_destroy(mycss_entry_t* entry, mycss_selectors return mycss_selector_value_destroy(entry, selector_entry->type, selector_entry->sub_type, selector_entry->value, destroy_self); } -mycss_selectors_entry_t ** mycss_selectors_entry_list_create(mycss_selectors_t* selectors) +mycss_selectors_entries_list_t * mycss_selectors_entries_list_create(mycss_selectors_t* selectors) { mycss_entry_t* entry = selectors->ref_entry; - return (mycss_selectors_entry_t**) mchar_async_malloc(entry->mchar, + return (mycss_selectors_entries_list_t*) mchar_async_malloc(entry->mchar, entry->mchar_value_node_id, - sizeof(mycss_selectors_entry_t*)); + sizeof(mycss_selectors_entries_list_t)); } -mycss_selectors_entry_t ** mycss_selectors_entry_list_add_one(mycss_selectors_t* selectors, mycss_selectors_entry_t** list, size_t current_size) +mycss_selectors_entries_list_t * mycss_selectors_entries_list_add_one(mycss_selectors_t* selectors, mycss_selectors_entries_list_t* entries, size_t current_size) { mycss_entry_t* entry = selectors->ref_entry; - size_t current_size_char = current_size * sizeof(mycss_selectors_entry_t *); + size_t current_size_char = current_size * sizeof(mycss_selectors_entries_list_t); - return (mycss_selectors_entry_t**) + return (mycss_selectors_entries_list_t*) mchar_async_realloc(entry->mchar, entry->mchar_value_node_id, - (char*)list, current_size_char, (current_size_char + sizeof(mycss_selectors_entry_t*))); + (char*)entries, current_size_char, (current_size_char + sizeof(mycss_selectors_entries_list_t))); } -mycss_selectors_entry_t ** mycss_selectors_entry_list_destroy(mycss_selectors_t* selectors, mycss_selectors_entry_t** list) +mycss_selectors_entries_list_t * mycss_selectors_entries_list_destroy(mycss_selectors_t* selectors, mycss_selectors_entries_list_t* entries) { mycss_entry_t* entry = selectors->ref_entry; - mchar_async_free(entry->mchar, entry->mchar_value_node_id, (char*)list); + mchar_async_free(entry->mchar, entry->mchar_value_node_id, (char*)entries); return NULL; } @@ -440,10 +440,11 @@ void mycss_selectors_print_chain(mycss_selectors_t* selectors, mycss_selectors_e 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->selector_list_length; i++) { - mycss_selectors_print_chain(selectors, selectors_list->selector_list[i], fh); + 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->selector_list_length) + if((i + 1) != selectors_list->entries_list_length) fprintf(fh, ", "); } diff --git a/source/mycss/selectors/init.h b/source/mycss/selectors/init.h index deee757..f71c14e 100644 --- a/source/mycss/selectors/init.h +++ b/source/mycss/selectors/init.h @@ -52,9 +52,9 @@ void mycss_selectors_print_chain(mycss_selectors_t* selectors, mycss_selectors_e mycss_selectors_entry_t * mycss_selectors_entry_create(mycss_selectors_t* selectors); -mycss_selectors_entry_t ** mycss_selectors_entry_list_create(mycss_selectors_t* selectors); -mycss_selectors_entry_t ** mycss_selectors_entry_list_add_one(mycss_selectors_t* selectors, mycss_selectors_entry_t** list, size_t current_size); -mycss_selectors_entry_t ** mycss_selectors_entry_list_destroy(mycss_selectors_t* selectors, mycss_selectors_entry_t** list); +mycss_selectors_entries_list_t * mycss_selectors_entries_list_create(mycss_selectors_t* selectors); +mycss_selectors_entries_list_t * mycss_selectors_entries_list_add_one(mycss_selectors_t* selectors, mycss_selectors_entries_list_t* entries, size_t current_size); +mycss_selectors_entries_list_t * mycss_selectors_entries_list_destroy(mycss_selectors_t* selectors, mycss_selectors_entries_list_t* entries); mycss_selectors_entry_t * mycss_selectors_entry(mycss_selectors_t* selectors); void mycss_selectors_entry_append_to_current(mycss_selectors_t* selectors, mycss_selectors_entry_t* selector); diff --git a/source/mycss/selectors/list.c b/source/mycss/selectors/list.c index 32c2b35..a5d61c8 100644 --- a/source/mycss/selectors/list.c +++ b/source/mycss/selectors/list.c @@ -40,12 +40,24 @@ mycss_selectors_list_t * mycss_selectors_list_destroy(mycss_selectors_t* selecto mycss_entry_t *entry = selectors->ref_entry; - if(selectors_list->selector_list) + if(selectors_list->entries_list) { - for(size_t i = 0; i < selectors_list->selector_list_length; i++) - mycss_selectors_entry_destroy(entry->selectors, selectors_list->selector_list[i], true); + for(size_t i = 0; i < selectors_list->entries_list_length; i++) { + mycss_selectors_entry_t *sel_entry = selectors_list->entries_list[i].entry; + + while(sel_entry) { + if(sel_entry->next) { + sel_entry = sel_entry->next; + mycss_selectors_entry_destroy(entry->selectors, sel_entry->prev, true); + } + else { + mycss_selectors_entry_destroy(entry->selectors, sel_entry, true); + break; + } + } + } - mycss_selectors_entry_list_destroy(entry->selectors, selectors_list->selector_list); + mycss_selectors_entries_list_destroy(entry->selectors, selectors_list->entries_list); } if(self_destroy) { @@ -58,27 +70,29 @@ mycss_selectors_list_t * mycss_selectors_list_destroy(mycss_selectors_t* selecto mycss_selectors_list_t * mycss_selectors_list_append_selector(mycss_selectors_t* selectors, mycss_selectors_list_t* current_list, mycss_selectors_entry_t* selector) { - if(current_list->selector_list == NULL) { - current_list->selector_list = mycss_selectors_entry_list_create(selectors); + if(current_list->entries_list == NULL) { + current_list->entries_list = mycss_selectors_entries_list_create(selectors); } else { - current_list->selector_list = mycss_selectors_entry_list_add_one(selectors, current_list->selector_list, current_list->selector_list_length); + current_list->entries_list = mycss_selectors_entries_list_add_one(selectors, current_list->entries_list, current_list->entries_list_length); } - current_list->selector_list[current_list->selector_list_length] = selector; - current_list->selector_list_length++; + selectors->specificity = ¤t_list->entries_list[current_list->entries_list_length].specificity; + + current_list->entries_list[current_list->entries_list_length].entry = selector; + current_list->entries_list_length++; return current_list; } mycss_selectors_entry_t * mycss_selectors_list_last_entry(mycss_selectors_list_t* list) { - size_t i = list->selector_list_length; + size_t i = list->entries_list_length; while(i) { i--; - mycss_selectors_entry_t *entry = list->selector_list[i]; + mycss_selectors_entry_t *entry = list->entries_list[i].entry; while(entry) { if(entry->next == NULL) @@ -106,24 +120,24 @@ void mycss_selectors_list_append_to_current(mycss_selectors_t* selectors, mycss_ mycss_selectors_entry_t ** mycss_selectors_list_current_chain(mycss_selectors_list_t* list) { - if(list->selector_list_length) + if(list->entries_list_length) return NULL; - return &list->selector_list[ list->selector_list_length - 1 ]; + return &list->entries_list[ list->entries_list_length - 1 ].entry; } bool mycss_selectors_list_destroy_last_empty_selector(mycss_selectors_t* selectors, mycss_selectors_list_t* list, bool destroy_found) { - if(list->selector_list_length == 0) + if(list->entries_list_length == 0) return false; - size_t idx = list->selector_list_length - 1; + size_t idx = list->entries_list_length - 1; - mycss_selectors_entry_t *entry = list->selector_list[idx]; + mycss_selectors_entry_t *entry = list->entries_list[idx].entry; if(entry == NULL) { mycss_selectors_entry_destroy(selectors, entry, destroy_found); - list->selector_list_length--; + list->entries_list_length--; return true; } @@ -135,8 +149,8 @@ bool mycss_selectors_list_destroy_last_empty_selector(mycss_selectors_t* selecto if(entry->prev) entry->prev->next = NULL; else { - list->selector_list[idx] = NULL; - list->selector_list_length--; + list->entries_list[idx].entry = NULL; + list->entries_list_length--; } mycss_selectors_entry_destroy(selectors, entry, destroy_found); diff --git a/source/mycss/selectors/list.h b/source/mycss/selectors/list.h index aa6ebd8..73bcc2c 100644 --- a/source/mycss/selectors/list.h +++ b/source/mycss/selectors/list.h @@ -25,14 +25,19 @@ #ifdef __cplusplus extern "C" { #endif - + #include "mycss/entry.h" #include "mycss/selectors/myosi.h" #include "mycss/declaration/myosi.h" +struct mycss_selectors_entries_list { + mycss_selectors_entry_t* entry; + mycss_selectors_specificity_t specificity; +}; + struct mycss_selectors_list { - mycss_selectors_entry_t** selector_list; - size_t selector_list_length; + mycss_selectors_entries_list_t* entries_list; + size_t entries_list_length; mycss_declaration_entry_t* declaration_entry; diff --git a/source/mycss/selectors/myosi.h b/source/mycss/selectors/myosi.h index 2368e0d..81be9ea 100644 --- a/source/mycss/selectors/myosi.h +++ b/source/mycss/selectors/myosi.h @@ -28,8 +28,10 @@ extern "C" { typedef struct mycss_selectors mycss_selectors_t; typedef struct mycss_selectors_entry mycss_selectors_entry_t; +typedef struct mycss_selectors_entries_list mycss_selectors_entries_list_t; typedef struct mycss_selectors_list mycss_selectors_list_t; - +typedef struct mycss_selectors_specificity mycss_selectors_specificity_t; + #include "mycss/myosi.h" #include "mycss/mystring.h" #include "mycss/namespace/myosi.h" @@ -184,6 +186,12 @@ enum mycss_selectors_function_drop_type { } typedef mycss_selectors_function_drop_type_t; +struct mycss_selectors_specificity { + unsigned int a; + unsigned int b; + unsigned int c; +}; + struct mycss_selectors { // refs mycss_entry_t* ref_entry; @@ -194,6 +202,7 @@ struct mycss_selectors { mycss_selectors_list_t** list; mycss_selectors_list_t* list_last; + mycss_selectors_specificity_t* specificity; mycss_selectors_combinator_t* combinator; mycss_token_type_t ending_token; @@ -214,9 +223,6 @@ struct mycss_selectors_entry { mycss_selectors_combinator_t combinator; - /* TODO: experimental */ - void* node; - mycss_selectors_entry_t* next; mycss_selectors_entry_t* prev; }; diff --git a/source/mycss/selectors/parser.c b/source/mycss/selectors/parser.c index f31acf6..316b667 100644 --- a/source/mycss/selectors/parser.c +++ b/source/mycss/selectors/parser.c @@ -48,6 +48,10 @@ void mycss_selectors_parser_selector_ident_type(mycss_entry_t* entry, mycss_toke selector->type = MyCSS_SELECTORS_TYPE_ELEMENT; selector->key = str; + + if(entry->selectors->specificity) + if(str->length != 1 || *str->data != '*') + entry->selectors->specificity->c++; } void mycss_selectors_parser_selector_ident_attr(mycss_entry_t* entry, mycss_token_t* token) @@ -63,6 +67,10 @@ void mycss_selectors_parser_selector_ident_attr(mycss_entry_t* entry, mycss_toke selector->type = MyCSS_SELECTORS_TYPE_ATTRIBUTE; selector->key = str; + + if(entry->selectors->specificity) + if(str->length != 1 || *str->data != '*') + entry->selectors->specificity->b++; } void mycss_selectors_parser_selector_id(mycss_entry_t* entry, mycss_token_t* token) @@ -79,6 +87,9 @@ void mycss_selectors_parser_selector_id(mycss_entry_t* entry, mycss_token_t* tok selector->type = MyCSS_SELECTORS_TYPE_ID; selector->key = str; + if(entry->selectors->specificity) + entry->selectors->specificity->a++; + mycss_selectors_parser_selector_end(entry, token); } @@ -96,6 +107,9 @@ void mycss_selectors_parser_selector_class(mycss_entry_t* entry, mycss_token_t* selector->type = MyCSS_SELECTORS_TYPE_CLASS; selector->key = str; + if(entry->selectors->specificity) + entry->selectors->specificity->a++; + mycss_selectors_parser_selector_end(entry, token); } @@ -168,6 +182,22 @@ void mycss_selectors_parser_selector_after_namespace(mycss_entry_t* entry, mycss mycss_token_data_to_string(entry, token, str, true, true); selector->key = str; + + if(entry->selectors->specificity) { + if(selector->ns_entry == &entry->stylesheet->ns_stylesheet.entry_any) { + if(selector->type == MyCSS_SELECTORS_TYPE_ATTRIBUTE) + entry->selectors->specificity->b--; + else + entry->selectors->specificity->c--; + } + + if(str->length != 1 || *str->data != '*') { + if(selector->type == MyCSS_SELECTORS_TYPE_ATTRIBUTE) + entry->selectors->specificity->b++; + else + entry->selectors->specificity->c++; + } + } } ///////////////////////////////////////////////////////// @@ -218,6 +248,9 @@ void mycss_selectors_parser_selector_pseudo_class(mycss_entry_t* entry, mycss_to } } + if(entry->selectors->specificity) + entry->selectors->specificity->b++; + mycss_selectors_parser_check_and_set_bad_parent_selector(entry, entry->selectors->list_last); mycss_selectors_parser_selector_end(entry, token); } @@ -235,6 +268,9 @@ void mycss_selectors_parser_selector_pseudo_class_function(mycss_entry_t* entry, entry->parser_ending_token = MyCSS_TOKEN_TYPE_RIGHT_PARENTHESIS; mycss_entry_parser_list_push(entry, mycss_selectors_state_simple_selector_colon_function, entry->parser_switch, entry->selectors->ending_token, false); + if(entry->selectors->specificity) + entry->selectors->specificity->b++; + mycss_selectors_function_begin_f to_func = mycss_function_begin_by_name(str->data, str->length); if(to_func) { @@ -278,6 +314,9 @@ void mycss_selectors_parser_selector_pseudo_element(mycss_entry_t* entry, mycss_ if(selector->sub_type == MyCSS_SELECTORS_SUB_TYPE_PSEUDO_ELEMENT_UNKNOWN) selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; + if(entry->selectors->specificity) + entry->selectors->specificity->c++; + mycss_selectors_parser_check_and_set_bad_parent_selector(entry, entry->selectors->list_last); mycss_selectors_parser_selector_end(entry, token); } @@ -294,6 +333,9 @@ void mycss_selectors_parser_selector_pseudo_element_function(mycss_entry_t* entr selector->flags |= MyCSS_SELECTORS_FLAGS_SELECTOR_BAD; mycss_selectors_begin_unknown(entry, selector); + + if(entry->selectors->specificity) + entry->selectors->specificity->c++; } void mycss_selectors_parser_selector_pseudo_element_function_end(mycss_entry_t* entry, mycss_token_t* token) diff --git a/source/mycss/selectors/state.c b/source/mycss/selectors/state.c index a29a2e0..fe91022 100644 --- a/source/mycss/selectors/state.c +++ b/source/mycss/selectors/state.c @@ -200,7 +200,7 @@ bool mycss_selectors_state_complex_selector_list(mycss_entry_t* entry, mycss_tok mycss_selectors_list_append_to_current(entry->selectors, sel_list); mycss_selectors_list_append_selector(selectors, sel_list, NULL); - selectors->entry = &sel_list->selector_list[0]; + selectors->entry = &sel_list->entries_list[0].entry; selectors->entry_last = NULL; entry->parser = mycss_selectors_state_complex_selector_list_need_selector; @@ -247,7 +247,7 @@ bool mycss_selectors_state_complex_selector_list_need_combinator_or_selector(myc mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); - selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry = &selectors->list_last->entries_list[ (selectors->list_last->entries_list_length - 1) ].entry; selectors->entry_last = NULL; entry->parser = mycss_selectors_state_complex_selector_list_need_selector; @@ -278,7 +278,7 @@ bool mycss_selectors_state_complex_selector_list_need_combinator_or_selector_ws( mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); - selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry = &selectors->list_last->entries_list[ (selectors->list_last->entries_list_length - 1) ].entry; selectors->entry_last = NULL; entry->parser = mycss_selectors_state_complex_selector_list_need_selector; @@ -316,7 +316,7 @@ bool mycss_selectors_state_compound_selector_list(mycss_entry_t* entry, mycss_to mycss_selectors_list_append_to_current(entry->selectors, sel_list); mycss_selectors_list_append_selector(selectors, sel_list, NULL); - selectors->entry = &sel_list->selector_list[0]; + selectors->entry = &sel_list->entries_list[0].entry; selectors->entry_last = NULL; entry->parser = mycss_selectors_state_compound_selector_list_comma_ws; @@ -350,7 +350,7 @@ bool mycss_selectors_state_compound_selector_list_need_selector_or_comma(mycss_e mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); - selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry = &selectors->list_last->entries_list[ (selectors->list_last->entries_list_length - 1) ].entry; selectors->entry_last = NULL; entry->parser = mycss_selectors_state_compound_selector_list_comma_ws; @@ -393,7 +393,7 @@ bool mycss_selectors_state_compound_selector_list_need_ending_or_comma(mycss_ent mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); - selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry = &selectors->list_last->entries_list[ (selectors->list_last->entries_list_length - 1) ].entry; selectors->entry_last = NULL; entry->parser = mycss_selectors_state_compound_selector_list_comma_ws; @@ -418,7 +418,7 @@ bool mycss_selectors_state_relative_selector_list(mycss_entry_t* entry, mycss_to mycss_selectors_list_append_to_current(entry->selectors, sel_list); mycss_selectors_list_append_selector(selectors, sel_list, NULL); - selectors->entry = &sel_list->selector_list[0]; + selectors->entry = &sel_list->entries_list[0].entry; selectors->entry_last = NULL; entry->parser = mycss_selectors_state_relative_selector_list_need_combinator_or_selector_begin; @@ -495,7 +495,7 @@ bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector(my mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); - selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry = &selectors->list_last->entries_list[ (selectors->list_last->entries_list_length - 1) ].entry; selectors->entry_last = NULL; entry->parser = mycss_selectors_state_relative_selector_list_need_combinator_or_selector_begin; @@ -532,7 +532,7 @@ bool mycss_selectors_state_relative_selector_list_need_combinator_or_selector_ws mycss_selectors_list_append_selector(selectors, selectors->list_last, NULL); - selectors->entry = &selectors->list_last->selector_list[ (selectors->list_last->selector_list_length - 1) ]; + selectors->entry = &selectors->list_last->entries_list[ (selectors->list_last->entries_list_length - 1) ].entry; selectors->entry_last = NULL; entry->parser = mycss_selectors_state_relative_selector_list_need_combinator_or_selector_begin; diff --git a/source/myhtml/api.h b/source/myhtml/api.h index a778ea9..4f9821b 100644 --- a/source/myhtml/api.h +++ b/source/myhtml/api.h @@ -36,7 +36,7 @@ #define MyHTML_VERSION_MAJOR 1 #define MyHTML_VERSION_MINOR 0 -#define MyHTML_VERSION_PATCH 3 +#define MyHTML_VERSION_PATCH 4 #include <stdbool.h> #include <stddef.h> @@ -1542,6 +1542,25 @@ myhtml_node_raw_pasition(myhtml_tree_node_t *node); myhtml_position_t myhtml_node_element_pasition(myhtml_tree_node_t *node); +/** + * Get data value from tree node + * + * @param[in] myhtml_tree_node_t* + * + * @return void* + */ +void* +myhtml_node_get_data(myhtml_tree_node_t *node); + +/** + * Set data value to tree node + * + * @param[in] myhtml_tree_node_t* + * @param[in] void* + */ +void +myhtml_node_set_data(myhtml_tree_node_t *node, void* data); + /*********************************************************************************** * * MyHTML_ATTRIBUTE diff --git a/source/myhtml/myhtml.c b/source/myhtml/myhtml.c index d64b18b..bcdbb7f 100644 --- a/source/myhtml/myhtml.c +++ b/source/myhtml/myhtml.c @@ -68,7 +68,7 @@ myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t th #ifdef MyHTML_BUILD_WITHOUT_THREADS - status = mythread_init(myhtml->thread, NULL, thread_count, queue_size); + status = mythread_init(myhtml->thread, NULL, thread_count); if(status) return status; @@ -76,18 +76,26 @@ myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t th #else /* MyHTML_BUILD_WITHOUT_THREADS */ switch (opt) { case MyHTML_OPTIONS_PARSE_MODE_SINGLE: - status = mythread_init(myhtml->thread, "lastmac", 0, queue_size); + status = mythread_init(myhtml->thread, "lastmac", 0); + if(status) + return status; + + myhtml->thread->context = mythread_queue_list_create(&status); if(status) return status; break; case MyHTML_OPTIONS_PARSE_MODE_ALL_IN_ONE: - status = mythread_init(myhtml->thread, "lastmac", 1, queue_size); + status = mythread_init(myhtml->thread, "lastmac", 1); if(status) return status; - myhread_create_stream(myhtml->thread, myhtml_parser_worker_stream, &status); + myhtml->thread->context = mythread_queue_list_create(&status); + if(status) + return status; + + myhread_create_stream(myhtml->thread, mythread_function_queue_stream, myhtml_parser_worker_stream, MyTHREAD_OPT_STOP, &status); break; default: @@ -95,12 +103,16 @@ myhtml_status_t myhtml_init(myhtml_t* myhtml, enum myhtml_options opt, size_t th if(thread_count == 0) thread_count = 1; - status = mythread_init(myhtml->thread, "lastmac", (thread_count + 1), queue_size); + status = mythread_init(myhtml->thread, "lastmac", (thread_count + 1)); + if(status) + return status; + + myhtml->thread->context = mythread_queue_list_create(&status); if(status) return status; - myhread_create_stream(myhtml->thread, myhtml_parser_stream, &status); - myhread_create_batch(myhtml->thread, myhtml_parser_worker, &status, thread_count); + myhread_create_stream(myhtml->thread, mythread_function_queue_stream, myhtml_parser_stream, MyTHREAD_OPT_STOP, &status); + myhread_create_batch(myhtml->thread, mythread_function_queue_batch, myhtml_parser_worker, MyTHREAD_OPT_STOP, &status, thread_count); break; } @@ -123,7 +135,13 @@ myhtml_t* myhtml_destroy(myhtml_t* myhtml) myhtml_destroy_marker(myhtml); - mythread_destroy(myhtml->thread, true); + if(myhtml->thread) { +#ifndef MyHTML_BUILD_WITHOUT_THREADS + mythread_queue_list_destroy(myhtml->thread->context); +#endif + mythread_destroy(myhtml->thread, mythread_queue_wait_all_for_done, true); + } + myhtml_tokenizer_state_destroy(myhtml); if(myhtml->insertion_func) @@ -721,6 +739,16 @@ myhtml_position_t myhtml_node_element_pasition(myhtml_tree_node_t *node) return (myhtml_position_t){0, 0}; } +void myhtml_node_set_data(myhtml_tree_node_t *node, void* data) +{ + node->data = data; +} + +void * myhtml_node_get_data(myhtml_tree_node_t *node) +{ + return node->data; +} + myhtml_status_t myhtml_get_nodes_by_attribute_key_recursion(myhtml_tree_t *tree, myhtml_tree_node_t* node, myhtml_collection_t* collection, const char* key, size_t key_len) { while(node) diff --git a/source/myhtml/myhtml.h b/source/myhtml/myhtml.h index 01d86b6..1cc2721 100644 --- a/source/myhtml/myhtml.h +++ b/source/myhtml/myhtml.h @@ -177,6 +177,8 @@ const char * myhtml_node_text(myhtml_tree_node_t *node, size_t *length); myhtml_string_t * myhtml_node_string(myhtml_tree_node_t *node); myhtml_position_t myhtml_node_raw_pasition(myhtml_tree_node_t *node); myhtml_position_t myhtml_node_element_pasition(myhtml_tree_node_t *node); +void myhtml_node_set_data(myhtml_tree_node_t *node, void* data); +void * myhtml_node_get_data(myhtml_tree_node_t *node); /* attributes */ myhtml_tree_attr_t * myhtml_attribute_next(myhtml_tree_attr_t *attr); diff --git a/source/myhtml/myosi.h b/source/myhtml/myosi.h index 6d9061e..01061e7 100644 --- a/source/myhtml/myosi.h +++ b/source/myhtml/myosi.h @@ -31,7 +31,7 @@ #define MyHTML_VERSION_MAJOR 1 #define MyHTML_VERSION_MINOR 0 -#define MyHTML_VERSION_PATCH 3 +#define MyHTML_VERSION_PATCH 4 #if (defined(_WIN32) || defined(_WIN64)) && !defined(__WINPTHREADS_VERSION) #define IS_OS_WINDOWS @@ -172,7 +172,8 @@ enum mythread_thread_opt { MyTHREAD_OPT_UNDEF = 0x00, MyTHREAD_OPT_WAIT = 0x01, MyTHREAD_OPT_QUIT = 0x02, - MyTHREAD_OPT_STOP = 0x04 + MyTHREAD_OPT_STOP = 0x04, + MyTHREAD_OPT_DONE = 0x08 } typedef mythread_thread_opt_t; @@ -484,9 +485,6 @@ typedef struct myhtml myhtml_t; // parser state function typedef size_t (*myhtml_tokenizer_state_f)(myhtml_tree_t* tree, myhtml_token_node_t* token_node, const char* html, size_t html_offset, size_t html_size); -// parser stream function -typedef void (*mythread_f)(mythread_id_t thread_id, mythread_queue_node_t *qnode); - // parser insertion mode function typedef bool (*myhtml_insertion_f)(myhtml_tree_t* tree, myhtml_token_node_t* token); diff --git a/source/myhtml/parser.c b/source/myhtml/parser.c index bc77b9f..95cdc1b 100644 --- a/source/myhtml/parser.c +++ b/source/myhtml/parser.c @@ -20,8 +20,10 @@ #include "myhtml/parser.h" -void myhtml_parser_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode) +void myhtml_parser_stream(mythread_id_t thread_id, void* ctx) { + mythread_queue_node_t *qnode = (mythread_queue_node_t*)ctx; + if((qnode->tree->parse_flags & MyHTML_TREE_PARSE_FLAGS_WITHOUT_BUILD_TREE) == 0) { while(myhtml_rules_tree_dispatcher(qnode->tree, qnode->token)){} } @@ -180,8 +182,10 @@ size_t myhtml_parser_token_data_to_string_charef(myhtml_tree_t *tree, myhtml_str return str->length; } -void myhtml_parser_worker(mythread_id_t thread_id, mythread_queue_node_t *qnode) +void myhtml_parser_worker(mythread_id_t thread_id, void* ctx) { + mythread_queue_node_t *qnode = (mythread_queue_node_t*)ctx; + myhtml_tree_t* tree = qnode->tree; myhtml_token_node_t* token = qnode->token; @@ -286,8 +290,10 @@ void myhtml_parser_worker(mythread_id_t thread_id, mythread_queue_node_t *qnode) tree->callback_after_token_ctx = tree->callback_after_token(tree, token, tree->callback_after_token_ctx); } -void myhtml_parser_worker_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode) +void myhtml_parser_worker_stream(mythread_id_t thread_id, void* ctx) { + mythread_queue_node_t *qnode = (mythread_queue_node_t*)ctx; + myhtml_parser_worker(thread_id, qnode); myhtml_parser_stream(thread_id, qnode); } diff --git a/source/myhtml/parser.h b/source/myhtml/parser.h index b4d98f3..a4d1ab9 100644 --- a/source/myhtml/parser.h +++ b/source/myhtml/parser.h @@ -33,9 +33,9 @@ extern "C" { #include "myhtml/token.h" #include "myhtml/data_process.h" -void myhtml_parser_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode); -void myhtml_parser_worker(mythread_id_t thread_id, mythread_queue_node_t *qnode); -void myhtml_parser_worker_stream(mythread_id_t thread_id, mythread_queue_node_t *qnode); +void myhtml_parser_stream(mythread_id_t thread_id, void* ctx); +void myhtml_parser_worker(mythread_id_t thread_id, void* ctx); +void myhtml_parser_worker_stream(mythread_id_t thread_id, void* ctx); size_t myhtml_parser_token_data_to_string(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); size_t myhtml_parser_token_data_to_string_lowercase(myhtml_tree_t *tree, myhtml_string_t* str, myhtml_data_process_entry_t* proc_entry, size_t begin, size_t length); diff --git a/source/myhtml/thread.c b/source/myhtml/thread.c index 7428ec4..685d6ec 100644 --- a/source/myhtml/thread.c +++ b/source/myhtml/thread.c @@ -258,14 +258,14 @@ mythread_t * mythread_create(void) #ifdef MyHTML_BUILD_WITHOUT_THREADS -myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count, size_t queue_size) +myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count) { return MyHTML_STATUS_OK; } #else /* MyHTML_BUILD_WITHOUT_THREADS */ -myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count, size_t queue_size) +myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count) { mythread->batch_count = 0; mythread->batch_first_id = 0; @@ -296,12 +296,6 @@ myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size mythread->pth_list = NULL; } - myhtml_status_t status; - mythread->queue_list = mythread_queue_list_create(mythread, &status); - - if(mythread->queue_list == NULL) - return status; - if(sem_prefix) { mythread->sem_prefix_length = strlen(sem_prefix); @@ -328,7 +322,7 @@ void mythread_clean(mythread_t *mythread) mythread->sys_last_error = 0; } -mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy) +mythread_t * mythread_destroy(mythread_t *mythread, mythread_callback_before_join_f before_join, bool self_destroy) { if(mythread == NULL) return NULL; @@ -341,7 +335,9 @@ mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy) mythread_resume_all(mythread); mythread_stream_quit_all(mythread); mythread_batch_quit_all(mythread); - mythread_wait_all_for_done(mythread); + + if(before_join) + before_join(mythread); for (size_t i = mythread->pth_list_root; i < mythread->pth_list_length; i++) { @@ -352,10 +348,6 @@ mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy) mythread->pth_list = NULL; } - if(mythread->queue_list) { - myhtml_free(mythread->queue_list); - } - if(mythread->sem_prefix) { myhtml_free(mythread->sem_prefix); @@ -375,7 +367,7 @@ mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy) #ifndef MyHTML_BUILD_WITHOUT_THREADS -mythread_id_t _myhread_create_stream_raw(mythread_t *mythread, mythread_f func, void *work_func, myhtml_status_t *status, size_t total_count) +mythread_id_t _myhread_create_stream_raw(mythread_t *mythread, mythread_work_f work_func, void *process_func, mythread_thread_opt_t opt, myhtml_status_t *status, size_t total_count) { mythread->sys_last_error = 0; @@ -392,10 +384,10 @@ mythread_id_t _myhread_create_stream_raw(mythread_t *mythread, mythread_f func, mythread_list_t *thr = &mythread->pth_list[mythread->pth_list_length]; thr->data.mythread = mythread; - thr->data.func = func; + thr->data.func = work_func; thr->data.id = mythread->pth_list_length; thr->data.t_count = total_count; - thr->data.opt = MyTHREAD_OPT_STOP; + thr->data.opt = opt; myhtml_status_t m_status = myhtml_hread_mutex_create(mythread, &thr->data, 0); @@ -404,7 +396,7 @@ mythread_id_t _myhread_create_stream_raw(mythread_t *mythread, mythread_f func, return 0; } - m_status = myhtml_thread_create(mythread, thr, work_func); + m_status = myhtml_thread_create(mythread, thr, process_func); if(m_status != MyHTML_STATUS_OK) return 0; @@ -412,12 +404,12 @@ mythread_id_t _myhread_create_stream_raw(mythread_t *mythread, mythread_f func, return thr->data.id; } -mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_f func, myhtml_status_t *status) +mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_process_f process_func, mythread_work_f work_func, mythread_thread_opt_t opt, myhtml_status_t *status) { - return _myhread_create_stream_raw(mythread, func, mythread_function_stream, status, 0); + return _myhread_create_stream_raw(mythread, work_func, process_func, opt, status, 0); } -mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_f func, myhtml_status_t *status, size_t count) +mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_process_f process_func, mythread_work_f work_func, mythread_thread_opt_t opt, myhtml_status_t *status, size_t count) { if(mythread->batch_count) { *status = MyHTML_STATUS_THREAD_ERROR_BATCH_INIT; @@ -443,7 +435,7 @@ mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_f func, myhtml for (size_t i = 0; i < count; i++) { - mythread_id_t curr_id = _myhread_create_stream_raw(mythread, func, mythread_function_batch, status, i); + mythread_id_t curr_id = _myhread_create_stream_raw(mythread, work_func, process_func, opt, status, i); if(init_first == false) { mythread->batch_first_id = curr_id; @@ -475,9 +467,8 @@ mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_f func, myhtml #endif /* MyHTML_BUILD_WITHOUT_THREADS */ // mythread queue functions -// TODO: size = 1024; -- never use #ifndef MyHTML_BUILD_WITHOUT_THREADS -mythread_queue_list_t * mythread_queue_list_create(mythread_t *mythread, myhtml_status_t *status) +mythread_queue_list_t * mythread_queue_list_create(myhtml_status_t *status) { if(status) *status = MyHTML_STATUS_OK; @@ -493,9 +484,22 @@ mythread_queue_list_t * mythread_queue_list_create(mythread_t *mythread, myhtml_ return queue_list; } +void mythread_queue_list_destroy(mythread_queue_list_t* queue_list) +{ + if(queue_list == NULL) + return; + + myhtml_free(queue_list); +} + +size_t mythread_queue_list_get_count(mythread_queue_list_t* queue_list) +{ + return queue_list->count; +} + mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythread, mythread_queue_t *queue, myhtml_status_t *status) { - mythread_queue_list_t *queue_list = mythread->queue_list; + mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; if(status) *status = MyHTML_STATUS_OK; @@ -553,7 +557,7 @@ mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythrea mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t *mythread, mythread_queue_list_entry_t *entry, bool destroy_queue) { - mythread_queue_list_t *queue_list = mythread->queue_list; + mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; mythread_queue_list_entry_t *next = entry->next; mythread_queue_list_entry_t *prev = entry->prev; @@ -736,7 +740,7 @@ mythread_queue_node_t * mythread_queue_node_malloc(mythread_t *mythread, mythrea if(queue->nodes_pos >= queue->nodes_pos_size) { - mythread_wait_all_for_done(mythread); + mythread_queue_wait_all_for_done(mythread); queue->nodes_pos_size <<= 1; mythread_queue_node_t** tmp = myhtml_realloc(queue->nodes, sizeof(mythread_queue_node_t*) * queue->nodes_pos_size); @@ -779,7 +783,7 @@ mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, m if(queue->nodes_uses >= limit) { queue->nodes_uses++; - mythread_wait_all_for_done(mythread); + mythread_queue_wait_all_for_done(mythread); queue->nodes_length = 0; queue->nodes_pos = 0; @@ -792,7 +796,7 @@ mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, m if(queue->nodes_pos >= queue->nodes_pos_size) { - mythread_wait_all_for_done(mythread); + mythread_queue_wait_all_for_done(mythread); queue->nodes_pos_size <<= 1; mythread_queue_node_t** tmp = myhtml_realloc(queue->nodes, sizeof(mythread_queue_node_t*) * queue->nodes_pos_size); @@ -849,18 +853,40 @@ mythread_queue_node_t * mythread_queue_node_malloc_round(mythread_t *mythread, m return &queue->nodes[queue->nodes_pos][queue->nodes_length]; } +void mythread_queue_wait_all_for_done(mythread_t *mythread) +{ + const struct timespec tomeout = {0, 0}; + + mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; + mythread_queue_list_entry_t *entry = queue_list->first; + + while(entry) + { + for (size_t idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { + while(entry->thread_param[idx].use < entry->queue->nodes_uses) { + myhtml_thread_nanosleep(&tomeout); + } + } + + entry = entry->next; + } +} + +#else + +void mythread_queue_wait_all_for_done(mythread_t *mythread) {} + #endif /* MyHTML_BUILD_WITHOUT_THREADS */ #ifdef MyHTML_BUILD_WITHOUT_THREADS void mythread_stream_quit_all(mythread_t *mythread) {} void mythread_batch_quit_all(mythread_t *mythread) {} -void mythread_stream_stop_all(mythread_t *mythread) {}; -void mythread_batch_stop_all(mythread_t *mythread) {}; -void mythread_stop_all(mythread_t *mythread) {}; -void mythread_resume_all(mythread_t *mythread) {}; -void mythread_wait_all_for_done(mythread_t *mythread) {}; -void mythread_suspend_all(mythread_t *mythread) {}; +void mythread_stream_stop_all(mythread_t *mythread) {} +void mythread_batch_stop_all(mythread_t *mythread) {} +void mythread_stop_all(mythread_t *mythread) {} +void mythread_resume_all(mythread_t *mythread) {} +void mythread_suspend_all(mythread_t *mythread) {} #else /* MyHTML_BUILD_WITHOUT_THREADS */ @@ -933,25 +959,6 @@ void mythread_resume_all(mythread_t *mythread) } } -void mythread_wait_all_for_done(mythread_t *mythread) -{ - const struct timespec tomeout = {0, 0}; - - mythread_queue_list_t *queue_list = mythread->queue_list; - mythread_queue_list_entry_t *entry = queue_list->first; - - while(entry) - { - for (size_t idx = mythread->pth_list_root; idx < mythread->pth_list_size; idx++) { - while(entry->thread_param[idx].use < entry->queue->nodes_uses) { - myhtml_thread_nanosleep(&tomeout); - } - } - - entry = entry->next; - } -} - void mythread_suspend_all(mythread_t *mythread) { if(mythread->stream_opt != MyTHREAD_OPT_WAIT) @@ -992,7 +999,7 @@ bool mythread_function_see_for_all_done(mythread_queue_list_t *queue_list, size_ bool mythread_function_see_opt(mythread_context_t *ctx, volatile mythread_thread_opt_t opt, size_t done_count, const struct timespec *timeout) { mythread_t * mythread = ctx->mythread; - mythread_queue_list_t *queue_list = mythread->queue_list; + mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; if(done_count != queue_list->count) return false; @@ -1023,11 +1030,11 @@ bool mythread_function_see_opt(mythread_context_t *ctx, volatile mythread_thread return false; } -void mythread_function_batch(void *arg) +void mythread_function_queue_batch(void *arg) { mythread_context_t *ctx = (mythread_context_t*)arg; mythread_t * mythread = ctx->mythread; - mythread_queue_list_t *queue_list = mythread->queue_list; + mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; const struct timespec timeout = {0, 0}; myhtml_hread_mutex_wait(mythread, ctx); @@ -1058,7 +1065,7 @@ void mythread_function_batch(void *arg) mythread_queue_node_t *qnode = &entry->queue->nodes[pos][len]; if((qnode->tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) - ctx->func(ctx->id, qnode); + ctx->func(ctx->id, (void*)qnode); thread_param->use += mythread->batch_count; } @@ -1075,11 +1082,11 @@ void mythread_function_batch(void *arg) while (1); } -void mythread_function_stream(void *arg) +void mythread_function_queue_stream(void *arg) { mythread_context_t *ctx = (mythread_context_t*)arg; mythread_t * mythread = ctx->mythread; - mythread_queue_list_t *queue_list = mythread->queue_list; + mythread_queue_list_t *queue_list = (mythread_queue_list_t*)mythread->context; const struct timespec timeout = {0, 0}; myhtml_hread_mutex_wait(mythread, ctx); @@ -1110,7 +1117,7 @@ void mythread_function_stream(void *arg) mythread_queue_node_t *qnode = &entry->queue->nodes[pos][len]; if((qnode->tree->flags & MyHTML_TREE_FLAGS_SINGLE_MODE) == 0) - ctx->func(ctx->id, qnode); + ctx->func(ctx->id, (void*)qnode); thread_param->use++; } @@ -1127,6 +1134,40 @@ void mythread_function_stream(void *arg) while (1); } +void mythread_function(void *arg) +{ + mythread_context_t *ctx = (mythread_context_t*)arg; + mythread_t * mythread = ctx->mythread; + + myhtml_hread_mutex_wait(mythread, ctx); + + do { + if(mythread->stream_opt & MyTHREAD_OPT_STOP || ctx->opt & MyTHREAD_OPT_STOP) + { + ctx->opt |= MyTHREAD_OPT_DONE; + myhtml_hread_mutex_wait(mythread, ctx); + + if(mythread->stream_opt & MyTHREAD_OPT_QUIT || ctx->opt & MyTHREAD_OPT_QUIT) + { + myhtml_hread_mutex_close(mythread, ctx); + ctx->opt = MyTHREAD_OPT_QUIT; + break; + } + + ctx->opt = MyTHREAD_OPT_UNDEF; + } + else if(mythread->stream_opt & MyTHREAD_OPT_QUIT || ctx->opt & MyTHREAD_OPT_QUIT) + { + myhtml_hread_mutex_close(mythread, ctx); + ctx->opt = MyTHREAD_OPT_QUIT; + break; + } + + ctx->func(ctx->id, ctx); + } + while (1); +} + #endif /* MyHTML_BUILD_WITHOUT_THREADS */ diff --git a/source/myhtml/thread.h b/source/myhtml/thread.h index b156833..07d8fba 100644 --- a/source/myhtml/thread.h +++ b/source/myhtml/thread.h @@ -49,6 +49,10 @@ extern "C" { #define MyTHREAD_SEM_NAME "myhtml" +/* functions */ +typedef void (*mythread_callback_before_join_f)(mythread_t* mythread); +typedef void (*mythread_process_f)(void* arg); +typedef void (*mythread_work_f)(mythread_id_t thread_id, void* arg); #ifdef MyHTML_BUILD_WITHOUT_THREADS @@ -58,8 +62,9 @@ struct mythread { #else /* MyHTML_BUILD_WITHOUT_THREADS */ -void mythread_function_stream(void *arg); -void mythread_function_batch(void *arg); +void mythread_function_queue_stream(void *arg); +void mythread_function_queue_batch(void *arg); +void mythread_function(void *arg); // thread struct mythread_context { @@ -73,7 +78,7 @@ struct mythread_context { size_t sem_name_size; - mythread_f func; + mythread_work_f func; volatile size_t t_count; volatile mythread_thread_opt_t opt; @@ -88,6 +93,7 @@ struct mythread_list { pthread_t pth; #endif mythread_context_t data; + mythread_process_f process_func; }; struct mythread_workers_list { @@ -101,7 +107,7 @@ struct mythread { size_t pth_list_size; size_t pth_list_root; - mythread_queue_list_t *queue_list; + void *context; char *sem_prefix; size_t sem_prefix_length; @@ -119,17 +125,17 @@ struct mythread { volatile mythread_thread_opt_t batch_opt; }; -mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_f func, myhtml_status_t *status); -mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_f func, myhtml_status_t *status, size_t count); +mythread_id_t myhread_create_stream(mythread_t *mythread, mythread_process_f process_func, mythread_work_f func, mythread_thread_opt_t opt, myhtml_status_t *status); +mythread_id_t myhread_create_batch(mythread_t *mythread, mythread_process_f process_func, mythread_work_f func, mythread_thread_opt_t opt, myhtml_status_t *status, size_t count); void myhtml_thread_nanosleep(const struct timespec *tomeout); -#endif +#endif /* MyHTML_BUILD_WITHOUT_THREADS */ mythread_t * mythread_create(void); -myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count, size_t queue_size); +myhtml_status_t mythread_init(mythread_t *mythread, const char *sem_prefix, size_t thread_count); void mythread_clean(mythread_t *mythread); -mythread_t * mythread_destroy(mythread_t *mythread, bool self_destroy); +mythread_t * mythread_destroy(mythread_t *mythread, mythread_callback_before_join_f before_join, bool self_destroy); void mythread_stream_quit_all(mythread_t *mythread); void mythread_batch_quit_all(mythread_t *mythread); @@ -138,7 +144,7 @@ void mythread_stream_stop_all(mythread_t *mythread); void mythread_batch_stop_all(mythread_t *mythread); void mythread_stop_all(mythread_t *mythread); -void mythread_wait_all_for_done(mythread_t *mythread); +void mythread_queue_wait_all_for_done(mythread_t *mythread); void mythread_resume_all(mythread_t *mythread); void mythread_suspend_all(mythread_t *mythread); @@ -194,7 +200,11 @@ mythread_queue_node_t * mythread_queue_node_malloc_limit(mythread_t *mythread, m #ifndef MyHTML_BUILD_WITHOUT_THREADS -mythread_queue_list_t * mythread_queue_list_create(mythread_t *mythread, myhtml_status_t *status); +mythread_queue_list_t * mythread_queue_list_create(myhtml_status_t *status); +void mythread_queue_list_destroy(mythread_queue_list_t* queue_list); + +size_t mythread_queue_list_get_count(mythread_queue_list_t* queue_list); + mythread_queue_list_entry_t * mythread_queue_list_entry_push(mythread_t *mythread, mythread_queue_t *queue, myhtml_status_t *status); mythread_queue_list_entry_t * mythread_queue_list_entry_delete(mythread_t *mythread, mythread_queue_list_entry_t *entry, bool destroy_queue); void mythread_queue_list_entry_clean(mythread_t *mythread, mythread_queue_list_entry_t *entry); diff --git a/source/myhtml/tokenizer.c b/source/myhtml/tokenizer.c index 7c8f777..aa03639 100644 --- a/source/myhtml/tokenizer.c +++ b/source/myhtml/tokenizer.c @@ -173,8 +173,7 @@ myhtml_status_t myhtml_tokenizer_end(myhtml_tree_t* tree) mythread_queue_list_entry_wait_for_done(tree->myhtml->thread, tree->queue_entry); tree->queue_entry = mythread_queue_list_entry_delete(tree->myhtml->thread, tree->queue_entry, false); - if(tree->myhtml->thread->queue_list->count == 0) { - //myhtml_tokenizer_wait(tree); + if(mythread_queue_list_get_count(tree->myhtml->thread->context) == 0) { myhtml_tokenizer_pause(tree); } } @@ -242,7 +241,7 @@ myhtml_tree_node_t * myhtml_tokenizer_fragment_init(myhtml_tree_t* tree, myhtml_ void myhtml_tokenizer_wait(myhtml_tree_t* tree) { - mythread_wait_all_for_done(tree->myhtml->thread); + mythread_queue_wait_all_for_done(tree->myhtml->thread); } void myhtml_tokenizer_post(myhtml_tree_t* tree) diff --git a/source/myhtml/tree.c b/source/myhtml/tree.c index 96884e2..cd5e929 100644 --- a/source/myhtml/tree.c +++ b/source/myhtml/tree.c @@ -299,15 +299,8 @@ myhtml_tree_t * myhtml_tree_destroy(myhtml_tree_t* tree) void myhtml_tree_node_clean(myhtml_tree_node_t* tree_node) { - tree_node->flags = MyHTML_TREE_NODE_UNDEF; - tree_node->tag_id = MyHTML_TAG__UNDEF; - tree_node->prev = 0; - tree_node->next = 0; - tree_node->child = 0; - tree_node->parent = 0; - tree_node->last_child = 0; - tree_node->token = 0; - tree_node->ns = MyHTML_NAMESPACE_HTML; + memset(tree_node, 0, sizeof(myhtml_tree_node_t)); + tree_node->ns = MyHTML_NAMESPACE_HTML; } /* parse flags */ @@ -729,6 +722,7 @@ myhtml_tree_node_t * myhtml_tree_node_insert_by_node(myhtml_tree_t* tree, myhtml myhtml_tree_node_insert_by_mode(tree, adjusted_location, node, mode); myhtml_tree_open_elements_append(tree, node); + myhtml_tree_index_append(tree, node); return node; } diff --git a/source/myhtml/tree.h b/source/myhtml/tree.h index 45e39e9..eedf914 100644 --- a/source/myhtml/tree.h +++ b/source/myhtml/tree.h @@ -80,14 +80,15 @@ struct myhtml_tree_node { myhtml_tag_id_t tag_id; enum myhtml_namespace ns; - myhtml_tree_node_t* prev; // предыдущий ид элемента этого же уровня - myhtml_tree_node_t* next; // следеющий ид эелента этого же уровня - myhtml_tree_node_t* child; // ид чилда - myhtml_tree_node_t* parent; // ид родителя + myhtml_tree_node_t* prev; + myhtml_tree_node_t* next; + myhtml_tree_node_t* child; + myhtml_tree_node_t* parent; - myhtml_tree_node_t* last_child; // + myhtml_tree_node_t* last_child; myhtml_token_node_t* token; + void* data; }; enum myhtml_tree_compat_mode { |