summaryrefslogtreecommitdiffstats
path: root/hw4/l4basic/l4strv.h
diff options
context:
space:
mode:
Diffstat (limited to 'hw4/l4basic/l4strv.h')
-rw-r--r--hw4/l4basic/l4strv.h76
1 files changed, 76 insertions, 0 deletions
diff --git a/hw4/l4basic/l4strv.h b/hw4/l4basic/l4strv.h
new file mode 100644
index 0000000..60e5bb1
--- /dev/null
+++ b/hw4/l4basic/l4strv.h
@@ -0,0 +1,76 @@
+/* vim: set sw=4 ts=4 sts=4 et: */
+#ifndef LBS_STRV_H
+#define LBS_STRV_H
+
+#include <l4common.h>
+#include <l4array.h>
+
+typedef struct LbsStrvStruct {
+ /*< private >*/
+ LbsArray array; /* data */
+ unsigned ref_count; /* reference count */
+ bool is_alloc; /* is allocated using xmalloc */
+} LbsStrv;
+
+#define LBS_STRV(x) ((LbsStrv*)(x))
+#define LBS_STRV_GENERIC(x) ((char**)(x))
+#define LBS_STRV_GENERIC_CONST(x) ((const char* const*)(x))
+
+#define lbs_strv_new() (lbs_strv_new_with_max (0))
+LbsStrv* lbs_strv_new_with_max (size_t max);
+
+#define lbs_strv_init(strv) (lbs_strv_init_with_max (strv, 0))
+int lbs_strv_init_with_max (LbsStrv* strv, size_t max);
+
+#define lbs_strv_ref(strv) \
+ (lbs_strv_ref_generic (LBS_COMMON_CHECK_TYPE ((strv), LbsStrv*)))
+#define lbs_strv_unref(strv) \
+ (lbs_strv_unref_generic (LBS_COMMON_CHECK_TYPE ((strv), LbsStrv*)))
+void* lbs_strv_ref_generic (void* strv);
+void lbs_strv_unref_generic (void* strv);
+
+#define lbs_strv_free(array) \
+ (lbs_strv_free_generic (LBS_COMMON_CHECK_TYPE ((strv), LbsStrv*)))
+void lbs_strv_free_generic (void* strv);
+
+#define lbs_strv_get_len(strv) \
+ (lbs_array_get_len (&(LBS_COMMON_CHECK_TYPE ((strv), LbsStrv*)->array)))
+#define lbs_strv_get_max(strv) \
+ (lbs_array_get_max (&(LBS_COMMON_CHECK_TYPE ((strv), LbsStrv*)->array)))
+#define lbs_strv_get_ref_count(strv) \
+ (LBS_COMMON_CHECK_TYPE ((strv), LbsStrv*)->ref_count)
+#define lbs_strv_get_is_alloc(strv) \
+ (LBS_COMMON_CHECK_TYPE ((strv), LbsStrv*)->is_alloc)
+#define lbs_strv_set_len(strv,len) \
+ (lbs_array_set_len (LBS_COMMON_CHECK_TYPE ((strv), LbsStrv*)->array, (len)))
+#define lbs_strv_set_max(strv,max) \
+ (lbs_array_set_max (LBS_COMMON_CHECK_TYPE ((strv), LbsStrv*)->array, (max)))
+
+char* lbs_strv_dup_str (LbsStrv* strv, size_t stri);
+#define lbs_strv_get_str_wrapper(strv,stri) \
+ (&(lbs_array_v (&((strv)->array), LbsArray, (stri))))
+#define lbs_strv_get_str_len(strv,stri) \
+ (lbs_array_get_len (lbs_strv_get_str_wrapper ((strv), (stri))))
+#define lbs_strv_get_str_not_null_terminated(strv, stri) \
+ ((char*)(lbs_array_get_data (lbs_strv_get_str_wrapper ((strv), (stri)))))
+#define lbs_strv_char(strv,stri,chri) \
+ (lbs_array_v (lbs_strv_get_str_wrapper (strv, stri), char, (chri)))
+
+int lbs_strv_append_char (LbsStrv* strv, size_t stri, char chr);
+int lbs_strv_append_str_empty (LbsStrv* strv);
+int lbs_strv_append_str (LbsStrv* strv, const char* bstr);
+int lbs_strv_append_strv (LbsStrv* strv, const char* const* bstrv);
+int lbs_strv_remove_str (LbsStrv* strv);
+#define lbs_strv_remove_char(strv,stri) \
+ (lbs_array_remove (lbs_strv_get_str_wrapper ((strv), (stri))))
+
+int lbs_strv_minimize (LbsStrv* strv);
+char** lbs_strv_copy_strv (LbsStrv* strv);
+char** lbs_strv_drop_struct (LbsStrv* strv);
+
+char** lbs_strv_generic_build (const char* str, ...);
+int lbs_strv_generic_cmp (const char* const* bstrv1,
+ const char* const* bstrv2);
+void lbs_strv_generic_free (char** bstrv);
+
+#endif /* LBS_STRV_H */