1/* Implementation of the size intrinsic.
2   Copyright (C) 2002-2022 Free Software Foundation, Inc.
3   Contributed by Paul Brook <paul@nowt.org>
4
5This file is part of the GNU Fortran 95 runtime library (libgfortran).
6
7Libgfortran is free software; you can redistribute it and/or
8modify it under the terms of the GNU General Public
9License as published by the Free Software Foundation; either
10version 3 of the License, or (at your option) any later version.
11
12Libgfortran is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17Under Section 7 of GPL version 3, you are granted additional
18permissions described in the GCC Runtime Library Exception, version
193.1, as published by the Free Software Foundation.
20
21You should have received a copy of the GNU General Public License and
22a copy of the GCC Runtime Library Exception along with this program;
23see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
24<http://www.gnu.org/licenses/>.  */
25
26#include "libgfortran.h"
27
28/* Note: This function is only used internally in libgfortran and old FE code,
29   new code generates the code inline.  */
30index_type
31size0 (const array_t * array)
32{
33  int n;
34  index_type size;
35  index_type len;
36
37  size = 1;
38  for (n = 0; n < GFC_DESCRIPTOR_RANK (array); n++)
39    {
40      len = GFC_DESCRIPTOR_EXTENT(array,n);
41      if (len < 0)
42        len = 0;
43      size *= len;
44    }
45  return size;
46}
47iexport(size0);
48
49extern index_type size1 (const array_t * array, index_type dim);
50export_proto(size1);
51
52/* Note: This function it is unused in libgfortran itself and the FE no longer
53   call it; however, old code might still call it. */
54index_type
55size1 (const array_t * array, index_type dim)
56{
57  index_type size;
58
59  dim--;
60
61  size = GFC_DESCRIPTOR_EXTENT(array,dim);
62  if (size < 0)
63    size = 0;
64  return size;
65}
66