summaryrefslogtreecommitdiffstats
path: root/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/documentation/threads.txt
diff options
context:
space:
mode:
Diffstat (limited to 'debian/uncrustify-trinity/uncrustify-trinity-0.75.0/documentation/threads.txt')
-rw-r--r--debian/uncrustify-trinity/uncrustify-trinity-0.75.0/documentation/threads.txt111
1 files changed, 111 insertions, 0 deletions
diff --git a/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/documentation/threads.txt b/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/documentation/threads.txt
new file mode 100644
index 00000000..f6ed4edd
--- /dev/null
+++ b/debian/uncrustify-trinity/uncrustify-trinity-0.75.0/documentation/threads.txt
@@ -0,0 +1,111 @@
+
+Notes on how to deal with the wicked corner case that is C/C++
+preprocessor #if magic. None of this is actually implemented.
+
+Languages not affected:
+ - D
+ - Java
+ - ECMA (Java Script)
+
+Langauges affected:
+ - C
+ - C++
+ - C#
+ - Vala
+ - Pawn
+ - Objective C/C++
+
+
+Threads of code are created for functions that navigate the tokens.
+There is the master list of the raw tokens parsed out.
+
+There is at least one thread, which, in the absense of any #if statements, is
+the same as the raw token list.
+
+In the threads, a BARRIER is placed where ever code cannot move past.
+This represents and #if or #else statement.
+Normally, the barriers are skipped when navigating code. Only when removing a
+newline does the code need to check for a barrier.
+
+For #if statements without an #else, there is an implicit #else added that contains
+nothing.
+
+// example 1
+a
+#if X
+b
+#endif
+c
+
+Thread
+ #if #endif
+ V V
+0 - a -+- b -+- c
+ | |
+1 +-----+ <- empty else path (ie, for '#if 0')
+
+Max depth = 2
+
+
+// example 2
+a
+#if X
+b
+#else
+c
+#endif
+d
+ #if #endif
+ V V
+0 - a -+- b -+- d
+ | |
+1 +- c -+ <- else path
+
+Max depth = 2
+
+
+// example 3
+a
+#if X
+b
+#elif Y
+c
+#elif Z
+d
+#else
+e
+#endif
+f
+#if A
+g
+#endif
+h
+ #if X #endif #if A
+ V V V
+0 - a -+- b -+- f -----------+- g -+- h
+ | | | |
+1 +- c -+ <- elif Y +-----+ <- empty else
+ | |
+2 +- d -+ <- elif Z
+ | |
+3 +- e -+ <- else
+
+Max depth = 4
+
+The detection routines need to be executed once for each thread, up to the maximum
+thread depth. Note that the typical maximum thread depth is going to be 2-3.
+
+0 - a - b - f - g - h
+1 - a - c - f ----- h
+2 - a - d - f - g - h
+3 - a - e - f - g - h
+
+The general rule is that if the current thread exceed the max, thread 0 is used.
+
+Identification is the primary use for the threads.
+The secondary use is indentation. The indentation of each token at each thread
+level is recorded.
+The maximum indentation for the token is used, assuming the thread is without
+error. ('#if 0' commented out code that is bad may not be handled.)
+
+I won't know if this will work for sure until I try it.