mirror of
https://github.com/tailix/libkernaux.git
synced 2025-02-24 15:55:41 -05:00
Ruby: move cmdline to separate extension file
This commit is contained in:
parent
67faa492c1
commit
51c32f4b45
2 changed files with 96 additions and 83 deletions
88
pkgs/ruby/ext/default/cmdline.c
Normal file
88
pkgs/ruby/ext/default/cmdline.c
Normal file
|
@ -0,0 +1,88 @@
|
||||||
|
#include <kernaux.h>
|
||||||
|
#include <ruby.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_KERNAUX_CMDLINE
|
||||||
|
|
||||||
|
#define ARGV_COUNT_MAX 256
|
||||||
|
#define BUFFER_SIZE 4096
|
||||||
|
|
||||||
|
struct Data {
|
||||||
|
char error_msg[KERNAUX_CMDLINE_ERROR_MSG_SIZE_MAX];
|
||||||
|
char *argv[ARGV_COUNT_MAX];
|
||||||
|
char buffer[BUFFER_SIZE];
|
||||||
|
};
|
||||||
|
|
||||||
|
static VALUE rb_KernAux_Cmdline_ALLOC(VALUE klass);
|
||||||
|
static VALUE rb_KernAux_cmdline(VALUE self, VALUE cmdline);
|
||||||
|
|
||||||
|
static const struct rb_data_type_struct info = {
|
||||||
|
.wrap_struct_name = "cmdline",
|
||||||
|
.function = {
|
||||||
|
.dmark = NULL,
|
||||||
|
.dfree = RUBY_DEFAULT_FREE,
|
||||||
|
.dsize = NULL,
|
||||||
|
.dcompact = NULL,
|
||||||
|
.reserved = { 0 },
|
||||||
|
},
|
||||||
|
.parent = NULL,
|
||||||
|
.data = NULL,
|
||||||
|
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
||||||
|
};
|
||||||
|
|
||||||
|
static VALUE rb_KernAux = Qnil;
|
||||||
|
static VALUE rb_KernAux_Error = Qnil;
|
||||||
|
static VALUE rb_KernAux_CmdlineError = Qnil;
|
||||||
|
static VALUE rb_KernAux_Cmdline = Qnil;
|
||||||
|
|
||||||
|
void init_cmdline()
|
||||||
|
{
|
||||||
|
rb_KernAux = rb_define_module("KernAux");
|
||||||
|
rb_KernAux_Error =
|
||||||
|
rb_define_class_under(rb_KernAux, "Error" ,rb_eRuntimeError);
|
||||||
|
rb_KernAux_CmdlineError =
|
||||||
|
rb_define_class_under(rb_KernAux, "CmdlineError", rb_KernAux_Error);
|
||||||
|
rb_KernAux_Cmdline =
|
||||||
|
rb_define_class_under(rb_KernAux, "Cmdline", rb_cObject);
|
||||||
|
rb_define_alloc_func(rb_KernAux_Cmdline, rb_KernAux_Cmdline_ALLOC);
|
||||||
|
rb_define_singleton_method(rb_KernAux, "cmdline", rb_KernAux_cmdline, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
VALUE rb_KernAux_Cmdline_ALLOC(const VALUE klass)
|
||||||
|
{
|
||||||
|
struct Data *data;
|
||||||
|
return TypedData_Make_Struct(klass, struct Data, &info, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
VALUE rb_KernAux_cmdline(const VALUE self_rb, VALUE cmdline_rb)
|
||||||
|
{
|
||||||
|
const char *const cmdline = StringValueCStr(cmdline_rb);
|
||||||
|
size_t argc;
|
||||||
|
|
||||||
|
const VALUE data_rb = rb_funcall(rb_KernAux_Cmdline, rb_intern("new"), 0);
|
||||||
|
struct Data *data;
|
||||||
|
TypedData_Get_Struct(data_rb, struct Data, &info, data);
|
||||||
|
if (!data) rb_raise(rb_KernAux_CmdlineError, "internal error");
|
||||||
|
|
||||||
|
const bool result = kernaux_cmdline(
|
||||||
|
cmdline,
|
||||||
|
data->error_msg,
|
||||||
|
&argc,
|
||||||
|
data->argv,
|
||||||
|
data->buffer,
|
||||||
|
ARGV_COUNT_MAX,
|
||||||
|
BUFFER_SIZE
|
||||||
|
);
|
||||||
|
|
||||||
|
if (!result) rb_raise(rb_KernAux_CmdlineError, "%s", data->error_msg);
|
||||||
|
|
||||||
|
VALUE result_rb = rb_ary_new2(argc);
|
||||||
|
for (size_t index = 0; index < argc; ++index) {
|
||||||
|
rb_ary_push(
|
||||||
|
result_rb,
|
||||||
|
rb_funcall(rb_str_new2(data->argv[index]), rb_intern("freeze"), 0)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
return rb_funcall(result_rb, rb_intern("freeze"), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif // HAVE_KERNAUX_CMDLINE
|
|
@ -6,44 +6,20 @@
|
||||||
#include <kernaux.h>
|
#include <kernaux.h>
|
||||||
#include <ruby.h>
|
#include <ruby.h>
|
||||||
|
|
||||||
#define CMDLINE_ARGV_COUNT_MAX 256
|
|
||||||
#define CMDLINE_BUFFER_SIZE 4096
|
|
||||||
|
|
||||||
struct Cmdline {
|
|
||||||
char error_msg[KERNAUX_CMDLINE_ERROR_MSG_SIZE_MAX];
|
|
||||||
char *argv[CMDLINE_ARGV_COUNT_MAX];
|
|
||||||
char buffer[CMDLINE_BUFFER_SIZE];
|
|
||||||
};
|
|
||||||
|
|
||||||
static const struct rb_data_type_struct cmdline_rbdata = {
|
|
||||||
.wrap_struct_name = "cmdline",
|
|
||||||
.function = {
|
|
||||||
.dmark = NULL,
|
|
||||||
.dfree = RUBY_DEFAULT_FREE,
|
|
||||||
.dsize = NULL,
|
|
||||||
.dcompact = NULL,
|
|
||||||
.reserved = { 0 },
|
|
||||||
},
|
|
||||||
.parent = NULL,
|
|
||||||
.data = NULL,
|
|
||||||
.flags = RUBY_TYPED_FREE_IMMEDIATELY,
|
|
||||||
};
|
|
||||||
|
|
||||||
static VALUE rb_KernAux = Qnil;
|
static VALUE rb_KernAux = Qnil;
|
||||||
static VALUE rb_KernAux_Cmdline = Qnil;
|
|
||||||
|
|
||||||
static VALUE rb_KernAux_Error = Qnil;
|
static VALUE rb_KernAux_Error = Qnil;
|
||||||
static VALUE rb_KernAux_CmdlineError = Qnil;
|
|
||||||
|
|
||||||
static void assert_cb(const char *file, int line, const char *str);
|
static void assert_cb(const char *file, int line, const char *str);
|
||||||
|
|
||||||
|
#ifdef HAVE_KERNAUX_CMDLINE
|
||||||
|
void init_cmdline();
|
||||||
|
#endif // HAVE_KERNAUX_CMDLINE
|
||||||
|
|
||||||
static VALUE rb_KernAux_assert_cb(VALUE self);
|
static VALUE rb_KernAux_assert_cb(VALUE self);
|
||||||
static VALUE rb_KernAux_assert_cb_EQ(VALUE self, VALUE assert_cb);
|
static VALUE rb_KernAux_assert_cb_EQ(VALUE self, VALUE assert_cb);
|
||||||
static
|
static
|
||||||
VALUE rb_KernAux_assert_do(VALUE self, VALUE file, VALUE line, VALUE msg);
|
VALUE rb_KernAux_assert_do(VALUE self, VALUE file, VALUE line, VALUE msg);
|
||||||
|
|
||||||
static VALUE rb_KernAux_Cmdline_ALLOC(VALUE klass);
|
|
||||||
|
|
||||||
#ifdef HAVE_KERNAUX_UTOA10
|
#ifdef HAVE_KERNAUX_UTOA10
|
||||||
static VALUE rb_KernAux_utoa10(VALUE self, VALUE number);
|
static VALUE rb_KernAux_utoa10(VALUE self, VALUE number);
|
||||||
#endif
|
#endif
|
||||||
|
@ -53,22 +29,17 @@ static VALUE rb_KernAux_itoa10(VALUE self, VALUE number);
|
||||||
#ifdef HAVE_KERNAUX_SNPRINTF
|
#ifdef HAVE_KERNAUX_SNPRINTF
|
||||||
static VALUE rb_KernAux_snprintf1(int argc, const VALUE *argv, VALUE self);
|
static VALUE rb_KernAux_snprintf1(int argc, const VALUE *argv, VALUE self);
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_KERNAUX_CMDLINE
|
|
||||||
static VALUE rb_KernAux_cmdline(VALUE self, VALUE str);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void Init_default()
|
void Init_default()
|
||||||
{
|
{
|
||||||
rb_KernAux = rb_define_module("KernAux");
|
#ifdef HAVE_KERNAUX_CMDLINE
|
||||||
rb_KernAux_Cmdline =
|
init_cmdline();
|
||||||
rb_define_class_under(rb_KernAux, "Cmdline", rb_cObject);
|
#endif // HAVE_KERNAUX_CMDLINE
|
||||||
|
|
||||||
rb_define_alloc_func(rb_KernAux_Cmdline, rb_KernAux_Cmdline_ALLOC);
|
rb_KernAux = rb_define_module("KernAux");
|
||||||
|
|
||||||
rb_KernAux_Error =
|
rb_KernAux_Error =
|
||||||
rb_define_class_under(rb_KernAux, "Error", rb_eRuntimeError);
|
rb_define_class_under(rb_KernAux, "Error", rb_eRuntimeError);
|
||||||
rb_KernAux_CmdlineError =
|
|
||||||
rb_define_class_under(rb_KernAux, "CmdlineError", rb_KernAux_Error);
|
|
||||||
|
|
||||||
kernaux_assert_cb = assert_cb;
|
kernaux_assert_cb = assert_cb;
|
||||||
|
|
||||||
|
@ -89,9 +60,6 @@ void Init_default()
|
||||||
rb_define_singleton_method(rb_KernAux, "snprintf1",
|
rb_define_singleton_method(rb_KernAux, "snprintf1",
|
||||||
rb_KernAux_snprintf1, -1);
|
rb_KernAux_snprintf1, -1);
|
||||||
#endif
|
#endif
|
||||||
#ifdef HAVE_KERNAUX_CMDLINE
|
|
||||||
rb_define_singleton_method(rb_KernAux, "cmdline", rb_KernAux_cmdline, 1);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void assert_cb(const char *const file, const int line, const char *const str)
|
void assert_cb(const char *const file, const int line, const char *const str)
|
||||||
|
@ -129,13 +97,6 @@ VALUE rb_KernAux_assert_do(
|
||||||
return Qnil;
|
return Qnil;
|
||||||
}
|
}
|
||||||
|
|
||||||
VALUE rb_KernAux_Cmdline_ALLOC(const VALUE klass)
|
|
||||||
{
|
|
||||||
struct Cmdline *cmdline;
|
|
||||||
return
|
|
||||||
TypedData_Make_Struct(klass, struct Cmdline, &cmdline_rbdata, cmdline);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef HAVE_KERNAUX_UTOA10
|
#ifdef HAVE_KERNAUX_UTOA10
|
||||||
VALUE rb_KernAux_utoa10(
|
VALUE rb_KernAux_utoa10(
|
||||||
const VALUE self_rb __attribute__((unused)),
|
const VALUE self_rb __attribute__((unused)),
|
||||||
|
@ -268,39 +229,3 @@ VALUE rb_KernAux_snprintf1(
|
||||||
return rb_funcall(result_rb, rb_intern("freeze"), 0);
|
return rb_funcall(result_rb, rb_intern("freeze"), 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_KERNAUX_CMDLINE
|
|
||||||
VALUE rb_KernAux_cmdline(const VALUE self_rb, VALUE str_rb)
|
|
||||||
{
|
|
||||||
const char *const str = StringValueCStr(str_rb);
|
|
||||||
size_t argc;
|
|
||||||
|
|
||||||
const VALUE cmdline_rb =
|
|
||||||
rb_funcall(rb_KernAux_Cmdline, rb_intern("new"), 0);
|
|
||||||
struct Cmdline *cmdline;
|
|
||||||
TypedData_Get_Struct(cmdline_rb, struct Cmdline, &cmdline_rbdata, cmdline);
|
|
||||||
if (!cmdline) rb_raise(rb_KernAux_CmdlineError, "internal error");
|
|
||||||
|
|
||||||
const bool result = kernaux_cmdline(
|
|
||||||
str,
|
|
||||||
cmdline->error_msg,
|
|
||||||
&argc,
|
|
||||||
cmdline->argv,
|
|
||||||
cmdline->buffer,
|
|
||||||
CMDLINE_ARGV_COUNT_MAX,
|
|
||||||
CMDLINE_BUFFER_SIZE
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!result) rb_raise(rb_KernAux_CmdlineError, "%s", cmdline->error_msg);
|
|
||||||
|
|
||||||
VALUE result_rb = rb_ary_new2(argc);
|
|
||||||
for (size_t index = 0; index < argc; ++index) {
|
|
||||||
rb_ary_push(
|
|
||||||
result_rb,
|
|
||||||
rb_funcall(rb_str_new2(cmdline->argv[index]),
|
|
||||||
rb_intern("freeze"), 0)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return rb_funcall(result_rb, rb_intern("freeze"), 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue