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

github.com/lexborisov/Modest.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlexborisov <lex.borisov@gmail.com>2016-10-07 20:47:31 +0300
committerlexborisov <lex.borisov@gmail.com>2016-10-07 20:47:31 +0300
commitf7f6e338fd84f03bbd7b33729dbbdba9311137e3 (patch)
tree01c6660cbdca75e7c2f729df10a555f7efc47414
parent581c8587cade0485be46e507ad43b4a0d8c3c720 (diff)
work in progress! Create Threads for find html nodes by selectors.
-rw-r--r--devel/osx/Modest.xcodeproj/project.pbxproj884
-rw-r--r--devel/osx/Modest.xcodeproj/project.xcworkspace/xcshareddata/Modest.xcscmblueprint37
-rw-r--r--devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstatebin126962 -> 0 bytes
-rw-r--r--devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist23
-rw-r--r--devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme10
-rw-r--r--devel/osx/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist2
-rw-r--r--devel/osx/Modest/Modest.xcodeproj/project.xcworkspace/contents.xcworkspacedata7
-rw-r--r--devel/osx/Modest/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/Modest.xcscheme46
-rw-r--r--devel/osx/Modest/Modest.xcodeproj/xcuserdata/alexanderborisov.xcuserdatad/xcschemes/xcschememanagement.plist22
-rw-r--r--devel/osx/Modest/main.c188
-rw-r--r--include/modest/finder/finder.h62
-rw-r--r--include/modest/finder/myosi.h13
-rw-r--r--include/modest/finder/pseudo_class.h104
-rw-r--r--include/modest/finder/thread.h93
-rw-r--r--include/modest/finder/type.h37
-rw-r--r--include/modest/modest.h44
-rw-r--r--include/modest/myosi.h6
-rw-r--r--include/modest/node/node.h36
-rw-r--r--include/modest/style/map.h38
-rw-r--r--include/modest/style/map_resource.h32
-rw-r--r--include/modest/style/sheet.h37
-rw-r--r--include/modest/style/type.h50
-rw-r--r--include/mycss/selectors/init.h6
-rw-r--r--include/mycss/selectors/list.h11
-rw-r--r--include/mycss/selectors/myosi.h14
-rw-r--r--include/myhtml/api.h21
-rw-r--r--include/myhtml/myhtml.h2
-rw-r--r--include/myhtml/myosi.h8
-rw-r--r--include/myhtml/parser.h6
-rw-r--r--include/myhtml/thread.h32
-rw-r--r--include/myhtml/tree.h11
-rw-r--r--source/modest/Makefile.mk2
-rw-r--r--source/modest/finder/finder.c169
-rw-r--r--source/modest/finder/finder.h62
-rw-r--r--source/modest/finder/myosi.h13
-rw-r--r--source/modest/finder/pseudo_class.c293
-rw-r--r--source/modest/finder/pseudo_class.h104
-rw-r--r--source/modest/finder/thread.c401
-rw-r--r--source/modest/finder/thread.h93
-rw-r--r--source/modest/finder/type.c22
-rw-r--r--source/modest/finder/type.h37
-rw-r--r--source/modest/modest.c86
-rw-r--r--source/modest/modest.h44
-rw-r--r--source/modest/myosi.h6
-rw-r--r--source/modest/node/node.c46
-rw-r--r--source/modest/node/node.h36
-rw-r--r--source/modest/style/map.c57
-rw-r--r--source/modest/style/map.h38
-rw-r--r--source/modest/style/map_resource.h32
-rw-r--r--source/modest/style/sheet.c40
-rw-r--r--source/modest/style/sheet.h37
-rw-r--r--source/modest/style/type.c24
-rw-r--r--source/modest/style/type.h50
-rw-r--r--source/mycss/selectors/function_parser.c20
-rw-r--r--source/mycss/selectors/init.c25
-rw-r--r--source/mycss/selectors/init.h6
-rw-r--r--source/mycss/selectors/list.c52
-rw-r--r--source/mycss/selectors/list.h11
-rw-r--r--source/mycss/selectors/myosi.h14
-rw-r--r--source/mycss/selectors/parser.c42
-rw-r--r--source/mycss/selectors/state.c18
-rw-r--r--source/myhtml/api.h21
-rw-r--r--source/myhtml/myhtml.c44
-rw-r--r--source/myhtml/myhtml.h2
-rw-r--r--source/myhtml/myosi.h8
-rw-r--r--source/myhtml/parser.c12
-rw-r--r--source/myhtml/parser.h6
-rw-r--r--source/myhtml/thread.c163
-rw-r--r--source/myhtml/thread.h32
-rw-r--r--source/myhtml/tokenizer.c5
-rw-r--r--source/myhtml/tree.c12
-rw-r--r--source/myhtml/tree.h11
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
deleted file mode 100644
index d04547b..0000000
--- a/devel/osx/Modest.xcodeproj/project.xcworkspace/xcuserdata/alexanderborisov.xcuserdatad/UserInterfaceState.xcuserstate
+++ /dev/null
Binary files differ
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 = &current_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 {