add from_arr
This commit is contained in:
parent
112d98edcd
commit
ede2118dbd
2 changed files with 259 additions and 227 deletions
53
.session.vim
Normal file
53
.session.vim
Normal file
|
@ -0,0 +1,53 @@
|
||||||
|
let SessionLoad = 1
|
||||||
|
let s:so_save = &g:so | let s:siso_save = &g:siso | setg so=0 siso=0 | setl so=-1 siso=-1
|
||||||
|
let v:this_session=expand("<sfile>:p")
|
||||||
|
silent only
|
||||||
|
silent tabonly
|
||||||
|
cd ~/Documents/Projects/slibs
|
||||||
|
if expand('%') == '' && !&modified && line('$') <= 1 && getline(1) == ''
|
||||||
|
let s:wipebuf = bufnr('%')
|
||||||
|
endif
|
||||||
|
let s:shortmess_save = &shortmess
|
||||||
|
if &shortmess =~ 'A'
|
||||||
|
set shortmess=aoOA
|
||||||
|
else
|
||||||
|
set shortmess=aoO
|
||||||
|
endif
|
||||||
|
badd +73 slibs.h
|
||||||
|
argglobal
|
||||||
|
%argdel
|
||||||
|
$argadd slibs.h
|
||||||
|
edit slibs.h
|
||||||
|
argglobal
|
||||||
|
setlocal fdm=manual
|
||||||
|
setlocal fde=0
|
||||||
|
setlocal fmr={{{,}}}
|
||||||
|
setlocal fdi=#
|
||||||
|
setlocal fdl=0
|
||||||
|
setlocal fml=1
|
||||||
|
setlocal fdn=20
|
||||||
|
setlocal fen
|
||||||
|
silent! normal! zE
|
||||||
|
let &fdl = &fdl
|
||||||
|
let s:l = 72 - ((18 * winheight(0) + 15) / 30)
|
||||||
|
if s:l < 1 | let s:l = 1 | endif
|
||||||
|
keepjumps exe s:l
|
||||||
|
normal! zt
|
||||||
|
keepjumps 72
|
||||||
|
normal! 032|
|
||||||
|
tabnext 1
|
||||||
|
if exists('s:wipebuf') && len(win_findbuf(s:wipebuf)) == 0 && getbufvar(s:wipebuf, '&buftype') isnot# 'terminal'
|
||||||
|
silent exe 'bwipe ' . s:wipebuf
|
||||||
|
endif
|
||||||
|
unlet! s:wipebuf
|
||||||
|
set winheight=1 winwidth=20
|
||||||
|
let &shortmess = s:shortmess_save
|
||||||
|
let s:sx = expand("<sfile>:p:r")."x.vim"
|
||||||
|
if filereadable(s:sx)
|
||||||
|
exe "source " . fnameescape(s:sx)
|
||||||
|
endif
|
||||||
|
let &g:so = s:so_save | let &g:siso = s:siso_save
|
||||||
|
set hlsearch
|
||||||
|
doautoall SessionLoadPost
|
||||||
|
unlet SessionLoad
|
||||||
|
" vim: set ft=vim :
|
85
slibs.h
85
slibs.h
|
@ -45,8 +45,7 @@
|
||||||
// Vector
|
// Vector
|
||||||
|
|
||||||
#define sl_vec(type) \
|
#define sl_vec(type) \
|
||||||
struct \
|
struct { \
|
||||||
{ \
|
|
||||||
type *data; \
|
type *data; \
|
||||||
size_t size; \
|
size_t size; \
|
||||||
size_t capacity; \
|
size_t capacity; \
|
||||||
|
@ -67,6 +66,13 @@
|
||||||
(vec).data[(vec).size++] = (element); \
|
(vec).data[(vec).size++] = (element); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define sl_vec_from_arr(vec, arr) \
|
||||||
|
{ \
|
||||||
|
for (size_t i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) { \
|
||||||
|
sl_vec_push(vec, arr[i]); \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
|
||||||
#define sl_vec_unshift(vec, element) \
|
#define sl_vec_unshift(vec, element) \
|
||||||
{ \
|
{ \
|
||||||
if ((vec).size >= (vec).capacity) \
|
if ((vec).size >= (vec).capacity) \
|
||||||
|
@ -83,19 +89,14 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
#define sl_vec_forward(vec) \
|
#define sl_vec_forward(vec) \
|
||||||
{ \
|
{ (vec).data++; }
|
||||||
(vec).data++; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define sl_vec_backward(vec) \
|
#define sl_vec_backward(vec) \
|
||||||
{ \
|
{ (vec).data--; }
|
||||||
(vec).data--; \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define sl_vec_pop(vec) \
|
#define sl_vec_pop(vec) \
|
||||||
{ \
|
{ \
|
||||||
if ((vec).size > 0) \
|
if ((vec).size > 0) { \
|
||||||
{ \
|
|
||||||
(vec).size--; \
|
(vec).size--; \
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
@ -140,16 +141,14 @@ int sl_hash(const char *str);
|
||||||
#define sl_map(name, valuetype) \
|
#define sl_map(name, valuetype) \
|
||||||
typedef valuetype sl_##name##_type; \
|
typedef valuetype sl_##name##_type; \
|
||||||
\
|
\
|
||||||
typedef struct sl_##name##_entry \
|
typedef struct sl_##name##_entry { \
|
||||||
{ \
|
|
||||||
const char *key; \
|
const char *key; \
|
||||||
sl_##name##_type value; \
|
sl_##name##_type value; \
|
||||||
} sl_##name##_entry; \
|
} sl_##name##_entry; \
|
||||||
\
|
\
|
||||||
typedef sl_vec(sl_##name##_entry) sl_##name##_entry_vec; \
|
typedef sl_vec(sl_##name##_entry) sl_##name##_entry_vec; \
|
||||||
\
|
\
|
||||||
typedef struct sl_##name##_map \
|
typedef struct sl_##name##_map { \
|
||||||
{ \
|
|
||||||
sl_##name##_entry_vec *entries[SL_MAX_HASH_ENTRIES]; \
|
sl_##name##_entry_vec *entries[SL_MAX_HASH_ENTRIES]; \
|
||||||
} sl_##name##_map; \
|
} sl_##name##_map; \
|
||||||
\
|
\
|
||||||
|
@ -159,23 +158,19 @@ int sl_hash(const char *str);
|
||||||
{ \
|
{ \
|
||||||
int hash = sl_hash(key_); \
|
int hash = sl_hash(key_); \
|
||||||
sl_##map##_entry_vec *entry = map.entries[hash]; \
|
sl_##map##_entry_vec *entry = map.entries[hash]; \
|
||||||
if (!entry) \
|
if (!entry) { \
|
||||||
{ \
|
|
||||||
entry = calloc(1, sizeof(sl_##map##_entry_vec)); \
|
entry = calloc(1, sizeof(sl_##map##_entry_vec)); \
|
||||||
map.entries[hash] = entry; \
|
map.entries[hash] = entry; \
|
||||||
} \
|
} \
|
||||||
int found = 0; \
|
int found = 0; \
|
||||||
for (sl_vec_it(el, *entry)) \
|
for (sl_vec_it(el, *entry)) { \
|
||||||
{ \
|
if (strcmp(el->key, key_) == 0) { \
|
||||||
if (strcmp(el->key, key_) == 0) \
|
|
||||||
{ \
|
|
||||||
el->value = val; \
|
el->value = val; \
|
||||||
found = 1; \
|
found = 1; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
if (!found) \
|
if (!found) { \
|
||||||
{ \
|
|
||||||
sl_##map##_entry new_entry = {key_, val}; \
|
sl_##map##_entry new_entry = {key_, val}; \
|
||||||
sl_vec_push(*entry, new_entry) \
|
sl_vec_push(*entry, new_entry) \
|
||||||
} \
|
} \
|
||||||
|
@ -186,12 +181,9 @@ int sl_hash(const char *str);
|
||||||
sl_##map##_entry_vec *entry = map.entries[sl_hash(key_)]; \
|
sl_##map##_entry_vec *entry = map.entries[sl_hash(key_)]; \
|
||||||
sl_##map##_type *value = NULL; \
|
sl_##map##_type *value = NULL; \
|
||||||
\
|
\
|
||||||
if (entry) \
|
if (entry) { \
|
||||||
{ \
|
for (sl_vec_it(el, *entry)) { \
|
||||||
for (sl_vec_it(el, *entry)) \
|
if (strcmp(el->key, key_) == 0) { \
|
||||||
{ \
|
|
||||||
if (strcmp(el->key, key_) == 0) \
|
|
||||||
{ \
|
|
||||||
value = &el->value; \
|
value = &el->value; \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
|
@ -202,13 +194,11 @@ int sl_hash(const char *str);
|
||||||
})
|
})
|
||||||
|
|
||||||
#ifdef SL_IMPLEMENTATION
|
#ifdef SL_IMPLEMENTATION
|
||||||
int sl_hash(const char *str)
|
int sl_hash(const char *str) {
|
||||||
{
|
|
||||||
uint32_t seed = 0;
|
uint32_t seed = 0;
|
||||||
size_t len = strlen(str);
|
size_t len = strlen(str);
|
||||||
|
|
||||||
for (size_t i = 0; i < len && i < sizeof(uint32_t); i++)
|
for (size_t i = 0; i < len && i < sizeof(uint32_t); i++) {
|
||||||
{
|
|
||||||
seed <<= 8;
|
seed <<= 8;
|
||||||
seed |= str[i];
|
seed |= str[i];
|
||||||
}
|
}
|
||||||
|
@ -245,8 +235,7 @@ typedef sl_vec(char) sl_string;
|
||||||
char *sl_c_str(sl_string str);
|
char *sl_c_str(sl_string str);
|
||||||
|
|
||||||
#ifdef SL_IMPLEMENTATION
|
#ifdef SL_IMPLEMENTATION
|
||||||
char *sl_c_str(sl_string str)
|
char *sl_c_str(sl_string str) {
|
||||||
{
|
|
||||||
sl_vec_push(str, '\0');
|
sl_vec_push(str, '\0');
|
||||||
return str.data;
|
return str.data;
|
||||||
}
|
}
|
||||||
|
@ -255,10 +244,8 @@ char *sl_c_str(sl_string str)
|
||||||
void sl_append_c_str(sl_string *sl_str, const char *c_str);
|
void sl_append_c_str(sl_string *sl_str, const char *c_str);
|
||||||
|
|
||||||
#ifdef SL_IMPLEMENTATION
|
#ifdef SL_IMPLEMENTATION
|
||||||
void sl_append_c_str(sl_string *sl_str, const char *c_str)
|
void sl_append_c_str(sl_string *sl_str, const char *c_str) {
|
||||||
{
|
for (int i = 0; i < strlen(c_str); i++) {
|
||||||
for (int i = 0; i < strlen(c_str); i++)
|
|
||||||
{
|
|
||||||
sl_vec_push(*sl_str, c_str[i]);
|
sl_vec_push(*sl_str, c_str[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -267,21 +254,17 @@ void sl_append_c_str(sl_string *sl_str, const char *c_str)
|
||||||
// Pointers
|
// Pointers
|
||||||
|
|
||||||
#define sl_ptr(type) \
|
#define sl_ptr(type) \
|
||||||
struct \
|
struct { \
|
||||||
{ \
|
|
||||||
type *ptr; \
|
type *ptr; \
|
||||||
int ref_count; \
|
int ref_count; \
|
||||||
}
|
}
|
||||||
|
|
||||||
#define sl_ptr_make(raw_ptr) \
|
#define sl_ptr_make(raw_ptr) {raw_ptr, 1}
|
||||||
{ \
|
|
||||||
raw_ptr, 1}
|
|
||||||
|
|
||||||
#define sl_ptr_release(smart_ptr) \
|
#define sl_ptr_release(smart_ptr) \
|
||||||
({ \
|
({ \
|
||||||
smart_ptr.ref_count--; \
|
smart_ptr.ref_count--; \
|
||||||
if (smart_ptr.ref_count <= 0) \
|
if (smart_ptr.ref_count <= 0) { \
|
||||||
{ \
|
|
||||||
free(smart_ptr.ptr); \
|
free(smart_ptr.ptr); \
|
||||||
} \
|
} \
|
||||||
})
|
})
|
||||||
|
@ -306,14 +289,12 @@ sl_string *sl_read_file(const char *filename);
|
||||||
void sl_write_file(const char *filename, const sl_string buffer);
|
void sl_write_file(const char *filename, const sl_string buffer);
|
||||||
|
|
||||||
#ifdef SL_IMPLEMENTATION
|
#ifdef SL_IMPLEMENTATION
|
||||||
FILE *sl_open_file(const char *filename, const char *mode)
|
FILE *sl_open_file(const char *filename, const char *mode) {
|
||||||
{
|
|
||||||
FILE *file = fopen(filename, mode);
|
FILE *file = fopen(filename, mode);
|
||||||
return file;
|
return file;
|
||||||
}
|
}
|
||||||
|
|
||||||
sl_string *sl_read_file(const char *filename)
|
sl_string *sl_read_file(const char *filename) {
|
||||||
{
|
|
||||||
FILE *file = sl_open_file(filename, "r");
|
FILE *file = sl_open_file(filename, "r");
|
||||||
if (!file)
|
if (!file)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -324,8 +305,7 @@ sl_string *sl_read_file(const char *filename)
|
||||||
|
|
||||||
sl_string *buffer = sl_new(sl_string, 0);
|
sl_string *buffer = sl_new(sl_string, 0);
|
||||||
|
|
||||||
for (size_t i = 0; i < file_size; i++)
|
for (size_t i = 0; i < file_size; i++) {
|
||||||
{
|
|
||||||
sl_vec_push(*buffer, fgetc(file));
|
sl_vec_push(*buffer, fgetc(file));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -333,8 +313,7 @@ sl_string *sl_read_file(const char *filename)
|
||||||
return buffer;
|
return buffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
void sl_write_file(const char *filename, sl_string buffer)
|
void sl_write_file(const char *filename, sl_string buffer) {
|
||||||
{
|
|
||||||
FILE *file = sl_open_file(filename, "w");
|
FILE *file = sl_open_file(filename, "w");
|
||||||
if (!file)
|
if (!file)
|
||||||
return;
|
return;
|
||||||
|
|
Loading…
Add table
Reference in a new issue