// RUN: %libomp-compile-and-run
#include <string.h>
#include <stdlib.h>

enum kmp_target_offload_kind {
  tgt_disabled = 0,
  tgt_default = 1,
  tgt_mandatory = 2
};

extern int __kmpc_get_target_offload();

const char *disabled_examples[] = {
    // Allowed inputs
    "disabled", "DISABLED", "Disabled", "dIsAbLeD", "DiSaBlEd"};

const char *default_examples[] = {
    // Allowed inputs
    "default", "DEFAULT", "Default", "deFAulT", "DEfaULt",
    // These should be changed to default (failed match)
    "mandatry", "defaults", "disable", "enabled", "mandatorynot"};

const char *mandatory_examples[] = {
    // Allowed inputs
    "mandatory", "MANDATORY", "Mandatory", "manDatoRy", "MANdATOry"};

// Return target-offload-var ICV
int get_target_offload_icv() {
#pragma omp parallel
  {}
  return __kmpc_get_target_offload();
}

int main() {
  int i;
  const char *omp_target_offload = "OMP_TARGET_OFFLOAD=";
  char buf[80];

  for (i = 0; i < sizeof(disabled_examples) / sizeof(char *); ++i) {
    strcpy(buf, omp_target_offload);
    strcat(buf, disabled_examples[i]);
    kmp_set_defaults(buf);
    if (tgt_disabled != get_target_offload_icv())
      return EXIT_FAILURE;
  }
  for (i = 0; i < sizeof(default_examples) / sizeof(char *); ++i) {
    strcpy(buf, omp_target_offload);
    strcat(buf, default_examples[i]);
    kmp_set_defaults(buf);
    if (tgt_default != get_target_offload_icv())
      return EXIT_FAILURE;
  }
  for (i = 0; i < sizeof(mandatory_examples) / sizeof(char *); ++i) {
    strcpy(buf, omp_target_offload);
    strcat(buf, mandatory_examples[i]);
    kmp_set_defaults(buf);
    if (tgt_mandatory != get_target_offload_icv())
      return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}
