summaryrefslogtreecommitdiffstats
path: root/Alc/helpers.c
diff options
context:
space:
mode:
authorChris Robinson <[email protected]>2014-03-28 05:40:24 -0700
committerChris Robinson <[email protected]>2014-03-28 05:44:19 -0700
commitaf8fda8a4a19e7d51506bf873c719361277249d2 (patch)
treee32990f884b9d3d6caed01dbccab4c111ee6902d /Alc/helpers.c
parent2ca673cca2205271fc1198e9bbf04695960cf25d (diff)
Add an al_string type and use it for the device lists
Diffstat (limited to 'Alc/helpers.c')
-rw-r--r--Alc/helpers.c64
1 files changed, 64 insertions, 0 deletions
diff --git a/Alc/helpers.c b/Alc/helpers.c
index af17b48c..77bfb353 100644
--- a/Alc/helpers.c
+++ b/Alc/helpers.c
@@ -87,6 +87,7 @@ DEFINE_DEVPROPKEY(DEVPKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80,
#include "atomic.h"
#include "uintmap.h"
#include "vector.h"
+#include "alstring.h"
#include "compat.h"
@@ -780,6 +781,69 @@ ALboolean vector_reserve(void *ptr, size_t orig_count, size_t base_size, size_t
return AL_TRUE;
}
+ALboolean vector_resize(void *ptr, size_t base_size, size_t obj_count, size_t obj_size)
+{
+ vector_ *vecptr = ptr;
+ if(!vector_reserve(vecptr, (*vecptr)->Capacity, base_size, obj_count, obj_size, AL_TRUE))
+ return AL_FALSE;
+ (*vecptr)->Size = (ALsizei)obj_count;
+ return AL_TRUE;
+}
+
+
+extern inline ALsizei al_string_length(const_al_string str);
+extern inline ALsizei al_string_empty(const_al_string str);
+extern inline const al_string_char_type *al_string_get_cstr(const_al_string str);
+
+void al_string_clear(al_string *str)
+{
+ /* Reserve one more character than the total size of the string. This is to
+ * ensure we have space to add a null terminator in the string data so it
+ * can be used as a C-style string. */
+ VECTOR_RESERVE(*str, 1);
+ VECTOR_RESIZE(*str, 0);
+ *VECTOR_ITER_END(*str) = 0;
+}
+
+void al_string_copy(al_string *str, const_al_string from)
+{
+ ALsizei len = VECTOR_SIZE(from);
+ VECTOR_RESERVE(*str, len+1);
+ VECTOR_RESIZE(*str, len);
+ memcpy(&VECTOR_FRONT(*str), &VECTOR_FRONT(from),
+ len*sizeof(al_string_char_type));
+ *VECTOR_ITER_END(*str) = 0;
+}
+
+void al_string_copy_cstr(al_string *str, const al_string_char_type *from)
+{
+ ALsizei len = strlen(from);
+ VECTOR_RESERVE(*str, len+1);
+ VECTOR_RESIZE(*str, len);
+ memcpy(&VECTOR_FRONT(*str), from, len*sizeof(al_string_char_type));
+ *VECTOR_ITER_END(*str) = 0;
+}
+
+void al_string_append_char(al_string *str, const al_string_char_type c)
+{
+ VECTOR_RESERVE(*str, al_string_length(*str)+2);
+ VECTOR_PUSH_BACK(*str, c);
+ *VECTOR_ITER_END(*str) = 0;
+}
+
+void al_string_append_range(al_string *str, const al_string_char_type *from, const al_string_char_type *to)
+{
+ ptrdiff_t len = to - from;
+ if(len != 0)
+ {
+ VECTOR_RESERVE(*str, al_string_length(*str)+len+1);
+ VECTOR_RESIZE(*str, al_string_length(*str)+len);
+ memcpy(VECTOR_ITER_END(*str)-len, from, len);
+ *VECTOR_ITER_END(*str) = 0;
+ }
+}
+
+
void InitUIntMap(UIntMap *map, ALsizei limit)
{