summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2022-01-15 11:30:20 +0100
committerThomas Koenig <tkoenig@gcc.gnu.org>2022-01-15 11:30:20 +0100
commitf660638317ef7c79eee6640d0275c9e8fc34beba (patch)
tree68098f87f533126203ea5a888588a37f99aff6b1
parent8d87dd6069d5bdfab3f611bdb0399c7da5058041 (diff)
Allow for multiple defaults in endianness and r16 in GFORTRAN_CONVERT_UNIT.
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.
-rw-r--r--libgfortran/runtime/environ.c111
1 files changed, 56 insertions, 55 deletions
diff --git a/libgfortran/runtime/environ.c b/libgfortran/runtime/environ.c
index ff10fe53f68..3dd75ca22e3 100644
--- a/libgfortran/runtime/environ.c
+++ b/libgfortran/runtime/environ.c
@@ -500,78 +500,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: