// literalescaping.js
// for escaping/unescaping java literal strings
// by Gordon Mohr 
// (c) 2005

var regex_is_control_char = /[\000-\010\013\014\016-\037\177]/;
var regex_is_octal_digit = /[0-7]/;

function javaLiteralEscape(raw) {
  var escaped = "";
  for(i = 0; i<raw.length; i++) {
    c = raw.charAt(i);
    switch (c) {
      case '\b':
        escaped += "\\b";
        break;
      case '\t':
        escaped += "\\t";
        break;
      case '\n':
        escaped += "\\n";
        break;
      case '\f':
        escaped += "\\f";
        break;
      case '\r':
        escaped += "\\r";
        break;
      case '\"':
        escaped += "\\\"";
        break;
      case '\'':
        escaped += "\\'";
        break;
      case '\\':
        escaped += "\\\\";
        break;
      default:
        if(regex_is_control_char.test(c)) {

            var unicode_int = raw.charCodeAt(i);
            alert(c+":"+unicode_int);
            var unicode;
            if(unicode_int <= 255) {
                // octal
              unicode = unicode_int.toString(8);
            } else {
              // hexadecimal
              unicode = unicode_int.toString(16);
              while(unicode.length<4) {
                  unicode = "0" + unicode;
              }
            }
          escaped += "\\"+unicode;
        } else {
          escaped += c;
        }
    } // end switch
  } // end for
  return escaped;
}

function javaLiteralUnescape(escaped) {
  raw = "";
  for(i = 0; i<escaped.length; i++) {
    c = escaped.charAt(i);
    if (c!='\\') {
      raw += c; 
    } else {
      i++;
      if(i>=escaped.length) {
        // trailing '/'
        raw += c;
        continue;
      }
      c = escaped.charAt(i);
      switch (c) {
        case 'b':
          raw += '\b';
          break;
        case 't':
          raw += '\t';
          break;
        case 'n':
          raw += '\n';
          break;
        case 'f':
          raw += '\f';
          break;
        case 'r':
          raw += '\r';
          break;
        case '"':
          raw += '\"';
          break;
        case '\'':
          raw += '\'';
          break;
        case '\\':
          raw += '\\';
          break;
        case 'u':
          // unicode hex escape
          var unicode = 
              String.fromCharCode(
                  parseInt(escaped.substring(i+1,i+5),16));
          raw += unicode;
          i = i + 4;
          // TODO: catch errors
          break;
        default:
            if(regex_is_octal_digit.test(c)) {
              // octal escape
              var octal = parseInt(escaped.substring(i+1,i+4),8);
              if(octal<=255) {
                raw += String.fromCharCode(octal);
                i += octal.toString(8).length;
              } else {
                // err
                raw += '\\';
                raw += c;
              }
            }
            break;
      }
    }
  }
  return raw;
}