OSDN Git Service

2005-07-07 Thomas Koenig <Thomas.Koenig@online.de>
[pf3gnuchains/gcc-fork.git] / libgfortran / intrinsics / eoshift0.c
index 5db3737..6152e9f 100644 (file)
@@ -1,5 +1,5 @@
 /* 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 (libgfortran).
@@ -64,6 +64,12 @@ eoshift0 (gfc_array_char * ret, const gfc_array_char * array,
   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;
 
@@ -125,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)
     {
@@ -251,4 +266,3 @@ eoshift0_8 (gfc_array_char *ret, const gfc_array_char *array,
 {
   eoshift0 (ret, array, *pshift, pbound, pdim ? *pdim : 1);
 }
-