1 /* 2 * Parser definitions. 3 * 4 * Copyright (C) 2019 Paul Boddie <paul@boddie.org.uk> 5 * 6 * This program is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU General Public License as 8 * published by the Free Software Foundation; either version 2 of 9 * the License, or (at your option) any later version. 10 * 11 * This program is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 * GNU General Public License for more details. 15 * 16 * You should have received a copy of the GNU General Public License 17 * along with this program; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, 19 * Boston, MA 02110-1301, USA 20 */ 21 22 #pragma once 23 24 #include "types.h" 25 26 /* Value copying, avoiding problems with retaining values in structures. */ 27 28 void *copy(void *value); 29 30 /* Specialised copying. */ 31 32 #define copy_attribute(in) (struct attribute *) copy(&in); 33 #define copy_identifier(in) (struct identifier *) copy(&in); 34 #define copy_include(in) (struct include *) copy(&in); 35 #define copy_interface(in) (struct interface *) copy(&in); 36 #define copy_parameter(in) (struct parameter *) copy(&in); 37 #define copy_signature(in) (struct signature *) copy(&in); 38 39 /* Generalised copying to structures with tail members. */ 40 41 #define copy_tail(type, out, in) out.tail = (struct type *) copy(&in)