/* Copyright (C) 2021 Free Software Foundation, Inc.
   Contributed by Oracle.

   This file is part of GNU Binutils.

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation; either version 3, or (at your option)
   any later version.

   This program is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with this program; if not, write to the Free Software
   Foundation, 51 Franklin Street - Fifth Floor, Boston,
   MA 02110-1301, USA.  */

#include "config.h"
#include <assert.h>
#include <string.h>

#include "util.h"
#include "FileData.h"

void
FileData::init ()
{
  readTime = 0;
  writeTime = 0;
  otherTime = 0;
  errorTime = 0;
  readBytes = 0;
  writeBytes = 0;
  readCnt = 0;
  writeCnt = 0;
  otherCnt = 0;
  errorCnt = 0;
  wSlowestBytes = 0;
  wSmallestBytes = _10TB;
  wLargestBytes = 0;
  w0KB1KBCnt = 0;
  w1KB8KBCnt = 0;
  w8KB32KBCnt = 0;
  w32KB128KBCnt = 0;
  w128KB256KBCnt = 0;
  w256KB512KBCnt = 0;
  w512KB1000KBCnt = 0;
  w1000KB10MBCnt = 0;
  w10MB100MBCnt = 0;
  w100MB1GBCnt = 0;
  w1GB10GBCnt = 0;
  w10GB100GBCnt = 0;
  w100GB1TBCnt = 0;
  w1TB10TBCnt = 0;
  rSlowestBytes = 0;
  rSmallestBytes = _10TB;
  rLargestBytes = 0;
  r0KB1KBCnt = 0;
  r1KB8KBCnt = 0;
  r8KB32KBCnt = 0;
  r32KB128KBCnt = 0;
  r128KB256KBCnt = 0;
  r256KB512KBCnt = 0;
  r512KB1000KBCnt = 0;
  r1000KB10MBCnt = 0;
  r10MB100MBCnt = 0;
  r100MB1GBCnt = 0;
  r1GB10GBCnt = 0;
  r10GB100GBCnt = 0;
  r100GB1TBCnt = 0;
  r1TB10TBCnt = 0;
}

FileData::FileData (const char *fName)
{
  fileName = dbe_strdup (fName);
  fileDesList = new Vector<int>;
  virtualFds = new Vector<int64_t>;
  virtualFd = -1;
  fileDes = -1;
  fsType[0] = '\0';
  histType = Histable::IOACTVFD;
  init ();
}

FileData::FileData (FileData *fData)
{
  fileName = dbe_strdup (fData->fileName);
  fileDesList = new Vector<int>;
  Vector<int> *fdList = fData->fileDesList;
  int fd;
  if (fdList != NULL)
    for (int i = 0; i < fdList->size (); i++)
      if ((fd = fdList->fetch (i)) == -1)
	fileDesList->append (fd);

  virtualFds = new Vector<int64_t>;
  Vector<int64_t> *vfds = fData->virtualFds;
  int64_t vfd;
  if (vfds != NULL)
    for (int i = 0; i < vfds->size (); i++)
      if ((vfd = vfds->fetch (i)) == -1)
	virtualFds->append (vfd);
  virtualFd = fData->virtualFd;
  fileDes = fData->fileDes;
  histType = fData->histType;

  for (int i = 0; i < FSTYPESZ; i++)
    fsType[i] = fData->fsType[i];

  readTime = fData->readTime;
  writeTime = fData->writeTime;
  otherTime = fData->otherTime;
  errorTime = fData->errorTime;
  readBytes = fData->readBytes;
  writeBytes = fData->writeBytes;
  readCnt = fData->readCnt;
  writeCnt = fData->writeCnt;
  otherCnt = fData->otherCnt;
  errorCnt = fData->errorCnt;
  wSlowestBytes = fData->wSlowestBytes;
  wSmallestBytes = fData->wSmallestBytes;
  wLargestBytes = fData->wLargestBytes;
  w0KB1KBCnt = fData->w0KB1KBCnt;
  w1KB8KBCnt = fData->w1KB8KBCnt;
  w8KB32KBCnt = fData->w8KB32KBCnt;
  w32KB128KBCnt = fData->w32KB128KBCnt;
  w128KB256KBCnt = fData->w128KB256KBCnt;
  w256KB512KBCnt = fData->w256KB512KBCnt;
  w512KB1000KBCnt = fData->w512KB1000KBCnt;
  w1000KB10MBCnt = fData->w1000KB10MBCnt;
  w10MB100MBCnt = fData->w10MB100MBCnt;
  w100MB1GBCnt = fData->w100MB1GBCnt;
  w1GB10GBCnt = fData->w1GB10GBCnt;
  w10GB100GBCnt = fData->w10GB100GBCnt;
  w100GB1TBCnt = fData->w100GB1TBCnt;
  w1TB10TBCnt = fData->w1TB10TBCnt;
  rSlowestBytes = fData->rSlowestBytes;
  rSmallestBytes = fData->rSmallestBytes;
  rLargestBytes = fData->rLargestBytes;
  r0KB1KBCnt = fData->r0KB1KBCnt;
  r1KB8KBCnt = fData->r1KB8KBCnt;
  r8KB32KBCnt = fData->r8KB32KBCnt;
  r32KB128KBCnt = fData->r32KB128KBCnt;
  r128KB256KBCnt = fData->r128KB256KBCnt;
  r256KB512KBCnt = fData->r256KB512KBCnt;
  r512KB1000KBCnt = fData->r512KB1000KBCnt;
  r1000KB10MBCnt = fData->r1000KB10MBCnt;
  r10MB100MBCnt = fData->r10MB100MBCnt;
  r100MB1GBCnt = fData->r100MB1GBCnt;
  r1GB10GBCnt = fData->r1GB10GBCnt;
  r10GB100GBCnt = fData->r10GB100GBCnt;
  r100GB1TBCnt = fData->r100GB1TBCnt;
  r1TB10TBCnt = fData->r1TB10TBCnt;
}

