(rawList, limit, allowVoid)
| 1059 | return parts; |
| 1060 | } |
| 1061 | function parse(rawList, limit, allowVoid) { // main parser |
| 1062 | limit = limit || Infinity; |
| 1063 | var ret = '', list = []; |
| 1064 | function flushList() { |
| 1065 | return '(' + list.join(', ') + ')'; |
| 1066 | } |
| 1067 | var name; |
| 1068 | if (func[i] === 'N') { |
| 1069 | // namespaced N-E |
| 1070 | name = parseNested().join('::'); |
| 1071 | limit--; |
| 1072 | if (limit === 0) return rawList ? [name] : name; |
| 1073 | } else { |
| 1074 | // not namespaced |
| 1075 | if (func[i] === 'K' || (first && func[i] === 'L')) i++; // ignore const and first 'L' |
| 1076 | var size = parseInt(func.substr(i)); |
| 1077 | if (size) { |
| 1078 | var pre = size.toString().length; |
| 1079 | name = func.substr(i + pre, size); |
| 1080 | i += pre + size; |
| 1081 | } |
| 1082 | } |
| 1083 | first = false; |
| 1084 | if (func[i] === 'I') { |
| 1085 | i++; |
| 1086 | var iList = parse(true); |
| 1087 | var iRet = parse(true, 1, true); |
| 1088 | ret += iRet[0] + ' ' + name + '<' + iList.join(', ') + '>'; |
| 1089 | } else { |
| 1090 | ret = name; |
| 1091 | } |
| 1092 | paramLoop: while (i < func.length && limit-- > 0) { |
| 1093 | //dump('paramLoop'); |
| 1094 | var c = func[i++]; |
| 1095 | if (c in basicTypes) { |
| 1096 | list.push(basicTypes[c]); |
| 1097 | } else { |
| 1098 | switch (c) { |
| 1099 | case 'P': list.push(parse(true, 1, true)[0] + '*'); break; // pointer |
| 1100 | case 'R': list.push(parse(true, 1, true)[0] + '&'); break; // reference |
| 1101 | case 'L': { // literal |
| 1102 | i++; // skip basic type |
| 1103 | var end = func.indexOf('E', i); |
| 1104 | var size = end - i; |
| 1105 | list.push(func.substr(i, size)); |
| 1106 | i += size + 2; // size + 'EE' |
| 1107 | break; |
| 1108 | } |
| 1109 | case 'A': { // array |
| 1110 | var size = parseInt(func.substr(i)); |
| 1111 | i += size.toString().length; |
| 1112 | if (func[i] !== '_') throw '?'; |
| 1113 | i++; // skip _ |
| 1114 | list.push(parse(true, 1, true)[0] + ' [' + size + ']'); |
| 1115 | break; |
| 1116 | } |
| 1117 | case 'E': break paramLoop; |
| 1118 | default: ret += '?' + c; break paramLoop; |
no test coverage detected