blob: 45ba9b4e6212db41e0e8e03c260cabb86b322c00 [file] [log] [blame] [raw]
/*******************************************************************************
* Copyright (c) 2010 Luaj.org. All rights reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
******************************************************************************/
package org.luaj.vm3.ast;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import org.luaj.vm3.LuaString;
public class Str {
private Str() {}
public static LuaString quoteString(String image) {
String s = image.substring(1, image.length() - 1);
byte[] bytes = unquote(s);
return LuaString.valueOf(bytes);
}
public static LuaString charString(String image) {
String s = image.substring(1, image.length() - 1);
byte[] bytes = unquote(s);
return LuaString.valueOf(bytes);
}
public static LuaString longString(String image) {
int i = image.indexOf('[', image.indexOf('[') + 1) + 1;
String s = image.substring(i, image.length() - i);
byte[] b = iso88591bytes(s);
return LuaString.valueOf(b);
}
public static byte[] iso88591bytes(String s) {
try {
return s.getBytes("ISO8859-1");
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException("ISO8859-1 not supported");
}
}
public static byte[] unquote(String s) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
char[] c = s.toCharArray();
int n = c.length;
for (int i = 0; i < n; i++) {
if (c[i] == '\\' && i < n) {
switch (c[++i]) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
int d = (int) (c[i++] - '0');
for (int j = 0; i < n && j < 2 && c[i] >= '0' && c[i] <= '9'; i++, j++)
d = d * 10 + (int) (c[i] - '0');
baos.write((byte) d);
--i;
continue;
case 'a':
baos.write((byte) 7);
continue;
case 'b':
baos.write((byte) '\b');
continue;
case 'f':
baos.write((byte) '\f');
continue;
case 'n':
baos.write((byte) '\n');
continue;
case 'r':
baos.write((byte) '\r');
continue;
case 't':
baos.write((byte) '\t');
continue;
case 'v':
baos.write((byte) 11);
continue;
case '"':
baos.write((byte) '"');
continue;
case '\'':
baos.write((byte) '\'');
continue;
case '\\':
baos.write((byte) '\\');
continue;
default:
baos.write((byte) c[i]);
break;
}
} else {
baos.write((byte) c[i]);
}
}
return baos.toByteArray();
}
}