mirror of
https://github.com/gnosygnu/xowa.git
synced 2026-03-02 03:49:30 +00:00
v1.7.3.1
This commit is contained in:
@@ -50,7 +50,7 @@ abstract class String_bldr_base implements String_bldr {
|
||||
public String_bldr Add_fmt_line(String format, Object... args) {Add_str_w_crlf(String_.Format(format, args)); return this;}
|
||||
public String_bldr Add_kv_obj(String k, Object v) {
|
||||
if (this.Count() != 0) this.Add(" ");
|
||||
this.Add_fmt("{0}={1}", k, Object_.XtoStr_OrNullStr(v));
|
||||
this.Add_fmt("{0}={1}", k, Object_.Xto_str_strict_or_null_mark(v));
|
||||
return this;
|
||||
}
|
||||
public String_bldr Add_char_pipe() {return Add("|");}
|
||||
|
||||
@@ -27,7 +27,7 @@ public class Err_ { //_20110415
|
||||
public static Err err_(Exception e, String fmt, Object... args) {return Err.exc_(e, String_.Format(fmt, args));}
|
||||
public static Err cast_(Exception ignore, Class<?> t, Object o) {
|
||||
String o_str = "";
|
||||
try {o_str = Object_.XtoStr_OrNullStr(o);}
|
||||
try {o_str = Object_.Xto_str_strict_or_null_mark(o);}
|
||||
catch (Exception e) {Err_.Noop(e); o_str = "<ERROR>";}
|
||||
return cast_manual_msg_(ignore, t, o_str);
|
||||
}
|
||||
@@ -46,7 +46,7 @@ public class Err_ { //_20110415
|
||||
return Err.hdr_("type mismatch")
|
||||
.Add("expdType", ClassAdp_.FullNameOf_type(t))
|
||||
.Add("actlType", ClassAdp_.NameOf_obj(o))
|
||||
.Add("actlObj", Object_.XtoStr_OrNullStr(o))
|
||||
.Add("actlObj", Object_.Xto_str_strict_or_null_mark(o))
|
||||
;
|
||||
}
|
||||
public static Err missing_idx_(int idx, int len) {return Err.hdr_("index is out of bounds").Add("idx", idx).Add("len", len);}
|
||||
|
||||
@@ -20,7 +20,7 @@ public class Err_mgr {
|
||||
Err_mgr(Gfo_msg_root msg_root) {this.msg_root = msg_root;} Gfo_msg_root msg_root;
|
||||
public Err not_implemented_() {return Err_.new_(Msg_not_implemented.Gen_str_none());}
|
||||
public Err unhandled_(Object obj) {return Err_.new_(Msg_unhandled.Gen_str_one(obj));}
|
||||
public Err cast_(Exception e, Class<?> obj_class, Object obj) {return Err_.new_(Msg_cast.Gen_str_many(ClassAdp_.NameOf_type(obj_class), Object_.XtoStr_OrNullStr(obj)));}
|
||||
public Err cast_(Exception e, Class<?> obj_class, Object obj) {return Err_.new_(Msg_cast.Gen_str_many(ClassAdp_.NameOf_type(obj_class), Object_.Xto_str_strict_or_null_mark(obj)));}
|
||||
public Err parse_(Class<?> type , byte[] raw) {return Err_.new_(Msg_parse.Gen_str_many(ClassAdp_.NameOf_type(type), String_.new_utf8_len_safe_(raw, 0, 255)));}
|
||||
public Err parse_obj_(Object o , byte[] raw) {return Err_.new_(Msg_parse.Gen_str_many(ClassAdp_.NameOf_obj(o), String_.new_utf8_len_safe_(raw, 0, 255)));}
|
||||
public Err parse_(String type_name, byte[] raw) {return Err_.new_(Msg_parse.Gen_str_many(type_name, String_.new_utf8_len_safe_(raw, 0, 255)));}
|
||||
|
||||
@@ -24,7 +24,7 @@ public class SrlAble_ {
|
||||
return sb.XtoStr();
|
||||
}
|
||||
public static String XtoStr(Object o) {
|
||||
SrlAble s = SrlAble_.as_(o); if (s == null) return Object_.XtoStr_OrNullStr(o);
|
||||
SrlAble s = SrlAble_.as_(o); if (s == null) return Object_.Xto_str_strict_or_null_mark(o);
|
||||
GfoMsg m = GfoMsg_.new_parse_("root");
|
||||
s.Srl(m);
|
||||
return XtoStr(m);
|
||||
@@ -36,7 +36,7 @@ public class SrlAble_ {
|
||||
for (int i = 0; i < owner.Args_count(); i++) {
|
||||
if (i != 0) sb.Add(" ");
|
||||
KeyVal kv = owner.Args_getAt(i);
|
||||
sb.Add(kv.Key()).Add("=").Add("'").Add(Object_.XtoStr_OrNullStr(kv.Val())).Add("'");
|
||||
sb.Add(kv.Key()).Add("=").Add("'").Add(Object_.Xto_str_strict_or_null_mark(kv.Val())).Add("'");
|
||||
}
|
||||
int subsCount = owner.Subs_count();
|
||||
if (subsCount == 0) {
|
||||
|
||||
@@ -41,7 +41,8 @@ public class Bool_ implements GfoInvkAble {
|
||||
public static final byte N_byte = 0, Y_byte = 1, __byte = 127;
|
||||
public static final boolean N = false, Y = true;
|
||||
public static final String N_str = "n", Y_str = "y";
|
||||
public static final byte[] True_bry = Bry_.new_ascii_("true"), False_bry = Bry_.new_ascii_("false");
|
||||
public static final String True_str = "true", False_str = "false";
|
||||
public static final byte[] True_bry = Bry_.new_ascii_(True_str), False_bry = Bry_.new_ascii_(False_str);
|
||||
public static final byte[] Y_bry = new byte[] {Byte_ascii.Ltr_y}, N_bry = new byte[] {Byte_ascii.Ltr_n};
|
||||
public static final Bool_ Gfs = new Bool_();
|
||||
|
||||
|
||||
@@ -75,7 +75,7 @@ public class Bry_ {
|
||||
byte[][] rv = new byte[ary_len][];
|
||||
for (int i = 0; i < ary_len; i++) {
|
||||
Object itm = ary[i];
|
||||
rv[i] = itm == null ? null : Bry_.new_utf8_(Object_.XtoStr_OrEmpty(itm));
|
||||
rv[i] = itm == null ? null : Bry_.new_utf8_(Object_.Xto_str_strict_or_empty(itm));
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
@@ -450,6 +450,19 @@ public class Bry_ {
|
||||
if (lhs[i] != rhs[i + rhs_bgn]) return false;
|
||||
return true;
|
||||
}
|
||||
public static boolean Eq_ci_ascii(byte[] lhs, byte[] rhs, int rhs_bgn, int rhs_end) {
|
||||
if (lhs == null && rhs == null) return true;
|
||||
else if (lhs == null || rhs == null) return false;
|
||||
int lhs_len = lhs.length;
|
||||
int rhs_len = rhs_end - rhs_bgn;
|
||||
if (lhs_len != rhs_len) return false;
|
||||
for (int i = 0; i < lhs_len; i++) {
|
||||
byte lhs_b = lhs[i]; if (lhs_b > 64 && lhs_b < 91) lhs_b += 32; // lowercase
|
||||
byte rhs_b = rhs[i + rhs_bgn]; if (rhs_b > 64 && rhs_b < 91) rhs_b += 32; // lowercase
|
||||
if (lhs_b != rhs_b) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
public static byte[] XtoStrBytesByInt(int val, int padLen) {return XtoStrBytesByInt(val, null, 0, padLen);}
|
||||
public static byte[] XtoStrBytesByInt(int val, byte[] ary, int aryPos, int padLen) {
|
||||
int neg = 0;
|
||||
@@ -481,24 +494,24 @@ public class Bry_ {
|
||||
}
|
||||
return ary;
|
||||
}
|
||||
public static byte X_to_byte_by_int(byte[] ary, int bgn, int end, byte or) {return (byte)X_to_int_or(ary, bgn, end, or);}
|
||||
public static int X_to_int(byte[] ary) {return X_to_int_or(ary, null, 0, ary.length, -1);}
|
||||
public static int X_to_int_or_fail(byte[] ary) {
|
||||
int rv = X_to_int_or(ary, null, 0, ary.length, Int_.MinValue);
|
||||
public static byte Xto_byte_by_int(byte[] ary, int bgn, int end, byte or) {return (byte)Xto_int_or(ary, bgn, end, or);}
|
||||
public static int Xto_int(byte[] ary) {return Xto_int_or(ary, null, 0, ary.length, -1);}
|
||||
public static int Xto_int_or_fail(byte[] ary) {
|
||||
int rv = Xto_int_or(ary, null, 0, ary.length, Int_.MinValue);
|
||||
if (rv == Int_.MinValue) throw Err_.new_fmt_("could not parse to int; val={0}", String_.new_utf8_(ary));
|
||||
return rv;
|
||||
}
|
||||
public static boolean X_to_bool_by_int_or_fail(byte[] ary) {
|
||||
int rv = X_to_int_or(ary, null, 0, ary.length, Int_.MinValue);
|
||||
public static boolean Xto_bool_by_int_or_fail(byte[] ary) {
|
||||
int rv = Xto_int_or(ary, null, 0, ary.length, Int_.MinValue);
|
||||
switch (rv) {
|
||||
case 0: return false;
|
||||
case 1: return true;
|
||||
default: throw Err_.new_fmt_("could not parse to boolean int; val={0}", String_.new_utf8_(ary));
|
||||
}
|
||||
}
|
||||
public static int X_to_int_or(byte[] ary, int or) {return X_to_int_or(ary, null, 0, ary.length, or);}
|
||||
public static int X_to_int_or(byte[] ary, int bgn, int end, int or) {return X_to_int_or(ary, null, bgn, end, or);}
|
||||
public static int X_to_int_or(byte[] ary, byte[] ignore_ary, int bgn, int end, int or) {
|
||||
public static int Xto_int_or(byte[] ary, int or) {return Xto_int_or(ary, null, 0, ary.length, or);}
|
||||
public static int Xto_int_or(byte[] ary, int bgn, int end, int or) {return Xto_int_or(ary, null, bgn, end, or);}
|
||||
public static int Xto_int_or(byte[] ary, byte[] ignore_ary, int bgn, int end, int or) {
|
||||
if ( ary == null
|
||||
|| end == bgn // null-len
|
||||
) return or;
|
||||
@@ -532,7 +545,7 @@ public class Bry_ {
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public static int X_to_int_or_trim(byte[] ary, int bgn, int end, int or) { // NOTE: same as X_to_int_or, except trims ws at bgn / end; DATE:2014-02-09
|
||||
public static int Xto_int_or_trim(byte[] ary, int bgn, int end, int or) { // NOTE: same as Xto_int_or, except trims ws at bgn / end; DATE:2014-02-09
|
||||
if (end == bgn) return or; // null len
|
||||
int rv = 0, multiple = 1;
|
||||
boolean numbers_seen = false, ws_seen = false;
|
||||
@@ -558,7 +571,7 @@ public class Bry_ {
|
||||
}
|
||||
return rv;
|
||||
}
|
||||
public static int X_to_int_or_lax(byte[] ary, int bgn, int end, int or) {
|
||||
public static int Xto_int_or_lax(byte[] ary, int bgn, int end, int or) {
|
||||
if (end == bgn) return or; // null-len
|
||||
int end_num = end;
|
||||
for (int i = bgn; i < end; i++) {
|
||||
@@ -579,7 +592,7 @@ public class Bry_ {
|
||||
break;
|
||||
}
|
||||
}
|
||||
return X_to_int_or(ary, bgn, end_num, or);
|
||||
return Xto_int_or(ary, bgn, end_num, or);
|
||||
}
|
||||
public static float XtoFloatByPos(byte[] ary, int bgn, int end) {return Float_.parse_(String_.new_utf8_(ary, bgn, end));}
|
||||
public static double XtoDoubleByPosOr(byte[] ary, int bgn, int end, double or) {return Double_.parseOr_(String_.new_utf8_(ary, bgn, end), or);}
|
||||
@@ -655,7 +668,7 @@ public class Bry_ {
|
||||
int bgn = posRef.Val();
|
||||
int pos = Bry_finder.Find_fwd(ary, lkp, bgn, ary.length);
|
||||
if (pos == Bry_.NotFound) throw Err_.new_("lkp failed").Add("lkp", (char)lkp).Add("bgn", bgn);
|
||||
int rv = Bry_.X_to_int_or(ary, posRef.Val(), pos, -1);
|
||||
int rv = Bry_.Xto_int_or(ary, posRef.Val(), pos, -1);
|
||||
posRef.Val_(pos + 1); // +1 = lkp.Len
|
||||
return rv;
|
||||
}
|
||||
|
||||
@@ -109,7 +109,7 @@ public class Bry__tst {
|
||||
tst_XtoInt("", -1);
|
||||
}
|
||||
void tst_XtoInt(String val, int expd) {tst_XtoInt(val, -1, expd);}
|
||||
void tst_XtoInt(String val, int or, int expd) {Tfds.Eq(expd, Bry_.X_to_int_or(Bry_.new_utf8_(val), or));}
|
||||
void tst_XtoInt(String val, int or, int expd) {Tfds.Eq(expd, Bry_.Xto_int_or(Bry_.new_utf8_(val), or));}
|
||||
void tst_XtoIntBy4Bytes(int expd, byte... ary) {Tfds.Eq(expd, Bry_.XtoIntBy4Bytes(ary), "XtoInt"); Tfds.Eq_ary(ary, Bry_.XbyInt(expd), "XbyInt");}
|
||||
void tst_ReadCsvStr(String raw, String expd) {tst_ReadCsvStr(raw, Int_obj_ref.zero_() , expd);}
|
||||
void tst_ReadCsvStr(String raw, int bgn, String expd) {tst_ReadCsvStr(raw, Int_obj_ref.new_(bgn), expd);}
|
||||
@@ -141,21 +141,21 @@ public class Bry__tst {
|
||||
Trim_tst("a c", 1, 3, "");
|
||||
Trim_tst(" ", 0, 2, "");
|
||||
} void Trim_tst(String raw, int bgn, int end, String expd) {Tfds.Eq(expd, String_.new_utf8_(Bry_.Trim(Bry_.new_utf8_(raw), bgn, end)));}
|
||||
@Test public void X_to_int_lax() {
|
||||
tst_X_to_int_lax("12a", 12);
|
||||
tst_X_to_int_lax("1", 1);
|
||||
tst_X_to_int_lax("123", 123);
|
||||
tst_X_to_int_lax("a", 0);
|
||||
tst_X_to_int_lax("-1", -1);
|
||||
@Test public void Xto_int_lax() {
|
||||
tst_Xto_int_lax("12a", 12);
|
||||
tst_Xto_int_lax("1", 1);
|
||||
tst_Xto_int_lax("123", 123);
|
||||
tst_Xto_int_lax("a", 0);
|
||||
tst_Xto_int_lax("-1", -1);
|
||||
}
|
||||
private void tst_X_to_int_lax(String val, int expd) {Tfds.Eq(expd, Bry_.X_to_int_or_lax(Bry_.new_utf8_(val), 0, String_.Len(val), 0));}
|
||||
@Test public void X_to_int_or_trim() {
|
||||
tst_X_to_int_trim("123 " , 123);
|
||||
tst_X_to_int_trim(" 123" , 123);
|
||||
tst_X_to_int_trim(" 123 " , 123);
|
||||
tst_X_to_int_trim(" 1 3 " , -1);
|
||||
private void tst_Xto_int_lax(String val, int expd) {Tfds.Eq(expd, Bry_.Xto_int_or_lax(Bry_.new_utf8_(val), 0, String_.Len(val), 0));}
|
||||
@Test public void Xto_int_or_trim() {
|
||||
tst_Xto_int_trim("123 " , 123);
|
||||
tst_Xto_int_trim(" 123" , 123);
|
||||
tst_Xto_int_trim(" 123 " , 123);
|
||||
tst_Xto_int_trim(" 1 3 " , -1);
|
||||
}
|
||||
private void tst_X_to_int_trim(String val, int expd) {Tfds.Eq(expd, Bry_.X_to_int_or_trim(Bry_.new_utf8_(val), 0, String_.Len(val), -1));}
|
||||
private void tst_Xto_int_trim(String val, int expd) {Tfds.Eq(expd, Bry_.Xto_int_or_trim(Bry_.new_utf8_(val), 0, String_.Len(val), -1));}
|
||||
@Test public void Compare() {
|
||||
tst_Compare("abcde", 0, 1, "abcde", 0, 1, CompareAble_.Same);
|
||||
tst_Compare("abcde", 0, 1, "abcde", 1, 2, CompareAble_.Less);
|
||||
|
||||
@@ -19,7 +19,7 @@ package gplx;
|
||||
public class Bry_fmtr_eval_mgr_gfs implements Bry_fmtr_eval_mgr {
|
||||
public boolean Enabled() {return enabled;} public void Enabled_(boolean v) {enabled = v;} private boolean enabled;
|
||||
public byte[] Eval(byte[] cmd) {
|
||||
return enabled ? Bry_.new_utf8_(Object_.XtoStr_OrNullStr(GfsCore._.ExecText(String_.new_utf8_(cmd)))) : null;
|
||||
return enabled ? Bry_.new_utf8_(Object_.Xto_str_strict_or_null_mark(GfsCore._.ExecText(String_.new_utf8_(cmd)))) : null;
|
||||
}
|
||||
public static final Bry_fmtr_eval_mgr_gfs _ = new Bry_fmtr_eval_mgr_gfs(); Bry_fmtr_eval_mgr_gfs() {}
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ public class Byte_ {
|
||||
public static byte cast_(Object o) {try {return (Byte)o;} catch (Exception e) {throw Err_.type_mismatch_exc_(e, byte.class, o);}}
|
||||
public static byte parse_(String raw) {return Byte.parseByte(raw);}
|
||||
public static byte int_(int v) {return v > 127 ? (byte)(v - 256) : (byte)v;} // PERF?: (byte)(v & 0xff)
|
||||
public static byte X_to_boolean_byte(boolean v) {
|
||||
public static byte Xto_boolean_byte(boolean v) {
|
||||
return v ? Bool_.Y_byte : Bool_.N_byte;
|
||||
}
|
||||
public static final byte Zero = 0, MaxValue_127 = 127;
|
||||
|
||||
@@ -56,7 +56,7 @@ public class Byte_ascii {
|
||||
public static boolean Is_num(byte b) {
|
||||
return b > Byte_ascii.Slash && b < Byte_ascii.Colon;
|
||||
}
|
||||
public static int X_to_digit(byte b) {return b - Byte_ascii.Num_0;}
|
||||
public static int Xto_digit(byte b) {return b - Byte_ascii.Num_0;}
|
||||
public static byte Case_upper(byte b) {
|
||||
return b > 96 && b < 123
|
||||
? (byte)(b - 32)
|
||||
|
||||
@@ -35,6 +35,12 @@ public class Double_ {
|
||||
int v_int = (int)v;
|
||||
return v - v_int == 0 ? Int_.XtoStr(v_int) : Double.toString(v);
|
||||
}
|
||||
public static String Xto_str_loose(double v) {
|
||||
int v_as_int = (int)v;
|
||||
return v == v_as_int
|
||||
? Int_.XtoStr(v_as_int) // convert to int, and call print String to eliminate any trailing decimal places
|
||||
: String.format("%g", v); // call "%g" format which should eliminate most, though not all; EX:2449.6000000000004; DATE:2014-07-14
|
||||
}
|
||||
public static double cast_(Object o) {try {return (Double)o;} catch(Exception e) {throw Err_.type_mismatch_exc_(e, double.class, o);}}
|
||||
public static double parse_(String raw) {try {return Double.parseDouble(raw);} catch(Exception e) {throw Err_.parse_type_exc_(e, double.class, raw);}}
|
||||
public static double parseOr_(String raw, double v) {try {return Double.parseDouble(raw);} catch(Exception e) {Err_.Noop(e); return v;}}
|
||||
|
||||
@@ -151,7 +151,7 @@ public class Int_ implements GfoInvkAble {
|
||||
public static int parse_(String raw) {try {return Integer.parseInt(raw);} catch(Exception e) {throw Err_.parse_type_exc_(e, int.class, raw);}}
|
||||
public static int cast_(Object obj) {try {return (Integer)obj;} catch(Exception exc) {throw Err_.type_mismatch_exc_(exc, int.class, obj);}}
|
||||
public static int cast_or_(Object obj, int or) {try {return (Integer)obj;} catch(Exception e) {Err_.Noop(e); return or;}}
|
||||
public static int X_by_double_(double v) {return (int)v;}
|
||||
public static int Xby_double_(double v) {return (int)v;}
|
||||
public static String XtoStr(int v) {return new Integer(v).toString();}
|
||||
public static String XtoStr_fmt(int v, String fmt) {return new java.text.DecimalFormat(fmt).format(v);}
|
||||
public static boolean TypeMatch(Class<?> type) {return type == int.class || type == Integer.class;}
|
||||
|
||||
@@ -32,7 +32,7 @@ public class Int_ary_ {
|
||||
|| pos_is_last
|
||||
) {
|
||||
if (num_bgn == -1) return or; // empty itm; EX: "1,"; "1,,2"
|
||||
int num = Bry_.X_to_int_or(src, num_bgn, num_end, Int_.MinValue);
|
||||
int num = Bry_.Xto_int_or(src, num_bgn, num_end, Int_.MinValue);
|
||||
if (num == Int_.MinValue) return or; // not a number; parse failed
|
||||
if (rv_len == 0) { // rv not init'd
|
||||
rv_len = (raw_len / 2) + 1; // default rv_len to len of String / 2; + 1 to avoid fraction rounding down
|
||||
@@ -77,7 +77,7 @@ public class Int_ary_ {
|
||||
case Byte_ascii.Dash:
|
||||
if (pos == raw_len -1) return or; // eos; EX: "1-"
|
||||
if (num_bgn == -1) return or; // no rng_bgn; EX: "-2"
|
||||
rng_bgn = Bry_.X_to_int_or(src, num_bgn, pos, Int_.MinValue);
|
||||
rng_bgn = Bry_.Xto_int_or(src, num_bgn, pos, Int_.MinValue);
|
||||
if (rng_bgn == Int_.MinValue) return or;
|
||||
num_bgn = -1;
|
||||
itm_is_rng = true;
|
||||
|
||||
@@ -101,7 +101,7 @@ public class Long_ {
|
||||
public static long Int_merge(int hi, int lo) {return (long)hi << 32 | (lo & 0xFFFFFFFFL);}
|
||||
public static int Int_split_lo(long v) {return (int)(v);}
|
||||
public static int Int_split_hi(long v) {return (int)(v >> 32);}
|
||||
public static long X_by_int(int v) {return (long)v;}
|
||||
public static long Xby_int(int v) {return (long)v;}
|
||||
}
|
||||
/* alternate for Int_merge does not work in java
|
||||
public static long MergeInts(int lo, int hi) {return (uint)(hi << 32) | (lo & 0xffffffff);}
|
||||
|
||||
@@ -24,13 +24,9 @@ public class Object_ {
|
||||
else if (lhs == null || rhs == null) return false;
|
||||
else return lhs.equals(rhs);
|
||||
}
|
||||
public static Object Parse(String val, String valType) {
|
||||
if (String_.Eq(valType, IntClassXtn.Key_const)) return Int_.parse_(val);
|
||||
else return val;
|
||||
}
|
||||
public static String XtoStr_OrNull(Object v) {return v == null ? null : ToString_lang(v);}
|
||||
public static String XtoStr_OrNullStr(Object v) {return v == null ? String_.Null_mark : ToString_lang(v);}
|
||||
public static String XtoStr_OrEmpty(Object v) {return v == null ? String_.Empty : ToString_lang(v);}
|
||||
public static String Xto_str_strict_or_null(Object v) {return v == null ? null : ToString_lang(v);}
|
||||
public static String Xto_str_strict_or_null_mark(Object v) {return v == null ? String_.Null_mark : ToString_lang(v);}
|
||||
public static String Xto_str_strict_or_empty(Object v) {return v == null ? String_.Empty : ToString_lang(v);}
|
||||
static String ToString_lang(Object v) {
|
||||
if (v == null) return null;
|
||||
Class<?> c = v.getClass();
|
||||
@@ -38,4 +34,13 @@ public class Object_ {
|
||||
else if (ClassAdp_.Eq(c, String_.ClassOf)) return (String)v;
|
||||
else return v.toString();
|
||||
}
|
||||
public static String Xto_str_loose_or(Object v, String or) { // tries to pretty-print doubles; also standardizes true/false; DATE:2014-07-14
|
||||
if (v == null) return null;
|
||||
Class<?> c = ClassAdp_.ClassOf_obj(v);
|
||||
if (ClassAdp_.Eq(c, Bry_.ClassOf)) return String_.new_utf8_((byte[])v);
|
||||
else if (ClassAdp_.Eq(c, String_.ClassOf)) return (String)v;
|
||||
else if (ClassAdp_.Eq(c, Bool_.ClassOf)) return Bool_.cast_(v) ? Bool_.True_str : Bool_.False_str; // always return true / false
|
||||
else if (ClassAdp_.Eq(c, Double_.ClassOf)) return Double_.Xto_str_loose(Double_.cast_(v));
|
||||
else return v.toString();
|
||||
}
|
||||
}
|
||||
@@ -18,10 +18,19 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx;
|
||||
import org.junit.*;
|
||||
public class Object__tst {
|
||||
@Test public void Eq() {
|
||||
tst_Eq(null, null, true); // both null
|
||||
tst_Eq(5, 5, true); // both non-null
|
||||
tst_Eq(5, null, false); // rhs non-null
|
||||
tst_Eq(null, 5, false); // lhs non-null
|
||||
} void tst_Eq(Object lhs, Object rhs, boolean expd) {Tfds.Eq(expd, Object_.Eq(lhs, rhs));}
|
||||
@Before public void init() {} private Object__fxt fxt = new Object__fxt();
|
||||
@Test public void Eq() {
|
||||
fxt.Test_eq(null, null, true); // both null
|
||||
fxt.Test_eq(5, 5, true); // both non-null
|
||||
fxt.Test_eq(5, null, false); // rhs non-null
|
||||
fxt.Test_eq(null, 5, false); // lhs non-null
|
||||
}
|
||||
@Test public void Xto_str_loose_or_null() {
|
||||
fxt.Test_xto_str_loose_or_null(null, null);
|
||||
fxt.Test_xto_str_loose_or_null(2449.6000000000004d, "2449.60");
|
||||
}
|
||||
}
|
||||
class Object__fxt {
|
||||
public void Test_eq(Object lhs, Object rhs, boolean expd) {Tfds.Eq(expd, Object_.Eq(lhs, rhs));}
|
||||
public void Test_xto_str_loose_or_null(Object v, String expd) {Tfds.Eq(expd, Object_.Xto_str_loose_or(v, null));}
|
||||
}
|
||||
|
||||
@@ -283,7 +283,7 @@ public class String_ implements GfoInvkAble {
|
||||
for (int i = 0; i < aryLen; i++) {
|
||||
if (i != 0) sb.Add(separator);
|
||||
Object val = ary[i];
|
||||
sb.Add_obj(Object_.XtoStr_OrEmpty(val));
|
||||
sb.Add_obj(Object_.Xto_str_strict_or_empty(val));
|
||||
}
|
||||
return sb.XtoStr();
|
||||
}
|
||||
@@ -373,7 +373,7 @@ public class String_ implements GfoInvkAble {
|
||||
else if (c == bracketEnd) {
|
||||
int aryIdx = Int_.parse_or_(numberStr, Int_.MinValue);
|
||||
if (aryIdx != Int_.MinValue && Int_.Between(aryIdx, 0, aryLength - 1)) // check (a) aryIdx is num; (b) aryIdx is in bounds
|
||||
aryVal = Object_.XtoStr_OrEmpty(ary[aryIdx]);
|
||||
aryVal = Object_.Xto_str_strict_or_empty(ary[aryIdx]);
|
||||
else
|
||||
aryVal = String_.Concat_any(bracketBgn, numberStr, bracketEnd); // not valid, just add String
|
||||
sb.Add(aryVal);
|
||||
|
||||
@@ -18,14 +18,14 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx;
|
||||
public class KeyVal implements XtoStrAble {
|
||||
@gplx.Internal protected KeyVal(byte key_tid, Object k, Object v) {this.key_tid = key_tid; key = k; val = v;}
|
||||
public String Key() {return Object_.XtoStr_OrNull(key);}
|
||||
public String Key() {return Object_.Xto_str_strict_or_null(key);}
|
||||
public byte Key_tid() {return key_tid;} private byte key_tid;
|
||||
public Object Key_as_obj() {return key;} private Object key;
|
||||
public KeyVal Key_(Object v) {this.key = v; return this;}
|
||||
public Object Val() {return val;} public KeyVal Val_(Object v) {val = v; return this;} private Object val;
|
||||
public String Val_to_str_or_empty() {return Object_.XtoStr_OrEmpty(val);}
|
||||
public String Val_to_str_or_null() {return Object_.XtoStr_OrNull(val);}
|
||||
public byte[] Val_to_bry() {return Bry_.new_utf8_(Object_.XtoStr_OrNull(val));}
|
||||
public String Val_to_str_or_empty() {return Object_.Xto_str_strict_or_empty(val);}
|
||||
public String Val_to_str_or_null() {return Object_.Xto_str_strict_or_null(val);}
|
||||
public byte[] Val_to_bry() {return Bry_.new_utf8_(Object_.Xto_str_strict_or_null(val));}
|
||||
@Override public String toString() {return XtoStr();}
|
||||
public String XtoStr() {return Key() + "=" + Object_.XtoStr_OrNullStr(val);}
|
||||
public String XtoStr() {return Key() + "=" + Object_.Xto_str_strict_or_null_mark(val);}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ public class KeyVal_ {
|
||||
if (ClassAdp_.Eq_typeSafe(itm_val, KeyVal[].class))
|
||||
sb.Add(Ary_x_to_str((KeyVal[])itm_val));
|
||||
else
|
||||
sb.Add(Object_.XtoStr_OrNullStr(itm_val));
|
||||
sb.Add(Object_.Xto_str_strict_or_null_mark(itm_val));
|
||||
sb.Add_char_nl();
|
||||
}
|
||||
return sb.XtoStr();
|
||||
@@ -73,7 +73,7 @@ public class KeyVal_ {
|
||||
KeyVal itm = ary[i];
|
||||
if (indent > 0)
|
||||
bfr.Add_byte_repeat(Byte_ascii.Space, indent * 2); // add indent : " "
|
||||
bfr.Add_str(Object_.XtoStr_OrEmpty(itm.Key())).Add_byte_eq(); // add key + eq : "key="
|
||||
bfr.Add_str(Object_.Xto_str_strict_or_empty(itm.Key())).Add_byte_eq(); // add key + eq : "key="
|
||||
Object val = itm.Val();
|
||||
if (val == null)
|
||||
bfr.Add_str(String_.Null_mark);
|
||||
@@ -89,7 +89,7 @@ public class KeyVal_ {
|
||||
bfr.Add(val_as_bool ? Bool_.True_bry : Bool_.False_bry); // add "true" or "false"; don't call toString
|
||||
}
|
||||
else
|
||||
bfr.Add_str(Object_.XtoStr_OrNullStr(val)); // call toString()
|
||||
bfr.Add_str(Object_.Xto_str_strict_or_null_mark(val)); // call toString()
|
||||
}
|
||||
bfr.Add_byte_nl();
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ public class TimeSpanAdp_ {
|
||||
switch (b) {
|
||||
case Byte_ascii.Num_0: case Byte_ascii.Num_1: case Byte_ascii.Num_2: case Byte_ascii.Num_3: case Byte_ascii.Num_4:
|
||||
case Byte_ascii.Num_5: case Byte_ascii.Num_6: case Byte_ascii.Num_7: case Byte_ascii.Num_8: case Byte_ascii.Num_9:
|
||||
int unit_digit = Byte_ascii.X_to_digit(b);
|
||||
int unit_digit = Byte_ascii.Xto_digit(b);
|
||||
unit_val = (unit_multiple == 1) ? unit_digit : unit_val + (unit_digit * unit_multiple);
|
||||
switch (colon_pos) {
|
||||
case 0: val_s = unit_val; break;
|
||||
|
||||
@@ -39,7 +39,7 @@ public class Yn {
|
||||
if (v_int == Bool_.__int) Err_mgr._.unhandled_(v);
|
||||
return v_int == Bool_.Y_int;
|
||||
}
|
||||
public static String X_to_str(boolean v) {return v ? "y" : "n";}
|
||||
public static String Xto_str(boolean v) {return v ? "y" : "n";}
|
||||
public static boolean store_bool_or(SrlMgr mgr, String key, boolean or) {
|
||||
String v = mgr.SrlStrOr(key, "");
|
||||
return mgr.Type_rdr() ? parse_or_(v, or) : or;
|
||||
|
||||
@@ -26,7 +26,7 @@ class HashAdp_null implements HashAdp {
|
||||
public int Count() {return 0;}
|
||||
public boolean Has(Object key) {return false;}
|
||||
public Object Fetch(Object key) {return null;}
|
||||
public Object FetchOrFail(Object key) {throw Err_.missing_key_(Object_.XtoStr_OrNullStr(key));}
|
||||
public Object FetchOrFail(Object key) {throw Err_.missing_key_(Object_.Xto_str_strict_or_null_mark(key));}
|
||||
public Object FetchOrNew(Object key, NewAble proto) {throw Err_.new_("could not add to null hash");}
|
||||
public void Add(Object key, Object val) {}
|
||||
public void AddKeyVal(Object val) {}
|
||||
|
||||
@@ -119,7 +119,7 @@ public abstract class ListAdp_base implements ListAdp, GfoInvkAble {
|
||||
for (int i = 0; i < count; i++) {
|
||||
if (i != 0) sb.Add_char_crlf();
|
||||
Object val = list[i];
|
||||
sb.Add_obj(Object_.XtoStr_OrEmpty(val));
|
||||
sb.Add_obj(Object_.Xto_str_strict_or_empty(val));
|
||||
}
|
||||
return sb.XtoStr();
|
||||
}
|
||||
|
||||
@@ -18,13 +18,13 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
package gplx.texts; import gplx.*;
|
||||
import org.junit.*;
|
||||
public class RegxPatn_cls_like_tst {
|
||||
@Test public void Basic() {
|
||||
@Test public void Basic() {
|
||||
tst_Match("abcd", "abcd", true); // basic; pass
|
||||
tst_Match("abcd", "zbcd", false); // basic; fail
|
||||
tst_Match("abcd", "abc", false); // no wildcard; must be exact match
|
||||
tst_Match("a cd", "a cd", true); // check space works
|
||||
}
|
||||
@Test public void Wildcard() {
|
||||
@Test public void Wildcard() {
|
||||
tst_Match("abcd", "a%", true); // bgn; pass
|
||||
tst_Match("abcd", "b%", false); // bgn; fail
|
||||
tst_Match("abcd", "%d", true); // end; pass
|
||||
@@ -34,12 +34,12 @@ public class RegxPatn_cls_like_tst {
|
||||
tst_Match("abcd", "%a%", true); // flank; bgn; pass
|
||||
tst_Match("abcd", "%d%", true); // flank; end; pass
|
||||
}
|
||||
@Test public void Any() {
|
||||
@Test public void Any() {
|
||||
tst_Match("abcd", "a_cd", true); // basic; pass
|
||||
tst_Match("abcd", "z_cd", false); // basic; fail
|
||||
tst_Match("abcd", "a_c", false); // fail; check no wildcard
|
||||
}
|
||||
@Test public void CharSet() {
|
||||
@Test public void CharSet() {
|
||||
tst_Match("abcd", "a[b]cd", true); // pass
|
||||
tst_Match("abcd", "a[x]cd", false); // fail
|
||||
tst_Match("abcd", "a[bcde]cd", true); // multiple; pass
|
||||
@@ -47,20 +47,20 @@ public class RegxPatn_cls_like_tst {
|
||||
tst_Match("abcd", "a[^z]cd", true); // not; pass
|
||||
tst_Match("abcd", "a[^b]cd", false); // not; fail
|
||||
}
|
||||
@Test public void Escape() {
|
||||
@Test public void Escape() {
|
||||
tst_Match("a%b", "a|%b", true); // escape wildcard; pass
|
||||
tst_Match("a%bc", "a|%b", false); // escape wildcard; fail
|
||||
tst_Match("a|b", "a|b", false); // escape char; fail
|
||||
tst_Match("a|b", "a||b", true); // escape char; pass
|
||||
}
|
||||
@Test public void Escape_diffChar() {
|
||||
@Test public void Escape_diffChar() {
|
||||
tst_Match("a%b", "a~%b", '~', true); // escape wildcard; pass
|
||||
tst_Match("a%bc", "a~%b", '~', false); // escape wildcard; fail
|
||||
tst_Match("a|b", "a|b", '~', true); // no escape needed
|
||||
tst_Match("a~b", "a~b", '~', false); // escape char; fail
|
||||
tst_Match("a~b", "a~~b", '~', true); // escape char; pass
|
||||
}
|
||||
@Test public void Chars() { // Escape RegxBldr; ex: LIKE 'a{' -> a\{
|
||||
@Test public void Chars() { // Escape RegxBldr; ex: LIKE 'a{' -> a\{
|
||||
tst_EscapeRegxChar(RegxBldr.Tkn_Escape); // \
|
||||
tst_EscapeRegxChar(RegxBldr.Tkn_GroupBegin); // [
|
||||
tst_EscapeRegxChar(RegxBldr.Tkn_GroupEnd); // ]
|
||||
@@ -79,8 +79,8 @@ public class RegxPatn_cls_like_tst {
|
||||
Tfds.Eq(expd, actl, "raw={0} regx={1} expd={2}", raw, regx, expd);
|
||||
}
|
||||
void tst_EscapeRegxChar(char regexChar) {
|
||||
RegxPatn_cls_like like = RegxPatn_cls_like_.parse_(Object_.XtoStr_OrEmpty(regexChar), '|');
|
||||
Tfds.Eq(true, like.Matches(Object_.XtoStr_OrEmpty(regexChar)));
|
||||
RegxPatn_cls_like like = RegxPatn_cls_like_.parse_(Object_.Xto_str_strict_or_empty(regexChar), '|');
|
||||
Tfds.Eq(true, like.Matches(Object_.Xto_str_strict_or_empty(regexChar)));
|
||||
Tfds.Eq(false, like.Matches("a")); // catches errors for improper escaping of wildcard
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ public class IoEngine_xrg_recycleFil extends IoEngine_xrg_fil_affects1_base {
|
||||
for (int i = 0; i < aryLen; i++) {
|
||||
if (i != 0) sb.Add(separator);
|
||||
Object val = ary.FetchAt(i);
|
||||
sb.Add_obj(Object_.XtoStr_OrEmpty(val));
|
||||
sb.Add_obj(Object_.Xto_str_strict_or_empty(val));
|
||||
}
|
||||
return sb.XtoStr();
|
||||
}
|
||||
|
||||
@@ -71,9 +71,9 @@ public class ProcessAdp implements GfoInvkAble, RlsAble {
|
||||
default: throw Err_mgr._.unhandled_(run_mode);
|
||||
}
|
||||
}
|
||||
public String[] X_to_process_bldr_args(String... args) {
|
||||
public String[] Xto_process_bldr_args(String... args) {
|
||||
String args_str = args_fmtr.Bld_str_many(args);
|
||||
return X_to_process_bldr_args_utl(exe_url, args_str);
|
||||
return Xto_process_bldr_args_utl(exe_url, args_str);
|
||||
}
|
||||
public Object Invk(GfsCtx ctx, int ikey, String k, GfoMsg m) {
|
||||
if (ctx.Match(k, Invk_enabled)) return enabled;
|
||||
@@ -209,7 +209,7 @@ public class ProcessAdp implements GfoInvkAble, RlsAble {
|
||||
exit_code = Exit_init;
|
||||
rslt_out = "";
|
||||
WhenBgn_run();
|
||||
pb = new ProcessBuilder(X_to_process_bldr_args_utl(exe_url, args_str));
|
||||
pb = new ProcessBuilder(Xto_process_bldr_args_utl(exe_url, args_str));
|
||||
pb.redirectErrorStream(true); // NOTE: need to redirectErrorStream or rdr.readLine() will hang; see inkscape and Ostfriesland Verkehr-de.svg
|
||||
if (working_dir != null)
|
||||
pb.directory(new File(working_dir.Xto_api()));
|
||||
@@ -259,7 +259,7 @@ public class ProcessAdp implements GfoInvkAble, RlsAble {
|
||||
}
|
||||
private static final String GRP_KEY = "gplx.process";
|
||||
public static final int Exit_pass = 0, Exit_init = -1;
|
||||
public static String[] X_to_process_bldr_args_utl(Io_url exe_url, String args_str) {
|
||||
public static String[] Xto_process_bldr_args_utl(Io_url exe_url, String args_str) {
|
||||
ListAdp list = ListAdp_.new_();
|
||||
list.Add(exe_url.Xto_api());
|
||||
String_bldr sb = String_bldr_.new_();
|
||||
|
||||
@@ -20,7 +20,7 @@ public abstract class ClassXtn_base {
|
||||
public abstract Class<?> UnderClass();
|
||||
public abstract Object ParseOrNull(String raw);
|
||||
@gplx.Virtual public Object XtoDb(Object obj) {return obj;}
|
||||
@gplx.Virtual public String XtoUi(Object obj, String fmt) {return Object_.XtoStr_OrNullStr(obj);}
|
||||
@gplx.Virtual public String XtoUi(Object obj, String fmt) {return Object_.Xto_str_strict_or_null_mark(obj);}
|
||||
@gplx.Virtual public boolean MatchesClass(Object obj) {if (obj == null) throw Err_.null_("obj");
|
||||
return ClassAdp_.Eq_typeSafe(obj, UnderClass());
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ public class GfoNde implements GfoInvkAble {
|
||||
String_bldr sb = String_bldr_.new_();
|
||||
for (int i = 0; i < aryLen; i++) {
|
||||
String key = i >= flds.Count() ? "<< NULL " + i + " >>" : flds.FetchAt(i).Key();
|
||||
String val = i >= aryLen ? "<< NULL " + i + " >>" : Object_.XtoStr_OrNullStr(ary[i]);
|
||||
String val = i >= aryLen ? "<< NULL " + i + " >>" : Object_.Xto_str_strict_or_null_mark(ary[i]);
|
||||
sb.Add(key).Add("=").Add(val);
|
||||
}
|
||||
return sb.XtoStr();
|
||||
|
||||
@@ -260,9 +260,9 @@ class XtoStrWkr_gplx implements XtoStrWkr {
|
||||
String rv = null;
|
||||
if (type == String.class) rv = String_.cast_(o);
|
||||
else if (Int_.TypeMatch(type)) return Int_.XtoStr(Int_.cast_(o));
|
||||
else if (Bool_.TypeMatch(type)) return Yn.X_to_str(Bool_.cast_(o));
|
||||
else if (Bool_.TypeMatch(type)) return Yn.Xto_str(Bool_.cast_(o));
|
||||
else if (type == DateAdp.class) return DateAdp_.cast_(o).XtoStr_gplx();
|
||||
else rv = Object_.XtoStr_OrEmpty(o);
|
||||
else rv = Object_.Xto_str_strict_or_empty(o);
|
||||
return String_.Replace(rv, "'", "''");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -23,7 +23,7 @@ class XmlDataWtr extends DataWtr_base implements DataWtr {
|
||||
public void InitWtr(String key, Object val) {}
|
||||
@Override public void WriteData(String name, Object val) {
|
||||
// if (val == null) return;
|
||||
String valString = Object_.XtoStr_OrEmpty(val);
|
||||
String valString = Object_.Xto_str_strict_or_empty(val);
|
||||
int valStringLen = String_.Len(valString);
|
||||
sb.Add(" ").Add(name).Add("=\"");
|
||||
for (int i = 0; i < valStringLen; i++) {
|
||||
|
||||
@@ -190,7 +190,7 @@ class DsvDataRdr_fxt {
|
||||
GfoNde row = tbl.Subs().FetchAt_asGfoNde(i);
|
||||
for (int j = 0; j < row.Flds().Count(); j++) {
|
||||
if (j != 0) sb.Add("~");
|
||||
sb.Add_obj(Object_.XtoStr_OrNullStr(row.ReadAt(j)));
|
||||
sb.Add_obj(Object_.Xto_str_strict_or_null_mark(row.ReadAt(j)));
|
||||
}
|
||||
expdList.Add(sb.XtoStrAndClear());
|
||||
}
|
||||
@@ -201,7 +201,7 @@ class DsvDataRdr_fxt {
|
||||
}
|
||||
for (int j = 0; j < expdRow.length; j++) {
|
||||
if (j != 0) sb.Add("~");
|
||||
sb.Add_obj(Object_.XtoStr_OrNullStr(expdRow[j]));
|
||||
sb.Add_obj(Object_.Xto_str_strict_or_null_mark(expdRow[j]));
|
||||
}
|
||||
actlList.Add(sb.XtoStrAndClear());
|
||||
}
|
||||
|
||||
@@ -119,7 +119,7 @@ class GfsCore_ {
|
||||
if (type == String.class) invk = String_.Gfs;
|
||||
else if (Int_.TypeMatch(type)) invk = Int_.Gfs;
|
||||
else if (Bool_.TypeMatch(type)) invk = Bool_.Gfs;
|
||||
else throw Err_.new_("unknown primitive").Add("type", ClassAdp_.NameOf_type(type)).Add("obj", Object_.XtoStr_OrNullStr(rv));
|
||||
else throw Err_.new_("unknown primitive").Add("type", ClassAdp_.NameOf_type(type)).Add("obj", Object_.Xto_str_strict_or_null_mark(rv));
|
||||
primitive = rv;
|
||||
}
|
||||
Object exec_rv = null;
|
||||
|
||||
@@ -37,6 +37,6 @@ class GfsCoreFxt {
|
||||
public void tst_MsgStr(GfoMsg msg, Object expd) {
|
||||
GfsCtx ctx = GfsCtx.new_();
|
||||
Object actl = core.ExecOne(ctx, msg);
|
||||
Tfds.Eq(Object_.XtoStr_OrNullStr(expd), Object_.XtoStr_OrNullStr(actl));
|
||||
Tfds.Eq(Object_.Xto_str_strict_or_null_mark(expd), Object_.Xto_str_strict_or_null_mark(actl));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -37,7 +37,7 @@ public class UsrMsg {
|
||||
KeyVal kv = (KeyVal)args.FetchAt(i);
|
||||
m.Add(kv.Key(), kv.Val());
|
||||
}
|
||||
return Object_.XtoStr_OrNullStr(invk.Invk(GfsCtx._, 0, cmd, m));
|
||||
return Object_.Xto_str_strict_or_null_mark(invk.Invk(GfsCtx._, 0, cmd, m));
|
||||
}
|
||||
String_bldr sb = String_bldr_.new_();
|
||||
sb.Add(hdr).Add(spr);
|
||||
|
||||
@@ -165,13 +165,13 @@ public class Tfds { // URL:doc/gplx.tfds/Tfds.txt
|
||||
String_bldr sb = String_bldr_.new_();
|
||||
int aryLen = Array_.Len(ary);
|
||||
for (int i = 0; i < aryLen; i++)
|
||||
sb.Add_many("'", Object_.XtoStr_OrNullStr(ary[i]), "'", " ");
|
||||
sb.Add_many("'", Object_.Xto_str_strict_or_null_mark(ary[i]), "'", " ");
|
||||
WriteText(sb.XtoStr() + String_.CrLf);
|
||||
}
|
||||
}
|
||||
class TfdsEqListItmStr_cls_default implements TfdsEqListItmStr {
|
||||
public String XtoStr(Object cur, Object actl) {
|
||||
return Object_.XtoStr_OrNullStr(cur);
|
||||
return Object_.Xto_str_strict_or_null_mark(cur);
|
||||
}
|
||||
public static final TfdsEqListItmStr_cls_default _ = new TfdsEqListItmStr_cls_default(); TfdsEqListItmStr_cls_default() {}
|
||||
}
|
||||
@@ -230,7 +230,7 @@ class TfdsMsgBldr {
|
||||
if (s != null) return String_.Concat("'", s, "'"); // if Object is String, put quotes around it for legibility
|
||||
XtoStrAble xtoStrAble = XtoStrAble_.as_(obj);
|
||||
if (xtoStrAble != null) return xtoStrAble.XtoStr();
|
||||
return Object_.XtoStr_OrNullStr(obj);
|
||||
return Object_.Xto_str_strict_or_null_mark(obj);
|
||||
}
|
||||
String WrapMsg(String text) {
|
||||
return String_.Concat(String_.CrLf
|
||||
|
||||
Reference in New Issue
Block a user