aboutsummaryrefslogtreecommitdiff
path: root/libgfortran
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2012-10-06 13:04:35 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2012-10-06 13:04:35 +0000
commit4ed3a4d41bca4ddd01f7775ab0f4e1140a0a4fdd (patch)
tree6ef50bac9c6995525a6e109ca1f1b71824cf4a6e /libgfortran
parente9355cc32ee9d5967f9c359d42c1ae505e5266b6 (diff)
downloadgcc-4ed3a4d41bca4ddd01f7775ab0f4e1140a0a4fdd.zip
gcc-4ed3a4d41bca4ddd01f7775ab0f4e1140a0a4fdd.tar.gz
gcc-4ed3a4d41bca4ddd01f7775ab0f4e1140a0a4fdd.tar.bz2
re PR libfortran/54736 (GFORTRAN_CONVERT_UNIT causes malloc error on several platforms)
2012-10-06 Thomas König <tkoenig@gcc.gnu.org> PR libfortran/54736 * runtime/environ.c (search_unit): Correct logic for binary search. (mark_single): Fix index errors. From-SVN: r192158
Diffstat (limited to 'libgfortran')
-rw-r--r--libgfortran/ChangeLog7
-rw-r--r--libgfortran/runtime/environ.c42
2 files changed, 35 insertions, 14 deletions
diff --git a/libgfortran/ChangeLog b/libgfortran/ChangeLog
index feeb10a..de915f8 100644
--- a/libgfortran/ChangeLog
+++ b/libgfortran/ChangeLog
@@ -1,3 +1,10 @@
+2012-10-06 Thomas König <tkoenig@gcc.gnu.org>
+
+ PR libfortran/54736
+ * runtime/environ.c (search_unit): Correct logic
+ for binary search.
+ (mark_single): Fix index errors.
+
2012-09-29 Thomas König <tkoenig@gcc.gnu.org>
PR fortran/52724
diff --git a/libgfortran/runtime/environ.c b/libgfortran/runtime/environ.c
index bcb91f4..1f73397 100644
--- a/libgfortran/runtime/environ.c
+++ b/libgfortran/runtime/environ.c
@@ -459,21 +459,35 @@ search_unit (int unit, int *ip)
{
int low, high, mid;
- low = -1;
- high = n_elist;
- while (high - low > 1)
+ if (n_elist == 0)
+ {
+ *ip = 0;
+ return 0;
+ }
+
+ low = 0;
+ high = n_elist - 1;
+
+ do
{
mid = (low + high) / 2;
- if (unit <= elist[mid].unit)
- high = mid;
+ if (unit == elist[mid].unit)
+ {
+ *ip = mid;
+ return 1;
+ }
+ else if (unit > elist[mid].unit)
+ low = mid + 1;
else
- low = mid;
- }
- *ip = high;
- if (elist[high].unit == unit)
- return 1;
+ high = mid - 1;
+ } while (low <= high);
+
+ if (unit > elist[mid].unit)
+ *ip = mid + 1;
else
- return 0;
+ *ip = mid;
+
+ return 0;
}
/* This matches a keyword. If it is found, return the token supplied,
@@ -588,13 +602,13 @@ mark_single (int unit)
}
if (search_unit (unit, &i))
{
- elist[unit].conv = endian;
+ elist[i].conv = endian;
}
else
{
- for (j=n_elist; j>=i; j--)
+ for (j=n_elist-1; j>=i; j--)
elist[j+1] = elist[j];
-
+
n_elist += 1;
elist[i].unit = unit;
elist[i].conv = endian;