summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwtschueller <wtschueller@users.noreply.github.com>2014-06-18 19:37:44 (GMT)
committerwtschueller <wtschueller@users.noreply.github.com>2014-06-18 19:37:44 (GMT)
commit2984dad86558b4a81e11ce07485057e3903a9304 (patch)
tree09f0cf74742615ea677f9b5baf96ae49f4ce5343
parent9d24b488add8b4c7c689f58a095184a6ed85e9f1 (diff)
downloadDoxygen-2984dad86558b4a81e11ce07485057e3903a9304.zip
Doxygen-2984dad86558b4a81e11ce07485057e3903a9304.tar.gz
Doxygen-2984dad86558b4a81e11ce07485057e3903a9304.tar.bz2
Tcl: support switch command
--HG-- extra : rebase_source : f516669986006db5aca6af6417f323e57fa848d1
-rw-r--r--src/tclscanner.l183
-rw-r--r--testing/060/060__command__switch_8tcl.xml358
-rw-r--r--testing/060_command_switch.tcl238
3 files changed, 778 insertions, 1 deletions
diff --git a/src/tclscanner.l b/src/tclscanner.l
index 0f35122..f9878db 100644
--- a/src/tclscanner.l
+++ b/src/tclscanner.l
@@ -1837,6 +1837,181 @@ D
}
//! Handle internal tcl commands.
+// switch ?options? string pattern body ?pattern body ...?
+// switch ?options? string {pattern body ?pattern body ...?}
+static void tcl_command_SWITCH()
+{
+D
+ tcl_codify_cmd("keyword",0);
+ tcl_codify_cmd(NULL,1);
+ tcl_scan *myScan=NULL;
+ unsigned int i;
+ QCString token;
+ // first: find the last option token
+ unsigned int lastOptionIndex = 0;
+ for (i = 2; i<tcl.list_commandwords.count(); i += 2)
+ {
+ token = (*tcl.list_commandwords.at(i)).utf8();
+ if (token == "--")
+ {
+ lastOptionIndex = i;
+ break;
+ }
+ if (token[0] == '-' && i - lastOptionIndex == 2)
+ {
+ // options start with dash and should form a continuous chain
+ lastOptionIndex = i;
+ }
+ }
+ // second: eat up options
+ for (i = 2; i <= lastOptionIndex; i++)
+ {
+ myScan = tcl_command_ARG(myScan, i, false);
+ }
+ // third: how many tokens are left?
+ if (tcl.list_commandwords.count() - lastOptionIndex == 5)
+ {
+ //printf("syntax: switch ?options? string {pattern body ?pattern body ...?}\n");
+ myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false);
+ myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false);
+ myScan = tcl_command_ARG(myScan, lastOptionIndex + 3, false);
+ // walk trough the list step by step
+ // this way we can preserve whitespace
+ bool inBraces = false;
+ bool nextIsPattern = true;
+ int size;
+ const char *elem;
+ const char *next;
+ token = (*tcl.list_commandwords.at(lastOptionIndex + 4)).utf8();
+ if (token[0] == '{')
+ {
+ inBraces = true;
+ token = token.mid(1, token.length() - 2);
+ if (myScan!=NULL)
+ {
+ myScan->after << "NULL" << QCString("{");
+ }
+ else
+ {
+ tcl_codify(NULL,QCString("{"));
+ }
+ }
+ // ToDo: check if multibyte chars are handled correctly
+ while (token.length() > 0)
+ {
+ TclFindElement((const char*)token, token.length(), &elem, &next, &size, NULL);
+ //printf("%s\nstart=%d, elem=%d, next=%d, size=%d, brace=%d\n",
+ // (const char*) token, (const char*) token, elem, next, size, brace);
+ //
+ // handle leading whitespace/opening brace/double quotes
+ if (elem - token > 0)
+ {
+ if (myScan != NULL)
+ {
+ myScan->after << "NULL" << token.left(elem - token);
+ }
+ else
+ {
+ tcl_codify(NULL, token.left(elem - token));
+ }
+ }
+ // handle actual element without braces/double quotes
+ if (nextIsPattern)
+ {
+ if (myScan != NULL)
+ {
+ myScan->after << "NULL" << token.mid(elem - token,size);
+ }
+ else
+ {
+ tcl_codify(NULL,token.mid(elem - token, size));
+ }
+ //printf("pattern=%s\n",(const char*) token.mid(elem - token, size));
+ }
+ else {
+ if (myScan != NULL)
+ {
+ myScan->after << "script" << token.mid(elem - token, size);
+ }
+ else
+ {
+ myScan = tcl.scan.at(0);
+ myScan = tcl_scan_start('?', token.mid(elem - token, size),
+ myScan->ns, myScan->entry_cl, myScan->entry_fn);
+ }
+ //printf("script =%s\n", (const char*) token.mid(elem - token, size));
+ }
+ // handle trailing whitespace/closing brace/double quotes
+ if (next - elem - size > 0)
+ {
+ if (myScan != NULL)
+ {
+ myScan->after << "NULL" << token.mid(elem - token + size, next - elem - size);
+ }
+ else
+ {
+ tcl_codify(NULL, token.mid(elem - token + size, next - elem - size));
+ }
+ }
+ nextIsPattern = !nextIsPattern;
+ token = token.mid(next - token);
+ }
+ if (inBraces)
+ {
+ if (myScan != NULL)
+ {
+ myScan->after << "NULL" << QCString("}");
+ }
+ else
+ {
+ tcl_codify(NULL, QCString("}"));
+ }
+ }
+ if (!nextIsPattern)
+ {
+ tcl_war("Invalid switch syntax: last token is not a list of even elements.\n");
+ //tcl_war("%s\n", tcl.list_commandwords.join(" ").ascii());
+ }
+ }
+ else if ((tcl.list_commandwords.count() - lastOptionIndex > 6) &&
+ ((tcl.list_commandwords.count() - lastOptionIndex-3) % 4 == 0))
+ {
+ //printf("detected: switch ?options? string pattern body ?pattern body ...?\n");
+ myScan = tcl_command_ARG(myScan, lastOptionIndex + 1, false);
+ myScan = tcl_command_ARG(myScan, lastOptionIndex + 2, false);
+ //printf("value=%s\n",(const char*) (*tcl.list_commandwords.at(lastOptionIndex + 2)).utf8());
+ for (i = lastOptionIndex + 3; i < tcl.list_commandwords.count(); i += 4)
+ {
+ myScan = tcl_command_ARG(myScan, i + 0, false); // whitespace
+ myScan = tcl_command_ARG(myScan, i + 1, false); // pattern
+ myScan = tcl_command_ARG(myScan, i + 2, false); // whitespace
+ if (myScan != NULL) // script
+ {
+ myScan->after << "script" << tcl.list_commandwords[i+3];
+ }
+ else
+ {
+ myScan = tcl.scan.at(0);
+ myScan = tcl_scan_start('?', *tcl.list_commandwords.at(i+3),
+ myScan->ns, myScan->entry_cl, myScan->entry_fn);
+ }
+ //printf("pattern=%s\n",(const char*) (*tcl.list_commandwords.at(i+1)).utf8());
+ //printf("script=%s\n",(const char*) (*tcl.list_commandwords.at(i+3)).utf8());
+ }
+ }
+ else
+ {
+ // not properly detected syntax
+ tcl_war("Invalid switch syntax: %d options followed by %d tokens.\n",
+ lastOptionIndex / 2, (tcl.list_commandwords.count() - 1) / 2 - lastOptionIndex / 2);
+ for (i = lastOptionIndex + 1; i <= tcl.list_commandwords.count(); i++)
+ {
+ myScan = tcl_command_ARG(myScan, i, false);
+ }
+ }
+}
+
+//! Handle internal tcl commands.
// "catch script ?resultVarName? ?optionsVarName?"
static void tcl_command_CATCH()
{
@@ -2494,8 +2669,14 @@ tcl_inf("->\n");
}
/*
* Start of internal tcl keywords
- * Ready: eval, catch, if, for, foreach, while
+ * Ready: switch, eval, catch, if, for, foreach, while
*/
+ if (myStr=="switch")
+ {
+ if (tcl.list_commandwords.count() < 5) {myLine=__LINE__;goto command_warn;}
+ tcl_command_SWITCH();
+ goto command_end;
+ }
if (myStr=="eval")
{
if (tcl.list_commandwords.count() < 3) {myLine=__LINE__;goto command_warn;}
diff --git a/testing/060/060__command__switch_8tcl.xml b/testing/060/060__command__switch_8tcl.xml
new file mode 100644
index 0000000..d9424ef
--- /dev/null
+++ b/testing/060/060__command__switch_8tcl.xml
@@ -0,0 +1,358 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<doxygen xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="compound.xsd" version="">
+ <compounddef id="060__command__switch_8tcl" kind="file">
+ <compoundname>060_command_switch.tcl</compoundname>
+ <sectiondef kind="func">
+ <memberdef kind="function" id="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>Invoked</definition>
+ <argsstring>args</argsstring>
+ <name>Invoked</name>
+ <briefdescription>
+ <para>should be reference by every proc below </para>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="10" bodyend="13"/>
+ <referencedby refid="060__command__switch_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" compoundref="060__command__switch_8tcl" startline="22" endline="25">a</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a68bdb74c144118d936931c46f75d4b3e" compoundref="060__command__switch_8tcl" startline="29" endline="36">b</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" compoundref="060__command__switch_8tcl" startline="37" endline="43">c</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" compoundref="060__command__switch_8tcl" startline="44" endline="50">d</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" compoundref="060__command__switch_8tcl" startline="51" endline="57">e</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1af6830d2c644b45088ea8f1f74a46b778" compoundref="060__command__switch_8tcl" startline="58" endline="65">f</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" compoundref="060__command__switch_8tcl" startline="66" endline="73">g</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1af96fd0966e32a310a0778d2e5c357700" compoundref="060__command__switch_8tcl" startline="74" endline="81">h</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" compoundref="060__command__switch_8tcl" startline="83" endline="94">i</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a2aaa92757686acea102cba3475f0c13b" compoundref="060__command__switch_8tcl" startline="95" endline="106">j</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a20363f854eb4098a446733d63d34dbc1" compoundref="060__command__switch_8tcl" startline="107" endline="118">k</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1aff56f84b49947b84b2a304f51cf8e678" compoundref="060__command__switch_8tcl" startline="119" endline="129">l</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a78d127e8bda64d4471ac811ad512fbd9" compoundref="060__command__switch_8tcl" startline="130" endline="141">m</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1acdde3cd86eb2421ce8dbb2e85227d368" compoundref="060__command__switch_8tcl" startline="142" endline="153">n</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a495e7a4ede0831107e9d435080a7c268" compoundref="060__command__switch_8tcl" startline="154" endline="165">o</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a15229b450f26d8fa1c10bea4f3279f4d" compoundref="060__command__switch_8tcl" startline="166" endline="175">p</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1ab678a0a9a7e94bce5b17141f40220d88" compoundref="060__command__switch_8tcl" startline="176" endline="185">q</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a0a0bd3dc69dd06934c4e6362155e0ace" compoundref="060__command__switch_8tcl" startline="186" endline="195">r</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a011c73f2dbb87635a3b4206c72355f6e" compoundref="060__command__switch_8tcl" startline="196" endline="205">s</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a429306927a4581ad93fac620e605eec5" compoundref="060__command__switch_8tcl" startline="207" endline="210">x</referencedby>
+ <referencedby refid="060__command__switch_8tcl_1a32b6e5206a2cc75dbb8ed2eff74f5ce4" compoundref="060__command__switch_8tcl" startline="215" endline="229">y</referencedby>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a3f55465410c57ed00ab28827a741b1c3" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>NotInvoked</definition>
+ <argsstring>args</argsstring>
+ <name>NotInvoked</name>
+ <briefdescription>
+ <para>must not be reference by every proc below </para>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="16" bodyend="19"/>
+ <referencedby refid="060__command__switch_8tcl_1a32b6e5206a2cc75dbb8ed2eff74f5ce4" compoundref="060__command__switch_8tcl" startline="215" endline="229">y</referencedby>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1ab08ae027fc5777bc4f0629f1b60b35db" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>a</definition>
+ <argsstring>args</argsstring>
+ <name>a</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="22" bodyend="25"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a68bdb74c144118d936931c46f75d4b3e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>b</definition>
+ <argsstring>args</argsstring>
+ <name>b</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="29" bodyend="36"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1ab14f56bc3bd7680490ece4ad7815465f" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>c</definition>
+ <argsstring>args</argsstring>
+ <name>c</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="37" bodyend="43"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1af43f4b1f0064a33b2d662af9f06d3a00" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>d</definition>
+ <argsstring>args</argsstring>
+ <name>d</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="44" bodyend="50"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1aff65a51a703804e0ad1adbcfd76c86f8" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>e</definition>
+ <argsstring>args</argsstring>
+ <name>e</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="51" bodyend="57"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1af6830d2c644b45088ea8f1f74a46b778" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>f</definition>
+ <argsstring>args</argsstring>
+ <name>f</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="58" bodyend="65"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1af08b4b5bfa9edf0b0a7dee1c2b2c29e0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>g</definition>
+ <argsstring>args</argsstring>
+ <name>g</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="66" bodyend="73"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1af96fd0966e32a310a0778d2e5c357700" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>h</definition>
+ <argsstring>args</argsstring>
+ <name>h</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="74" bodyend="81"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a8c90afd4641b25be86bd09983c3cbee0" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>i</definition>
+ <argsstring>args</argsstring>
+ <name>i</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="83" bodyend="94"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a2aaa92757686acea102cba3475f0c13b" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>j</definition>
+ <argsstring>args</argsstring>
+ <name>j</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="95" bodyend="106"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a20363f854eb4098a446733d63d34dbc1" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>k</definition>
+ <argsstring>args</argsstring>
+ <name>k</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="107" bodyend="118"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1aff56f84b49947b84b2a304f51cf8e678" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>l</definition>
+ <argsstring>args</argsstring>
+ <name>l</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="119" bodyend="129"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a78d127e8bda64d4471ac811ad512fbd9" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>m</definition>
+ <argsstring>args</argsstring>
+ <name>m</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="130" bodyend="141"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1acdde3cd86eb2421ce8dbb2e85227d368" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>n</definition>
+ <argsstring>args</argsstring>
+ <name>n</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="142" bodyend="153"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a495e7a4ede0831107e9d435080a7c268" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>o</definition>
+ <argsstring>args</argsstring>
+ <name>o</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="154" bodyend="165"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a15229b450f26d8fa1c10bea4f3279f4d" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>p</definition>
+ <argsstring>args</argsstring>
+ <name>p</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="166" bodyend="175"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1ab678a0a9a7e94bce5b17141f40220d88" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>q</definition>
+ <argsstring>args</argsstring>
+ <name>q</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="176" bodyend="185"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a0a0bd3dc69dd06934c4e6362155e0ace" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>r</definition>
+ <argsstring>args</argsstring>
+ <name>r</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="186" bodyend="195"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a011c73f2dbb87635a3b4206c72355f6e" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>s</definition>
+ <argsstring>args</argsstring>
+ <name>s</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="196" bodyend="205"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a429306927a4581ad93fac620e605eec5" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>x</definition>
+ <argsstring>args</argsstring>
+ <name>x</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="207" bodyend="210"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ </memberdef>
+ <memberdef kind="function" id="060__command__switch_8tcl_1a32b6e5206a2cc75dbb8ed2eff74f5ce4" prot="public" static="no" const="no" explicit="no" inline="no" virt="non-virtual">
+ <type/>
+ <definition>y</definition>
+ <argsstring>args</argsstring>
+ <name>y</name>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <inbodydescription>
+ </inbodydescription>
+ <location file="060_command_switch.tcl" bodystart="215" bodyend="229"/>
+ <references refid="060__command__switch_8tcl_1aa889853547f65a22ae133cd57ff89601" compoundref="060__command__switch_8tcl" startline="10" endline="13">Invoked</references>
+ <references refid="060__command__switch_8tcl_1a3f55465410c57ed00ab28827a741b1c3" compoundref="060__command__switch_8tcl" startline="16" endline="19">NotInvoked</references>
+ </memberdef>
+ </sectiondef>
+ <briefdescription>
+ </briefdescription>
+ <detaileddescription>
+ </detaileddescription>
+ <location file="060_command_switch.tcl"/>
+ </compounddef>
+</doxygen>
diff --git a/testing/060_command_switch.tcl b/testing/060_command_switch.tcl
new file mode 100644
index 0000000..ab556d0
--- /dev/null
+++ b/testing/060_command_switch.tcl
@@ -0,0 +1,238 @@
+#// objective: tests processing of switch, only references/referencedby relations are relevant
+#// check: 060__command__switch_8tcl.xml
+#// config: REFERENCED_BY_RELATION = yes
+#// config: REFERENCES_RELATION = yes
+#// config: EXTRACT_ALL = yes
+#// config: INLINE_SOURCES = no
+
+##
+# \brief should be reference by every proc below
+proc Invoked args {
+ puts "Procedure \"Invoked\" is invoked indeed. Ok."
+ return $args
+}
+##
+# \brief must not be reference by every proc below
+proc NotInvoked args {
+ puts "Procedure \"NotInvoked\" is invoked. Not Ok!"
+ return $args
+}
+#
+# check if call references work at all
+proc a args {
+ Invoked NotInvoked
+ return
+}
+#
+# switch command
+# switch ?options? string pattern body ?pattern body ...?
+proc b args {
+ switch value NotInvoked {
+ } NotInvoked {
+ } default {
+ Invoked
+ }
+ return
+}
+proc c args {
+ switch value NotInvoked {
+ } [Invoked] {
+ } default {
+ }
+ return
+}
+proc d args {
+ switch NotInvoked pattern {
+ } [Invoked] {
+ } default {
+ }
+ return
+}
+proc e args {
+ switch [Invoked] pattern {
+ } NotInvoked {
+ } default {
+ }
+ return
+}
+proc f args {
+ switch -exact value pattern {
+ } NotInvoked {
+ } default {
+ Invoked
+ }
+ return
+}
+proc g args {
+ switch -exact -- value pattern {
+ } NotInvoked {
+ } default {
+ Invoked
+ }
+ return
+}
+proc h args {
+ switch -exact -- -value pattern {
+ } NotInvoked {
+ } default {
+ Invoked
+ }
+ return
+}
+# switch ?options? string {pattern body ?pattern body ...?}
+proc i args {
+ switch value {
+ NotInvoked {
+ }
+ NotInvoked {
+ }
+ default {
+ Invoked
+ }
+ }
+ return
+}
+proc j args {
+ switch vale {
+ NotInvoked {
+ }
+ [NotInvoked] {
+ }
+ default {
+ Invoked
+ }
+ }
+ return
+}
+proc k args {
+ switch NotInvoked {
+ [NotInvoked] {
+ }
+ NotInvoked {
+ Invoked
+ }
+ default {
+ }
+ }
+ return
+}
+proc l args {
+ switch [Invoked] {
+ pattern {
+ }
+ NotInvoked {
+ }
+ default {
+ }
+ }
+ return
+}
+proc m args {
+ switch -exact value {
+ pattern {
+ }
+ NotInvoked {
+ }
+ default {
+ Invoked
+ }
+ }
+ return
+}
+proc n args {
+ switch -exact -- value {
+ pattern {
+ }
+ NotInvoked {
+ }
+ default {
+ Invoked
+ }
+ }
+ return
+}
+proc o args {
+ switch -exact -- -value {
+ pattern {
+ }
+ NotInvoked {
+ }
+ default {
+ Invoked
+ }
+ }
+ return
+}
+proc p args {
+ switch -exact -- inquotes {
+ "inquotes" {
+ Invoked
+ }
+ default {
+ }
+ }
+ return
+}
+proc q args {
+ switch -exact -- "in quotes" {
+ "in quotes" {
+ Invoked
+ }
+ default {
+ }
+ }
+ return
+}
+proc r args {
+ switch -exact -- inbraces {
+ {inbraces} {
+ Invoked
+ }
+ default {
+ }
+ }
+ return
+}
+proc s args {
+ switch -exact -- {in braces} {
+ {in braces} {
+ Invoked
+ }
+ default {
+ }
+ }
+ return
+}
+# wrong syntax
+proc x args {
+ catch {switch -exact -- [Invoked] pattern1 NotInvoked pattern2}
+ return
+}
+# The current version does not check the last argument beforehand.
+# Therefore, all script elements are evaluated as scripts before
+# the parser detects the dangling pattern. It throws a warning, at the very least.
+# Anyway, for working code the documentation will be correct.
+proc y args {
+ catch {switch -exact -- [Invoked] {
+ pattern {
+ NotInvoked
+ }
+ NotInvoked {
+ NotInvoked
+ }
+ default {
+ NotInvoked
+ }
+ pattern
+ }}
+ return
+}
+#
+# call all single letter procs
+# let tcl check what is called and what is not called
+foreach p [info procs ?] {
+ puts "Check procedure \"$p\""
+ $p
+}
+exit
+