debase-ruby_core_source 0.7.8 → 0.7.9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (127) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/Rakefile +6 -3
  4. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/addr2line.h +21 -0
  5. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/constant.h +36 -0
  6. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/dln.h +50 -0
  7. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/encdb.h +169 -0
  8. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/eval_intern.h +241 -0
  9. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/gc.h +104 -0
  10. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/id.h +135 -0
  11. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/insns.inc +187 -0
  12. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/insns_info.inc +724 -0
  13. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/internal.h +395 -0
  14. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/iseq.h +140 -0
  15. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/known_errors.inc +731 -0
  16. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/method.h +141 -0
  17. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/node.h +541 -0
  18. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/node_name.inc +212 -0
  19. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/opt_sc.inc +702 -0
  20. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/optinsn.inc +83 -0
  21. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/optunifs.inc +120 -0
  22. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/parse.h +181 -0
  23. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/probes_helper.h +67 -0
  24. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/regenc.h +227 -0
  25. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/regint.h +915 -0
  26. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/regparse.h +367 -0
  27. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/revision.h +1 -0
  28. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/ruby_atomic.h +170 -0
  29. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/siphash.h +48 -0
  30. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/thread_pthread.h +56 -0
  31. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/thread_win32.h +45 -0
  32. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/timev.h +21 -0
  33. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/transcode_data.h +127 -0
  34. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/transdb.h +193 -0
  35. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/version.h +52 -0
  36. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/vm.inc +3196 -0
  37. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/vm_core.h +1020 -0
  38. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/vm_debug.h +41 -0
  39. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/vm_exec.h +173 -0
  40. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/vm_insnhelper.h +274 -0
  41. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/vm_opts.h +56 -0
  42. data/lib/debase/ruby_core_source/ruby-2.0.0-p645/vmtc.inc +101 -0
  43. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/addr2line.h +21 -0
  44. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/constant.h +36 -0
  45. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/dln.h +51 -0
  46. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/encdb.h +170 -0
  47. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/eval_intern.h +270 -0
  48. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/gc.h +101 -0
  49. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/id.h +171 -0
  50. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/insns.inc +189 -0
  51. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/insns_info.inc +731 -0
  52. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/internal.h +892 -0
  53. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/iseq.h +136 -0
  54. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/known_errors.inc +731 -0
  55. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/method.h +145 -0
  56. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/node.h +543 -0
  57. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/node_name.inc +212 -0
  58. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/opt_sc.inc +710 -0
  59. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/optinsn.inc +83 -0
  60. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/optunifs.inc +121 -0
  61. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/parse.h +183 -0
  62. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/probes_helper.h +67 -0
  63. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/regenc.h +223 -0
  64. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/regint.h +911 -0
  65. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/regparse.h +363 -0
  66. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/revision.h +1 -0
  67. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/ruby_atomic.h +170 -0
  68. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/siphash.h +48 -0
  69. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/thread_native.h +23 -0
  70. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/thread_pthread.h +56 -0
  71. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/thread_win32.h +45 -0
  72. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/timev.h +42 -0
  73. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/transcode_data.h +123 -0
  74. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/transdb.h +193 -0
  75. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/version.h +52 -0
  76. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/vm.inc +3243 -0
  77. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/vm_core.h +1057 -0
  78. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/vm_debug.h +37 -0
  79. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/vm_exec.h +182 -0
  80. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/vm_insnhelper.h +273 -0
  81. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/vm_opts.h +56 -0
  82. data/lib/debase/ruby_core_source/ruby-2.1.6-p336/vmtc.inc +102 -0
  83. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/addr2line.h +21 -0
  84. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/ccan/build_assert/build_assert.h +40 -0
  85. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/ccan/check_type/check_type.h +63 -0
  86. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/ccan/container_of/container_of.h +142 -0
  87. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/ccan/list/list.h +635 -0
  88. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/ccan/str/str.h +16 -0
  89. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/constant.h +43 -0
  90. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/dln.h +51 -0
  91. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/eval_intern.h +275 -0
  92. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/gc.h +107 -0
  93. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/id.h +210 -0
  94. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/insns.inc +107 -0
  95. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/insns_info.inc +752 -0
  96. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/internal.h +1185 -0
  97. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/iseq.h +158 -0
  98. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/known_errors.inc +746 -0
  99. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/method.h +144 -0
  100. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/node.h +544 -0
  101. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/node_name.inc +212 -0
  102. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/opt_sc.inc +734 -0
  103. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/optinsn.inc +83 -0
  104. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/optunifs.inc +124 -0
  105. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/parse.h +184 -0
  106. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/probes_helper.h +67 -0
  107. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/regenc.h +234 -0
  108. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/regint.h +972 -0
  109. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/regparse.h +363 -0
  110. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/revision.h +1 -0
  111. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/ruby_atomic.h +170 -0
  112. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/siphash.h +48 -0
  113. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/symbol.h +87 -0
  114. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/thread_pthread.h +54 -0
  115. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/thread_win32.h +36 -0
  116. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/timev.h +42 -0
  117. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/transcode_data.h +123 -0
  118. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/version.h +52 -0
  119. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/vm.inc +3353 -0
  120. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/vm_core.h +1161 -0
  121. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/vm_debug.h +37 -0
  122. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/vm_exec.h +182 -0
  123. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/vm_insnhelper.h +233 -0
  124. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/vm_opts.h +56 -0
  125. data/lib/debase/ruby_core_source/ruby-2.2.2-p95/vmtc.inc +105 -0
  126. data/lib/debase/ruby_core_source/version.rb +1 -1
  127. metadata +124 -2
