annotate libgfortran/intrinsics/reshape_generic.c @ 145:1830386684a0

gcc-9.2.0
author anatofuz
date Thu, 13 Feb 2020 11:34:05 +0900
parents 84e7813d76e9
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Generic implementation of the RESHAPE intrinsic
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2002-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 Contributed by Paul Brook <paul@nowt.org>
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 This file is part of the GNU Fortran runtime library (libgfortran).
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 Libgfortran is free software; you can redistribute it and/or
kono
parents:
diff changeset
8 modify it under the terms of the GNU General Public
kono
parents:
diff changeset
9 License as published by the Free Software Foundation; either
kono
parents:
diff changeset
10 version 3 of the License, or (at your option) any later version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 Ligbfortran is distributed in the hope that it will be useful,
kono
parents:
diff changeset
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
kono
parents:
diff changeset
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
kono
parents:
diff changeset
15 GNU General Public License for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 Under Section 7 of GPL version 3, you are granted additional
kono
parents:
diff changeset
18 permissions described in the GCC Runtime Library Exception, version
kono
parents:
diff changeset
19 3.1, as published by the Free Software Foundation.
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 You should have received a copy of the GNU General Public License and
kono
parents:
diff changeset
22 a copy of the GCC Runtime Library Exception along with this program;
kono
parents:
diff changeset
23 see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
kono
parents:
diff changeset
24 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
25
kono
parents:
diff changeset
26 #include "libgfortran.h"
kono
parents:
diff changeset
27 #include <string.h>
kono
parents:
diff changeset
28
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
29 typedef GFC_FULL_ARRAY_DESCRIPTOR(1, index_type) shape_type;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
30 typedef GFC_FULL_ARRAY_DESCRIPTOR(GFC_MAX_DIMENSIONS, char) parray;
111
kono
parents:
diff changeset
31
kono
parents:
diff changeset
32 static void
kono
parents:
diff changeset
33 reshape_internal (parray *ret, parray *source, shape_type *shape,
kono
parents:
diff changeset
34 parray *pad, shape_type *order, index_type size)
kono
parents:
diff changeset
35 {
kono
parents:
diff changeset
36 /* r.* indicates the return array. */
kono
parents:
diff changeset
37 index_type rcount[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
38 index_type rextent[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
39 index_type rstride[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
40 index_type rstride0;
kono
parents:
diff changeset
41 index_type rdim;
kono
parents:
diff changeset
42 index_type rsize;
kono
parents:
diff changeset
43 index_type rs;
kono
parents:
diff changeset
44 index_type rex;
kono
parents:
diff changeset
45 char * restrict rptr;
kono
parents:
diff changeset
46 /* s.* indicates the source array. */
kono
parents:
diff changeset
47 index_type scount[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
48 index_type sextent[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
49 index_type sstride[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
50 index_type sstride0;
kono
parents:
diff changeset
51 index_type sdim;
kono
parents:
diff changeset
52 index_type ssize;
kono
parents:
diff changeset
53 const char *sptr;
kono
parents:
diff changeset
54 /* p.* indicates the pad array. */
kono
parents:
diff changeset
55 index_type pcount[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
56 index_type pextent[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
57 index_type pstride[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
58 index_type pdim;
kono
parents:
diff changeset
59 index_type psize;
kono
parents:
diff changeset
60 const char *pptr;
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 const char *src;
kono
parents:
diff changeset
63 int n;
kono
parents:
diff changeset
64 int dim;
kono
parents:
diff changeset
65 int sempty, pempty, shape_empty;
kono
parents:
diff changeset
66 index_type shape_data[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
67
kono
parents:
diff changeset
68 rdim = GFC_DESCRIPTOR_EXTENT(shape,0);
kono
parents:
diff changeset
69 /* rdim is always > 0; this lets the compiler optimize more and
kono
parents:
diff changeset
70 avoids a warning. */
kono
parents:
diff changeset
71 GFC_ASSERT (rdim > 0);
kono
parents:
diff changeset
72
kono
parents:
diff changeset
73 if (rdim != GFC_DESCRIPTOR_RANK(ret))
kono
parents:
diff changeset
74 runtime_error("rank of return array incorrect in RESHAPE intrinsic");
kono
parents:
diff changeset
75
kono
parents:
diff changeset
76 shape_empty = 0;
kono
parents:
diff changeset
77
kono
parents:
diff changeset
78 for (n = 0; n < rdim; n++)
kono
parents:
diff changeset
79 {
kono
parents:
diff changeset
80 shape_data[n] = shape->base_addr[n * GFC_DESCRIPTOR_STRIDE(shape,0)];
kono
parents:
diff changeset
81 if (shape_data[n] <= 0)
kono
parents:
diff changeset
82 {
kono
parents:
diff changeset
83 shape_data[n] = 0;
kono
parents:
diff changeset
84 shape_empty = 1;
kono
parents:
diff changeset
85 }
kono
parents:
diff changeset
86 }
kono
parents:
diff changeset
87
kono
parents:
diff changeset
88 if (ret->base_addr == NULL)
kono
parents:
diff changeset
89 {
kono
parents:
diff changeset
90 index_type alloc_size;
kono
parents:
diff changeset
91
kono
parents:
diff changeset
92 rs = 1;
kono
parents:
diff changeset
93 for (n = 0; n < rdim; n++)
kono
parents:
diff changeset
94 {
kono
parents:
diff changeset
95 rex = shape_data[n];
kono
parents:
diff changeset
96
kono
parents:
diff changeset
97 GFC_DIMENSION_SET(ret->dim[n],0,rex - 1,rs);
kono
parents:
diff changeset
98
kono
parents:
diff changeset
99 rs *= rex;
kono
parents:
diff changeset
100 }
kono
parents:
diff changeset
101 ret->offset = 0;
kono
parents:
diff changeset
102
kono
parents:
diff changeset
103 if (unlikely (rs < 1))
kono
parents:
diff changeset
104 alloc_size = 0; /* xmalloc will allocate 1 byte. */
kono
parents:
diff changeset
105 else
kono
parents:
diff changeset
106 alloc_size = rs;
kono
parents:
diff changeset
107
kono
parents:
diff changeset
108 ret->base_addr = xmallocarray (alloc_size, size);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
109 ret->dtype.rank = rdim;
111
kono
parents:
diff changeset
110 }
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 if (shape_empty)
kono
parents:
diff changeset
113 return;
kono
parents:
diff changeset
114
kono
parents:
diff changeset
115 if (pad)
kono
parents:
diff changeset
116 {
kono
parents:
diff changeset
117 pdim = GFC_DESCRIPTOR_RANK (pad);
kono
parents:
diff changeset
118 psize = 1;
kono
parents:
diff changeset
119 pempty = 0;
kono
parents:
diff changeset
120 for (n = 0; n < pdim; n++)
kono
parents:
diff changeset
121 {
kono
parents:
diff changeset
122 pcount[n] = 0;
kono
parents:
diff changeset
123 pstride[n] = GFC_DESCRIPTOR_STRIDE(pad,n);
kono
parents:
diff changeset
124 pextent[n] = GFC_DESCRIPTOR_EXTENT(pad,n);
kono
parents:
diff changeset
125 if (pextent[n] <= 0)
kono
parents:
diff changeset
126 {
kono
parents:
diff changeset
127 pempty = 1;
kono
parents:
diff changeset
128 pextent[n] = 0;
kono
parents:
diff changeset
129 }
kono
parents:
diff changeset
130
kono
parents:
diff changeset
131 if (psize == pstride[n])
kono
parents:
diff changeset
132 psize *= pextent[n];
kono
parents:
diff changeset
133 else
kono
parents:
diff changeset
134 psize = 0;
kono
parents:
diff changeset
135 }
kono
parents:
diff changeset
136 pptr = pad->base_addr;
kono
parents:
diff changeset
137 }
kono
parents:
diff changeset
138 else
kono
parents:
diff changeset
139 {
kono
parents:
diff changeset
140 pdim = 0;
kono
parents:
diff changeset
141 psize = 1;
kono
parents:
diff changeset
142 pempty = 1;
kono
parents:
diff changeset
143 pptr = NULL;
kono
parents:
diff changeset
144 }
kono
parents:
diff changeset
145
kono
parents:
diff changeset
146 if (unlikely (compile_options.bounds_check))
kono
parents:
diff changeset
147 {
kono
parents:
diff changeset
148 index_type ret_extent, source_extent;
kono
parents:
diff changeset
149
kono
parents:
diff changeset
150 rs = 1;
kono
parents:
diff changeset
151 for (n = 0; n < rdim; n++)
kono
parents:
diff changeset
152 {
kono
parents:
diff changeset
153 rs *= shape_data[n];
kono
parents:
diff changeset
154 ret_extent = GFC_DESCRIPTOR_EXTENT(ret,n);
kono
parents:
diff changeset
155 if (ret_extent != shape_data[n])
kono
parents:
diff changeset
156 runtime_error("Incorrect extent in return value of RESHAPE"
kono
parents:
diff changeset
157 " intrinsic in dimension %ld: is %ld,"
kono
parents:
diff changeset
158 " should be %ld", (long int) n+1,
kono
parents:
diff changeset
159 (long int) ret_extent, (long int) shape_data[n]);
kono
parents:
diff changeset
160 }
kono
parents:
diff changeset
161
kono
parents:
diff changeset
162 source_extent = 1;
kono
parents:
diff changeset
163 sdim = GFC_DESCRIPTOR_RANK (source);
kono
parents:
diff changeset
164 /* sdim is always > 0; this lets the compiler optimize more and
kono
parents:
diff changeset
165 avoids a warning. */
kono
parents:
diff changeset
166 GFC_ASSERT(sdim>0);
kono
parents:
diff changeset
167
kono
parents:
diff changeset
168 for (n = 0; n < sdim; n++)
kono
parents:
diff changeset
169 {
kono
parents:
diff changeset
170 index_type se;
kono
parents:
diff changeset
171 se = GFC_DESCRIPTOR_EXTENT(source,n);
kono
parents:
diff changeset
172 source_extent *= se > 0 ? se : 0;
kono
parents:
diff changeset
173 }
kono
parents:
diff changeset
174
kono
parents:
diff changeset
175 if (rs > source_extent && (!pad || pempty))
kono
parents:
diff changeset
176 runtime_error("Incorrect size in SOURCE argument to RESHAPE"
kono
parents:
diff changeset
177 " intrinsic: is %ld, should be %ld",
kono
parents:
diff changeset
178 (long int) source_extent, (long int) rs);
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 if (order)
kono
parents:
diff changeset
181 {
kono
parents:
diff changeset
182 int seen[GFC_MAX_DIMENSIONS];
kono
parents:
diff changeset
183 index_type v;
kono
parents:
diff changeset
184
kono
parents:
diff changeset
185 for (n = 0; n < rdim; n++)
kono
parents:
diff changeset
186 seen[n] = 0;
kono
parents:
diff changeset
187
kono
parents:
diff changeset
188 for (n = 0; n < rdim; n++)
kono
parents:
diff changeset
189 {
kono
parents:
diff changeset
190 v = order->base_addr[n * GFC_DESCRIPTOR_STRIDE(order,0)] - 1;
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 if (v < 0 || v >= rdim)
kono
parents:
diff changeset
193 runtime_error("Value %ld out of range in ORDER argument"
kono
parents:
diff changeset
194 " to RESHAPE intrinsic", (long int) v + 1);
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 if (seen[v] != 0)
kono
parents:
diff changeset
197 runtime_error("Duplicate value %ld in ORDER argument to"
kono
parents:
diff changeset
198 " RESHAPE intrinsic", (long int) v + 1);
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 seen[v] = 1;
kono
parents:
diff changeset
201 }
kono
parents:
diff changeset
202 }
kono
parents:
diff changeset
203 }
kono
parents:
diff changeset
204
kono
parents:
diff changeset
205 rsize = 1;
kono
parents:
diff changeset
206 for (n = 0; n < rdim; n++)
kono
parents:
diff changeset
207 {
kono
parents:
diff changeset
208 if (order)
kono
parents:
diff changeset
209 dim = order->base_addr[n * GFC_DESCRIPTOR_STRIDE(order,0)] - 1;
kono
parents:
diff changeset
210 else
kono
parents:
diff changeset
211 dim = n;
kono
parents:
diff changeset
212
kono
parents:
diff changeset
213 rcount[n] = 0;
kono
parents:
diff changeset
214 rstride[n] = GFC_DESCRIPTOR_STRIDE(ret,dim);
kono
parents:
diff changeset
215 rextent[n] = GFC_DESCRIPTOR_EXTENT(ret,dim);
kono
parents:
diff changeset
216
kono
parents:
diff changeset
217 if (rextent[n] != shape_data[dim])
kono
parents:
diff changeset
218 runtime_error ("shape and target do not conform");
kono
parents:
diff changeset
219
kono
parents:
diff changeset
220 if (rsize == rstride[n])
kono
parents:
diff changeset
221 rsize *= rextent[n];
kono
parents:
diff changeset
222 else
kono
parents:
diff changeset
223 rsize = 0;
kono
parents:
diff changeset
224 if (rextent[n] <= 0)
kono
parents:
diff changeset
225 return;
kono
parents:
diff changeset
226 }
kono
parents:
diff changeset
227
kono
parents:
diff changeset
228 sdim = GFC_DESCRIPTOR_RANK (source);
kono
parents:
diff changeset
229 /* sdim is always > 0; this lets the compiler optimize more and
kono
parents:
diff changeset
230 avoids a warning. */
kono
parents:
diff changeset
231 GFC_ASSERT(sdim>0);
kono
parents:
diff changeset
232
kono
parents:
diff changeset
233 ssize = 1;
kono
parents:
diff changeset
234 sempty = 0;
kono
parents:
diff changeset
235 for (n = 0; n < sdim; n++)
kono
parents:
diff changeset
236 {
kono
parents:
diff changeset
237 scount[n] = 0;
kono
parents:
diff changeset
238 sstride[n] = GFC_DESCRIPTOR_STRIDE(source,n);
kono
parents:
diff changeset
239 sextent[n] = GFC_DESCRIPTOR_EXTENT(source,n);
kono
parents:
diff changeset
240 if (sextent[n] <= 0)
kono
parents:
diff changeset
241 {
kono
parents:
diff changeset
242 sempty = 1;
kono
parents:
diff changeset
243 sextent[n] = 0;
kono
parents:
diff changeset
244 }
kono
parents:
diff changeset
245
kono
parents:
diff changeset
246 if (ssize == sstride[n])
kono
parents:
diff changeset
247 ssize *= sextent[n];
kono
parents:
diff changeset
248 else
kono
parents:
diff changeset
249 ssize = 0;
kono
parents:
diff changeset
250 }
kono
parents:
diff changeset
251
kono
parents:
diff changeset
252 if (rsize != 0 && ssize != 0 && psize != 0)
kono
parents:
diff changeset
253 {
kono
parents:
diff changeset
254 rsize *= size;
kono
parents:
diff changeset
255 ssize *= size;
kono
parents:
diff changeset
256 psize *= size;
kono
parents:
diff changeset
257 reshape_packed (ret->base_addr, rsize, source->base_addr, ssize,
kono
parents:
diff changeset
258 pad ? pad->base_addr : NULL, psize);
kono
parents:
diff changeset
259 return;
kono
parents:
diff changeset
260 }
kono
parents:
diff changeset
261 rptr = ret->base_addr;
kono
parents:
diff changeset
262 src = sptr = source->base_addr;
kono
parents:
diff changeset
263 rstride0 = rstride[0] * size;
kono
parents:
diff changeset
264 sstride0 = sstride[0] * size;
kono
parents:
diff changeset
265
kono
parents:
diff changeset
266 if (sempty && pempty)
kono
parents:
diff changeset
267 abort ();
kono
parents:
diff changeset
268
kono
parents:
diff changeset
269 if (sempty)
kono
parents:
diff changeset
270 {
kono
parents:
diff changeset
271 /* Pretend we are using the pad array the first time around, too. */
kono
parents:
diff changeset
272 src = pptr;
kono
parents:
diff changeset
273 sptr = pptr;
kono
parents:
diff changeset
274 sdim = pdim;
kono
parents:
diff changeset
275 for (dim = 0; dim < pdim; dim++)
kono
parents:
diff changeset
276 {
kono
parents:
diff changeset
277 scount[dim] = pcount[dim];
kono
parents:
diff changeset
278 sextent[dim] = pextent[dim];
kono
parents:
diff changeset
279 sstride[dim] = pstride[dim];
kono
parents:
diff changeset
280 sstride0 = pstride[0] * size;
kono
parents:
diff changeset
281 }
kono
parents:
diff changeset
282 }
kono
parents:
diff changeset
283
kono
parents:
diff changeset
284 while (rptr)
kono
parents:
diff changeset
285 {
kono
parents:
diff changeset
286 /* Select between the source and pad arrays. */
kono
parents:
diff changeset
287 memcpy(rptr, src, size);
kono
parents:
diff changeset
288 /* Advance to the next element. */
kono
parents:
diff changeset
289 rptr += rstride0;
kono
parents:
diff changeset
290 src += sstride0;
kono
parents:
diff changeset
291 rcount[0]++;
kono
parents:
diff changeset
292 scount[0]++;
kono
parents:
diff changeset
293
kono
parents:
diff changeset
294 /* Advance to the next destination element. */
kono
parents:
diff changeset
295 n = 0;
kono
parents:
diff changeset
296 while (rcount[n] == rextent[n])
kono
parents:
diff changeset
297 {
kono
parents:
diff changeset
298 /* When we get to the end of a dimension, reset it and increment
kono
parents:
diff changeset
299 the next dimension. */
kono
parents:
diff changeset
300 rcount[n] = 0;
kono
parents:
diff changeset
301 /* We could precalculate these products, but this is a less
kono
parents:
diff changeset
302 frequently used path so probably not worth it. */
kono
parents:
diff changeset
303 rptr -= rstride[n] * rextent[n] * size;
kono
parents:
diff changeset
304 n++;
kono
parents:
diff changeset
305 if (n == rdim)
kono
parents:
diff changeset
306 {
kono
parents:
diff changeset
307 /* Break out of the loop. */
kono
parents:
diff changeset
308 rptr = NULL;
kono
parents:
diff changeset
309 break;
kono
parents:
diff changeset
310 }
kono
parents:
diff changeset
311 else
kono
parents:
diff changeset
312 {
kono
parents:
diff changeset
313 rcount[n]++;
kono
parents:
diff changeset
314 rptr += rstride[n] * size;
kono
parents:
diff changeset
315 }
kono
parents:
diff changeset
316 }
kono
parents:
diff changeset
317
kono
parents:
diff changeset
318 /* Advance to the next source element. */
kono
parents:
diff changeset
319 n = 0;
kono
parents:
diff changeset
320 while (scount[n] == sextent[n])
kono
parents:
diff changeset
321 {
kono
parents:
diff changeset
322 /* When we get to the end of a dimension, reset it and increment
kono
parents:
diff changeset
323 the next dimension. */
kono
parents:
diff changeset
324 scount[n] = 0;
kono
parents:
diff changeset
325 /* We could precalculate these products, but this is a less
kono
parents:
diff changeset
326 frequently used path so probably not worth it. */
kono
parents:
diff changeset
327 src -= sstride[n] * sextent[n] * size;
kono
parents:
diff changeset
328 n++;
kono
parents:
diff changeset
329 if (n == sdim)
kono
parents:
diff changeset
330 {
kono
parents:
diff changeset
331 if (sptr && pad)
kono
parents:
diff changeset
332 {
kono
parents:
diff changeset
333 /* Switch to the pad array. */
kono
parents:
diff changeset
334 sptr = NULL;
kono
parents:
diff changeset
335 sdim = pdim;
kono
parents:
diff changeset
336 for (dim = 0; dim < pdim; dim++)
kono
parents:
diff changeset
337 {
kono
parents:
diff changeset
338 scount[dim] = pcount[dim];
kono
parents:
diff changeset
339 sextent[dim] = pextent[dim];
kono
parents:
diff changeset
340 sstride[dim] = pstride[dim];
kono
parents:
diff changeset
341 sstride0 = sstride[0] * size;
kono
parents:
diff changeset
342 }
kono
parents:
diff changeset
343 }
kono
parents:
diff changeset
344 /* We now start again from the beginning of the pad array. */
kono
parents:
diff changeset
345 src = pptr;
kono
parents:
diff changeset
346 break;
kono
parents:
diff changeset
347 }
kono
parents:
diff changeset
348 else
kono
parents:
diff changeset
349 {
kono
parents:
diff changeset
350 scount[n]++;
kono
parents:
diff changeset
351 src += sstride[n] * size;
kono
parents:
diff changeset
352 }
kono
parents:
diff changeset
353 }
kono
parents:
diff changeset
354 }
kono
parents:
diff changeset
355 }
kono
parents:
diff changeset
356
kono
parents:
diff changeset
357 extern void reshape (parray *, parray *, shape_type *, parray *, shape_type *);
kono
parents:
diff changeset
358 export_proto(reshape);
kono
parents:
diff changeset
359
kono
parents:
diff changeset
360 void
kono
parents:
diff changeset
361 reshape (parray *ret, parray *source, shape_type *shape, parray *pad,
kono
parents:
diff changeset
362 shape_type *order)
kono
parents:
diff changeset
363 {
kono
parents:
diff changeset
364 reshape_internal (ret, source, shape, pad, order,
kono
parents:
diff changeset
365 GFC_DESCRIPTOR_SIZE (source));
kono
parents:
diff changeset
366 }
kono
parents:
diff changeset
367
kono
parents:
diff changeset
368
kono
parents:
diff changeset
369 extern void reshape_char (parray *, gfc_charlen_type, parray *, shape_type *,
kono
parents:
diff changeset
370 parray *, shape_type *, gfc_charlen_type,
kono
parents:
diff changeset
371 gfc_charlen_type);
kono
parents:
diff changeset
372 export_proto(reshape_char);
kono
parents:
diff changeset
373
kono
parents:
diff changeset
374 void
kono
parents:
diff changeset
375 reshape_char (parray *ret, gfc_charlen_type ret_length __attribute__((unused)),
kono
parents:
diff changeset
376 parray *source, shape_type *shape, parray *pad,
kono
parents:
diff changeset
377 shape_type *order, gfc_charlen_type source_length,
kono
parents:
diff changeset
378 gfc_charlen_type pad_length __attribute__((unused)))
kono
parents:
diff changeset
379 {
kono
parents:
diff changeset
380 reshape_internal (ret, source, shape, pad, order, source_length);
kono
parents:
diff changeset
381 }
kono
parents:
diff changeset
382
kono
parents:
diff changeset
383
kono
parents:
diff changeset
384 extern void reshape_char4 (parray *, gfc_charlen_type, parray *, shape_type *,
kono
parents:
diff changeset
385 parray *, shape_type *, gfc_charlen_type,
kono
parents:
diff changeset
386 gfc_charlen_type);
kono
parents:
diff changeset
387 export_proto(reshape_char4);
kono
parents:
diff changeset
388
kono
parents:
diff changeset
389 void
kono
parents:
diff changeset
390 reshape_char4 (parray *ret, gfc_charlen_type ret_length __attribute__((unused)),
kono
parents:
diff changeset
391 parray *source, shape_type *shape, parray *pad,
kono
parents:
diff changeset
392 shape_type *order, gfc_charlen_type source_length,
kono
parents:
diff changeset
393 gfc_charlen_type pad_length __attribute__((unused)))
kono
parents:
diff changeset
394 {
kono
parents:
diff changeset
395 reshape_internal (ret, source, shape, pad, order,
kono
parents:
diff changeset
396 source_length * sizeof (gfc_char4_t));
kono
parents:
diff changeset
397 }