Allow for multiple defaults in endianness and r16 in GFORTRAN_CONVERT_UNIT.
authorThomas Koenig <tkoenig@gcc.gnu.org>
Sat, 15 Jan 2022 10:30:20 +0000 (11:30 +0100)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Mon, 17 Jan 2022 06:29:35 +0000 (07:29 +0100)
With this patch, it is possible to specify multiple defaults inthe
GFORTRAN_CONVERT_UNIT environment variable so that, for example, R16_IEEE
and BIG_ENDIAN can be specified together.

libgfortran/ChangeLog:

* runtime/environ.c: Allow for multiple default values so that
separate default specifications for IBM long double format and
endianness are possible.

libgfortran/runtime/environ.c

index 3d60950..a53c649 100644 (file)
@@ -499,78 +499,79 @@ do_parse (void)
 
   unit_count = 0;
 
-  start = p;
-
   /* Parse the string.  First, let's look for a default.  */
-  tok = next_token ();
   endian = 0;
-
-  switch (tok)
+  while (1)
     {
-    case NATIVE:
-      endian = GFC_CONVERT_NATIVE;
-      break;
+      start = p;
+      tok = next_token ();
+      switch (tok)
+       {
+       case NATIVE:
+         endian = GFC_CONVERT_NATIVE;
+         break;
 
-    case SWAP:
-      endian = GFC_CONVERT_SWAP;
-      break;
+       case SWAP:
+         endian = GFC_CONVERT_SWAP;
+         break;
 
-    case BIG:
-      endian = GFC_CONVERT_BIG;
-      break;
+       case BIG:
+         endian = GFC_CONVERT_BIG;
+         break;
 
-    case LITTLE:
-      endian = GFC_CONVERT_LITTLE;
-      break;
+       case LITTLE:
+         endian = GFC_CONVERT_LITTLE;
+         break;
 
 #ifdef HAVE_GFC_REAL_17
-    case R16_IEEE:
-      endian = GFC_CONVERT_R16_IEEE;
-      break;
+       case R16_IEEE:
+         endian = GFC_CONVERT_R16_IEEE;
+         break;
 
-    case R16_IBM:
-      endian = GFC_CONVERT_R16_IBM;
-      break;
+       case R16_IBM:
+         endian = GFC_CONVERT_R16_IBM;
+         break;
 #endif
-    case INTEGER:
-      /* A leading digit means that we are looking at an exception.
-        Reset the position to the beginning, and continue processing
-        at the exception list.  */
-      p = start;
-      goto exceptions;
-      break;
+       case INTEGER:
+         /* A leading digit means that we are looking at an exception.
+            Reset the position to the beginning, and continue processing
+            at the exception list.  */
+         p = start;
+         goto exceptions;
+         break;
 
-    case END:
-      goto end;
-      break;
+       case END:
+         goto end;
+         break;
 
-    default:
-      goto error;
-      break;
+       default:
+         goto error;
+         break;
     }
 
-  tok = next_token ();
-  switch (tok)
-    {
-    case ';':
-      def = endian;
-      break;
+      tok = next_token ();
+      switch (tok)
+       {
+       case ';':
+         def = def == GFC_CONVERT_NONE ? endian : def | endian;
+         break;
 
-    case ':':
-      /* This isn't a default after all.  Reset the position to the
-        beginning, and continue processing at the exception list.  */
-      p = start;
-      goto exceptions;
-      break;
+       case ':':
+         /* This isn't a default after all.  Reset the position to the
+            beginning, and continue processing at the exception list.  */
+         p = start;
+         goto exceptions;
+         break;
 
-    case END:
-      def = endian;
-      goto end;
-      break;
+       case END:
+         def = def == GFC_CONVERT_NONE ? endian : def | endian;
+         goto end;
+         break;
 
-    default:
-      goto error;
-      break;
+       default:
+         goto error;
+         break;
+       }
     }
 
  exceptions: