Thanks for the bug report! That code is messed up -- I was
trying to make it "do the right thing" as often as possible,
and missed that case somehow. I think this version of the
code works, but maybe it would be better to return to the
old form (in repl.c):
void s7_repl(s7_scheme *sc)
{
#if (!WITH_C_LOADER)
dumb_repl(sc);
#else
s7_pointer old_e, e, val;
s7_int gc_loc;
bool repl_loaded = false;
/* try to get lib_s7.so from the repl's directory, and set *libc*.
* otherwise repl.scm will try to load libc.scm which will try to build libc_s7.so locally, but that requires s7.h
*/
e = s7_inlet(sc, list_2(sc, s7_make_symbol(sc, "init_func"), s7_make_symbol(sc, "libc_s7_init")));
gc_loc = s7_gc_protect(sc, e);
old_e = s7_set_curlet(sc, e); /* e is now (curlet) so loaded names from libc will be placed there, not in (rootlet) */
val = s7_load_with_environment(sc, "libc_s7.so", e);
if (val)
{
s7_pointer libs;
uint64_t hash;
hash = raw_string_hash((const uint8_t *)"*libc*", 6); /* hack around an idiotic gcc 10.2.1 warning */
s7_define(sc, sc->nil, new_symbol(sc, "*libc*", 6, hash, hash % SYMBOL_TABLE_SIZE), e);
libs = global_slot(sc->libraries_symbol);
slot_set_value(libs, cons(sc, cons(sc, make_permanent_string("libc.scm"), e), slot_value(libs)));
}
else
{
val = s7_load(sc, "repl.scm");
if (val) repl_loaded = true;
}
s7_set_curlet(sc, old_e); /* restore incoming (curlet) */
s7_gc_unprotect_at(sc, gc_loc);
if (!val) /* s7_load was unable to find/load libc_s7.so or repl.scm */
dumb_repl(sc);
else
{
#if S7_DEBUGGING
s7_autoload(sc, s7_make_symbol(sc, "compare-calls"), s7_make_string(sc, "compare-calls.scm"));
s7_autoload(sc, s7_make_symbol(sc, "get-overheads"), s7_make_string(sc, "compare-calls.scm"));
#endif
s7_provide(sc, "libc.scm");
#if WITH_NOTCURSES
s7_load(sc, "nrepl.scm");
s7_eval_c_string(sc, "((*nrepl* 'run))");
#else
if (!repl_loaded) s7_load(sc, "repl.scm");
s7_eval_c_string(sc, "((*repl* 'run))");
#endif
}
#endif
}
#if WITH_MAIN && (!USE_SND)
#if (!MS_WINDOWS) && WITH_C_LOADER
static char *realdir(const char *filename) /* this code courtesy Lassi Kortela 4-Nov-19 */
{
char *path;
char *p;
/* s7_repl wants to load libc_s7.o (for tcsetattr et al), but if it is started in a directory other than the libc_s7.so
* directory, it fails (it tries to build the library but that requires s7.h and libc.scm). So here we are trying to
* guess the libc_s7 directory from the command line program name. This can't work in general, but it works often
* enough to be worth the effort. If S7_LOAD_PATH is set, it is used instead.
*/
if (!strchr(filename, '/'))
return(NULL);
if (!(path = realpath(filename, NULL))) /* in Windows maybe GetModuleFileName(NULL, buffer, buffer_size) */
{
fprintf(stderr, "%s: %s\n", strerror(errno), filename);
exit(2);
}
if (!(p = strrchr(path, '/')))
{
free(path);
fprintf(stderr, "please provide the full pathname for %s\n", filename);
exit(2);
}
if (p > path) *p = '\0'; else p[1] = 0;
return(path);
}
#endif
int main(int argc, char **argv)
{
s7_scheme *sc;
sc = s7_init();
fprintf(stderr, "s7: %s\n", S7_DATE);
if (argc == 2)
{
fprintf(stderr, "load %s\n", argv[1]);
if (!s7_load(sc, argv[1]))
{
fprintf(stderr, "can't load %s\n", argv[1]);
return(2);
}}
else
{
#if (MS_WINDOWS) || (!WITH_C_LOADER) || ((defined(__linux__)) && (!defined(__GLIBC__))) /* musl? */
dumb_repl(sc);
#else
#ifdef S7_LOAD_PATH
s7_add_to_load_path(sc, S7_LOAD_PATH);
#else
char *dir;
dir = realdir(argv[0]);
if (dir)
{
s7_add_to_load_path(sc, dir);
free(dir);
}
#endif
s7_repl(sc);
#endif
}
return(0);
}
/* in Linux: gcc s7.c -o repl -DWITH_MAIN -I. -O2 -g -ldl -lm -Wl,-export-dynamic
* in *BSD: gcc s7.c -o repl -DWITH_MAIN -I. -O2 -g -lm -Wl,-export-dynamic
* in OSX: gcc s7.c -o repl -DWITH_MAIN -I. -O2 -g -lm
* (clang also needs LDFLAGS="-Wl,-export-dynamic" in Linux and "-fPIC")
* in msys2: gcc s7.c -o s7 -DWITH_MAIN -I. -O2 -g -ldl -lm -Wl,-export-all-symbols,--out-implib,s7.lib
*
* (s7.c compile time 17-Jun-20 48 secs)
* musl works, but there is some problem in libgsl.scm with gsl/gsl_blas.h I think
*/
#endif
_______________________________________________
Cmdist mailing list
[email protected]
https://cm-mail.stanford.edu/mailman/listinfo/cmdist