Files
my-os-project2/user/tb/runtime.c

57 lines
1.2 KiB
C

#include <stddef.h>
#include <stdbool.h>
#include <linklist.h>
#include <dlmalloc/malloc.h>
#include <string/string.h>
#include <uprintf.h>
#include "runtime.h"
#include "interp.h"
RtCmd *RTCMDS = NULL;
RtAlias *RTALIASES = NULL;
#define RTCMD(name, _fn) \
do { \
RtCmd *_cmd = dlmalloc(sizeof(*_cmd)); \
_cmd->cmdname = (name); \
_cmd->fn = (_fn); \
LL_APPEND(RTCMDS, _cmd); \
} while(0)
bool rt_print(Token *tks) {
Token *tk = tks;
while (tk) {
uprintf("%.*s", (int)tk->len, tk->ptr);
if (tk->next != NULL) {
uprintf(" ");
}
tk = tk->next;
}
uprintf("\n");
return true;
}
bool rt_mkalias(Token *tks) {
RtAlias *alias = dlmalloc(sizeof(*alias));
string_memset(alias, 0, sizeof(*alias));
Token *tk = tks;
size_t i = 0;
while (tk) {
if (i == 0) {
usprintf(alias->namebuf, "%.*s", (int)tk->len, tk->ptr);
} else {
size_t off = string_len(alias->valbuf);
usprintf(alias->valbuf + off, "%.*s", (int)tk->len, tk->ptr);
}
i++;
tk = tk->next;
}
LL_APPEND(RTALIASES, alias);
return true;
}
void rt_init(void) {
RTCMD("@print", &rt_print);
RTCMD("@mkalias", &rt_mkalias);
}