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.
This commit is contained in:
Thomas Koenig 2022-01-15 11:30:20 +01:00
parent b3e77224ed
commit 025a707d28
1 changed files with 56 additions and 55 deletions

View 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: