PageRenderTime 56ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/src/sys/java/fan/sys/FanStr.java

https://bitbucket.org/bedlaczech/fan-1.0
Java | 980 lines | 827 code | 110 blank | 43 comment | 281 complexity | 39a11f8fe2d57bf6940a06e940a31ed8 MD5 | raw file
Possible License(s): CC-BY-SA-3.0
  1. //
  2. // Copyright (c) 2006, Brian Frank and Andy Frank
  3. // Licensed under the Academic Free License version 3.0
  4. //
  5. // History:
  6. // 4 Dec 05 Brian Frank Creation
  7. // 6 Oct 08 Brian Frank Refactor String into String/FanStr
  8. //
  9. package fan.sys;
  10. import java.math.BigDecimal;
  11. import java.util.HashMap;
  12. import fanx.serial.*;
  13. import fanx.util.StrUtil;
  14. /**
  15. * FanString defines the methods for sys::Str. The actual
  16. * class used for representation is java.lang.String.
  17. */
  18. public class FanStr
  19. {
  20. public static String fromChars(List chars)
  21. {
  22. if (chars.sz() == 0) return "";
  23. StringBuilder s = new StringBuilder(chars.sz());
  24. for (int i=0; i<chars.sz(); ++i)
  25. s.append((char)((Long)chars.get(i)).longValue());
  26. return s.toString();
  27. }
  28. public static String makeTrim(StringBuilder s)
  29. {
  30. int start = 0;
  31. int end = s.length();
  32. while (start < end) if (FanInt.isSpace(s.charAt(start))) start++; else break;
  33. while (end > start) if (FanInt.isSpace(s.charAt(end-1))) end--; else break;
  34. return s.substring(start, end);
  35. }
  36. //////////////////////////////////////////////////////////////////////////
  37. // Identity
  38. //////////////////////////////////////////////////////////////////////////
  39. public static boolean equals(String self, Object obj)
  40. {
  41. return self.equals(obj);
  42. }
  43. public static boolean equalsIgnoreCase(String a, String b)
  44. {
  45. if (a == b) return true;
  46. int an = a.length();
  47. int bn = b.length();
  48. if (an != bn) return false;
  49. for (int i=0; i<an; ++i)
  50. {
  51. int ac = a.charAt(i);
  52. int bc = b.charAt(i);
  53. if ('A' <= ac && ac <= 'Z') ac |= 0x20;
  54. if ('A' <= bc && bc <= 'Z') bc |= 0x20;
  55. if (ac != bc) return false;
  56. }
  57. return true;
  58. }
  59. public static long compare(String a, Object b)
  60. {
  61. int cmp = a.compareTo((String)b);
  62. if (cmp < 0) return -1;
  63. return cmp == 0 ? 0 : 1;
  64. }
  65. public static long compareIgnoreCase(String a, String b)
  66. {
  67. if (a == b) return 0;
  68. int an = a.length();
  69. int bn = b.length();
  70. for (int i=0; i<an && i<bn; ++i)
  71. {
  72. int ac = a.charAt(i);
  73. int bc = b.charAt(i);
  74. if ('A' <= ac && ac <= 'Z') ac |= 0x20;
  75. if ('A' <= bc && bc <= 'Z') bc |= 0x20;
  76. if (ac != bc) return ac < bc ? -1 : +1;
  77. }
  78. if (an == bn) return 0;
  79. return an < bn ? -1 : +1;
  80. }
  81. public static long hash(String self)
  82. {
  83. return self.hashCode();
  84. }
  85. public static int caseInsensitiveHash(String self)
  86. {
  87. int n = self.length();
  88. int hash = 0;
  89. for (int i=0; i<n; ++i)
  90. {
  91. int c = self.charAt(i);
  92. if ('A' <= c && c <= 'Z') c |= 0x20;
  93. hash = 31*hash + c;
  94. }
  95. return hash;
  96. }
  97. public static String toStr(String self)
  98. {
  99. return self;
  100. }
  101. public static String toLocale(String self)
  102. {
  103. return self;
  104. }
  105. public static Type typeof(String self)
  106. {
  107. return Sys.StrType;
  108. }
  109. //////////////////////////////////////////////////////////////////////////
  110. // Operators
  111. //////////////////////////////////////////////////////////////////////////
  112. public static long get(String self, long index)
  113. {
  114. try
  115. {
  116. int i = (int)index;
  117. if (i < 0) i = self.length()+i;
  118. return self.charAt(i);
  119. }
  120. catch (IndexOutOfBoundsException e)
  121. {
  122. throw IndexErr.make(index);
  123. }
  124. }
  125. public static long getSafe(String self, long index) { return getSafe(self, index, 0); }
  126. public static long getSafe(String self, long index, long def)
  127. {
  128. try
  129. {
  130. int i = (int)index;
  131. if (i < 0) i = self.length()+i;
  132. return self.charAt(i);
  133. }
  134. catch (IndexOutOfBoundsException e)
  135. {
  136. return def;
  137. }
  138. }
  139. public static String getRange(String self, Range r)
  140. {
  141. int size = self.length();
  142. int s = r.startIndex(size);
  143. int e = r.endIndex(size);
  144. if (e+1 < s) throw IndexErr.make(r);
  145. return self.substring(s, e+1);
  146. }
  147. public static String plus(String self, Object obj)
  148. {
  149. if (obj == null) return self.concat("null");
  150. String x = FanObj.toStr(obj);
  151. if (x.length() == 0) return self;
  152. return self.concat(x);
  153. }
  154. //////////////////////////////////////////////////////////////////////////
  155. // Identity
  156. //////////////////////////////////////////////////////////////////////////
  157. public static String intern(String self)
  158. {
  159. return self.intern();
  160. }
  161. public static boolean isEmpty(String self)
  162. {
  163. return self.length() == 0;
  164. }
  165. public static long size(String self)
  166. {
  167. return self.length();
  168. }
  169. public static boolean startsWith(String self, String s)
  170. {
  171. return self.startsWith(s, 0);
  172. }
  173. public static boolean endsWith(String self, String s)
  174. {
  175. return self.endsWith(s);
  176. }
  177. public static boolean contains(String self, String s)
  178. {
  179. return index(self, s, 0L) != null;
  180. }
  181. public static boolean containsChar(String self, long ch)
  182. {
  183. return self.indexOf((int)ch) >= 0;
  184. }
  185. public static Long index(String self, String s) { return index(self, s, 0L); }
  186. public static Long index(String self, String s, long off)
  187. {
  188. int i = (int)off;
  189. if (i < 0) i = self.length()+i;
  190. int r;
  191. if (s.length() == 1)
  192. r = self.indexOf(s.charAt(0), i);
  193. else
  194. r = self.indexOf(s, i);
  195. if (r < 0) return null;
  196. return Long.valueOf(r);
  197. }
  198. public static Long indexr(String self, String s) { return indexr(self, s, -1L); }
  199. public static Long indexr(String self, String s, long off)
  200. {
  201. int i = (int)off;
  202. if (i < 0) i = self.length()+i;
  203. int r;
  204. if (s.length() == 1)
  205. r = self.lastIndexOf(s.charAt(0), i);
  206. else
  207. r = self.lastIndexOf(s, i);
  208. if (r < 0) return null;
  209. return Long.valueOf(r);
  210. }
  211. public static Long indexIgnoreCase(String self, String s) { return indexIgnoreCase(self, s, 0L); }
  212. public static Long indexIgnoreCase(String self, String s, long off)
  213. {
  214. int len = self.length(), slen = s.length();
  215. int r = -1;
  216. int i = (int)off;
  217. if (i < 0) i = len+i;
  218. int first = s.charAt(0);
  219. for (; i<=len-slen; ++i)
  220. {
  221. // test first char
  222. if (neic(first, self.charAt(i))) continue;
  223. // test remainder of chars
  224. r = i;
  225. for (int si=1, vi=i+1; si<slen; ++si, ++vi)
  226. if (neic(s.charAt(si), self.charAt(vi)))
  227. { r = -1; break; }
  228. if (r >= 0) break;
  229. }
  230. if (r < 0) return null;
  231. return Long.valueOf(r);
  232. }
  233. public static Long indexrIgnoreCase(String self, String s) { return indexrIgnoreCase(self, s, -1L); }
  234. public static Long indexrIgnoreCase(String self, String s, long off)
  235. {
  236. int len = self.length(), slen = s.length();
  237. int r = -1;
  238. int i = (int)off;
  239. if (i < 0) i = len+i;
  240. if (i+slen >= len) i = len-slen;
  241. int first = s.charAt(0);
  242. for (; i>=0; --i)
  243. {
  244. // test first char
  245. if (neic(first, self.charAt(i))) continue;
  246. // test remainder of chars
  247. r = i;
  248. for (int si=1, vi=i+1; si<slen; ++si, ++vi)
  249. if (neic(s.charAt(si), self.charAt(vi)))
  250. { r = -1; break; }
  251. if (r >= 0) break;
  252. }
  253. if (r < 0) return null;
  254. return Long.valueOf(r);
  255. }
  256. private static boolean neic(int a, int b)
  257. {
  258. if (a == b) return false;
  259. if ((a | 0x20) == (b | 0x20)) return FanInt.lower(a) != FanInt.lower(b);
  260. return true;
  261. }
  262. //////////////////////////////////////////////////////////////////////////
  263. // Iterators
  264. //////////////////////////////////////////////////////////////////////////
  265. public static List chars(String self)
  266. {
  267. int len = self.length();
  268. if (len == 0) return Sys.IntType.emptyList();
  269. Long[] chars = new Long[len];
  270. for (int i=0; i<len; ++i) chars[i] = Long.valueOf(self.charAt(i));
  271. return new List(Sys.IntType, chars);
  272. }
  273. public static void each(String self, Func f)
  274. {
  275. int len = self.length();
  276. if (f.arity() == 1)
  277. {
  278. for (int i=0; i<len ; ++i)
  279. f.call(Long.valueOf(self.charAt(i)));
  280. }
  281. else
  282. {
  283. for (int i=0; i<len ; ++i)
  284. f.call(Long.valueOf(self.charAt(i)), Long.valueOf(i));
  285. }
  286. }
  287. public static void eachr(String self, Func f)
  288. {
  289. if (f.arity() == 1)
  290. {
  291. for (int i=self.length()-1; i>=0; --i)
  292. f.call(Long.valueOf(self.charAt(i)));
  293. }
  294. else
  295. {
  296. for (int i=self.length()-1; i>=0; --i)
  297. f.call(Long.valueOf(self.charAt(i)), Long.valueOf(i));
  298. }
  299. }
  300. public static boolean any(String self, Func f)
  301. {
  302. int len = self.length();
  303. if (f.arity() == 1)
  304. {
  305. for (int i=0; i<len ; ++i)
  306. if (f.callBool(Long.valueOf(self.charAt(i))))
  307. return true;
  308. }
  309. else
  310. {
  311. for (int i=0; i<len ; ++i)
  312. if (f.callBool(Long.valueOf(self.charAt(i)), Long.valueOf(i)))
  313. return true;
  314. }
  315. return false;
  316. }
  317. public static boolean all(String self, Func f)
  318. {
  319. int len = self.length();
  320. if (f.arity() == 1)
  321. {
  322. for (int i=0; i<len ; ++i)
  323. if (!f.callBool(Long.valueOf(self.charAt(i))))
  324. return false;
  325. }
  326. else
  327. {
  328. for (int i=0; i<len ; ++i)
  329. if (!f.callBool(Long.valueOf(self.charAt(i)), Long.valueOf(i)))
  330. return false;
  331. }
  332. return true;
  333. }
  334. //////////////////////////////////////////////////////////////////////////
  335. // Utils
  336. //////////////////////////////////////////////////////////////////////////
  337. public static String spaces(long n)
  338. {
  339. // do an array lookup for reasonable length
  340. // strings since that is the common case
  341. int count = (int)n;
  342. try { return spaces[count]; } catch (ArrayIndexOutOfBoundsException e) {}
  343. // otherwise we build a new one
  344. StringBuilder s = new StringBuilder(spaces[spaces.length-1]);
  345. for (int i=spaces.length-1; i<count; ++i)
  346. s.append(' ');
  347. return s.toString();
  348. }
  349. static String[] spaces = new String[20];
  350. static
  351. {
  352. StringBuilder s = new StringBuilder();
  353. for (int i=0; i<spaces.length; ++i)
  354. {
  355. spaces[i] = s.toString();
  356. s.append(' ');
  357. }
  358. }
  359. public static String lower(String self)
  360. {
  361. StringBuilder s = new StringBuilder(self.length());
  362. for (int i=0; i<self.length(); ++i)
  363. {
  364. int ch = self.charAt(i);
  365. if ('A' <= ch && ch <= 'Z') ch |= 0x20;
  366. s.append((char)ch);
  367. }
  368. return s.toString();
  369. }
  370. public static String upper(String self)
  371. {
  372. StringBuilder s = new StringBuilder(self.length());
  373. for (int i=0; i<self.length(); ++i)
  374. {
  375. int ch = self.charAt(i);
  376. if ('a' <= ch && ch <= 'z') ch &= ~0x20;
  377. s.append((char)ch);
  378. }
  379. return s.toString();
  380. }
  381. public static String capitalize(String self)
  382. {
  383. if (self.length() > 0)
  384. {
  385. int ch = self.charAt(0);
  386. if ('a' <= ch && ch <= 'z')
  387. {
  388. StringBuilder s = new StringBuilder(self.length());
  389. s.append((char)(ch & ~0x20));
  390. s.append(self, 1, self.length());
  391. return s.toString();
  392. }
  393. }
  394. return self;
  395. }
  396. public static String decapitalize(String self)
  397. {
  398. if (self.length() > 0)
  399. {
  400. int ch = self.charAt(0);
  401. if ('A' <= ch && ch <= 'Z')
  402. {
  403. StringBuilder s = new StringBuilder(self.length());
  404. s.append((char)(ch | 0x20));
  405. s.append(self, 1, self.length());
  406. return s.toString();
  407. }
  408. }
  409. return self;
  410. }
  411. public static String toDisplayName(String self)
  412. {
  413. if (self.length() == 0) return "";
  414. StringBuilder s = new StringBuilder(self.length()+4);
  415. // capitalize first word
  416. int c = self.charAt(0);
  417. if ('a' <= c && c <= 'z') c &= ~0x20;
  418. s.append((char)c);
  419. // insert spaces before every capital
  420. int last = c;
  421. for (int i=1; i<self.length(); ++i)
  422. {
  423. c = self.charAt(i);
  424. if ('A' <= c && c <= 'Z' && last != '_')
  425. {
  426. int next = i+1 < self.length() ? self.charAt(i+1) : 'Q';
  427. if (!('A' <= last && last <= 'Z' ) || !('A' <= next && next <= 'Z'))
  428. s.append(' ');
  429. }
  430. else if ('a' <= c && c <= 'z')
  431. {
  432. if (('0' <= last && last <= '9')) { s.append(' '); c &= ~0x20; }
  433. else if (last == '_') c &= ~0x20;
  434. }
  435. else if ('0' <= c && c <= '9')
  436. {
  437. if (!('0' <= last && last <= '9')) s.append(' ');
  438. }
  439. else if (c == '_')
  440. {
  441. s.append(' ');
  442. last = c;
  443. continue;
  444. }
  445. s.append((char)c);
  446. last = c;
  447. }
  448. return s.toString();
  449. }
  450. public static String fromDisplayName(String self)
  451. {
  452. if (self.length() == 0) return "";
  453. StringBuilder s = new StringBuilder(self.length());
  454. int c = self.charAt(0);
  455. int c2 = self.length() == 1 ? 0 : self.charAt(1);
  456. if ('A' <= c && c <= 'Z' && !('A' <= c2 && c2 <= 'Z')) c |= 0x20;
  457. s.append((char)c);
  458. int last = c;
  459. for (int i=1; i<self.length(); ++i)
  460. {
  461. c = self.charAt(i);
  462. if (c != ' ')
  463. {
  464. if (last == ' ' && 'a' <= c && c <= 'z') c &= ~0x20;
  465. s.append((char)c);
  466. }
  467. last = c;
  468. }
  469. return s.toString();
  470. }
  471. public static String justl(String self, long width)
  472. {
  473. return padr(self, width, ' ');
  474. }
  475. public static String justr(String self, long width)
  476. {
  477. return padl(self, width, ' ');
  478. }
  479. public static String padl(String self, long width) { return padl(self, width, ' '); }
  480. public static String padl(String self, long width, long ch)
  481. {
  482. int w = (int)width;
  483. if (self.length() >= w) return self;
  484. char c = (char)ch;
  485. StringBuilder s = new StringBuilder(w);
  486. for (int i=self.length(); i<w; ++i) s.append(c);
  487. s.append(self);
  488. return s.toString();
  489. }
  490. public static String padr(String self, long width) { return padr(self, width, ' '); }
  491. public static String padr(String self, long width, long ch)
  492. {
  493. int w = (int)width;
  494. if (self.length() >= w) return self;
  495. char c = (char)ch;
  496. StringBuilder s = new StringBuilder(w);
  497. s.append(self);
  498. for (int i=self.length(); i<w; ++i) s.append(c);
  499. return s.toString();
  500. }
  501. public static String reverse(String self)
  502. {
  503. if (self.length() < 2) return self;
  504. StringBuilder s = new StringBuilder(self.length());
  505. for (int i=self.length()-1; i>=0; --i)
  506. s.append(self.charAt(i));
  507. return s.toString();
  508. }
  509. public static String trim(String self)
  510. {
  511. int len = self.length();
  512. if (len == 0) return self;
  513. if (self.charAt(0) > ' ' && self.charAt(len-1) > ' ') return self;
  514. return self.trim();
  515. }
  516. public static String trimStart(String self)
  517. {
  518. int len = self.length();
  519. if (len == 0) return self;
  520. if (self.charAt(0) > ' ') return self;
  521. int pos = 1;
  522. while (pos < len && self.charAt(pos) <= ' ') pos++;
  523. return self.substring(pos);
  524. }
  525. public static String trimEnd(String self)
  526. {
  527. int len = self.length();
  528. if (len == 0) return self;
  529. int pos = len-1;
  530. if (self.charAt(pos) > ' ') return self;
  531. while (pos >= 0 && self.charAt(pos) <= ' ') pos--;
  532. return self.substring(0, pos+1);
  533. }
  534. public static List split(String self) { return split(self, null, true); }
  535. public static List split(String self, Long separator) { return split(self, separator, true); }
  536. public static List split(String self, Long separator, boolean trimmed)
  537. {
  538. if (separator == null) return splitws(self);
  539. int sep = separator.intValue();
  540. boolean trim = trimmed;
  541. List toks = new List(Sys.StrType, 16);
  542. int len = self.length();
  543. int x = 0;
  544. for (int i=0; i<len; ++i)
  545. {
  546. if (self.charAt(i) != sep) continue;
  547. if (x <= i) toks.add(splitStr(self, x, i, trim));
  548. x = i+1;
  549. }
  550. if (x <= len) toks.add(splitStr(self, x, len, trim));
  551. return toks;
  552. }
  553. private static String splitStr(String val, int s, int e, boolean trim)
  554. {
  555. if (trim)
  556. {
  557. while (s < e && val.charAt(s) <= ' ') ++s;
  558. while (e > s && val.charAt(e-1) <= ' ') --e;
  559. }
  560. return val.substring(s, e);
  561. }
  562. public static List splitws(String val)
  563. {
  564. List toks = new List(Sys.StrType, 16);
  565. int len = val.length();
  566. while (len > 0 && val.charAt(len-1) <= ' ') --len;
  567. int x = 0;
  568. while (x < len && val.charAt(x) <= ' ') ++x;
  569. for (int i=x; i<len; ++i)
  570. {
  571. if (val.charAt(i) > ' ') continue;
  572. toks.add(val.substring(x, i));
  573. x = i + 1;
  574. while (x < len && val.charAt(x) <= ' ') ++x;
  575. i = x;
  576. }
  577. if (x <= len) toks.add(val.substring(x, len));
  578. if (toks.sz() == 0) toks.add("");
  579. return toks;
  580. }
  581. public static List splitLines(String self)
  582. {
  583. List lines = new List(Sys.StrType, 16);
  584. int len = self.length();
  585. int s = 0;
  586. for (int i=0; i<len; ++i)
  587. {
  588. int c = self.charAt(i);
  589. if (c == '\n' || c == '\r')
  590. {
  591. lines.add(self.substring(s, i));
  592. s = i+1;
  593. if (c == '\r' && s < len && self.charAt(s) == '\n') { i++; s++; }
  594. }
  595. }
  596. lines.add(self.substring(s, len));
  597. return lines;
  598. }
  599. public static String replace(String self, String from, String to)
  600. {
  601. if (self.length() == 0) return self;
  602. return StrUtil.replace(self, from, to);
  603. }
  604. public static long numNewlines(String self)
  605. {
  606. int numLines = 0;
  607. int len = self.length();
  608. for (int i=0; i<len; ++i)
  609. {
  610. int c = self.charAt(i);
  611. if (c == '\n') numLines++;
  612. else if (c == '\r')
  613. {
  614. numLines++;
  615. if (i+1<len && self.charAt(i+1) == '\n') i++;
  616. }
  617. }
  618. return numLines;
  619. }
  620. public static boolean isAscii(String self)
  621. {
  622. int len = self.length();
  623. for (int i=0; i<len; ++i)
  624. if (self.charAt(i) >= 128) return false;
  625. return true;
  626. }
  627. public static boolean isSpace(String self)
  628. {
  629. int len = self.length();
  630. for (int i=0; i<len; ++i)
  631. {
  632. int ch = self.charAt(i);
  633. if (ch >= 128 || (FanInt.charMap[ch] & FanInt.SPACE) == 0)
  634. return false;
  635. }
  636. return true;
  637. }
  638. public static boolean isUpper(String self)
  639. {
  640. int len = self.length();
  641. for (int i=0; i<len; ++i)
  642. {
  643. int ch = self.charAt(i);
  644. if (ch >= 128 || (FanInt.charMap[ch] & FanInt.UPPER) == 0)
  645. return false;
  646. }
  647. return true;
  648. }
  649. public static boolean isLower(String self)
  650. {
  651. int len = self.length();
  652. for (int i=0; i<len; ++i)
  653. {
  654. int ch = self.charAt(i);
  655. if (ch >= 128 || (FanInt.charMap[ch] & FanInt.LOWER) == 0)
  656. return false;
  657. }
  658. return true;
  659. }
  660. public static boolean isAlpha(String self)
  661. {
  662. int len = self.length();
  663. for (int i=0; i<len; ++i)
  664. {
  665. int ch = self.charAt(i);
  666. if (ch >= 128 || (FanInt.charMap[ch] & FanInt.ALPHA) == 0)
  667. return false;
  668. }
  669. return true;
  670. }
  671. public static boolean isAlphaNum(String self)
  672. {
  673. int len = self.length();
  674. for (int i=0; i<len; ++i)
  675. {
  676. int ch = self.charAt(i);
  677. if (ch >= 128 || (FanInt.charMap[ch] & FanInt.ALPHANUM) == 0)
  678. return false;
  679. }
  680. return true;
  681. }
  682. public static boolean isEveryChar(String self, int ch)
  683. {
  684. int len = self.length();
  685. for (int i=0; i<len; ++i)
  686. if (self.charAt(i) != ch) return false;
  687. return true;
  688. }
  689. //////////////////////////////////////////////////////////////////////////
  690. // Locale
  691. //////////////////////////////////////////////////////////////////////////
  692. public static long localeCompare(String self, String x)
  693. {
  694. int cmp = Locale.cur().collator().compare(self, x);
  695. if (cmp < 0) return -1;
  696. return cmp == 0 ? 0 : +1;
  697. }
  698. public static String localeLower(String self)
  699. {
  700. return self.toLowerCase(Locale.cur().java());
  701. }
  702. public static String localeUpper(String self)
  703. {
  704. return self.toUpperCase(Locale.cur().java());
  705. }
  706. public static String localeCapitalize(String self)
  707. {
  708. if (self.length() > 0)
  709. {
  710. int ch = self.charAt(0);
  711. if (Character.isLowerCase(ch))
  712. {
  713. StringBuilder s = new StringBuilder(self.length());
  714. s.append(Character.toString((char)ch).toUpperCase(Locale.cur().java()).charAt(0));
  715. s.append(self, 1, self.length());
  716. return s.toString();
  717. }
  718. }
  719. return self;
  720. }
  721. public static String localeDecapitalize(String self)
  722. {
  723. if (self.length() > 0)
  724. {
  725. int ch = self.charAt(0);
  726. if (Character.isUpperCase(ch))
  727. {
  728. StringBuilder s = new StringBuilder(self.length());
  729. s.append(Character.toString((char)ch).toLowerCase(Locale.cur().java()).charAt(0));
  730. s.append(self, 1, self.length());
  731. return s.toString();
  732. }
  733. }
  734. return self;
  735. }
  736. //////////////////////////////////////////////////////////////////////////
  737. // Conversion
  738. //////////////////////////////////////////////////////////////////////////
  739. public static Boolean toBool(String self) { return FanBool.fromStr(self, true); }
  740. public static Boolean toBool(String self, boolean checked) { return FanBool.fromStr(self, checked); }
  741. public static Long toInt(String self) { return FanInt.fromStr(self, 10, true); }
  742. public static Long toInt(String self, long radix) { return FanInt.fromStr(self, radix, true); }
  743. public static Long toInt(String self, long radix, boolean checked) { return FanInt.fromStr(self, radix, checked); }
  744. public static Double toFloat(String self) { return FanFloat.fromStr(self, true); }
  745. public static Double toFloat(String self, boolean checked) { return FanFloat.fromStr(self, checked); }
  746. public static BigDecimal toDecimal(String self) { return FanDecimal.fromStr(self, true); }
  747. public static BigDecimal toDecimal(String self, boolean checked) { return FanDecimal.fromStr(self, checked); }
  748. public static Uri toUri(String self) { return Uri.fromStr(self); }
  749. public static Regex toRegex(String self) { return Regex.fromStr(self); }
  750. public static String toCode(String self) { return toCode(self, FanInt.pos['"'], false); }
  751. public static String toCode(String self, Long quote) { return toCode(self, quote, false); }
  752. public static String toCode(String self, Long quote, boolean escapeUnicode)
  753. {
  754. StringBuilder s = new StringBuilder(self.length()+10);
  755. // opening quote
  756. boolean escu = escapeUnicode;
  757. int q = 0;
  758. if (quote != null)
  759. {
  760. q = quote.intValue();
  761. s.append((char)q);
  762. }
  763. // NOTE: these escape sequences are duplicated in ObjEncoder
  764. int len = self.length();
  765. for (int i=0; i<len; ++i)
  766. {
  767. int c = self.charAt(i);
  768. switch (c)
  769. {
  770. case '\n': s.append('\\').append('n'); break;
  771. case '\r': s.append('\\').append('r'); break;
  772. case '\f': s.append('\\').append('f'); break;
  773. case '\t': s.append('\\').append('t'); break;
  774. case '\\': s.append('\\').append('\\'); break;
  775. case '"': if (q == '"') s.append('\\').append('"'); else s.append((char)c); break;
  776. case '`': if (q == '`') s.append('\\').append('`'); else s.append((char)c); break;
  777. case '\'': if (q == '\'') s.append('\\').append('\''); else s.append((char)c); break;
  778. case '$': s.append('\\').append('$'); break;
  779. default:
  780. if (c < ' ' || (escu && c > 127))
  781. {
  782. s.append('\\').append('u')
  783. .append((char)hex((c>>12)&0xf))
  784. .append((char)hex((c>>8)&0xf))
  785. .append((char)hex((c>>4)&0xf))
  786. .append((char)hex(c&0xf));
  787. }
  788. else
  789. {
  790. s.append((char)c);
  791. }
  792. }
  793. }
  794. // closing quote
  795. if (q != 0) s.append((char)q);
  796. return s.toString();
  797. }
  798. private static int hex(int nib) { return "0123456789abcdef".charAt(nib); }
  799. public static String toXml(String self)
  800. {
  801. StringBuilder s = null;
  802. int len = self.length();
  803. for (int i=0; i<len; ++i)
  804. {
  805. int c = self.charAt(i);
  806. if (c > '>')
  807. {
  808. if (s != null) s.append((char)c);
  809. }
  810. else
  811. {
  812. String esc = xmlEsc[c];
  813. if (esc != null && (c != '>' || i==0 || self.charAt(i-1) == ']'))
  814. {
  815. if (s == null)
  816. {
  817. s = new StringBuilder(len+12);
  818. s.append(self, 0, i);
  819. }
  820. s.append(esc);
  821. }
  822. else if (s != null)
  823. {
  824. s.append((char)c);
  825. }
  826. }
  827. }
  828. if (s == null) return self;
  829. return s.toString();
  830. }
  831. private static String[] xmlEsc = new String['>'+1];
  832. static
  833. {
  834. xmlEsc['&'] = "&amp;";
  835. xmlEsc['<'] = "&lt;";
  836. xmlEsc['>'] = "&gt;";
  837. xmlEsc['\''] = "&#39;";
  838. xmlEsc['"'] = "&quot;";
  839. }
  840. public static InStream in(String self)
  841. {
  842. return new StrInStream(self);
  843. }
  844. public static Buf toBuf(String self) { return toBuf(self, Charset.utf8); }
  845. public static Buf toBuf(String self, Charset charset)
  846. {
  847. MemBuf buf = new MemBuf(self.length()*2);
  848. buf.charset(charset);
  849. buf.print(self);
  850. return buf.flip();
  851. }
  852. //////////////////////////////////////////////////////////////////////////
  853. // Fields
  854. //////////////////////////////////////////////////////////////////////////
  855. static final String[] ascii = new String[128];
  856. static
  857. {
  858. for (int i=0; i<ascii.length; ++i)
  859. ascii[i] = String.valueOf((char)i).intern();
  860. }
  861. public static final String defVal = "";
  862. }