Parse triples with index offsets: i, i/j/k, i//k, i/j
| 1134 | |
| 1135 | // Parse triples with index offsets: i, i/j/k, i//k, i/j |
| 1136 | static bool parseTriple(const char **token, int vsize, int vnsize, int vtsize, |
| 1137 | vertex_index_t *ret) { |
| 1138 | if (!ret) { |
| 1139 | return false; |
| 1140 | } |
| 1141 | |
| 1142 | vertex_index_t vi(-1); |
| 1143 | |
| 1144 | if (!fixIndex(atoi((*token)), vsize, &(vi.v_idx))) { |
| 1145 | return false; |
| 1146 | } |
| 1147 | |
| 1148 | (*token) += strcspn((*token), "/ \t\r"); |
| 1149 | if ((*token)[0] != '/') { |
| 1150 | (*ret) = vi; |
| 1151 | return true; |
| 1152 | } |
| 1153 | (*token)++; |
| 1154 | |
| 1155 | // i//k |
| 1156 | if ((*token)[0] == '/') { |
| 1157 | (*token)++; |
| 1158 | if (!fixIndex(atoi((*token)), vnsize, &(vi.vn_idx))) { |
| 1159 | return false; |
| 1160 | } |
| 1161 | (*token) += strcspn((*token), "/ \t\r"); |
| 1162 | (*ret) = vi; |
| 1163 | return true; |
| 1164 | } |
| 1165 | |
| 1166 | // i/j/k or i/j |
| 1167 | if (!fixIndex(atoi((*token)), vtsize, &(vi.vt_idx))) { |
| 1168 | return false; |
| 1169 | } |
| 1170 | |
| 1171 | (*token) += strcspn((*token), "/ \t\r"); |
| 1172 | if ((*token)[0] != '/') { |
| 1173 | (*ret) = vi; |
| 1174 | return true; |
| 1175 | } |
| 1176 | |
| 1177 | // i/j/k |
| 1178 | (*token)++; // skip '/' |
| 1179 | if (!fixIndex(atoi((*token)), vnsize, &(vi.vn_idx))) { |
| 1180 | return false; |
| 1181 | } |
| 1182 | (*token) += strcspn((*token), "/ \t\r"); |
| 1183 | |
| 1184 | (*ret) = vi; |
| 1185 | |
| 1186 | return true; |
| 1187 | } |
| 1188 | |
| 1189 | // Parse raw triples: i, i/j/k, i//k, i/j |
| 1190 | static vertex_index_t parseRawTriple(const char **token) { |