FileData::~FileData ()
{
  free (fileName);
  delete fileDesList;
  delete virtualFds;
}

void
FileData::setVirtualFds (int64_t vfd)
{
  for (int i = 0; i < virtualFds->size (); i++)
    if (vfd == virtualFds->fetch (i))
      return;
  virtualFds->append (vfd);
}

void
FileData::setFileDesList (int fd)
{
  for (int i = 0; i < fileDesList->size (); i++)
    if (fd == fileDesList->fetch (i))
      return;
  fileDesList->append (fd);
}

void
FileData::setFsType (const char* fst)
{
  size_t len = strlen (fst);
  if (len > 0 && len < FSTYPESZ)
    snprintf (fsType, sizeof (fsType), NTXT ("%s"), fst);
  else
    snprintf (fsType, sizeof (fsType), GTXT ("error"));
}

Histable*
FileData::convertto (Histable_type type, Histable*)
{
  return (type == histType ? this : NULL);
}

char*
FileData::get_name (Histable::NameFormat /*_nfmt*/)
{
  if (histType == Histable::IOACTVFD)
    {
      if (!streq (fileName, NTXT ("<Total>")))
	{
	  if (fileDes >= 0)
	    return dbe_sprintf (GTXT ("%s (IOVFD=%lld, FD=%d)"), fileName,
				(long long) virtualFd, (int) fileDes);
	  return dbe_sprintf (GTXT ("%s (IOVFD=%lld)"), fileName,
			      (long long) virtualFd);
	}
      else
	return fileName;
    }
  else if (histType == Histable::IOACTFILE)
    {
      if (!streq (fileName, NTXT ("<Total>")))
	{
	  if (!streq (fsType, NTXT ("N/A")))
	    return dbe_sprintf (GTXT ("%s (FS=%s)"), fileName, fsType);
	  return fileName;
	}
      return fileName;
    }
  return fileName;
}

char*
FileData::get_raw_name (Histable::NameFormat /*_nfmt*/)
{
  return fileName;
}

