diff --git a/SMILEBASIC/TEST.txt b/SMILEBASIC/TEST.txt index c031f3f..6fa6adf 100644 --- a/SMILEBASIC/TEST.txt +++ b/SMILEBASIC/TEST.txt @@ -32,6 +32,7 @@ ASSERT__ VAL("aa")==0, "VAL" ASSERT__ RAD(180)==PI(), "RAD" ASSERT__ DEG(RAD(180)), "DEG" +ASSERT__ HEX$(65535, 8)=="0000FFFF", "HEX$" ASSERT__ SUBST$("0123456789",0,"B")=="B","SUBST$" ASSERT__ SUBST$("0123456789",0,4,"B")=="B456789","SUBST$" ASSERT__ SUBST$("",0,4,"B")=="B","SUBST$" diff --git a/SMILEBASIC/builtinfunctions.d b/SMILEBASIC/builtinfunctions.d index 20add47..66e21b2 100644 --- a/SMILEBASIC/builtinfunctions.d +++ b/SMILEBASIC/builtinfunctions.d @@ -365,10 +365,25 @@ class BuiltinFunction { return val.to!wstring; } - static wstring HEX(int val) + static wstring HEX(int val, DefaultValue!(int, false) digits) { - //ひどい - return val.to!string(16).to!wstring; + import std.format; + if(digits.isDefault) + { + //ひどい + return val.to!string(16).to!wstring; + } + if(digits > 8) + { + throw new OutOfRange(); + } + FormatSpec!char f; + f.spec = 'X'; + f.flZero = true; + f.width = cast(int)digits; + auto w = appender!wstring(); + formatValue(w, val, f); + return cast(immutable)(w.data); } static void SPSET(PetitComputer p, int id, int defno) { diff --git a/SMILEBASIC/error.d b/SMILEBASIC/error.d index 9a3c8a2..3450d74 100644 --- a/SMILEBASIC/error.d +++ b/SMILEBASIC/error.d @@ -64,6 +64,14 @@ class TypeMismatch : SmileBasicError super("Type mismatch"); } } +class OutOfRange : SmileBasicError +{ + this() + { + this.errnum = 10; + super("Out of range"); + } +} class OutOfDATA : SmileBasicError { this()