diff --git a/headers/os/support/Architecture.h b/headers/os/support/Architecture.h index 7781397b0a..5ed8bc7197 100644 --- a/headers/os/support/Architecture.h +++ b/headers/os/support/Architecture.h @@ -18,10 +18,25 @@ const char* get_architecture(); const char* get_primary_architecture(); size_t get_secondary_architectures(const char** architectures, size_t count); +size_t get_architectures(const char** architectures, size_t count); const char* guess_architecture_for_path(const char* path); __END_DECLS +/* C++ API */ +#ifdef __cplusplus + + +#include + + +status_t get_secondary_architectures(BStringList& _architectures); +status_t get_architectures(BStringList& _architectures); + + +#endif + + #endif /* _SUPPORT_ARCHITECTURE_H */ diff --git a/headers/private/system/architecture_private.h b/headers/private/system/architecture_private.h index e638375e19..1000537d96 100644 --- a/headers/private/system/architecture_private.h +++ b/headers/private/system/architecture_private.h @@ -16,6 +16,7 @@ const char* __get_architecture(); const char* __get_primary_architecture(); size_t __get_secondary_architectures(const char** architectures, size_t count); +size_t __get_architectures(const char** architectures, size_t count); const char* __guess_architecture_for_path(const char* path); diff --git a/src/kits/support/Architecture.cpp b/src/kits/support/Architecture.cpp new file mode 100644 index 0000000000..93afc168ad --- /dev/null +++ b/src/kits/support/Architecture.cpp @@ -0,0 +1,53 @@ +/* + * Copyright 2013, Ingo Weinhold, ingo_weinhold@gmx.de. + * Distributed under the terms of the MIT License. + */ + + +#include + +#include + +#include + + +static const size_t kMaxArchitectureCount = 16; + + +static status_t +string_array_to_string_list(const char* const* architectures, size_t count, + BStringList& _architectures) +{ + _architectures.MakeEmpty(); + + for (size_t i = 0; i < count; i++) { + BString architecture(architectures[i]); + if (architecture.IsEmpty() || !_architectures.Add(architecture)) { + _architectures.MakeEmpty(); + return B_NO_MEMORY; + } + } + + return B_OK; +} + + +status_t +get_secondary_architectures(BStringList& _architectures) +{ + const char* architectures[kMaxArchitectureCount]; + size_t count = get_secondary_architectures(architectures, + kMaxArchitectureCount); + return string_array_to_string_list(architectures, + std::min(count, kMaxArchitectureCount), _architectures); +} + + +status_t +get_architectures(BStringList& _architectures) +{ + const char* architectures[kMaxArchitectureCount]; + size_t count = get_architectures(architectures, kMaxArchitectureCount); + return string_array_to_string_list(architectures, + std::min(count, kMaxArchitectureCount), _architectures); +} diff --git a/src/kits/support/Jamfile b/src/kits/support/Jamfile index a6e8249b90..e2ac6397eb 100644 --- a/src/kits/support/Jamfile +++ b/src/kits/support/Jamfile @@ -10,6 +10,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { local architecture = $(TARGET_PACKAGING_ARCH) ; MergeObject support_kit.o : + Architecture.cpp Archivable.cpp ArchivingManagers.cpp Beep.cpp diff --git a/src/system/libroot/os/Architecture.cpp b/src/system/libroot/os/Architecture.cpp index 9b96256ad3..d0a849c8a3 100644 --- a/src/system/libroot/os/Architecture.cpp +++ b/src/system/libroot/os/Architecture.cpp @@ -85,6 +85,17 @@ __get_secondary_architectures(const char** architectures, size_t count) } +size_t +__get_architectures(const char** architectures, size_t count) +{ + if (count == 0) + return __get_secondary_architectures(NULL, 0) + 1; + + architectures[0] = __get_primary_architecture(); + return __get_secondary_architectures(architectures + 1, count -1) + 1; +} + + const char* __guess_architecture_for_path(const char* path) { @@ -114,4 +125,5 @@ __guess_architecture_for_path(const char* path) B_DEFINE_WEAK_ALIAS(__get_architecture, get_architecture); B_DEFINE_WEAK_ALIAS(__get_primary_architecture, get_primary_architecture); B_DEFINE_WEAK_ALIAS(__get_secondary_architectures, get_secondary_architectures); +B_DEFINE_WEAK_ALIAS(__get_architectures, get_architectures); B_DEFINE_WEAK_ALIAS(__guess_architecture_for_path, guess_architecture_for_path);