13typedef uint64_t offset_t;
14typedef int64_t relative_offset_t;
15typedef size_t number_t;
26static constexpr EndianType ByteSwapped(EndianType endian_type)
31 return UndefinedEndian;
37 return AntiPDP11Endian;
44extern EndianType DefaultEndianType;
49size_t GetOffset(EndianType endiantype,
size_t bytes,
size_t index);
54offset_t AlignTo(offset_t value, offset_t align);
59uint16_t Swap16(uint16_t value);
64uint16_t FromLittleEndian16(uint16_t value);
69uint16_t FromBigEndian16(uint16_t value);
74uint32_t Swap32(uint32_t value);
79uint32_t Swap32words(uint32_t value);
84uint32_t FromLittleEndian32(uint32_t value);
89uint32_t FromBigEndian32(uint32_t value);
94uint32_t FromPDP11Endian32(uint32_t value);
99uint64_t Swap64(uint64_t value);
104uint64_t Swap64words(uint64_t value);
109uint64_t FromLittleEndian64(uint64_t value);
111uint64_t FromBigEndian64(uint64_t value);
113uint64_t FromPDP11Endian64(uint64_t value);
118uint64_t ReadUnsigned(
size_t bytes,
size_t maximum, uint8_t
const * data, EndianType endiantype);
123int64_t SignExtend(
size_t bytes, int64_t value);
128int64_t ReadSigned(
size_t bytes,
size_t maximum, uint8_t
const * data, EndianType endiantype);
133void WriteWord(
size_t bytes,
size_t maximum, uint8_t * data, uint64_t value, EndianType endiantype);
135bool LookupOption(std::map<std::string, std::string>& options, std::string key, std::string& value);
139 inline bool operator()(
const std::string& first,
const std::string& second)
const
141 return std::ranges::equal(first.begin(), first.end(), second.begin(), second.end(),
142 [](
char c1,
char c2) ->
bool { return std::tolower(static_cast<unsigned char>(c1)) == std::tolower(static_cast<unsigned char>(c2)); });
148 inline bool operator()(
const std::string& first,
const std::string& second)
const
150 return std::lexicographical_compare(first.begin(), first.end(), second.begin(), second.end(),
151 [](
char c1,
char c2) ->
bool { return std::tolower(static_cast<unsigned char>(c1)) < std::tolower(static_cast<unsigned char>(c2)); });
160bool starts_with(std::string str, std::string start);
167bool ends_with(std::string str, std::string end);
170enum class Month :
unsigned
187template <
unsigned _Year, Month _Month = Month::January,
unsigned _Day = 1>
190 static constexpr unsigned Year = _Year;
191 static constexpr ::Month Month = _Month;
192 static constexpr unsigned Day = _Day;
194 static constexpr std::chrono::sys_days to_days()
196 return std::chrono::year(Year) / std::chrono::month(
unsigned(Month)) / std::chrono::day(Day);
208template <
typename Epoch,
typename Rep =
int32_t,
typename Period = std::ratio<1>>
212 using period = Period;
213 using duration = std::chrono::duration<rep, period>;
214 using time_point = std::chrono::time_point<VendorClock>;
215 static constexpr bool is_steady =
false;
217 static constexpr rep to_ticks(duration dur)
222 static constexpr rep to_ticks(time_point tp)
224 return to_ticks(tp.time_since_epoch());
227 static constexpr duration to_duration(Rep ticks)
229 return duration(ticks);
232 static constexpr time_point to_time_point(duration dur)
234 return time_point(dur);
237 static constexpr time_point to_time_point(Rep ticks)
239 return time_point(duration(ticks));
242 static constexpr time_point to_time_point(std::chrono::time_point<std::chrono::system_clock> tp)
244 return time_point(std::chrono::duration_cast<duration>(tp - Epoch::to_time_point()));
247 static constexpr time_point to_time_point(std::chrono::sys_days days, std::chrono::nanoseconds ns)
249 return time_point(std::chrono::duration_cast<duration>(days - Epoch::to_days()) + std::chrono::duration_cast<duration>(ns));
252 template <
typename FromClock>
253 static time_point convert(std::chrono::time_point<FromClock> from)
255 return to_time_point(FromClock::to_days(from), FromClock::to_nanoseconds(from));
258 static constexpr std::chrono::sys_days to_days(time_point tp)
260 return Epoch::to_days() + std::chrono::duration_cast<std::chrono::days>(tp.time_since_epoch());
263 static constexpr std::chrono::nanoseconds to_nanoseconds(time_point tp)
265 const auto dur = tp.time_since_epoch();
266 return dur - std::chrono::duration_cast<std::chrono::days>(dur);
269 static std::string to_iso_time(time_point tp)
271 return std::format(
"{:%Y-%m-%d} {:%H:%M:%S}", to_days(tp), to_nanoseconds(tp));
274 static time_point now()
noexcept
276 return to_time_point(std::chrono::system_clock::now());
284template <
typename Clock>
285 using Timestamp = std::chrono::time_point<Clock>;
293 Exception(std::string message) : message(message)
299 extern std::ostream Debug;
300 extern std::ostream Warning;
301 extern std::ostream Error;
303 [[noreturn]]
void FatalError(std::string message);
307 typedef std::map<std::shared_ptr<Section>,
Location> Displacement;
Represents a single offset within a section, or an absolute location in memory if the section is null...
Definition location.h:17
A section of data as read from an object file.
Definition section.h:28
Provides a type for compile-time constants representing Gregorian dates.
Definition common.h:189
A static class that encodes a specific timestamp format.
Definition common.h:210