OSDN Git Service

2005-07-07 Thomas Koenig <Thomas.Koenig@online.de>
[pf3gnuchains/gcc-fork.git] / libgfortran / intrinsics / eoshift0.c
index 66f0ab1..6152e9f 100644 (file)
@@ -1,21 +1,30 @@
 /* Generic implementation of the EOSHIFT intrinsic
-   Copyright 2002 Free Software Foundation, Inc.
+   Copyright 2002, 2005 Free Software Foundation, Inc.
    Contributed by Paul Brook <paul@nowt.org>
 
-This file is part of the GNU Fortran 95 runtime library (libgfor).
+This file is part of the GNU Fortran 95 runtime library (libgfortran).
 
-Libgfor is free software; you can redistribute it and/or
-modify it under the terms of the GNU Lesser General Public
+Libgfortran is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public
 License as published by the Free Software Foundation; either
-version 2.1 of the License, or (at your option) any later version.
+version 2 of the License, or (at your option) any later version.
 
-Ligbfor is distributed in the hope that it will be useful,
+In addition to the permissions in the GNU General Public License, the
+Free Software Foundation gives you unlimited permission to link the
+compiled version of this file into combinations with other programs,
+and to distribute those combinations without any restriction coming
+from the use of this file.  (The General Public License restrictions
+do apply in other respects; for example, they cover modification of
+the file, and distribution when not linked into a combine
+executable.)
+
+Libgfortran is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-GNU Lesser General Public License for more details.
+GNU General Public License for more details.
 
-You should have received a copy of the GNU Lesser General Public
-License along with libgfor; see the file COPYING.LIB.  If not,
+You should have received a copy of the GNU General Public
+License along with libgfortran; see the file COPYING.  If not,
 write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 Boston, MA 02111-1307, USA.  */
 
@@ -36,25 +45,31 @@ eoshift0 (gfc_array_char * ret, const gfc_array_char * array,
          int shift, const char * pbound, int which)
 {
   /* r.* indicates the return array.  */
-  index_type rstride[GFC_MAX_DIMENSIONS - 1];
+  index_type rstride[GFC_MAX_DIMENSIONS];
   index_type rstride0;
   index_type roffset;
   char *rptr;
   char *dest;
   /* s.* indicates the source array.  */
-  index_type sstride[GFC_MAX_DIMENSIONS - 1];
+  index_type sstride[GFC_MAX_DIMENSIONS];
   index_type sstride0;
   index_type soffset;
   const char *sptr;
   const char *src;
 
-  index_type count[GFC_MAX_DIMENSIONS - 1];
-  index_type extent[GFC_MAX_DIMENSIONS - 1];
+  index_type count[GFC_MAX_DIMENSIONS];
+  index_type extent[GFC_MAX_DIMENSIONS];
   index_type dim;
   index_type size;
   index_type len;
   index_type n;
 
+  /* The compiler cannot figure out that these are set, initialize
+     them to avoid warnings.  */
+  len = 0;
+  soffset = 0;
+  roffset = 0;
+
   if (!pbound)
     pbound = zeros;
 
@@ -116,10 +131,19 @@ eoshift0 (gfc_array_char * ret, const gfc_array_char * array,
   sstride0 = sstride[0];
   rptr = ret->data;
   sptr = array->data;
-  if (shift > 0)
-    len = len - shift;
+
+  if ((shift >= 0 ? shift : -shift) > len)
+    {
+      shift = len;
+      len = 0;
+    }
   else
-    len = len + shift;
+    {
+      if (shift > 0)
+       len = len - shift;
+      else
+       len = len + shift;
+    }
 
   while (rptr)
     {
@@ -187,6 +211,35 @@ eoshift0 (gfc_array_char * ret, const gfc_array_char * array,
     }
 }
 
+
+extern void eoshift0_1 (gfc_array_char *, const gfc_array_char *,
+                       const GFC_INTEGER_1 *, const char *,
+                       const GFC_INTEGER_1 *);
+export_proto(eoshift0_1);
+
+void
+eoshift0_1 (gfc_array_char *ret, const gfc_array_char *array,
+           const GFC_INTEGER_1 *pshift, const char *pbound,
+           const GFC_INTEGER_1 *pdim)
+{
+  eoshift0 (ret, array, *pshift, pbound, pdim ? *pdim : 1);
+}
+
+
+extern void eoshift0_2 (gfc_array_char *, const gfc_array_char *,
+                       const GFC_INTEGER_2 *, const char *,
+                       const GFC_INTEGER_2 *);
+export_proto(eoshift0_2);
+
+void
+eoshift0_2 (gfc_array_char *ret, const gfc_array_char *array,
+           const GFC_INTEGER_2 *pshift, const char *pbound,
+           const GFC_INTEGER_2 *pdim)
+{
+  eoshift0 (ret, array, *pshift, pbound, pdim ? *pdim : 1);
+}
+
+
 extern void eoshift0_4 (gfc_array_char *, const gfc_array_char *,
                        const GFC_INTEGER_4 *, const char *,
                        const GFC_INTEGER_4 *);
@@ -200,6 +253,7 @@ eoshift0_4 (gfc_array_char *ret, const gfc_array_char *array,
   eoshift0 (ret, array, *pshift, pbound, pdim ? *pdim : 1);
 }
 
+
 extern void eoshift0_8 (gfc_array_char *, const gfc_array_char *,
                        const GFC_INTEGER_8 *, const char *,
                        const GFC_INTEGER_8 *);