summaryrefslogtreecommitdiffstats
path: root/hw4/l4basic/l4strv.h
blob: 60e5bb17a1e0180637b39e777e41026b72fa08ba (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
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 */