void
FileData::setFsType (FileSystem_type fst)
{
  const char *fsName;
  switch (fst)
    {
    case ZFS_TYPE:
      fsName = "zfs";
      break;
    case NFS_TYPE:
      fsName = "nfs";
      break;
    case UFS_TYPE:
      fsName = "ufs";
      break;
    case UDFS_TYPE:
      fsName = "udfs";
      break;
    case LOFS_TYPE:
      fsName = "lofs";
      break;
    case VXFS_TYPE:
      fsName = "vxfs";
      break;
    case TMPFS_TYPE:
      fsName = "tmpfs";
      break;
    case PCFS_TYPE:
      fsName = "pcfs";
      break;
    case HSFS_TYPE:
      fsName = "hsfs";
      break;
    case PROCFS_TYPE:
      fsName = "procfs";
      break;
    case FIFOFS_TYPE:
      fsName = "fifofs";
      break;
    case SWAPFS_TYPE:
      fsName = "swapfs";
      break;
    case CACHEFS_TYPE:
      fsName = "cachefs";
      break;
    case AUTOFS_TYPE:
      fsName = "autofs";
      break;
    case SPECFS_TYPE:
      fsName = "specfs";
      break;
    case SOCKFS_TYPE:
      fsName = "sockfs";
      break;
    case FDFS_TYPE:
      fsName = "fdfs";
      break;
    case MNTFS_TYPE:
      fsName = "mntfs";
      break;
    case NAMEFS_TYPE:
      fsName = "namefs";
      break;
    case OBJFS_TYPE:
      fsName = "objfs";
      break;
    case SHAREFS_TYPE:
      fsName = "sharefs";
      break;
    case EXT2FS_TYPE:
      fsName = "ext2";
      break;
    case EXT3FS_TYPE:
      fsName = "ext3";
      break;
    case EXT4FS_TYPE:
      fsName = "ext4";
      break;
    case UNKNOWNFS_TYPE:
      fsName = "N/A";
      break;
    default:
      fsName = "N/A";
      break;
    }
  setFsType (fsName);
}

void
FileData::setWriteStat (hrtime_t wt, int64_t nb)
{
  if (wSlowestBytes < wt)
    wSlowestBytes = wt;
  if (nb != 0 && wSmallestBytes > nb)
    wSmallestBytes = nb;
  if (wLargestBytes < nb)
    wLargestBytes = nb;
  if (nb >= 0 && nb <= _1KB)
    w0KB1KBCnt++;
  else if (nb <= _8KB)
    w1KB8KBCnt++;
  else if (nb <= _32KB)
    w8KB32KBCnt++;
  else if (nb <= _128KB)
    w32KB128KBCnt++;
  else if (nb <= _256KB)
    w128KB256KBCnt++;
  else if (nb <= _512KB)
    w256KB512KBCnt++;
  else if (nb <= _1000KB)
    w512KB1000KBCnt++;
  else if (nb <= _10MB)
    w1000KB10MBCnt++;
  else if (nb <= _100MB)
    w10MB100MBCnt++;
  else if (nb <= _1GB)
    w100MB1GBCnt++;
  else if (nb <= _10GB)
    w1GB10GBCnt++;
  else if (nb <= _100GB)
    w10GB100GBCnt++;
  else if (nb <= _1TB)
    w100GB1TBCnt++;
  else if (nb <= _10TB)
    w1TB10TBCnt++;
}

void
FileData::setReadStat (hrtime_t rt, int64_t nb)
{
  if (rSlowestBytes < rt)
    rSlowestBytes = rt;
  if (nb != 0 && rSmallestBytes > nb)
    rSmallestBytes = nb;
  if (rLargestBytes < nb)
    rLargestBytes = nb;
  if (nb >= 0 && nb <= _1KB)
    r0KB1KBCnt++;
  else if (nb <= _8KB)
    r1KB8KBCnt++;
  else if (nb <= _32KB)
    r8KB32KBCnt++;
  else if (nb <= _128KB)
    r32KB128KBCnt++;
  else if (nb <= _256KB)
    r128KB256KBCnt++;
  else if (nb <= _512KB)
    r256KB512KBCnt++;
  else if (nb <= _1000KB)
    r512KB1000KBCnt++;
  else if (nb <= _10MB)
    r1000KB10MBCnt++;
  else if (nb <= _100MB)
    r10MB100MBCnt++;
  else if (nb <= _1GB)
    r100MB1GBCnt++;
  else if (nb <= _10GB)
    r1GB10GBCnt++;
  else if (nb <= _100GB)
    r10GB100GBCnt++;
  else if (nb <= _1TB)
    r100GB1TBCnt++;
  else if (nb <= _10TB)
    r1TB10TBCnt++;
}
