| 1146 | } |
| 1147 | |
| 1148 | void looplist(char *list, char *varlist, char *body, bool withi) |
| 1149 | { |
| 1150 | vector<char *> vars; |
| 1151 | explodelist(varlist, vars); |
| 1152 | if(vars.length() < 1) return; |
| 1153 | int columns = vars.length(); |
| 1154 | if(withi) vars.add(newstring("i")); |
| 1155 | vector<ident *> ids; |
| 1156 | bool ok = true; |
| 1157 | loopv(vars) if(ids.add(newident(vars[i]))->type != ID_ALIAS) { conoutf("looplist error: \"%s\" is readonly", vars[i]); ok = false; } |
| 1158 | if(ok) |
| 1159 | { |
| 1160 | int ii = 0; |
| 1161 | vector<char *> elems; |
| 1162 | explodelist(list, elems); |
| 1163 | loopv(ids) pushident(*ids[i], newstring("")); |
| 1164 | loop_level++; |
| 1165 | if(elems.length() / columns > CSLIMIT_ITERATION) cslimiterr("loop iterations"); |
| 1166 | else for(int i = 0; i <= elems.length() - columns; i += columns) |
| 1167 | { |
| 1168 | loopj(vars.length()) |
| 1169 | { |
| 1170 | if(ids[j]->action != ids[j]->executing) delete[] ids[j]->action; |
| 1171 | if(j < columns) |
| 1172 | { |
| 1173 | ids[j]->action = elems[i + j]; |
| 1174 | elems[i + j] = NULL; |
| 1175 | } |
| 1176 | else |
| 1177 | { |
| 1178 | defformatstring(sii)("%d", ii++); |
| 1179 | ids[j]->action = newstring(sii); |
| 1180 | } |
| 1181 | } |
| 1182 | execute(body); |
| 1183 | loop_skip = false; |
| 1184 | if(loop_break) break; |
| 1185 | } |
| 1186 | loopv(ids) popident(*ids[i]); |
| 1187 | loopv(elems) if(elems[i]) delete[] elems[i]; |
| 1188 | loop_break = false; |
| 1189 | loop_level--; |
| 1190 | } |
| 1191 | loopv(vars) delete[] vars[i]; |
| 1192 | } |
| 1193 | COMMANDF(looplist, "sss", (char *list, char *varlist, char *body) { looplist(list, varlist, body, false); }); |
| 1194 | COMMANDF(looplisti, "sss", (char *list, char *varlist, char *body) { looplist(list, varlist, body, true); }); |
| 1195 |
no test coverage detected