void AssOverrideTag::ParseParameters(const wxString &text, AssOverrideTagProto::iterator proto_it) { Clear(); // Tokenize text, attempting to find all parameters std::vector<wxString> paramList = tokenize(text); size_t totalPars = paramList.size(); int parsFlag = 1 << (totalPars - 1); // Get optional parameters flag // vector (i)clip is the second clip proto_ittype in the list if ((Name == "\\clip" || Name == "\\iclip") && totalPars != 4) { ++proto_it; } unsigned curPar = 0; for (size_t n = 0; n < proto_it->params.size(); n++) { AssOverrideParamProto *curproto = &proto_it->params[n]; // Create parameter AssOverrideParameter *newparam = new AssOverrideParameter; newparam->classification = curproto->classification; Params.push_back(newparam); // Check if it's optional and not present if (!(curproto->optional & parsFlag) || curPar >= totalPars) { newparam->omitted = true; continue; } wxString curtok = paramList[curPar++]; if (curtok.empty()) { curPar++; continue; } wxChar firstChar = curtok[0]; bool auto4 = (firstChar == '!' || firstChar == '$' || firstChar == '%') && curproto->type != VARDATA_BLOCK; if (auto4) { newparam->Set(curtok); } else { switch (curproto->type) { case VARDATA_INT: { long temp; curtok.ToLong(&temp); newparam->Set<int>(temp); break; } case VARDATA_FLOAT: { double temp; curtok.ToDouble(&temp); newparam->Set(temp); break; } case VARDATA_TEXT: newparam->Set(curtok); break; case VARDATA_BOOL: { long temp; curtok.ToLong(&temp); newparam->Set<bool>(temp != 0); break; } case VARDATA_BLOCK: { AssDialogueBlockOverride *temp = new AssDialogueBlockOverride(curtok); temp->ParseTags(); newparam->Set(temp); break; } default: break; } } } }