// Copyright 2016 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.

#include "tools/gn/visual_studio_utils.h"

#include <vector>

#include "base/md5.h"
#include "base/strings/string_split.h"
#include "base/strings/string_util.h"

CompilerOptions::CompilerOptions() = default;

CompilerOptions::~CompilerOptions() = default;

LinkerOptions::LinkerOptions() = default;

LinkerOptions::~LinkerOptions() = default;

std::string MakeGuid(const std::string& entry_path, const std::string& seed) {
  std::string str = base::ToUpperASCII(base::MD5String(seed + entry_path));
  return '{' + str.substr(0, 8) + '-' + str.substr(8, 4) + '-' +
         str.substr(12, 4) + '-' + str.substr(16, 4) + '-' +
         str.substr(20, 12) + '}';
}

#define SetOption(condition, member, value) \
  if (condition) {                          \
    options->member = value;                \
    return;                                 \
  }

#define AppendOption(condition, member, value, separator) \
  if (condition) {                                        \
    options->member += value + separator;                 \
    return;                                               \
  }

void ParseCompilerOption(const std::string& cflag, CompilerOptions* options) {
  if (cflag.size() > 2 && cflag[0] == '/') {
    switch (cflag[1]) {
      case 'F':
        AppendOption(cflag.size() > 3 && cflag[2] == 'I', forced_include_files,
                     cflag.substr(3), ';')
        break;

      case 'G':
        if (cflag[2] == 'S') {
          SetOption(cflag.size() == 3, buffer_security_check, "true")
          SetOption(cflag.size() == 4 && cflag[3] == '-',
                    buffer_security_check, "false")
        }
        break;

      case 'M':
        switch (cflag[2]) {
          case 'D':
            SetOption(cflag.size() == 3, runtime_library, "MultiThreadedDLL")
            SetOption(cflag.size() == 4 && cflag[3] == 'd', runtime_library,
                      "MultiThreadedDebugDLL")
            break;

          case 'T':
            SetOption(cflag.size() == 3, runtime_library, "MultiThreaded")
            SetOption(cflag.size() == 4 && cflag[3] == 'd', runtime_library,
                      "MultiThreadedDebug")
            break;
        }
        break;

      case 'O':
        switch (cflag[2]) {
          case '1':
            SetOption(cflag.size() == 3, optimization, "MinSpace")
            break;

          case '2':
            SetOption(cflag.size() == 3, optimization, "MaxSpeed")
            break;

          case 'd':
            SetOption(cflag.size() == 3, optimization, "Disabled")
            break;

          case 'x':
            SetOption(cflag.size() == 3, optimization, "Full")
              break;
        }
        break;

      case 'T':
        // Skip flags that cause treating all source files as C and C++ files.
        if (cflag.size() == 3 && (cflag[2] == 'C' || cflag[2] == 'P'))
          return;
        break;

      case 'W':
        switch (cflag[2]) {
          case '0':
          case '1':
          case '2':
          case '3':
          case '4':
            SetOption(cflag.size() == 3, warning_level,
                      std::string("Level") + cflag[2])
            break;

          case 'X':
            SetOption(cflag.size() == 3, treat_warning_as_error, "true")
            break;
        }
        break;

      case 'w':
        AppendOption(cflag.size() > 3 && cflag[2] == 'd',
                     disable_specific_warnings, cflag.substr(3), ';')
        break;
    }
  }

  // Put everything else into additional_options.
  options->additional_options += cflag + ' ';
}

// Parses |ldflags| value and stores it in |options|.
void ParseLinkerOption(const std::string& ldflag, LinkerOptions* options) {
  const char kSubsytemPrefix[] ="/SUBSYSTEM:";
  if (base::StartsWith(ldflag, kSubsytemPrefix,
                       base::CompareCase::SENSITIVE)) {
    const std::string subsystem(
        ldflag.begin() + std::string(kSubsytemPrefix).length(),
        ldflag.end());
    const std::vector<std::string> tokens = base::SplitString(
        subsystem, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
    if (!tokens.empty())
      options->subsystem = tokens[0];
  }
}
