xref: /netbsd-src/external/gpl3/gcc/dist/libgfortran/intrinsics/move_alloc.c (revision b1e838363e3c6fc78a55519254d99869742dd33c)
1181254a7Smrg /* Generic implementation of the MOVE_ALLOC intrinsic
2*b1e83836Smrg    Copyright (C) 2006-2022 Free Software Foundation, Inc.
3181254a7Smrg    Contributed by Paul Thomas
4181254a7Smrg 
5181254a7Smrg This file is part of the GNU Fortran runtime library (libgfortran).
6181254a7Smrg 
7181254a7Smrg Libgfortran is free software; you can redistribute it and/or
8181254a7Smrg modify it under the terms of the GNU General Public
9181254a7Smrg License as published by the Free Software Foundation; either
10181254a7Smrg version 3 of the License, or (at your option) any later version.
11181254a7Smrg 
12181254a7Smrg Ligbfortran is distributed in the hope that it will be useful,
13181254a7Smrg but WITHOUT ANY WARRANTY; without even the implied warranty of
14181254a7Smrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15181254a7Smrg GNU General Public License for more details.
16181254a7Smrg 
17181254a7Smrg Under Section 7 of GPL version 3, you are granted additional
18181254a7Smrg permissions described in the GCC Runtime Library Exception, version
19181254a7Smrg 3.1, as published by the Free Software Foundation.
20181254a7Smrg 
21181254a7Smrg You should have received a copy of the GNU General Public License and
22181254a7Smrg a copy of the GCC Runtime Library Exception along with this program;
23181254a7Smrg see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24181254a7Smrg <http://www.gnu.org/licenses/>.  */
25181254a7Smrg 
26181254a7Smrg #include "libgfortran.h"
27181254a7Smrg 
28181254a7Smrg 
29181254a7Smrg extern void move_alloc (gfc_array_char *, gfc_array_char *);
30181254a7Smrg export_proto(move_alloc);
31181254a7Smrg 
32181254a7Smrg void
move_alloc(gfc_array_char * from,gfc_array_char * to)33181254a7Smrg move_alloc (gfc_array_char * from, gfc_array_char * to)
34181254a7Smrg {
35181254a7Smrg   int i;
36181254a7Smrg 
37181254a7Smrg   free (to->base_addr);
38181254a7Smrg 
39181254a7Smrg   for (i = 0; i < GFC_DESCRIPTOR_RANK (from); i++)
40181254a7Smrg     {
41181254a7Smrg       GFC_DIMENSION_SET(to->dim[i],GFC_DESCRIPTOR_LBOUND(from,i),
42181254a7Smrg 			GFC_DESCRIPTOR_UBOUND(from,i),
43181254a7Smrg 			GFC_DESCRIPTOR_STRIDE(from,i));
44181254a7Smrg       GFC_DIMENSION_SET(from->dim[i],GFC_DESCRIPTOR_LBOUND(from,i),
45181254a7Smrg 			GFC_DESCRIPTOR_LBOUND(from,i), 0);
46181254a7Smrg     }
47181254a7Smrg 
48181254a7Smrg   to->offset = from->offset;
49181254a7Smrg   GFC_DTYPE_COPY(to,from);
50181254a7Smrg   to->base_addr = from->base_addr;
51181254a7Smrg   from->base_addr = NULL;
52181254a7Smrg }
53181254a7Smrg 
54181254a7Smrg extern void move_alloc_c (gfc_array_char *, GFC_INTEGER_4,
55181254a7Smrg 			  gfc_array_char *, GFC_INTEGER_4);
56181254a7Smrg export_proto(move_alloc_c);
57181254a7Smrg 
58181254a7Smrg void
move_alloc_c(gfc_array_char * from,GFC_INTEGER_4 from_length,gfc_array_char * to,GFC_INTEGER_4 to_length)59181254a7Smrg move_alloc_c (gfc_array_char * from,
60181254a7Smrg 	      GFC_INTEGER_4 from_length __attribute__((unused)),
61181254a7Smrg 	      gfc_array_char * to,
62181254a7Smrg 	      GFC_INTEGER_4 to_length __attribute__((unused)))
63181254a7Smrg {
64181254a7Smrg   move_alloc (from, to);
65181254a7Smrg }
66