#!/bin/sh
#
# This generates runtime/mercury_errno_name.c
#
set -eu

# This list is taken from:
# - Cosmopolitan libc
#   https://github.com/jart/cosmopolitan/blob/master/libc/sysv/consts.sh
# - moreutils `errno -l' output on Linux
#
names="
ENOSYS
EPERM
ENOENT
ESRCH
EINTR
EIO
ENXIO
E2BIG
ENOEXEC
EBADF
ECHILD
EAGAIN
ENOMEM
EACCES
EFAULT
ENOTBLK
EBUSY
EEXIST
EXDEV
ENODEV
ENOTDIR
EISDIR
EINVAL
ENFILE
EMFILE
ENOTTY
ETXTBSY
EFBIG
ENOSPC
EDQUOT
ESPIPE
EROFS
EMLINK
EPIPE
EDOM
ERANGE
EDEADLK
ENAMETOOLONG
ENOLCK
ELOOP
ENOMSG
EIDRM
ETIME
EPROTO
EOVERFLOW
EILSEQ
EUSERS
ENOTSOCK
EDESTADDRREQ
EMSGSIZE
EPROTOTYPE
ENOPROTOOPT
EPROTONOSUPPORT
ESOCKTNOSUPPORT
EOPNOTSUPP
EPFNOSUPPORT
EAFNOSUPPORT
EADDRINUSE
EADDRNOTAVAIL
ENETDOWN
ENETUNREACH
ENETRESET
ECONNABORTED
ECONNRESET
ENOBUFS
EISCONN
ENOTCONN
ESHUTDOWN
ETOOMANYREFS
ETIMEDOUT
ECONNREFUSED
EHOSTDOWN
EHOSTUNREACH
EALREADY
EINPROGRESS
ESTALE
EREMOTE
EBADRPC
ERPCMISMATCH
EPROGUNAVAIL
EPROGMISMATCH
EPROCUNAVAIL
EFTYPE
EAUTH
ENEEDAUTH
EPROCLIM
ENOATTR
EPWROFF
EDEVERR
EBADEXEC
EBADARCH
ESHLIBVERS
EBADMACHO
ENOPOLICY
EBADMSG
ECANCELED
EOWNERDEAD
ENOTRECOVERABLE
ENONET
ERESTART
ENODATA
ENOSR
ENOSTR
EMULTIHOP
ENOLINK
ENOMEDIUM
EMEDIUMTYPE
EBADFD
ECHRNG
EL2NSYNC
EL3HLT
EL3RST
ELNRNG
EUNATCH
ENOCSI
EL2HLT
EBADE
EBADR
EXFULL
ENOANO
EBADRQC
EBADSLT
ENOPKG
EADV
ESRMNT
ECOMM
EDOTDOT
ENOTUNIQ
EREMCHG
ELIBACC
ELIBBAD
ELIBSCN
ELIBMAX
ELIBEXEC
ESTRPIPE
EUCLEAN
ENOTNAM
ENAVAIL
EISNAM
EREMOTEIO
ENOKEY
EKEYEXPIRED
EKEYREVOKED
EKEYREJECTED
ERFKILL
EHWPOISON
EBFONT
"

# Potential aliases:
# - EWOULDBLOCK should be the same as EAGAIN
# - EDEADLOCK should be the same as EDEADLK
# - ENOTSUP may be the same as EOPNOTSUPP on some platforms
# - ENOTEMPTY may be the same as EEXIST on some platforms
possible_aliases="
EWOULDBLOCK
EDEADLOCK
ENOTSUP
ENOTEMPTY
"

cat <<EOF
// vim: ts=4 sw=4 expandtab ft=c

// Copyright (C) 2022, 2025 The Mercury team.
// This file is distributed under the terms specified in COPYING.LIB.

// Generated by generate_errno_name.

#include <errno.h>
#include <stdlib.h>

#include "mercury_errno_name.h"

const char *
MR_errno_name(int errnum)
{
    switch (errnum) {
EOF

for name in $names ; do
    echo "#ifdef $name"
    echo "    case $name: return \"$name\";"
    echo "#endif"
done

cat <<EOF
    default:
        switch (errnum) {
EOF

for name in $possible_aliases ; do
    echo "#ifdef $name"
    echo "        case $name: return \"$name\";"
    echo "#endif"
done

cat <<EOF
        }
    }
    return NULL;
}
EOF
