/* * scheme.c * * Copyright © 2019-2020 Thomas White * * This file is part of NanoLight. * * NanoLight is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #include #include "lightctx.h" static SCM fixture_type; static SCM set_intensity(SCM fixture_scm, SCM intensity_scm) { const int intensity = scm_to_int(intensity_scm); scm_assert_foreign_object_type(fixture_type, fixture_scm); struct fixture *fixture = scm_foreign_object_ref(fixture_scm, 0); fixture->v.intensity = (float)intensity/100.0; return SCM_UNSPECIFIED; } static SCM fixture_name(SCM fixture_scm) { scm_assert_foreign_object_type(fixture_type, fixture_scm); struct fixture *fixture = scm_foreign_object_ref(fixture_scm, 0); return scm_from_utf8_symbol(fixture->label); } static void finalize_fixture(SCM fixture) { printf("finalise fixture!\n"); } void *register_scheme_funcs(void *data) { struct lightctx *nl = data; SCM name, slots; int i; scm_t_struct_finalize finalizer; SCM fixture_list; name = scm_from_utf8_symbol("fixture"); slots = scm_list_1(scm_from_utf8_symbol("data")); finalizer = finalize_fixture; fixture_type = scm_make_foreign_object_type(name, slots, finalizer); fixture_list = SCM_EOL; for ( i=0; in_fixtures; i++ ) { SCM obj = scm_make_foreign_object_1(fixture_type, &nl->fixtures[i]); SCM obj_list = scm_list_1(obj); fixture_list = scm_append(scm_list_2(fixture_list, obj_list)); } scm_define(scm_from_utf8_symbol("fixtures"), fixture_list); scm_c_define_gsubr("fixture-name", 1, 0, 0, &fixture_name); scm_c_define_gsubr("set-intensity", 2, 0, 0, &set_intensity); return NULL; } void *run_repl(void *pargsv) { scm_with_guile(®ister_scheme_funcs, pargsv); scm_shell(0, NULL); return NULL; }