Parse triples with index offsets: i, i/j/k, i//k, i/j
| 1197 | |
| 1198 | // Parse triples with index offsets: i, i/j/k, i//k, i/j |
| 1199 | static bool parseTriple(const char **token, int vsize, int vnsize, int vtsize, |
| 1200 | vertex_index_t *ret, const warning_context &context) { |
| 1201 | if (!ret) { |
| 1202 | return false; |
| 1203 | } |
| 1204 | |
| 1205 | vertex_index_t vi(-1); |
| 1206 | |
| 1207 | if (!fixIndex(atoi((*token)), vsize, &vi.v_idx, false, context)) { |
| 1208 | return false; |
| 1209 | } |
| 1210 | |
| 1211 | (*token) += strcspn((*token), "/ \t\r"); |
| 1212 | if ((*token)[0] != '/') { |
| 1213 | (*ret) = vi; |
| 1214 | return true; |
| 1215 | } |
| 1216 | (*token)++; |
| 1217 | |
| 1218 | // i//k |
| 1219 | if ((*token)[0] == '/') { |
| 1220 | (*token)++; |
| 1221 | if (!fixIndex(atoi((*token)), vnsize, &vi.vn_idx, true, context)) { |
| 1222 | return false; |
| 1223 | } |
| 1224 | (*token) += strcspn((*token), "/ \t\r"); |
| 1225 | (*ret) = vi; |
| 1226 | return true; |
| 1227 | } |
| 1228 | |
| 1229 | // i/j/k or i/j |
| 1230 | if (!fixIndex(atoi((*token)), vtsize, &vi.vt_idx, true, context)) { |
| 1231 | return false; |
| 1232 | } |
| 1233 | |
| 1234 | (*token) += strcspn((*token), "/ \t\r"); |
| 1235 | if ((*token)[0] != '/') { |
| 1236 | (*ret) = vi; |
| 1237 | return true; |
| 1238 | } |
| 1239 | |
| 1240 | // i/j/k |
| 1241 | (*token)++; // skip '/' |
| 1242 | if (!fixIndex(atoi((*token)), vnsize, &vi.vn_idx, true, context)) { |
| 1243 | return false; |
| 1244 | } |
| 1245 | (*token) += strcspn((*token), "/ \t\r"); |
| 1246 | |
| 1247 | (*ret) = vi; |
| 1248 | |
| 1249 | return true; |
| 1250 | } |
| 1251 | |
| 1252 | // Parse raw triples: i, i/j/k, i//k, i/j |
| 1253 | static vertex_index_t parseRawTriple(const char **token) { |