af79b4a5b6ad7ba470ebb62614bdd84730fd4643
[visor] / libvisor / src / visor.c
1 #include "vilibc.h"
2 #include "visor.h"
3 #include "vimpl.h"
4
5 #define vi_malloc(s)    vi->mm.malloc(s)
6 #define vi_free(p)              vi->mm.free(p)
7
8 #ifdef HAVE_LIBC
9 static const struct vi_alloc stdalloc = { malloc, free, realloc };
10 #endif
11
12 struct visor *vi_create(struct vi_alloc *mm)
13 {
14         struct visor *vi;
15
16 #ifdef HAVE_LIBC
17         if(!mm) mm = &stdalloc;
18 #else
19         if(!mm) return 0;
20 #endif
21
22         if(!(vi = mm->malloc(sizeof *vi))) {
23                 return 0;
24         }
25         memset(vi, 0, sizeof *vi);
26         vi->mm = *mm;
27
28         return vi;
29 }
30
31 void vi_destroy(struct visor *vi)
32 {
33         while(vi->buflist) {
34                 vi_delete_buf(vi, vi->buflist);
35         }
36         vi_free(vi);
37 }
38
39 void vi_set_fileops(struct visor *vi, struct vi_fileops *fop)
40 {
41         vi->fop = *fop;
42 }
43
44 struct vi_buffer *vi_new_buf(struct visor *vi, const char *path)
45 {
46         struct vi_buffer *nb;
47
48         if(!(nb = vi_malloc(sizeof *nb))) {
49                 vi_error(vi, "failed to allocate new buffer\n");
50                 return 0;
51         }
52         memset(nb, 0, sizeof *nb);
53
54         if(path) {
55                 if(vi_buf_read(nb, path) == -1) {
56                         vi_free(nb);
57                         return 0;
58                 }
59         }
60
61         if(vi->buflist) {
62                 struct vi_buffer *last = vi->buflist->prev;
63                 nb->prev = last;
64                 nb->next = vi->buflist;
65                 last->next = nb;
66                 vi->buflist->prev = nb;
67         } else {
68                 nb->next = nb->prev = nb;
69                 vi->buflist = nb;
70         }
71         return nb;
72 }