# Copyright 2014 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import("//testing/libfuzzer/fuzzer_test.gni")

config("hunspell_config") {
  defines = [
    "HUNSPELL_STATIC",
    "HUNSPELL_CHROME_CLIENT",
    "USE_HUNSPELL",
  ]
}

config("hunspell_warnings") {
  if (is_clang) {
    cflags = [ "-Wno-unused-private-field" ]
  }
}

static_library("hunspell") {
  sources = [
    "google/bdict.cc",
    "google/bdict.h",
    "google/bdict_reader.cc",
    "google/bdict_reader.h",
    "google/bdict_writer.cc",
    "google/bdict_writer.h",
    "src/hunspell/affentry.cxx",
    "src/hunspell/affentry.hxx",
    "src/hunspell/affixmgr.cxx",
    "src/hunspell/affixmgr.hxx",
    "src/hunspell/atypes.hxx",
    "src/hunspell/baseaffix.hxx",
    "src/hunspell/csutil.cxx",
    "src/hunspell/csutil.hxx",
    "src/hunspell/filemgr.cxx",
    "src/hunspell/filemgr.hxx",
    "src/hunspell/hashmgr.cxx",
    "src/hunspell/hashmgr.hxx",
    "src/hunspell/htypes.hxx",
    "src/hunspell/hunspell.cxx",
    "src/hunspell/hunspell.h",
    "src/hunspell/hunspell.hxx",
    "src/hunspell/hunzip.cxx",
    "src/hunspell/hunzip.hxx",
    "src/hunspell/langnum.hxx",
    "src/hunspell/phonet.cxx",
    "src/hunspell/phonet.hxx",
    "src/hunspell/replist.cxx",
    "src/hunspell/replist.hxx",
    "src/hunspell/suggestmgr.cxx",
    "src/hunspell/suggestmgr.hxx",
    "src/hunspell/w_char.hxx",
    "src/parsers/textparser.cxx",
    "src/parsers/textparser.hxx",
  ]

  configs -= [ "//build/config/compiler:chromium_code" ]
  configs += [
    "//build/config/compiler:no_chromium_code",

    # Must be after no_chromium_code for warning flags to be ordered correctly.
    ":hunspell_warnings",
  ]
  public_configs = [ ":hunspell_config" ]

  defines = [ "OPENOFFICEORG" ]

  deps = [
    "//base",
    "//third_party/icu",
  ]

  cflags = []

  if (is_win) {
    cflags += [
      # TODO(jschuh): http://crbug.com/167187 size_t -> int
      "/wd4267",
    ]
  }

  if (is_posix && !is_mac && !is_clang) {
    cflags += [
      "-Wno-unused-value",
      "-Wno-unused-variable",
      "-Wno-write-strings",
    ]
  }

  if (is_posix && !is_mac && !is_ios && !is_clang) {
    cflags += [
      # affentry.hxx has NULL as default parameter for a FLAG in two
      # places.
      "-Wno-conversion-null",
    ]
  }

  if (is_clang) {
    cflags += [
      # affentry.cxx has one `while ((p = nextchar(p)));` parsing loop.
      "-Wno-empty-body",

      # affentry.hxx has NULL as default parameter for a FLAG in two
      # places.
      "-Wno-null-conversion",
    ]
  }
}

fuzzer_test("hunspell_fuzzer") {
  sources = [
    "fuzz/hunspell_fuzzer.cc",
    "fuzz/hunspell_fuzzer_hunspell_dictionary.h",
  ]
  deps = [
    ":hunspell",
    "//base:base",
  ]

  # This is a dictionary for the fuzzer, not a spellcheck dictionary.
  dict = "fuzz/hunspell.dict"
}

fuzzer_test("bdict_fuzzer") {
  sources = [
    "fuzz/bdict_fuzzer.cc",
  ]
  deps = [
    ":hunspell",
    "//base:base",
  ]
  seed_corpus = "fuzz/bdict_corpus"
}
