From 2a1e3a572ccf46164341ebf498cc8543fd103a87 Mon Sep 17 00:00:00 2001 From: "Yukihiro \"Matz\" Matsumoto" Date: Tue, 18 Jul 2023 12:01:30 +0900 Subject: [PATCH] mruby-pack/pack.c (read_tmpl): support J/j template in pack J/j is available since Ruby 2.3. --- mrbgems/mruby-pack/README.md | 2 ++ mrbgems/mruby-pack/src/pack.c | 16 ++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/mrbgems/mruby-pack/README.md b/mrbgems/mruby-pack/README.md index 712cf8e1c..25c624421 100644 --- a/mrbgems/mruby-pack/README.md +++ b/mrbgems/mruby-pack/README.md @@ -28,6 +28,8 @@ There is no dependency on other mrbgems. - h : hex string (low nibble first) - I : unsigned integer, native endian (`unsigned int` in C) - i : signed integer, native endian (`int` in C) +- J : unsigned integer, native endian (`uintptr_t` in C) +- j : signed integer, native endian (`intptr_t` in C) - L : 32-bit unsigned, native endian (`uint32_t`) - l : 32-bit signed, native endian (`int32_t`) - m : base64 encoded string (see RFC 2045, count is width) diff --git a/mrbgems/mruby-pack/src/pack.c b/mrbgems/mruby-pack/src/pack.c index 75a6775d4..dd535ceda 100644 --- a/mrbgems/mruby-pack/src/pack.c +++ b/mrbgems/mruby-pack/src/pack.c @@ -1219,6 +1219,22 @@ alias: mrb_raisef(mrb, E_RUNTIME_ERROR, "mruby-pack does not support sizeof(int) == %d", (int)sizeof(int)); } break; + case 'J': + switch (sizeof(intptr_t)) { + case 4: t = 'L'; goto alias; + case 8: t = 'Q'; goto alias; + default: + mrb_raisef(mrb, E_RUNTIME_ERROR, "mruby-pack does not support sizeof(uintptr_t) == %d", (int)sizeof(uintptr_t)); + } + break; + case 'j': + switch (sizeof(intptr_t)) { + case 4: t = 'l'; goto alias; + case 8: t = 'q'; goto alias; + default: + mrb_raisef(mrb, E_RUNTIME_ERROR, "mruby-pack does not support sizeof(intptr_t) == %d", (int)sizeof(intptr_t)); + } + break; case 'L': dir = PACK_DIR_LONG; type = PACK_TYPE_INTEGER;