// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

#include "vm/globals.h"
#if defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)

#include "vm/proccpuinfo.h"

#include <ctype.h>  // NOLINT
#include <string.h>  // NOLINT

#include "platform/assert.h"

namespace dart {


char* ProcCpuInfo::data_ = NULL;
intptr_t ProcCpuInfo::datalen_ = 0;


void ProcCpuInfo::InitOnce() {
  // Get the size of the cpuinfo file by reading it until the end. This is
  // required because files under /proc do not always return a valid size
  // when using fseek(0, SEEK_END) + ftell(). Nor can they be mmap()-ed.
  static const char PATHNAME[] = "/proc/cpuinfo";
  FILE* fp = fopen(PATHNAME, "r");
  if (fp != NULL) {
    for (;;) {
      char buffer[256];
      size_t n = fread(buffer, 1, sizeof(buffer), fp);
      if (n == 0) {
        break;
      }
      datalen_ += n;
    }
    fclose(fp);
  }

  // Read the contents of the cpuinfo file.
  data_ = reinterpret_cast<char*>(malloc(datalen_ + 1));
  fp = fopen(PATHNAME, "r");
  if (fp != NULL) {
    for (intptr_t offset = 0; offset < datalen_; ) {
      size_t n = fread(data_ + offset, 1, datalen_ - offset, fp);
      if (n == 0) {
        break;
      }
      offset += n;
    }
    fclose(fp);
  }

  // Zero-terminate the data.
  data_[datalen_] = '\0';
}


void ProcCpuInfo::Cleanup() {
  ASSERT(data_);
  free(data_);
  data_ = NULL;
}


char* ProcCpuInfo::FieldStart(const char* field) {
  // Look for first field occurrence, and ensure it starts the line.
  size_t fieldlen = strlen(field);
  char* p = data_;
  for (;;) {
    p = strstr(p, field);
    if (p == NULL) {
      return NULL;
    }
    if (p == data_ || p[-1] == '\n') {
      break;
    }
    p += fieldlen;
  }

  // Skip to the first colon followed by a space.
  p = strchr(p + fieldlen, ':');
  if (p == NULL || !isspace(p[1])) {
    return NULL;
  }
  p += 2;

  return p;
}


bool ProcCpuInfo::FieldContains(const char* field, const char* search_string) {
  ASSERT(data_ != NULL);
  ASSERT(search_string != NULL);

  char* p = FieldStart(field);
  if (p == NULL) {
    return false;
  }

  // Find the end of the line.
  char* q = strchr(p, '\n');
  if (q == NULL) {
    q = data_ + datalen_;
  }

  char saved_end = *q;
  *q = '\0';
  bool ret = (strcasestr(p, search_string) != NULL);
  *q = saved_end;

  return ret;
}


// Extract the content of a the first occurrence of a given field in
// the content of the cpuinfo file and return it as a heap-allocated
// string that must be freed by the caller using free.
// Return NULL if not found.
const char* ProcCpuInfo::ExtractField(const char* field) {
  ASSERT(field != NULL);
  ASSERT(data_ != NULL);

  char* p = FieldStart(field);
  if (p == NULL) {
    return NULL;
  }

  // Find the end of the line.
  char* q = strchr(p, '\n');
  if (q == NULL) {
    q = data_ + datalen_;
  }

  intptr_t len = q - p;
  char* result = reinterpret_cast<char*>(malloc(len + 1));
  // Copy the line into result, leaving enough room for a null-terminator.
  char saved_end = *q;
  *q = '\0';
  strncpy(result, p, len);
  result[len] = '\0';
  *q = saved_end;

  return result;
}


bool ProcCpuInfo::HasField(const char* field) {
  ASSERT(field != NULL);
  ASSERT(data_ != NULL);
  return (FieldStart(field) != NULL);
}

}  // namespace dart

#endif  // defined(TARGET_OS_LINUX) || defined(TARGET_OS_ANDROID)
