diff options
author | wtschueller <wtschueller@users.noreply.github.com> | 2014-06-18 19:37:44 (GMT) |
---|---|---|
committer | wtschueller <wtschueller@users.noreply.github.com> | 2014-06-18 19:37:44 (GMT) |
commit | 2984dad86558b4a81e11ce07485057e3903a9304 (patch) | |
tree | 09f0cf74742615ea677f9b5baf96ae49f4ce5343 | |
parent | 9d24b488add8b4c7c689f58a095184a6ed85e9f1 (diff) | |
download | Doxygen-2984dad86558b4a81e11ce07485057e3903a9304.zip Doxygen-2984dad86558b4a81e11ce07485057e3903a9304.tar.gz Doxygen-2984dad86558b4a81e11ce07485057e3903a9304.tar.bz2 |
Tcl: support switch command
--HG--
extra : rebase_source : f516669986006db5aca6af6417f323e57fa848d1
-rw-r--r-- | src/tclscanner.l | 183 | ||||
-rw-r--r-- | testing/060/060__command__switch_8tcl.xml | 358 | ||||
-rw-r--r-- | testing/060_command_switch.tcl | 238 |
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 + |