1 1.1 mrg /* 2 1.1 mrg * Copyright 2012 Ecole Normale Superieure 3 1.1 mrg * 4 1.1 mrg * Use of this software is governed by the MIT license 5 1.1 mrg * 6 1.1 mrg * Written by Sven Verdoolaege, 7 1.1 mrg * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France 8 1.1 mrg */ 9 1.1 mrg 10 1.1 mrg #define xFN(TYPE,NAME) TYPE ## _ ## NAME 11 1.1 mrg #define FN(TYPE,NAME) xFN(TYPE,NAME) 12 1.1 mrg 13 1.1 mrg /* Replace the field FIELD of "node" by "field", 14 1.1 mrg * where the field may or may not have already been set in "node". 15 1.1 mrg * However, if the field has not already been set, 16 1.1 mrg * then "node" is required to have a single reference. 17 1.1 mrg * In this case the call to isl_ast_node_cow has no effect. 18 1.1 mrg */ 19 1.1 mrg __isl_give isl_ast_node *FN(FN(FN(isl_ast_node,NODE_TYPE),set),FIELD_NAME)( 20 1.1 mrg __isl_take isl_ast_node *node, __isl_take FIELD_TYPE *field) 21 1.1 mrg { 22 1.1 mrg if (FN(isl_ast_node_check,NODE_TYPE)(node) < 0 || !field) 23 1.1 mrg goto error; 24 1.1 mrg if (node->FIELD == field) { 25 1.1 mrg FN(FIELD_TYPE,free)(field); 26 1.1 mrg return node; 27 1.1 mrg } 28 1.1 mrg 29 1.1 mrg node = isl_ast_node_cow(node); 30 1.1 mrg if (!node) 31 1.1 mrg goto error; 32 1.1 mrg 33 1.1 mrg FN(FIELD_TYPE,free)(node->FIELD); 34 1.1 mrg node->FIELD = field; 35 1.1 mrg 36 1.1 mrg return node; 37 1.1 mrg error: 38 1.1 mrg isl_ast_node_free(node); 39 1.1 mrg FN(FIELD_TYPE,free)(field); 40 1.1 mrg return NULL; 41 1.1 mrg } 42