diff --git a/bin/mkpeep.pike b/bin/mkpeep.pike index fa010c6d7f7435a6c7babe4e7f5508d5b2031ff6..da13252d343db38bf1fa476147e95b33fd570e1a 100755 --- a/bin/mkpeep.pike +++ b/bin/mkpeep.pike @@ -314,8 +314,32 @@ class Switch(string test) { ret += sprintf("%*nswitch(%s)\n", ind, test); ret += sprintf("%*n{\n", ind); + mapping(string:array(string)) rev = ([]); + foreach(sort(indices(cases)), string c) + { + if(`+(@cases[c]->is_switch)) continue; + string code = cases[c]->get_string(0)*""; + while( sscanf(code, "%s/*%*s*/%s", code, string tail)==3 ) + code = code+tail; + rev[ code ] += ({ c }); + } + mapping(string:array(string)) alias = ([]); + foreach(rev;; array(string) cs) + { + if( sizeof(cs)>1 ) + { + alias[cs[0]] = cs[1..]; + foreach(cs[1..], string c) + m_delete(cases, c); + } + } + foreach(sort(indices(cases)), string c) { ret += sprintf("%*ncase %s:\n", ind, c); + if( alias[c] ) + foreach( alias[c], string c ) + ret += sprintf("%*ncase %s:\n", ind, c); + foreach(cases[c], object(Switch)|object(Breakable) b) ret += b->get_string([int(0..)](ind+2)); ret += sprintf("%*n break;\n"