/* Copyright 2010-2019 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include "parser.h" #include "convert.h" #include "labels.h" /* Array of recorded labels. */ /* If looking through this array turns out to be slow, we might have to replace it with some kind of hash table implementation. */ LABEL *labels_list = 0; size_t labels_number = 0; size_t labels_space = 0; /* Register a label, that is something that may be the target of a reference and must be unique in the document. Corresponds to @node, @anchor, and second arg of @float. */ void register_label (ELEMENT *current, ELEMENT *label) { if (labels_number == labels_space) { labels_space += 1; labels_space *= 1.5; labels_list = realloc (labels_list, labels_space * sizeof (LABEL)); if (!labels_list) fatal ("realloc failed"); } labels_list[labels_number++].target = current; if (label) add_extra_contents (current, "node_content", label); } void reset_labels (void) { labels_number = 0; } ELEMENT **internal_xref_list = 0; size_t internal_xref_number = 0; size_t internal_xref_space = 0; void remember_internal_xref (ELEMENT *element) { if (internal_xref_number == internal_xref_space) { internal_xref_list = realloc (internal_xref_list, (internal_xref_space += 2) * sizeof (*internal_xref_list)); } internal_xref_list[internal_xref_number++] = element; } void reset_internal_xrefs (void) { internal_xref_number = 0; }