import java.util.StringTokenizer;
/* Copyright (c) 2008 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
//package com.google.gdata.util.common.base;
/**
* Some common string manipulation utilities.
*/
public class Util{
/**
* Unescape any C escape sequences (\n, \r, \\, \ooo, etc) and return the
* resulting string.
*/
public static String unescapeCString(String s) {
if (s.indexOf('\\') < 0) {
// Fast path: nothing to unescape
return s;
}
StringBuilder sb = new StringBuilder();
int len = s.length();
for (int i = 0; i < len;) {
char c = s.charAt(i++);
if (c == '\\' && (i < len)) {
c = s.charAt(i++);
switch (c) {
case 'a': c = '\007'; break;
case 'b': c = '\b'; break;
case 'f': c = '\f'; break;
case 'n': c = '\n'; break;
case 'r': c = '\r'; break;
case 't': c = '\t'; break;
case 'v': c = '\013'; break;
case '\\': c = '\\'; break;
case '?': c = '?'; break;
case '\'': c = '\''; break;
case '"': c = '\"'; break;
default: {
if ((c == 'x') && (i < len) && isHex(s.charAt(i))) {
// "\xXX"
int v = hexValue(s.charAt(i++));
if ((i < len) && isHex(s.charAt(i))) {
v = v*16 + hexValue(s.charAt(i++));
}
c = (char)v;
} else if (isOctal(c)) {
// "\OOO"
int v = (c - '0');
if ((i < len) && isOctal(s.charAt(i))) {
v = v*8 + (s.charAt(i++) - '0');
}
if ((i < len) && isOctal(s.charAt(i))) {
v = v*8 + (s.charAt(i++) - '0');
}
c = (char)v;
} else {
// Propagate unknown escape sequences.
sb.append('\\');
}
break;
}
}
}
sb.append(c);
}
return sb.toString();
}
private static boolean isOctal(char c) {
return (c >= '0') && (c <= '7');
}
private static boolean isHex(char c) {
return ((c >= '0') && (c <= '9')) ||
((c >= 'a') && (c <= 'f')) ||
((c >= 'A') && (c <= 'F'));
}
private static int hexValue(char c) {
if ((c >= '0') && (c <= '9')) {
return (c - '0');
} else if ((c >= 'a') && (c <= 'f')) {
return (c - 'a') + 10;
} else {
return (c - 'A') + 10;
}
}
}