Hash :
63b45f3b
Author :
tokyovania
Date :
2022-08-12T14:38:49
switch from bits to bytes
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 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
/*
* Copyright 2018-2021 Thomas de Grivel <thoxdg@gmail.com>
*
* Permission to use, copy, modify, and distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <assert.h>
#include <stdio.h>
#include "data.h"
#include "var.h"
#include "rtbuf.h"
s_data_type g_rtbuf_var_type = {
sizeof(s_rtbuf_var),
DATA_TYPE_BYTES
};
s_data_alloc g_rtbuf_var_alloc;
s_rtbuf_var *g_rtbuf_var;
void rtbuf_var_init (void)
{
data_alloc_init(&g_rtbuf_var_alloc, &g_rtbuf_var_type, RTBUF_VAR_MAX, NULL, NULL);
g_rtbuf_var = g_rtbuf_var_alloc.mem;
assert(g_rtbuf_var);
}
void rtbuf_var_shutdown (void)
{
if (g_rtbuf_var) {
rtbuf_var_delete_all();
g_rtbuf_var = 0;
data_alloc_clean(&g_rtbuf_var_alloc);
}
}
s_rtbuf_var * rtbuf_var_new (const char *name)
{
s_rtbuf_var *var = data_new(&g_rtbuf_var_alloc);
if (var)
var->name = symbol_intern(name);
return var;
}
void rtbuf_var_delete (s_rtbuf_var *var)
{
data_delete(&g_rtbuf_var_alloc, var);
}
void rtbuf_var_delete_all ()
{
unsigned i = 0;
int n = g_rtbuf_var_alloc.n;
while (i < g_rtbuf_var_alloc.max) {
if (g_rtbuf_var[i].name) {
rtbuf_var_delete(g_rtbuf_var + i);
n--;
}
i++;
}
}
s_rtbuf_var * rtbuf_var_find (const char *name)
{
s_rtbuf_var *v = g_rtbuf_var + g_rtbuf_var_alloc.n;
unsigned i = g_rtbuf_var_alloc.n;
const char *sym = symbol_find(name);
if (sym)
while (v--, i--) {
assert(v >= g_rtbuf_var);
if (v->name == sym)
return v;
}
return NULL;
}
s_rtbuf_var * rtbuf_var_rtbuf_set (const char *name, unsigned i)
{
s_rtbuf_var *v = rtbuf_var_find(name);
if (!v)
v = rtbuf_var_new(name);
if (v) {
v->type = RTBUF_VAR_RTBUF;
v->index = i;
}
return v;
}
void rtbuf_var_print (const s_rtbuf_var *v)
{
if (v) {
printf("%s = ", v->name);
switch (v->type) {
case RTBUF_VAR_NULL:
printf("NULL");
fflush(stdout);
break;
case RTBUF_VAR_RTBUF:
rtbuf_print_long(v->index);
break;
default:
assert(0);
}
}
}