%{
// js_keywords.cc is automatically generated from js_keywords.gperf.
// Author: jmarantz@google.com

#include "base/logging.h"
#include "pagespeed/kernel/js/js_keywords.h"
#include "pagespeed/kernel/base/string_util.h"

namespace pagespeed {
%}
%compare-strncmp
%define class-name JsKeywordMapper
%define lookup-function-name Lookup
%define word-array-name kJsKeywordsTable
%global-table
%includes
%language=C++
%readonly-tables
%struct-type

struct JsKeywordMap {
  const char* name;
  pagespeed::JsKeywords::Type keyword;
  pagespeed::JsKeywords::Flag flag;
};
%%
### literals
"false",        JsKeywords::kFalse,           JsKeywords::kIsValue
"null",         JsKeywords::kNull,            JsKeywords::kIsValue
"true",         JsKeywords::kTrue,            JsKeywords::kIsValue
### keywords that can precede regular expressions
"case",         JsKeywords::kCase,            JsKeywords::kCanPrecedeRegEx
"delete",       JsKeywords::kDelete,          JsKeywords::kCanPrecedeRegEx
"do",           JsKeywords::kDo,              JsKeywords::kCanPrecedeRegEx
"in",           JsKeywords::kIn,              JsKeywords::kCanPrecedeRegEx
"instanceof",   JsKeywords::kInstanceof,      JsKeywords::kCanPrecedeRegEx
"new",          JsKeywords::kNew,             JsKeywords::kCanPrecedeRegEx
"return",       JsKeywords::kReturn,          JsKeywords::kCanPrecedeRegEx
"throw",        JsKeywords::kThrow,           JsKeywords::kCanPrecedeRegEx
"typeof",       JsKeywords::kTypeof,          JsKeywords::kCanPrecedeRegEx
"void",         JsKeywords::kVoid,            JsKeywords::kCanPrecedeRegEx
### keywords that can't precede regular expressions
"break",        JsKeywords::kBreak,           JsKeywords::kNone
"catch",        JsKeywords::kCatch,           JsKeywords::kNone
"const",        JsKeywords::kConst,           JsKeywords::kNone
"continue",     JsKeywords::kContinue,        JsKeywords::kNone
"debugger",     JsKeywords::kDebugger,        JsKeywords::kNone
"default",      JsKeywords::kDefault,         JsKeywords::kNone
"else",         JsKeywords::kElse,            JsKeywords::kNone
"finally",      JsKeywords::kFinally,         JsKeywords::kNone
"for",          JsKeywords::kFor,             JsKeywords::kNone
"function",     JsKeywords::kFunction,        JsKeywords::kNone
"if",           JsKeywords::kIf,              JsKeywords::kNone
"switch",       JsKeywords::kSwitch,          JsKeywords::kNone
"this",         JsKeywords::kThis,            JsKeywords::kNone
"try",          JsKeywords::kTry,             JsKeywords::kNone
"while",        JsKeywords::kWhile,           JsKeywords::kNone
"with",         JsKeywords::kWith,            JsKeywords::kNone
"var",          JsKeywords::kVar,             JsKeywords::kNone
### reserved for future use
"class",        JsKeywords::kClass,           JsKeywords::kIsReservedNonStrict
"enum",         JsKeywords::kEnum,            JsKeywords::kIsReservedNonStrict
"export",       JsKeywords::kExport,          JsKeywords::kIsReservedNonStrict
"extends",      JsKeywords::kExtends,         JsKeywords::kIsReservedNonStrict
"import",       JsKeywords::kImport,          JsKeywords::kIsReservedNonStrict
"super",        JsKeywords::kSuper,           JsKeywords::kIsReservedNonStrict
### reserved for future use in strict code
"implements",   JsKeywords::kImplements,      JsKeywords::kIsReservedStrict
"interface",    JsKeywords::kInterface,       JsKeywords::kIsReservedStrict
"let",          JsKeywords::kLet,             JsKeywords::kIsReservedStrict
"package",      JsKeywords::kPackage,         JsKeywords::kIsReservedStrict
"private",      JsKeywords::kPrivate,         JsKeywords::kIsReservedStrict
"protected",    JsKeywords::kProtected,       JsKeywords::kIsReservedStrict
"public",       JsKeywords::kPublic,          JsKeywords::kIsReservedStrict
"static",       JsKeywords::kStatic,          JsKeywords::kIsReservedStrict
"yield",        JsKeywords::kYield,           JsKeywords::kIsReservedStrict
%%

JsKeywords::Type JsKeywords::Lookup(const StringPiece& keyword,
                                       JsKeywords::Flag* flag) {
  const JsKeywordMap* keyword_map =
      JsKeywordMapper::Lookup(keyword.data(), keyword.size());
  if (keyword_map != NULL) {
    *flag = keyword_map->flag;
    return keyword_map->keyword;
  }
  return JsKeywords::kNotAKeyword;
}

bool JsKeywords::Iterator::AtEnd() const {
  return index_ > MAX_HASH_VALUE;
}

void JsKeywords::Iterator::Next() {
  DCHECK(!AtEnd());
  ++index_;
  while (!AtEnd() && (*(kJsKeywordsTable[index_].name) == '\0')) {
    ++index_;
  }
}

const char* JsKeywords::Iterator::name() const {
  DCHECK(!AtEnd());
  return kJsKeywordsTable[index_].name;
}

JsKeywords::Type JsKeywords::Iterator::keyword() const {
  DCHECK(!AtEnd());
  return kJsKeywordsTable[index_].keyword;
}

int JsKeywords::num_keywords() {
  return TOTAL_KEYWORDS;
}

bool JsKeywords::CanKeywordPrecedeRegEx(const StringPiece& name) {
  Flag flag;
  Type type = Lookup(name, &flag);
  return (IsAKeyword(type) && flag == kCanPrecedeRegEx);
}

}  // namespace net_instaweb
