protected void scanString() {
		np = bp;
		boolean hasSpecial = false;

		for (;;) {
			if (bp >= buflen) {
				lexError(pos, "unclosed.str.lit");
				return;
			}

			ch = buf[++bp];

			if (ch == '\'') {
				scanChar();
				if (ch != '\'') {
					token = LITERAL_CHARS;
					break;
				} else {
					System.arraycopy(buf, np + 1, sbuf, 0, sp);
					hasSpecial = true;
					putChar('\'');
					continue;
				}
			} 

			if (!hasSpecial) {
				sp++;
				continue;
			}

			if (sp == sbuf.length) {
				putChar(ch);
			} else {
				sbuf[sp++] = ch;
			}
		}

		if (!hasSpecial) {
			stringVal = new String(buf, np + 1, sp);
		} else {
			stringVal = new String(sbuf, 0, sp);
		}
	}