mirror of https://github.com/OpenTTD/OpenTTD.git
Cleanup: Simplify GRFLabel linked-list with std::vector. (#10284)
This commit is contained in:
parent
c53f29df53
commit
4f26f6b8aa
|
@ -429,13 +429,7 @@ static GRFFile *GetFileByFilename(const char *filename)
|
|||
/** Reset all NewGRFData that was used only while processing data */
|
||||
static void ClearTemporaryNewGRFData(GRFFile *gf)
|
||||
{
|
||||
/* Clear the GOTO labels used for GRF processing */
|
||||
for (GRFLabel *l = gf->label; l != nullptr;) {
|
||||
GRFLabel *l2 = l->next;
|
||||
free(l);
|
||||
l = l2;
|
||||
}
|
||||
gf->label = nullptr;
|
||||
gf->labels.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -6745,15 +6739,15 @@ static void SkipIf(ByteReader *buf)
|
|||
* file. The jump will always be the first matching label that follows
|
||||
* the current nfo_line. If no matching label is found, the first matching
|
||||
* label in the file is used. */
|
||||
GRFLabel *choice = nullptr;
|
||||
for (GRFLabel *label = _cur.grffile->label; label != nullptr; label = label->next) {
|
||||
if (label->label != numsprites) continue;
|
||||
const GRFLabel *choice = nullptr;
|
||||
for (const auto &label : _cur.grffile->labels) {
|
||||
if (label.label != numsprites) continue;
|
||||
|
||||
/* Remember a goto before the current line */
|
||||
if (choice == nullptr) choice = label;
|
||||
if (choice == nullptr) choice = &label;
|
||||
/* If we find a label here, this is definitely good */
|
||||
if (label->nfo_line > _cur.nfo_line) {
|
||||
choice = label;
|
||||
if (label.nfo_line > _cur.nfo_line) {
|
||||
choice = &label;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
@ -7601,23 +7595,9 @@ static void DefineGotoLabel(ByteReader *buf)
|
|||
|
||||
byte nfo_label = buf->ReadByte();
|
||||
|
||||
GRFLabel *label = MallocT<GRFLabel>(1);
|
||||
label->label = nfo_label;
|
||||
label->nfo_line = _cur.nfo_line;
|
||||
label->pos = _cur.file->GetPos();
|
||||
label->next = nullptr;
|
||||
_cur.grffile->labels.emplace_back(nfo_label, _cur.nfo_line, _cur.file->GetPos());
|
||||
|
||||
/* Set up a linked list of goto targets which we will search in an Action 0x7/0x9 */
|
||||
if (_cur.grffile->label == nullptr) {
|
||||
_cur.grffile->label = label;
|
||||
} else {
|
||||
/* Attach the label to the end of the list */
|
||||
GRFLabel *l;
|
||||
for (l = _cur.grffile->label; l->next != nullptr; l = l->next) {}
|
||||
l->next = label;
|
||||
}
|
||||
|
||||
grfmsg(2, "DefineGotoLabel: GOTO target with label 0x%02X", label->label);
|
||||
grfmsg(2, "DefineGotoLabel: GOTO target with label 0x%02X", nfo_label);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -98,7 +98,8 @@ struct GRFLabel {
|
|||
byte label;
|
||||
uint32 nfo_line;
|
||||
size_t pos;
|
||||
struct GRFLabel *next;
|
||||
|
||||
GRFLabel(byte label, uint32 nfo_line, size_t pos) : label(label), nfo_line(nfo_line), pos(pos) {}
|
||||
};
|
||||
|
||||
/** Dynamic data of a loaded NewGRF */
|
||||
|
@ -121,7 +122,7 @@ struct GRFFile : ZeroedMemoryAllocator {
|
|||
uint32 param[0x80];
|
||||
uint param_end; ///< one more than the highest set parameter
|
||||
|
||||
GRFLabel *label; ///< Pointer to the first label. This is a linked list, not an array.
|
||||
std::vector<GRFLabel> labels; ///< List of labels
|
||||
|
||||
std::vector<CargoLabel> cargo_list; ///< Cargo translation table (local ID -> label)
|
||||
uint8 cargo_map[NUM_CARGO]; ///< Inverse cargo translation table (CargoID -> local ID)
|
||||
|
|
Loading…
Reference in New Issue