#include "pixelscript.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Person {
char *name;
int age;
void (*print_info)(struct Person *self);
} Person;
void print_person_info(PixelScriptRuntime runtime, Person *self) {
if (self != NULL) {
char* rt = "Unkown";
if (runtime == Lua) {
rt = "Lua";
} else if (runtime == Python) {
rt = "Python";
} else if (runtime == JavaScript) {
rt = "JavaScript";
} else if (runtime == Easyjs) {
rt = "EasyJS";
}
printf("From runtime: %s, My name is: %s, and I am %d years old\n", rt, self->name, self->age);
}
}
const char* get_name(Person *self) {
return self->name;
}
int get_age(Person *self) {
return self->age;
}
void set_name(Person *self, const char* name) {
free(self->name);
self->name = strdup(name);
}
Person* create_person(const char *name, int age) {
Person *p = malloc(sizeof(Person));
p->name = strdup(name); p->age = age;
return p;
}
void destroy_person(Person *p) {
free(p->name);
free(p);
}
Var* ps_set_name(uintptr_t argc, struct Var **argv, void *opaque) {
Var* object = argv[1];
Var* name = argv[3];
Person* p = pixelscript_var_get_host_object(object);
char* new_name = pixelscript_var_get_string(name);
set_name(p, new_name);
pixelscript_free_str(new_name);
return pixelscript_var_newnull();
}
Var* ps_get_name(uintptr_t argc, struct Var **argv, void *opaque) {
Var* object = argv[1];
Person* p = pixelscript_var_get_host_object(object);
return pixelscript_var_newstring(p->name);
}
Var* ps_get_age(uintptr_t argc, struct Var **argv, void *opaque) {
Var* object = argv[1];
Person* p = pixelscript_var_get_host_object(object);
return pixelscript_var_newi64(p->age);
}
Var* ps_greet(uintptr_t argc, struct Var **argv, void *opaque) {
Var *runtime = argv[0];
Var *object = argv[1];
int runtime_int = pixelscript_var_get_i64(runtime);
Person* p = pixelscript_var_get_host_object(object);
print_person_info(runtime_int, p);
return pixelscript_var_newnull();
}
Var* new_person(uintptr_t argc, struct Var **argv, void *opaque) {
Var* name = argv[1];
Var* age_var = argv[2];
char* name_str = pixelscript_var_get_string(name);
int age = pixelscript_var_get_i64(age_var);
Person* p = create_person(name_str, age);
pixelscript_free_str(name_str);
PixelObject* object = pixelscript_new_object(p, destroy_person, "Person");
pixelscript_object_add_callback(object, "set_name", ps_set_name, NULL);
pixelscript_object_add_callback(object, "get_name", ps_get_name, NULL);
pixelscript_object_add_callback(object, "get_age", ps_get_age, NULL);
pixelscript_object_add_callback(object, "greet", ps_greet, NULL);
return pixelscript_var_newhost_object(object);
}
int main() {
pixelscript_initialize();
pixelscript_add_object("Person", new_person, NULL);
const char* lua_script = "local p = Person('Jordan', 23)\n"
"p:greet()\n"
"p:set_name('Jordan Castro')\n"
"p:greet()\n"
"p:set_name('Jordan Castro + ' .. p:get_age())\n"
"p:greet()\n";
char* res = pixelscript_exec_lua(lua_script, "<ctest>");
pixelscript_free_str(res);
const char* python_script = "p = Person('Jordan', 23)\n"
"p.greet()\n"
"p.set_name('Jordan Castro')\n"
"p.greet()\n"
"p.set_name(f'Jordan Castro + {p.get_age()}')\n"
"p.greet()\n";
char* res = pixelscript_exec_python(python_script, "<ctest>");
pixelscript_free_str(res);
pixelscript_finalize();
return 0;
}