## makelib-preprocessor-dictionary.pkg
## (C) 1999 Lucent Technologies, Bell Laboratories
## Author: Matthias Blume (blume@kurims.kyoto-u.ac.jp)
# Compiled by:
#
src/app/makelib/makelib.sublib# We're directly referenced (only) in
#
src/app/makelib/main/makelib-preprocessor-state-g.pkgstipulate
package sa = supported_architectures; # supported_architectures is from
src/lib/compiler/front/basics/main/supported-architectures.pkgherein
api Makelib_Preprocessor_Dictionary {
#
Makelib_Preprocessor_Dictionary;
get: Makelib_Preprocessor_Dictionary
->
String # key
->
Null_Or( Int ); # NULL means to drop key from dictionary; THE(value) means set it to given value.
empty_makelib_preprocessor_dictionary: Makelib_Preprocessor_Dictionary;
# Add/drop a definition to preprocessor dictionary:
#
define: ( Makelib_Preprocessor_Dictionary,
String, # Key
Null_Or( Int ) # Value. NULL means to drop the key.
)
->
Makelib_Preprocessor_Dictionary;
make_default_makelib_preprocessor_dictionary
:
{ architecture: sa::Supported_Architectures,
os_kind: platform_properties::os::Kind,
#
compiler_version: List( Int ),
extra_symbols: List( String )
}
->
Makelib_Preprocessor_Dictionary;
};
end;
stipulate
package sa = supported_architectures; # supported_architectures is from
src/lib/compiler/front/basics/main/supported-architectures.pkg package stm = string_map; # string_map is from
src/lib/src/string-map.pkgherein
package makelib_preprocessor_dictionary
: Makelib_Preprocessor_Dictionary
{
# We implement the makelib preprocessor dictionary
# as a simple String -> Int map:
#
Makelib_Preprocessor_Dictionary
=
stm::Map( Int );
fun get dictionary string
=
stm::get (dictionary, string);
empty_makelib_preprocessor_dictionary
=
stm::empty;
fun define (dictionary, string, THE value) => stm::set (dictionary, string, value); # Define 'string' in 'dictionary' with integer value 'value'
define (dictionary, string, NULL ) => stm::drop (dictionary, string); # Delete 'string' from 'dictionary'.
end;
# This fn is invoked (only) from:
#
#
src/app/makelib/main/makelib-preprocessor-state-g.pkg #
fun make_default_makelib_preprocessor_dictionary
{ architecture,
os_kind,
compiler_version, # Something like: [110,58,3,0.2]
extra_symbols # Currently this will be ["ABI_Darwin"] on intel macs, otherwise always [].
}
=
{
(sa::architecture_info architecture)
->
{ architecture_name, big_endian, pointer_size_in_bits };
architecture_symbol = "ARCH_" + architecture_name;
pointer_size_in_bits_symbol = "POINTER_SIZE_IN_BITS"; # Fundamental word size for this implementation. Currently always 32.
endian_symbol
=
big_endian ?? "BIG_ENDIAN"
:: "LITTLE_ENDIAN";
os_symbol
=
case os_kind
#
platform_properties::os::POSIX => "OPSYS_UNIX";
platform_properties::os::WIN32 => "OPSYS_WIN32";
platform_properties::os::MACOS => "OPSYS_MACOS";
platform_properties::os::OS2 => "OPSYS_OS2";
platform_properties::os::BEOS => "OPSYS_BEOS";
esac;
my (major, minor)
=
case compiler_version
#
[] => (0, 0);
[major] => (major, 0);
major ! minor ! _ => (major, minor);
esac;
major_symbol = "MYTHRYL_COMPILER_MAJOR_VERSION";
minor_symbol = "MYTHRYL_COMPILER_MINOR_VERSION";
my all_defs: List( (String, Int) ) # Extend our local key-val list with 'extra_symbols', all with value '1'.
=
fold_backward
(\\ (s, l) = (s, 1) ! l)
[ (architecture_symbol, 1),
(endian_symbol, 1),
(pointer_size_in_bits_symbol, pointer_size_in_bits),
(os_symbol, 1),
(major_symbol, major),
(minor_symbol, minor)
]
extra_symbols;
fold_forward
stm::set' # Fn to apply. set' def in
src/lib/src/string-map.pkg empty_makelib_preprocessor_dictionary # Initial value.
all_defs; # List to process.
};
};
end;