@@ -0,0 +1,56 @@
1
+ /*-*-c-*-*/
2
+ /**********************************************************************
3
+
4
+ vm_opts.h - VM optimize option
5
+
6
+ $Author: tmm1 $
7
+
8
+ Copyright (C) 2004-2007 Koichi Sasada
9
+
10
+ **********************************************************************/
11
+
12
+
13
+ #ifndef RUBY_VM_OPTS_H
14
+ #define RUBY_VM_OPTS_H
15
+
16
+ /* Compile options.
17
+ * You can change these options at runtime by VM::CompileOption.
18
+ * Following definitions are default values.
19
+ */
20
+
21
+ #define OPT_TRACE_INSTRUCTION 1
22
+ #define OPT_TAILCALL_OPTIMIZATION 0
23
+ #define OPT_PEEPHOLE_OPTIMIZATION 1
24
+ #define OPT_SPECIALISED_INSTRUCTION 1
25
+ #define OPT_INLINE_CONST_CACHE 1
26
+
27
+
28
+ /* Build Options.
29
+ * You can't change these options at runtime.
30
+ */
31
+
32
+ /* C compiler dependent */
33
+ #define OPT_DIRECT_THREADED_CODE 1
34
+ #define OPT_TOKEN_THREADED_CODE 0
35
+ #define OPT_CALL_THREADED_CODE 0
36
+
37
+ /* VM running option */
38
+ #define OPT_CHECKED_RUN 1
39
+ #define OPT_INLINE_METHOD_CACHE 1
40
+ #define OPT_GLOBAL_METHOD_CACHE 1
41
+ #define OPT_BLOCKINLINING 0
42
+
43
+ /* architecture independent, affects generated code */
44
+ #define OPT_OPERANDS_UNIFICATION 1
45
+ #define OPT_INSTRUCTIONS_UNIFICATION 0
46
+ #define OPT_UNIFY_ALL_COMBINATION 0
47
+ #define OPT_STACK_CACHING 0
48
+
49
+ /* misc */
50
+ #define SUPPORT_JOKE 0
51
+
52
+ #ifndef VM_COLLECT_USAGE_DETAILS
53
+ #define VM_COLLECT_USAGE_DETAILS 0
54
+ #endif
55
+
56
+ #endif /* RUBY_VM_OPTS_H */
@@ -0,0 +1,102 @@
1
+ /* -*-c-*- *********************************************************/
2
+ /*******************************************************************/
3
+ /*******************************************************************/
4
+ /**
5
+ This file is for threaded code.
6
+
7
+ ----
8
+ This file is auto generated by insns2vm.rb
9
+ DO NOT TOUCH!
10
+
11
+ If you want to fix something, you must edit 'template/vmtc.inc.tmpl'
12
+ or insns2vm.rb
13
+ */
14
+
15
+ static const void *const insns_address_table[] = {
16
+ LABEL_PTR(nop),
17
+ LABEL_PTR(getlocal),
18
+ LABEL_PTR(setlocal),
19
+ LABEL_PTR(getspecial),
20
+ LABEL_PTR(setspecial),
21
+ LABEL_PTR(getinstancevariable),
22
+ LABEL_PTR(setinstancevariable),
23
+ LABEL_PTR(getclassvariable),
24
+ LABEL_PTR(setclassvariable),
25
+ LABEL_PTR(getconstant),
26
+ LABEL_PTR(setconstant),
27
+ LABEL_PTR(getglobal),
28
+ LABEL_PTR(setglobal),
29
+ LABEL_PTR(putnil),
30
+ LABEL_PTR(putself),
31
+ LABEL_PTR(putobject),
32
+ LABEL_PTR(putspecialobject),
33
+ LABEL_PTR(putiseq),
34
+ LABEL_PTR(putstring),
35
+ LABEL_PTR(concatstrings),
36
+ LABEL_PTR(tostring),
37
+ LABEL_PTR(toregexp),
38
+ LABEL_PTR(newarray),
39
+ LABEL_PTR(duparray),
40
+ LABEL_PTR(expandarray),
41
+ LABEL_PTR(concatarray),
42
+ LABEL_PTR(splatarray),
43
+ LABEL_PTR(newhash),
44
+ LABEL_PTR(newrange),
45
+ LABEL_PTR(pop),
46
+ LABEL_PTR(dup),
47
+ LABEL_PTR(dupn),
48
+ LABEL_PTR(swap),
49
+ LABEL_PTR(reput),
50
+ LABEL_PTR(topn),
51
+ LABEL_PTR(setn),
52
+ LABEL_PTR(adjuststack),
53
+ LABEL_PTR(defined),
54
+ LABEL_PTR(checkmatch),
55
+ LABEL_PTR(trace),
56
+ LABEL_PTR(defineclass),
57
+ LABEL_PTR(send),
58
+ LABEL_PTR(opt_str_freeze),
59
+ LABEL_PTR(opt_send_simple),
60
+ LABEL_PTR(invokesuper),
61
+ LABEL_PTR(invokeblock),
62
+ LABEL_PTR(leave),
63
+ LABEL_PTR(throw),
64
+ LABEL_PTR(jump),
65
+ LABEL_PTR(branchif),
66
+ LABEL_PTR(branchunless),
67
+ LABEL_PTR(getinlinecache),
68
+ LABEL_PTR(setinlinecache),
69
+ LABEL_PTR(once),
70
+ LABEL_PTR(opt_case_dispatch),
71
+ LABEL_PTR(opt_plus),
72
+ LABEL_PTR(opt_minus),
73
+ LABEL_PTR(opt_mult),
74
+ LABEL_PTR(opt_div),
75
+ LABEL_PTR(opt_mod),
76
+ LABEL_PTR(opt_eq),
77
+ LABEL_PTR(opt_neq),
78
+ LABEL_PTR(opt_lt),
79
+ LABEL_PTR(opt_le),
80
+ LABEL_PTR(opt_gt),
81
+ LABEL_PTR(opt_ge),
82
+ LABEL_PTR(opt_ltlt),
83
+ LABEL_PTR(opt_aref),
84
+ LABEL_PTR(opt_aset),
85
+ LABEL_PTR(opt_length),
86
+ LABEL_PTR(opt_size),
87
+ LABEL_PTR(opt_empty_p),
88
+ LABEL_PTR(opt_succ),
89
+ LABEL_PTR(opt_not),
90
+ LABEL_PTR(opt_regexpmatch1),
91
+ LABEL_PTR(opt_regexpmatch2),
92
+ LABEL_PTR(opt_call_c_function),
93
+ LABEL_PTR(bitblt),
94
+ LABEL_PTR(answer),
95
+ LABEL_PTR(getlocal_OP__WC__0),
96
+ LABEL_PTR(getlocal_OP__WC__1),
97
+ LABEL_PTR(setlocal_OP__WC__0),
98
+ LABEL_PTR(setlocal_OP__WC__1),
99
+ LABEL_PTR(putobject_OP_INT2FIX_O_0_C_),
100
+ LABEL_PTR(putobject_OP_INT2FIX_O_1_C_),
101
+ };
102
+
@@ -0,0 +1,21 @@
1
+ /**********************************************************************
2
+
3
+ addr2line.h -
4
+
5
+ $Author$
6
+
7
+ Copyright (C) 2010 Shinichiro Hamaji
8
+
9
+ **********************************************************************/
10
+
11
+ #ifndef RUBY_ADDR2LINE_H
12
+ #define RUBY_ADDR2LINE_H
13
+
14
+ #ifdef USE_ELF
15
+
16
+ void
17
+ rb_dump_backtrace_with_lines(int num_traces, void **traces);
18
+
19
+ #endif /* USE_ELF */
20
+
21
+ #endif /* RUBY_ADDR2LINE_H */
@@ -0,0 +1,40 @@
1
+ /* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
2
+ #ifndef CCAN_BUILD_ASSERT_H
3
+ #define CCAN_BUILD_ASSERT_H
4
+
5
+ /**
6
+ * BUILD_ASSERT - assert a build-time dependency.
7
+ * @cond: the compile-time condition which must be true.
8
+ *
9
+ * Your compile will fail if the condition isn't true, or can't be evaluated
10
+ * by the compiler. This can only be used within a function.
11
+ *
12
+ * Example:
13
+ * #include <stddef.h>
14
+ * ...
15
+ * static char *foo_to_char(struct foo *foo)
16
+ * {
17
+ * // This code needs string to be at start of foo.
18
+ * BUILD_ASSERT(offsetof(struct foo, string) == 0);
19
+ * return (char *)foo;
20
+ * }
21
+ */
22
+ #define BUILD_ASSERT(cond) \
23
+ do { (void) sizeof(char [1 - 2*!(cond)]); } while(0)
24
+
25
+ /**
26
+ * BUILD_ASSERT_OR_ZERO - assert a build-time dependency, as an expression.
27
+ * @cond: the compile-time condition which must be true.
28
+ *
29
+ * Your compile will fail if the condition isn't true, or can't be evaluated
30
+ * by the compiler. This can be used in an expression: its value is "0".
31
+ *
32
+ * Example:
33
+ * #define foo_to_char(foo) \
34
+ * ((char *)(foo) \
35
+ * + BUILD_ASSERT_OR_ZERO(offsetof(struct foo, string) == 0))
36
+ */
37
+ #define BUILD_ASSERT_OR_ZERO(cond) \
38
+ (sizeof(char [1 - 2*!(cond)]) - 1)
39
+
40
+ #endif /* CCAN_BUILD_ASSERT_H */
@@ -0,0 +1,63 @@
1
+ /* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
2
+ #ifndef CCAN_CHECK_TYPE_H
3
+ #define CCAN_CHECK_TYPE_H
4
+
5
+ /**
6
+ * check_type - issue a warning or build failure if type is not correct.
7
+ * @expr: the expression whose type we should check (not evaluated).
8
+ * @type: the exact type we expect the expression to be.
9
+ *
10
+ * This macro is usually used within other macros to try to ensure that a macro
11
+ * argument is of the expected type. No type promotion of the expression is
12
+ * done: an unsigned int is not the same as an int!
13
+ *
14
+ * check_type() always evaluates to 0.
15
+ *
16
+ * If your compiler does not support typeof, then the best we can do is fail
17
+ * to compile if the sizes of the types are unequal (a less complete check).
18
+ *
19
+ * Example:
20
+ * // They should always pass a 64-bit value to _set_some_value!
21
+ * #define set_some_value(expr) \
22
+ * _set_some_value((check_type((expr), uint64_t), (expr)))
23
+ */
24
+
25
+ /**
26
+ * check_types_match - issue a warning or build failure if types are not same.
27
+ * @expr1: the first expression (not evaluated).
28
+ * @expr2: the second expression (not evaluated).
29
+ *
30
+ * This macro is usually used within other macros to try to ensure that
31
+ * arguments are of identical types. No type promotion of the expressions is
32
+ * done: an unsigned int is not the same as an int!
33
+ *
34
+ * check_types_match() always evaluates to 0.
35
+ *
36
+ * If your compiler does not support typeof, then the best we can do is fail
37
+ * to compile if the sizes of the types are unequal (a less complete check).
38
+ *
39
+ * Example:
40
+ * // Do subtraction to get to enclosing type, but make sure that
41
+ * // pointer is of correct type for that member.
42
+ * #define container_of(mbr_ptr, encl_type, mbr) \
43
+ * (check_types_match((mbr_ptr), &((encl_type *)0)->mbr), \
44
+ * ((encl_type *) \
45
+ * ((char *)(mbr_ptr) - offsetof(enclosing_type, mbr))))
46
+ */
47
+ #if HAVE_TYPEOF
48
+ #define check_type(expr, type) \
49
+ ((typeof(expr) *)0 != (type *)0)
50
+
51
+ #define check_types_match(expr1, expr2) \
52
+ ((typeof(expr1) *)0 != (typeof(expr2) *)0)
53
+ #else
54
+ #include "ccan/build_assert/build_assert.h"
55
+ /* Without typeof, we can only test the sizes. */
56
+ #define check_type(expr, type) \
57
+ BUILD_ASSERT_OR_ZERO(sizeof(expr) == sizeof(type))
58
+
59
+ #define check_types_match(expr1, expr2) \
60
+ BUILD_ASSERT_OR_ZERO(sizeof(expr1) == sizeof(expr2))
61
+ #endif /* HAVE_TYPEOF */
62
+
63
+ #endif /* CCAN_CHECK_TYPE_H */
@@ -0,0 +1,142 @@
1
+ /* CC0 (Public domain) - see ccan/licenses/CC0 file for details */
2
+ #ifndef CCAN_CONTAINER_OF_H
3
+ #define CCAN_CONTAINER_OF_H
4
+ #include "ccan/check_type/check_type.h"
5
+
6
+ /**
7
+ * container_of - get pointer to enclosing structure
8
+ * @member_ptr: pointer to the structure member
9
+ * @containing_type: the type this member is within
10
+ * @member: the name of this member within the structure.
11
+ *
12
+ * Given a pointer to a member of a structure, this macro does pointer
13
+ * subtraction to return the pointer to the enclosing type.
14
+ *
15
+ * Example:
16
+ * struct foo {
17
+ * int fielda, fieldb;
18
+ * // ...
19
+ * };
20
+ * struct info {
21
+ * int some_other_field;
22
+ * struct foo my_foo;
23
+ * };
24
+ *
25
+ * static struct info *foo_to_info(struct foo *foo)
26
+ * {
27
+ * return container_of(foo, struct info, my_foo);
28
+ * }
29
+ */
30
+ #define container_of(member_ptr, containing_type, member) \
31
+ ((containing_type *) \
32
+ ((char *)(member_ptr) \
33
+ - container_off(containing_type, member)) \
34
+ + check_types_match(*(member_ptr), ((containing_type *)0)->member))
35
+
36
+
37
+ /**
38
+ * container_of_or_null - get pointer to enclosing structure, or NULL
39
+ * @member_ptr: pointer to the structure member
40
+ * @containing_type: the type this member is within
41
+ * @member: the name of this member within the structure.
42
+ *
43
+ * Given a pointer to a member of a structure, this macro does pointer
44
+ * subtraction to return the pointer to the enclosing type, unless it
45
+ * is given NULL, in which case it also returns NULL.
46
+ *
47
+ * Example:
48
+ * struct foo {
49
+ * int fielda, fieldb;
50
+ * // ...
51
+ * };
52
+ * struct info {
53
+ * int some_other_field;
54
+ * struct foo my_foo;
55
+ * };
56
+ *
57
+ * static struct info *foo_to_info_allowing_null(struct foo *foo)
58
+ * {
59
+ * return container_of_or_null(foo, struct info, my_foo);
60
+ * }
61
+ */
62
+ static inline char *container_of_or_null_(void *member_ptr, size_t offset)
63
+ {
64
+ return member_ptr ? (char *)member_ptr - offset : NULL;
65
+ }
66
+ #define container_of_or_null(member_ptr, containing_type, member) \
67
+ ((containing_type *) \
68
+ container_of_or_null_(member_ptr, \
69
+ container_off(containing_type, member)) \
70
+ + check_types_match(*(member_ptr), ((containing_type *)0)->member))
71
+
72
+ /**
73
+ * container_off - get offset to enclosing structure
74
+ * @containing_type: the type this member is within
75
+ * @member: the name of this member within the structure.
76
+ *
77
+ * Given a pointer to a member of a structure, this macro does
78
+ * typechecking and figures out the offset to the enclosing type.
79
+ *
80
+ * Example:
81
+ * struct foo {
82
+ * int fielda, fieldb;
83
+ * // ...
84
+ * };
85
+ * struct info {
86
+ * int some_other_field;
87
+ * struct foo my_foo;
88
+ * };
89
+ *
90
+ * static struct info *foo_to_info(struct foo *foo)
91
+ * {
92
+ * size_t off = container_off(struct info, my_foo);
93
+ * return (void *)((char *)foo - off);
94
+ * }
95
+ */
96
+ #define container_off(containing_type, member) \
97
+ offsetof(containing_type, member)
98
+
99
+ /**
100
+ * container_of_var - get pointer to enclosing structure using a variable
101
+ * @member_ptr: pointer to the structure member
102
+ * @container_var: a pointer of same type as this member's container
103
+ * @member: the name of this member within the structure.
104
+ *
105
+ * Given a pointer to a member of a structure, this macro does pointer
106
+ * subtraction to return the pointer to the enclosing type.
107
+ *
108
+ * Example:
109
+ * static struct info *foo_to_i(struct foo *foo)
110
+ * {
111
+ * struct info *i = container_of_var(foo, i, my_foo);
112
+ * return i;
113
+ * }
114
+ */
115
+ #if HAVE_TYPEOF
116
+ #define container_of_var(member_ptr, container_var, member) \
117
+ container_of(member_ptr, typeof(*container_var), member)
118
+ #else
119
+ #define container_of_var(member_ptr, container_var, member) \
120
+ ((void *)((char *)(member_ptr) - \
121
+ container_off_var(container_var, member)))
122
+ #endif
123
+
124
+ /**
125
+ * container_off_var - get offset of a field in enclosing structure
126
+ * @container_var: a pointer to a container structure
127
+ * @member: the name of a member within the structure.
128
+ *
129
+ * Given (any) pointer to a structure and a its member name, this
130
+ * macro does pointer subtraction to return offset of member in a
131
+ * structure memory layout.
132
+ *
133
+ */
134
+ #if HAVE_TYPEOF
135
+ #define container_off_var(var, member) \
136
+ container_off(typeof(*var), member)
137
+ #else
138
+ #define container_off_var(var, member) \
139
+ ((const char *)&(var)->member - (const char *)(var))
140
+ #endif
141
+
142
+ #endif /* CCAN_CONTAINER_OF_H */
@@ -0,0 +1,635 @@
1
+ /* Licensed under BSD-MIT - see ccan/licenses/BSD-MIT file for details */
2
+ #ifndef CCAN_LIST_H
3
+ #define CCAN_LIST_H
4
+ #include <assert.h>
5
+ #include "ccan/str/str.h"
6
+ #include "ccan/container_of/container_of.h"
7
+ #include "ccan/check_type/check_type.h"
8
+
9
+ /**
10
+ * struct list_node - an entry in a doubly-linked list
11
+ * @next: next entry (self if empty)
12
+ * @prev: previous entry (self if empty)
13
+ *
14
+ * This is used as an entry in a linked list.
15
+ * Example:
16
+ * struct child {
17
+ * const char *name;
18
+ * // Linked list of all us children.
19
+ * struct list_node list;
20
+ * };
21
+ */
22
+ struct list_node
23
+ {
24
+ struct list_node *next, *prev;
25
+ };
26
+
27
+ /**
28
+ * struct list_head - the head of a doubly-linked list
29
+ * @h: the list_head (containing next and prev pointers)
30
+ *
31
+ * This is used as the head of a linked list.
32
+ * Example:
33
+ * struct parent {
34
+ * const char *name;
35
+ * struct list_head children;
36
+ * unsigned int num_children;
37
+ * };
38
+ */
39
+ struct list_head
40
+ {
41
+ struct list_node n;
42
+ };
43
+
44
+ #define LIST_LOC __FILE__ ":" stringify(__LINE__)
45
+ #define list_debug(h, loc) (h)
46
+ #define list_debug_node(n, loc) (n)
47
+
48
+ /**
49
+ * LIST_HEAD_INIT - initializer for an empty list_head
50
+ * @name: the name of the list.
51
+ *
52
+ * Explicit initializer for an empty list.
53
+ *
54
+ * See also:
55
+ * LIST_HEAD, list_head_init()
56
+ *
57
+ * Example:
58
+ * static struct list_head my_list = LIST_HEAD_INIT(my_list);
59
+ */
60
+ #define LIST_HEAD_INIT(name) { { &name.n, &name.n } }
61
+
62
+ /**
63
+ * LIST_HEAD - define and initialize an empty list_head
64
+ * @name: the name of the list.
65
+ *
66
+ * The LIST_HEAD macro defines a list_head and initializes it to an empty
67
+ * list. It can be prepended by "static" to define a static list_head.
68
+ *
69
+ * See also:
70
+ * LIST_HEAD_INIT, list_head_init()
71
+ *
72
+ * Example:
73
+ * static LIST_HEAD(my_global_list);
74
+ */
75
+ #define LIST_HEAD(name) \
76
+ struct list_head name = LIST_HEAD_INIT(name)
77
+
78
+ /**
79
+ * list_head_init - initialize a list_head
80
+ * @h: the list_head to set to the empty list
81
+ *
82
+ * Example:
83
+ * ...
84
+ * struct parent *parent = malloc(sizeof(*parent));
85
+ *
86
+ * list_head_init(&parent->children);
87
+ * parent->num_children = 0;
88
+ */
89
+ static inline void list_head_init(struct list_head *h)
90
+ {
91
+ h->n.next = h->n.prev = &h->n;
92
+ }
93
+
94
+ /**
95
+ * list_node_init - initialize a list_node
96
+ * @n: the list_node to link to itself.
97
+ *
98
+ * You don't need to use this normally! But it lets you list_del(@n)
99
+ * safely.
100
+ */
101
+ static inline void list_node_init(struct list_node *n)
102
+ {
103
+ n->next = n->prev = n;
104
+ }
105
+
106
+ /**
107
+ * list_add - add an entry at the start of a linked list.
108
+ * @h: the list_head to add the node to
109
+ * @n: the list_node to add to the list.
110
+ *
111
+ * The list_node does not need to be initialized; it will be overwritten.
112
+ * Example:
113
+ * struct child *child = malloc(sizeof(*child));
114
+ *
115
+ * child->name = "marvin";
116
+ * list_add(&parent->children, &child->list);
117
+ * parent->num_children++;
118
+ */
119
+ #define list_add(h, n) list_add_(h, n, LIST_LOC)
120
+ static inline void list_add_(struct list_head *h,
121
+ struct list_node *n,
122
+ const char *abortstr)
123
+ {
124
+ n->next = h->n.next;
125
+ n->prev = &h->n;
126
+ h->n.next->prev = n;
127
+ h->n.next = n;
128
+ (void)list_debug(h, abortstr);
129
+ }
130
+
131
+ /**
132
+ * list_add_tail - add an entry at the end of a linked list.
133
+ * @h: the list_head to add the node to
134
+ * @n: the list_node to add to the list.
135
+ *
136
+ * The list_node does not need to be initialized; it will be overwritten.
137
+ * Example:
138
+ * list_add_tail(&parent->children, &child->list);
139
+ * parent->num_children++;
140
+ */
141
+ #define list_add_tail(h, n) list_add_tail_(h, n, LIST_LOC)
142
+ static inline void list_add_tail_(struct list_head *h,
143
+ struct list_node *n,
144
+ const char *abortstr)
145
+ {
146
+ n->next = &h->n;
147
+ n->prev = h->n.prev;
148
+ h->n.prev->next = n;
149
+ h->n.prev = n;
150
+ (void)list_debug(h, abortstr);
151
+ }
152
+
153
+ /**
154
+ * list_empty - is a list empty?
155
+ * @h: the list_head
156
+ *
157
+ * If the list is empty, returns true.
158
+ *
159
+ * Example:
160
+ * assert(list_empty(&parent->children) == (parent->num_children == 0));
161
+ */
162
+ #define list_empty(h) list_empty_(h, LIST_LOC)
163
+ static inline int list_empty_(const struct list_head *h, const char* abortstr)
164
+ {
165
+ (void)list_debug(h, abortstr);
166
+ return h->n.next == &h->n;
167
+ }
168
+
169
+ /**
170
+ * list_empty_nodebug - is a list empty (and don't perform debug checks)?
171
+ * @h: the list_head
172
+ *
173
+ * If the list is empty, returns true.
174
+ * This differs from list_empty() in that if CCAN_LIST_DEBUG is set it
175
+ * will NOT perform debug checks. Only use this function if you REALLY
176
+ * know what you're doing.
177
+ *
178
+ * Example:
179
+ * assert(list_empty_nodebug(&parent->children) == (parent->num_children == 0));
180
+ */
181
+ #ifndef CCAN_LIST_DEBUG
182
+ #define list_empty_nodebug(h) list_empty(h)
183
+ #else
184
+ static inline int list_empty_nodebug(const struct list_head *h)
185
+ {
186
+ return h->n.next == &h->n;
187
+ }
188
+ #endif
189
+
190
+ /**
191
+ * list_del - delete an entry from an (unknown) linked list.
192
+ * @n: the list_node to delete from the list.
193
+ *
194
+ * Note that this leaves @n in an undefined state; it can be added to
195
+ * another list, but not deleted again.
196
+ *
197
+ * See also:
198
+ * list_del_from(), list_del_init()
199
+ *
200
+ * Example:
201
+ * list_del(&child->list);
202
+ * parent->num_children--;
203
+ */
204
+ #define list_del(n) list_del_(n, LIST_LOC)
205
+ static inline void list_del_(struct list_node *n, const char* abortstr)
206
+ {
207
+ (void)list_debug_node(n, abortstr);
208
+ n->next->prev = n->prev;
209
+ n->prev->next = n->next;
210
+ #ifdef CCAN_LIST_DEBUG
211
+ /* Catch use-after-del. */
212
+ n->next = n->prev = NULL;
213
+ #endif
214
+ }
215
+
216
+ /**
217
+ * list_del_init - delete a node, and reset it so it can be deleted again.
218
+ * @n: the list_node to be deleted.
219
+ *
220
+ * list_del(@n) or list_del_init() again after this will be safe,
221
+ * which can be useful in some cases.
222
+ *
223
+ * See also:
224
+ * list_del_from(), list_del()
225
+ *
226
+ * Example:
227
+ * list_del_init(&child->list);
228
+ * parent->num_children--;
229
+ */
230
+ #define list_del_init(n) list_del_init_(n, LIST_LOC)
231
+ static inline void list_del_init_(struct list_node *n, const char *abortstr)
232
+ {
233
+ list_del_(n, abortstr);
234
+ list_node_init(n);
235
+ }
236
+
237
+ /**
238
+ * list_del_from - delete an entry from a known linked list.
239
+ * @h: the list_head the node is in.
240
+ * @n: the list_node to delete from the list.
241
+ *
242
+ * This explicitly indicates which list a node is expected to be in,
243
+ * which is better documentation and can catch more bugs.
244
+ *
245
+ * See also: list_del()
246
+ *
247
+ * Example:
248
+ * list_del_from(&parent->children, &child->list);
249
+ * parent->num_children--;
250
+ */
251
+ static inline void list_del_from(struct list_head *h, struct list_node *n)
252
+ {
253
+ #ifdef CCAN_LIST_DEBUG
254
+ {
255
+ /* Thorough check: make sure it was in list! */
256
+ struct list_node *i;
257
+ for (i = h->n.next; i != n; i = i->next)
258
+ assert(i != &h->n);
259
+ }
260
+ #endif /* CCAN_LIST_DEBUG */
261
+
262
+ /* Quick test that catches a surprising number of bugs. */
263
+ assert(!list_empty(h));
264
+ list_del(n);
265
+ }
266
+
267
+ /**
268
+ * list_entry - convert a list_node back into the structure containing it.
269
+ * @n: the list_node
270
+ * @type: the type of the entry
271
+ * @member: the list_node member of the type
272
+ *
273
+ * Example:
274
+ * // First list entry is children.next; convert back to child.
275
+ * child = list_entry(parent->children.n.next, struct child, list);
276
+ *
277
+ * See Also:
278
+ * list_top(), list_for_each()
279
+ */
280
+ #define list_entry(n, type, member) container_of(n, type, member)
281
+
282
+ /**
283
+ * list_top - get the first entry in a list
284
+ * @h: the list_head
285
+ * @type: the type of the entry
286
+ * @member: the list_node member of the type
287
+ *
288
+ * If the list is empty, returns NULL.
289
+ *
290
+ * Example:
291
+ * struct child *first;
292
+ * first = list_top(&parent->children, struct child, list);
293
+ * if (!first)
294
+ * printf("Empty list!\n");
295
+ */
296
+ #define list_top(h, type, member) \
297
+ ((type *)list_top_((h), list_off_(type, member)))
298
+
299
+ static inline const void *list_top_(const struct list_head *h, size_t off)
300
+ {
301
+ if (list_empty(h))
302
+ return NULL;
303
+ return (const char *)h->n.next - off;
304
+ }
305
+
306
+ /**
307
+ * list_pop - remove the first entry in a list
308
+ * @h: the list_head
309
+ * @type: the type of the entry
310
+ * @member: the list_node member of the type
311
+ *
312
+ * If the list is empty, returns NULL.
313
+ *
314
+ * Example:
315
+ * struct child *one;
316
+ * one = list_pop(&parent->children, struct child, list);
317
+ * if (!one)
318
+ * printf("Empty list!\n");
319
+ */
320
+ #define list_pop(h, type, member) \
321
+ ((type *)list_pop_((h), list_off_(type, member)))
322
+
323
+ static inline const void *list_pop_(const struct list_head *h, size_t off)
324
+ {
325
+ struct list_node *n;
326
+
327
+ if (list_empty(h))
328
+ return NULL;
329
+ n = h->n.next;
330
+ list_del(n);
331
+ return (const char *)n - off;
332
+ }
333
+
334
+ /**
335
+ * list_tail - get the last entry in a list
336
+ * @h: the list_head
337
+ * @type: the type of the entry
338
+ * @member: the list_node member of the type
339
+ *
340
+ * If the list is empty, returns NULL.
341
+ *
342
+ * Example:
343
+ * struct child *last;
344
+ * last = list_tail(&parent->children, struct child, list);
345
+ * if (!last)
346
+ * printf("Empty list!\n");
347
+ */
348
+ #define list_tail(h, type, member) \
349
+ ((type *)list_tail_((h), list_off_(type, member)))
350
+
351
+ static inline const void *list_tail_(const struct list_head *h, size_t off)
352
+ {
353
+ if (list_empty(h))
354
+ return NULL;
355
+ return (const char *)h->n.prev - off;
356
+ }
357
+
358
+ /**
359
+ * list_for_each - iterate through a list.
360
+ * @h: the list_head (warning: evaluated multiple times!)
361
+ * @i: the structure containing the list_node
362
+ * @member: the list_node member of the structure
363
+ *
364
+ * This is a convenient wrapper to iterate @i over the entire list. It's
365
+ * a for loop, so you can break and continue as normal.
366
+ *
367
+ * Example:
368
+ * list_for_each(&parent->children, child, list)
369
+ * printf("Name: %s\n", child->name);
370
+ */
371
+ #define list_for_each(h, i, member) \
372
+ list_for_each_off(h, i, list_off_var_(i, member))
373
+
374
+ /**
375
+ * list_for_each_rev - iterate through a list backwards.
376
+ * @h: the list_head
377
+ * @i: the structure containing the list_node
378
+ * @member: the list_node member of the structure
379
+ *
380
+ * This is a convenient wrapper to iterate @i over the entire list. It's
381
+ * a for loop, so you can break and continue as normal.
382
+ *
383
+ * Example:
384
+ * list_for_each_rev(&parent->children, child, list)
385
+ * printf("Name: %s\n", child->name);
386
+ */
387
+ #define list_for_each_rev(h, i, member) \
388
+ for (i = container_of_var(list_debug(h, LIST_LOC)->n.prev, i, member); \
389
+ &i->member != &(h)->n; \
390
+ i = container_of_var(i->member.prev, i, member))
391
+
392
+ /**
393
+ * list_for_each_safe - iterate through a list, maybe during deletion
394
+ * @h: the list_head
395
+ * @i: the structure containing the list_node
396
+ * @nxt: the structure containing the list_node
397
+ * @member: the list_node member of the structure
398
+ *
399
+ * This is a convenient wrapper to iterate @i over the entire list. It's
400
+ * a for loop, so you can break and continue as normal. The extra variable
401
+ * @nxt is used to hold the next element, so you can delete @i from the list.
402
+ *
403
+ * Example:
404
+ * struct child *next;
405
+ * list_for_each_safe(&parent->children, child, next, list) {
406
+ * list_del(&child->list);
407
+ * parent->num_children--;
408
+ * }
409
+ */
410
+ #define list_for_each_safe(h, i, nxt, member) \
411
+ list_for_each_safe_off(h, i, nxt, list_off_var_(i, member))
412
+
413
+ /**
414
+ * list_next - get the next entry in a list
415
+ * @h: the list_head
416
+ * @i: a pointer to an entry in the list.
417
+ * @member: the list_node member of the structure
418
+ *
419
+ * If @i was the last entry in the list, returns NULL.
420
+ *
421
+ * Example:
422
+ * struct child *second;
423
+ * second = list_next(&parent->children, first, list);
424
+ * if (!second)
425
+ * printf("No second child!\n");
426
+ */
427
+ #define list_next(h, i, member) \
428
+ ((list_typeof(i))list_entry_or_null(list_debug(h, \
429
+ __FILE__ ":" stringify(__LINE__)), \
430
+ (i)->member.next, \
431
+ list_off_var_((i), member)))
432
+
433
+ /**
434
+ * list_prev - get the previous entry in a list
435
+ * @h: the list_head
436
+ * @i: a pointer to an entry in the list.
437
+ * @member: the list_node member of the structure
438
+ *
439
+ * If @i was the first entry in the list, returns NULL.
440
+ *
441
+ * Example:
442
+ * first = list_prev(&parent->children, second, list);
443
+ * if (!first)
444
+ * printf("Can't go back to first child?!\n");
445
+ */
446
+ #define list_prev(h, i, member) \
447
+ ((list_typeof(i))list_entry_or_null(list_debug(h, \
448
+ __FILE__ ":" stringify(__LINE__)), \
449
+ (i)->member.prev, \
450
+ list_off_var_((i), member)))
451
+
452
+ /**
453
+ * list_append_list - empty one list onto the end of another.
454
+ * @to: the list to append into
455
+ * @from: the list to empty.
456
+ *
457
+ * This takes the entire contents of @from and moves it to the end of
458
+ * @to. After this @from will be empty.
459
+ *
460
+ * Example:
461
+ * struct list_head adopter;
462
+ *
463
+ * list_append_list(&adopter, &parent->children);
464
+ * assert(list_empty(&parent->children));
465
+ * parent->num_children = 0;
466
+ */
467
+ #define list_append_list(t, f) list_append_list_(t, f, \
468
+ __FILE__ ":" stringify(__LINE__))
469
+ static inline void list_append_list_(struct list_head *to,
470
+ struct list_head *from,
471
+ const char *abortstr)
472
+ {
473
+ struct list_node *from_tail = list_debug(from, abortstr)->n.prev;
474
+ struct list_node *to_tail = list_debug(to, abortstr)->n.prev;
475
+
476
+ /* Sew in head and entire list. */
477
+ to->n.prev = from_tail;
478
+ from_tail->next = &to->n;
479
+ to_tail->next = &from->n;
480
+ from->n.prev = to_tail;
481
+
482
+ /* Now remove head. */
483
+ list_del(&from->n);
484
+ list_head_init(from);
485
+ }
486
+
487
+ /**
488
+ * list_prepend_list - empty one list into the start of another.
489
+ * @to: the list to prepend into
490
+ * @from: the list to empty.
491
+ *
492
+ * This takes the entire contents of @from and moves it to the start
493
+ * of @to. After this @from will be empty.
494
+ *
495
+ * Example:
496
+ * list_prepend_list(&adopter, &parent->children);
497
+ * assert(list_empty(&parent->children));
498
+ * parent->num_children = 0;
499
+ */
500
+ #define list_prepend_list(t, f) list_prepend_list_(t, f, LIST_LOC)
501
+ static inline void list_prepend_list_(struct list_head *to,
502
+ struct list_head *from,
503
+ const char *abortstr)
504
+ {
505
+ struct list_node *from_tail = list_debug(from, abortstr)->n.prev;
506
+ struct list_node *to_head = list_debug(to, abortstr)->n.next;
507
+
508
+ /* Sew in head and entire list. */
509
+ to->n.next = &from->n;
510
+ from->n.prev = &to->n;
511
+ to_head->prev = from_tail;
512
+ from_tail->next = to_head;
513
+
514
+ /* Now remove head. */
515
+ list_del(&from->n);
516
+ list_head_init(from);
517
+ }
518
+
519
+ /**
520
+ * list_for_each_off - iterate through a list of memory regions.
521
+ * @h: the list_head
522
+ * @i: the pointer to a memory region wich contains list node data.
523
+ * @off: offset(relative to @i) at which list node data resides.
524
+ *
525
+ * This is a low-level wrapper to iterate @i over the entire list, used to
526
+ * implement all oher, more high-level, for-each constructs. It's a for loop,
527
+ * so you can break and continue as normal.
528
+ *
529
+ * WARNING! Being the low-level macro that it is, this wrapper doesn't know
530
+ * nor care about the type of @i. The only assumtion made is that @i points
531
+ * to a chunk of memory that at some @offset, relative to @i, contains a
532
+ * properly filled `struct node_list' which in turn contains pointers to
533
+ * memory chunks and it's turtles all the way down. Whith all that in mind
534
+ * remember that given the wrong pointer/offset couple this macro will
535
+ * happilly churn all you memory untill SEGFAULT stops it, in other words
536
+ * caveat emptor.
537
+ *
538
+ * It is worth mentioning that one of legitimate use-cases for that wrapper
539
+ * is operation on opaque types with known offset for `struct list_node'
540
+ * member(preferably 0), because it allows you not to disclose the type of
541
+ * @i.
542
+ *
543
+ * Example:
544
+ * list_for_each_off(&parent->children, child,
545
+ * offsetof(struct child, list))
546
+ * printf("Name: %s\n", child->name);
547
+ */
548
+ #define list_for_each_off(h, i, off) \
549
+ for (i = list_node_to_off_(list_debug(h, LIST_LOC)->n.next, \
550
+ (off)); \
551
+ list_node_from_off_((void *)i, (off)) != &(h)->n; \
552
+ i = list_node_to_off_(list_node_from_off_((void *)i, (off))->next, \
553
+ (off)))
554
+
555
+ /**
556
+ * list_for_each_safe_off - iterate through a list of memory regions, maybe
557
+ * during deletion
558
+ * @h: the list_head
559
+ * @i: the pointer to a memory region wich contains list node data.
560
+ * @nxt: the structure containing the list_node
561
+ * @off: offset(relative to @i) at which list node data resides.
562
+ *
563
+ * For details see `list_for_each_off' and `list_for_each_safe'
564
+ * descriptions.
565
+ *
566
+ * Example:
567
+ * list_for_each_safe_off(&parent->children, child,
568
+ * next, offsetof(struct child, list))
569
+ * printf("Name: %s\n", child->name);
570
+ */
571
+ #define list_for_each_safe_off(h, i, nxt, off) \
572
+ for (i = list_node_to_off_(list_debug(h, LIST_LOC)->n.next, \
573
+ (off)), \
574
+ nxt = list_node_to_off_(list_node_from_off_(i, (off))->next, \
575
+ (off)); \
576
+ list_node_from_off_(i, (off)) != &(h)->n; \
577
+ i = nxt, \
578
+ nxt = list_node_to_off_(list_node_from_off_(i, (off))->next, \
579
+ (off)))
580
+
581
+
582
+ /* Other -off variants. */
583
+ #define list_entry_off(n, type, off) \
584
+ ((type *)list_node_from_off_((n), (off)))
585
+
586
+ #define list_head_off(h, type, off) \
587
+ ((type *)list_head_off((h), (off)))
588
+
589
+ #define list_tail_off(h, type, off) \
590
+ ((type *)list_tail_((h), (off)))
591
+
592
+ #define list_add_off(h, n, off) \
593
+ list_add((h), list_node_from_off_((n), (off)))
594
+
595
+ #define list_del_off(n, off) \
596
+ list_del(list_node_from_off_((n), (off)))
597
+
598
+ #define list_del_from_off(h, n, off) \
599
+ list_del_from(h, list_node_from_off_((n), (off)))
600
+
601
+ /* Offset helper functions so we only single-evaluate. */
602
+ static inline void *list_node_to_off_(struct list_node *node, size_t off)
603
+ {
604
+ return (void *)((char *)node - off);
605
+ }
606
+ static inline struct list_node *list_node_from_off_(void *ptr, size_t off)
607
+ {
608
+ return (struct list_node *)((char *)ptr + off);
609
+ }
610
+
611
+ /* Get the offset of the member, but make sure it's a list_node. */
612
+ #define list_off_(type, member) \
613
+ (container_off(type, member) + \
614
+ check_type(((type *)0)->member, struct list_node))
615
+
616
+ #define list_off_var_(var, member) \
617
+ (container_off_var(var, member) + \
618
+ check_type(var->member, struct list_node))
619
+
620
+ #if HAVE_TYPEOF
621
+ #define list_typeof(var) typeof(var)
622
+ #else
623
+ #define list_typeof(var) void *
624
+ #endif
625
+
626
+ /* Returns member, or NULL if at end of list. */
627
+ static inline void *list_entry_or_null(const struct list_head *h,
628
+ const struct list_node *n,
629
+ size_t off)
630
+ {
631
+ if (n == &h->n)
632
+ return NULL;
633
+ return (char *)n - off;
634
+ }
635
+ #endif /* CCAN_LIST_H */