(root)/
gcc-13.2.0/
libgm2/
libm2iso/
ErrnoCategory.cc
/* ErrnoCatogory.cc categorizes values of errno maps onto ChanConsts.h.

Copyright (C) 2008-2022 Free Software Foundation, Inc.
Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.

This file is part of GNU Modula-2.

GNU Modula-2 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.

GNU Modula-2 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.

Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.

You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
<http://www.gnu.org/licenses/>.  */

#include "config.h"
#include "ChanConsts.h"

#if defined(HAVE_ERRNO_H)
#include "errno.h"
#endif

#if defined(HAVE_SYS_ERRNO_H)
#include "sys/errno.h"
#endif

#include "m2rts.h"

#define EXPORT(FUNC) m2iso ## _ErrnoCategory_ ## FUNC
#define M2EXPORT(FUNC) m2iso ## _M2_ErrnoCategory_ ## FUNC
#define M2LIBNAME "m2iso"


/* IsErrnoHard returns true if the value of errno is associated
   with a hard device error.  */

extern "C" bool
EXPORT(IsErrnoHard) (int e)
{
#if defined(HAVE_ERRNO_H) || defined(HAVE_SYS_ERRNO_H)
  return ((e == EPERM) || (e == ENOENT) || (e == EIO) || (e == ENXIO)
          || (e == EACCES) || (e == ENOTBLK) || (e == ENODEV) || (e == EINVAL)
          || (e == ENFILE) || (e == EROFS) || (e == EMLINK));
#else
  return false;
#endif
}

/* IsErrnoSoft returns true if the value of errno is associated
   with a soft device error.  */

extern "C" bool
EXPORT(IsErrnoSoft) (int e)
{
#if defined(HAVE_ERRNO_H) || defined(HAVE_SYS_ERRNO_H)
  return ((e == ESRCH) || (e == EINTR) || (e == E2BIG) || (e == ENOEXEC)
          || (e == EBADF) || (e == ECHILD) || (e == EAGAIN) || (e == ENOMEM)
          || (e == EFAULT) || (e == EBUSY) || (e == EEXIST) || (e == EXDEV)
          || (e == ENOTDIR) || (e == EISDIR) || (e == EMFILE) || (e == ENOTTY)
          || (e == ETXTBSY) || (e == EFBIG) || (e == ENOSPC) || (e == EPIPE));
#else
  return false;
#endif
}

extern "C" bool
EXPORT(UnAvailable) (int e)
{
#if defined(HAVE_ERRNO_H) || defined(HAVE_SYS_ERRNO_H)
  return ((e == ENOENT) || (e == ESRCH) || (e == ENXIO) || (e == ECHILD)
          || (e == ENOTBLK) || (e == ENODEV) || (e == ENOTDIR));
#else
  return false;
#endif
}

/* GetOpenResults - maps errno onto the ISO Modula-2 enumerated type,
   OpenResults.  */

extern "C" openResults
EXPORT(GetOpenResults) (int e)
{
  if (e == 0)
    return opened;
#if defined(HAVE_ERRNO_H) || defined(HAVE_SYS_ERRNO_H)
  switch (e)
    {
    case EPERM:
      return wrongPermissions;
      break;
    case ENOENT:
      return noSuchFile;
      break;
    case ENXIO:
      return noSuchFile;
      break;
    case EACCES:
      return wrongPermissions;
      break;
    case ENOTBLK:
      return wrongFileType;
      break;
    case EEXIST:
      return fileExists;
      break;
    case ENODEV:
      return noSuchFile;
      break;
    case ENOTDIR:
      return wrongFileType;
      break;
    case EISDIR:
      return wrongFileType;
      break;
    case EINVAL:
      return wrongFlags;
      break;
    case ENFILE:
      return tooManyOpen;
      break;
    case EMFILE:
      return tooManyOpen;
      break;
    case ENOTTY:
      return wrongFileType;
      break;
    case ENOSPC:
      return noRoomOnDevice;
      break;
    case EROFS:
      return wrongPermissions;
      break;

    default:
      return otherProblem;
    }
#else
  return otherProblem;
#endif
}

/* GNU Modula-2 linking fodder.  */

extern "C" void
M2EXPORT(init) (int, char **, char **)
{
}

extern "C" void
M2EXPORT(fini) (int, char **, char **)
{
}

extern "C" void
M2EXPORT(dep) (void)
{
}

extern "C" void __attribute__((__constructor__))
M2EXPORT(ctor) (void)
{
  m2iso_M2RTS_RegisterModule ("ErrnoCategory", M2LIBNAME,
			      M2EXPORT(init), M2EXPORT(fini),
			      M2EXPORT(dep));
}