newchararrayreader.scala
来自「JAVA 语言的函数式编程扩展」· SCALA 代码 · 共 75 行
SCALA
75 行
/* NSC -- new Scala compiler * Copyright 2005-2006 LAMP/EPFL * @author Martin Odersky */// $Id: NewCharArrayReader.scala 14416 2008-03-19 01:17:25Z mihaylov $package scala.tools.nsc.utilimport scala.tools.nsc.util.SourceFile.{LF, FF, CR, SU}class NewCharArrayReader(val buf: RandomAccessSeq[Char], // should not change decodeUni: Boolean, error: (Int,String) => Unit) extends Iterator[Char] { private var idx : Int = 0 private var isUnicode0 = false def isUnicode = isUnicode0 private val bufLength = buf.length def seek(offset : Int) = { assert(offset <= bufLength) idx = offset } def offset = idx def withOffset = new Iterator[(Int,Char)] { def hasNext = NewCharArrayReader.this.hasNext def next = (offset, NewCharArrayReader.this.next) } override def hasNext = { // could be padded if (idx == bufLength - 1) buf(idx) != SU else idx < bufLength } override def next : Char = { isUnicode0 = false if (!hasNext) return SU var ch = buf(idx) idx = idx + 1 ch match { case CR if buf.safeIs(idx + 1, LF) => idx += 1; ch = LF case LF | FF => case '\\' => def evenSlashPrefix: Boolean = { var p = idx - 2 while (p >= 0 && buf(p) == '\\') p = p - 1; (idx - p) % 2 == 0 } def udigit: Int = { val d = digit2int(buf(idx), 16) if (d >= 0) { idx = idx + 1 } else if (error != null) error(idx, "error in unicode escape"); d } if (idx < bufLength && buf(idx) == 'u' && decodeUni && evenSlashPrefix) { do { idx = idx + 1; // nextcol = nextcol + 1; } while (idx < bufLength && buf(idx) == 'u'); val code = udigit << 12 | udigit << 8 | udigit << 4 | udigit isUnicode0 = true ch = code.asInstanceOf[Char] } case _ => } ch } def digit2int(ch: Char, base: Int): Int = { if ('0' <= ch && ch <= '9' && ch < '0' + base) ch - '0' else if ('A' <= ch && ch < 'A' + base - 10) ch - 'A' + 10 else if ('a' <= ch && ch < 'a' + base - 10) ch - 'a' + 10 else -1 }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?