/*
 * Copyright 2018 WebAssembly Community Group participants
 *
 * 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.
 */

#include "asmjs/asmangle.h"
#include <assert.h>


namespace wasm {

std::string asmangle(std::string name) {
  bool mightBeKeyword = true;
  size_t i = 1;

  assert(!name.empty());

  // Names must start with a character, $ or _
  switch (auto ch = name[0]) {
    case '0':
    case '1':
    case '2':
    case '3':
    case '4':
    case '5':
    case '6':
    case '7':
    case '8':
    case '9': {
      name = "$" + name;
      i = 2;
      goto notKeyword;
    }
    notKeyword:
    case '$':
    case '_': {
      mightBeKeyword = false;
      break;
    }
    default: {
      if (
        !(ch >= 'a' && ch <= 'z') &&
        !(ch >= 'A' && ch <= 'Z')
      ) {
        name = "$" + name.substr(1);
        mightBeKeyword = false;
      }
    }
  }

  // Names must contain only characters, digits, $ or _
  size_t len = name.length();
  for (; i < len; ++i) {
    switch (char ch = name[i]) {
      case '0':
      case '1':
      case '2':
      case '3':
      case '4':
      case '5':
      case '6':
      case '7':
      case '8':
      case '9':
      case '$':
      case '_': {
        mightBeKeyword = false;
        break;
      }
      default: {
        if (
          !(ch >= 'a' && ch <= 'z') &&
          !(ch >= 'A' && ch <= 'Z')
        ) {
          name = name.substr(0, i) + "_" + name.substr(i + 1);
          mightBeKeyword = false;
        }
      }
    }
  }

  // Names must not collide with keywords
  if (mightBeKeyword && len >= 2 && len <= 10) {
    switch (name[0]) {
      case 'a': {
        if (name == "arguments") {
          goto mangleKeyword;
        }
        break;
      }
      case 'b': {
        if (name == "break") {
          goto mangleKeyword;
        }
        break;
      }
      case 'c': {
        if (
          name == "case" ||
          name == "continue" ||
          name == "catch" ||
          name == "const" ||
          name == "class"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 'd': {
        if (
          name == "do" ||
          name == "default" ||
          name == "debugger"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 'e': {
        if (
          name == "else" ||
          name == "enum" ||
          name == "eval" || // to be sure
          name == "export" ||
          name == "extends"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 'f': {
        if (
          name == "for" ||
          name == "false" ||
          name == "finally" ||
          name == "function"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 'i': {
        if (
          name == "if" ||
          name == "in" ||
          name == "import" ||
          name == "interface" ||
          name == "implements" ||
          name == "instanceof"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 'l': {
        if (name == "let") {
          goto mangleKeyword;
        }
        break;
      }
      case 'n': {
        if (
          name == "new" ||
          name == "null"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 'p': {
        if (
          name == "public" ||
          name == "package" ||
          name == "private" ||
          name == "protected"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 'r': {
        if (name == "return") {
          goto mangleKeyword;
        }
        break;
      }
      case 's': {
        if (
          name == "super" ||
          name == "static" ||
          name == "switch"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 't': {
        if (
          name == "try" ||
          name == "this" ||
          name == "true" ||
          name == "throw" ||
          name == "typeof"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 'v': {
        if (
          name == "var" ||
          name == "void"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 'w': {
        if (
          name == "with" ||
          name == "while"
        ) {
          goto mangleKeyword;
        }
        break;
      }
      case 'y': {
        if (name == "yield") {
          goto mangleKeyword;
        }
        break;
      }
      mangleKeyword: {
        name = name + "_";
      }
    }
  }
  return name;
}

} // namespace wasm
