- fix format-string in jprint/script_print (printf(msg) -> fputs)
- fix bsexp_deinit: deinit_script guarded by sctx, not jc
- silence "config.script not found" when the optional override is absent
- remove dead code: bs/cmds/, bs/args.{c,h}, bs/utils.h, commented blocks
- REPL: welcome banner with version, readline tab-completion on
script_commands_list, skip blank lines, clean Ctrl-D exit
- README: build, REPL usage, typical SPI flow, command table, probes,
Xilinx STARTUPE3/CCLK caveat
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
102 lines
2.4 KiB
C
102 lines
2.4 KiB
C
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
|
|
#include "jtag_core/jtag_core.h"
|
|
#include "config/version.h"
|
|
#include "script/env.h"
|
|
#include "script/script.h"
|
|
#include "config/config_script.h"
|
|
|
|
#include "init.h"
|
|
|
|
void jprint(jtag_core *jc, const char *msg)
|
|
{
|
|
fputs(msg, stdout);
|
|
}
|
|
|
|
int script_print(script_ctx *sctx, enum MSGTYPE typ, char *string, ...)
|
|
{
|
|
int ret = 0;
|
|
const char *prefix = "";
|
|
va_list args;
|
|
|
|
switch (typ)
|
|
{
|
|
case MSG_DEBUG: prefix = "DEBUG : "; break;
|
|
case MSG_INFO_1: prefix = "INFO : "; break;
|
|
case MSG_WARNING: prefix = "WARNING : "; break;
|
|
case MSG_ERROR: prefix = "ERROR : "; break;
|
|
case MSG_INFO_0:
|
|
default: prefix = ""; break;
|
|
}
|
|
|
|
va_start(args, string);
|
|
ret = fputs(prefix, stdout);
|
|
ret += vprintf(string, args);
|
|
va_end(args);
|
|
return ret;
|
|
}
|
|
|
|
void bsexp_init(jtag_core **jc, script_ctx **sctx)
|
|
{
|
|
*jc = jtagcore_init();
|
|
if (NULL == *jc)
|
|
return;
|
|
|
|
(*jc)->envvar = (void *)initEnv(NULL, NULL);
|
|
if (NULL == (*jc)->envvar) {
|
|
jtagcore_deinit(*jc);
|
|
*jc = NULL;
|
|
return;
|
|
}
|
|
jtagcore_setEnvVar(*jc, "VERSION", "v" APP_VER_STR(APP_VER));
|
|
|
|
*sctx = jtagcore_initScript(*jc);
|
|
if (NULL == *sctx) {
|
|
deinitEnv((*jc)->envvar);
|
|
jtagcore_deinit(*jc);
|
|
*jc = NULL;
|
|
return;
|
|
}
|
|
setOutputFunc_script(*sctx, script_print);
|
|
execute_ram_script(*sctx, config_script, config_script_len);
|
|
/* User override is optional — silence the engine's "not found" message. */
|
|
{
|
|
FILE *f = fopen("config.script", "r");
|
|
if (f) {
|
|
fclose(f);
|
|
execute_file_script(*sctx, "config.script");
|
|
}
|
|
}
|
|
|
|
if (jtagcore_set_logs_callback(*jc, jprint) < 0)
|
|
{
|
|
fputs("Impossible to define the logs callback!\n", stderr);
|
|
return;
|
|
}
|
|
|
|
if (jtagcore_getEnvVar(*jc, "LOG_MESSAGES_FILTER_LEVEL", NULL))
|
|
{
|
|
jtagcore_set_logs_level(*jc, jtagcore_getEnvVarValue(*jc, "LOG_MESSAGES_FILTER_LEVEL"));
|
|
}
|
|
if (jtagcore_getEnvVar(*jc, "LOG_MESSAGES_FILE_OUTPUT", NULL))
|
|
{
|
|
jtagcore_set_logs_file(*jc, jtagcore_getEnvVar(*jc, "LOG_MESSAGES_FILE_OUTPUT", NULL));
|
|
}
|
|
}
|
|
|
|
void bsexp_deinit(jtag_core *jc, script_ctx *sctx)
|
|
{
|
|
if (NULL != sctx)
|
|
{
|
|
deinit_script(sctx);
|
|
}
|
|
if (NULL != jc)
|
|
{
|
|
deinitEnv((envvar_entry *)jc->envvar);
|
|
jtagcore_deinit(jc);
|
|
}
|
|
}
|