int gfc_interpret_integer (int kind, unsigned char *buffer, size_t buffer_size, mpz_t integer) { mpz_init (integer); gfc_conv_tree_to_mpz (integer, native_interpret_expr (gfc_get_int_type (kind), buffer, buffer_size)); return size_integer (kind); }
int gfc_interpret_logical (int kind, unsigned char *buffer, size_t buffer_size, int *logical) { tree t = native_interpret_expr (gfc_get_logical_type (kind), buffer, buffer_size); *logical = double_int_zero_p (tree_to_double_int (t)) ? 0 : 1; return size_logical (kind); }
int gfc_interpret_float (int kind, unsigned char *buffer, size_t buffer_size, mpfr_t real) { mpfr_init (real); gfc_conv_tree_to_mpfr (real, native_interpret_expr (gfc_get_real_type (kind), buffer, buffer_size)); return size_float (kind); }
int gfc_interpret_character (unsigned char *buffer, size_t buffer_size, gfc_expr *result) { int i; if (result->ts.cl && result->ts.cl->length) result->value.character.length = (int) mpz_get_ui (result->ts.cl->length->value.integer); gcc_assert (buffer_size >= size_character (result->value.character.length, result->ts.kind)); result->value.character.string = gfc_get_wide_string (result->value.character.length + 1); if (result->ts.kind == gfc_default_character_kind) for (i = 0; i < result->value.character.length; i++) result->value.character.string[i] = (gfc_char_t) buffer[i]; else { mpz_t integer; unsigned bytes = size_character (1, result->ts.kind); mpz_init (integer); gcc_assert (bytes <= sizeof (unsigned long)); for (i = 0; i < result->value.character.length; i++) { gfc_conv_tree_to_mpz (integer, native_interpret_expr (gfc_get_char_type (result->ts.kind), &buffer[bytes*i], buffer_size-bytes*i)); result->value.character.string[i] = (gfc_char_t) mpz_get_ui (integer); } mpz_clear (integer); } result->value.character.string[result->value.character.length] = '\0'; return result->value.character.length; }