#include #include #include #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, *tktmp; LL_FOREACH_SAFE(tks, tk, tktmp) { writefmt("{s}", tk->str); if (tk->next != NULL) { writefmt(" "); } } writefmt("\n"); return true; } bool rt_mkalias(Token *tks) { RtAlias *alias = dlmalloc(sizeof(*alias)); string_memset(alias, 0, sizeof(*alias)); size_t i; Token *tk, *tktmp; LL_FOREACH_SAFE_IDX(tks, tk, tktmp, i) { if (i == 0) { string_memcpy(alias->namebuf, tk->str, MIN(string_len(tk->str), RTALIAS_NAMEBUF_MAX)); } else if (i == 1) { string_memcpy(alias->valbuf, tk->str, MIN(string_len(tk->str), RTALIAS_VALBUF_MAX)); } } LL_APPEND(RTALIASES, alias); return true; } void rt_init(void) { RTCMD("%print", &rt_print); RTCMD("%mkalias", &rt_mkalias); }