main = do putStr cprogHeader mapM_ (putStr . cppify) possibleErrNos putStr cprogFooter cprogHeader = "#include \n" ++ "main() {\n" ++ " int i, j=0, max=0, noncontig=0, dup=0;\n" ++ " char *errs[2000];\n" ++ " char *dups[20];\n" ++ " int dupi[20];\n" ++ " char sep;\n" ++ " for (i=0; i<2000; i++) {\n" ++ " errs[i]=(char*)0;\n" ++ " }\n" ++ " for (i=0; i<20; i++) {\n" ++ " dups[i]=(char*)0;\n" ++ " dupi[i]=0;\n" ++ " }\n" cppify symbol = "#ifdef "++symbol++"\n" ++ " if (errs["++symbol++"]) {\n" ++ " dups[dup]=\""++symbol++"\"; dupi[dup]="++symbol++"; dup++;\n" ++ " } else\n" ++ " errs["++symbol++"] = \""++symbol++"\";\n" ++ " if ("++symbol++">max) max="++symbol++";\n" ++ "#endif\n" cprogFooter = " printf(\"module NHC.DErrNo where\\n\\n\");\n" ++ " printf(\"{- Automatically generated from /usr/include/errno.h -}\\n\\n\");\n" ++ " printf(\"data ErrNo =\\n\");\n" ++ " printf(\" Edummy\\n\");\n" ++ " for (i=1; i<=max; i++) {\n" ++ " if (errs[i]) {\n" ++ " printf(\" | %s\\n\",errs[i]);\n" ++ " } else if (j ErrNo -> Bool\\n\");\n" ++ " for (j=0;j "#ifdef "++symbol++"\n" ++ " printf(\"%c "++symbol++"\",sep);\n" ++ " sep = ',';\n" ++ "#endif\n") symbols ++ " printf(\" ]\\n\");\n" possibleErrNos = -- beginning of linux symbols [ "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" , "ESPIPE" , "EROFS" , "EMLINK" , "EPIPE" , "EDOM" , "ERANGE" , "EDEADLK" , "ENAMETOOLONG" , "ENOLCK" , "ENOSYS" , "ENOTEMPTY" , "ELOOP" , "EWOULDBLOCK" , "ENOMSG" , "EIDRM" , "ECHRNG" , "EL2NSYNC" , "EL3HLT" , "EL3RST" , "ELNRNG" , "EUNATCH" , "ENOCSI" , "EL2HLT" , "EBADE" , "EBADR" , "EXFULL" , "ENOANO" , "EBADRQC" , "EBADSLT" , "EDEADLOCK" , "EBFONT" , "ENOSTR" , "ENODATA" , "ETIME" , "ENOSR" , "ENONET" , "ENOPKG" , "EREMOTE" , "ENOLINK" , "EADV" , "ESRMNT" , "ECOMM" , "EPROTO" , "EMULTIHOP" , "EDOTDOT" , "EBADMSG" , "EOVERFLOW" , "ENOTUNIQ" , "EBADFD" , "EREMCHG" , "ELIBACC" , "ELIBBAD" , "ELIBSCN" , "ELIBMAX" , "ELIBEXEC" , "EILSEQ" , "ERESTART" , "ESTRPIPE" , "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" , "EUCLEAN" , "ENOTNAM" , "ENAVAIL" , "EISNAM" , "EREMOTEIO" , "EDQUOT" , "ENOMEDIUM" , "EMEDIATYPE" -- end of linux symbols -- beginning of SGI symbols , "EIORESID" , "EINIT" , "EREMDEV" , "ECANCELED" , "ENFSREMOTE" , "ETCP_EBASE" , "ETCP_ELIMIT" , "ENAMI_EBASE" , "ENAMI_ELIMIT" , "ENFS_EBASE" , "ENFS_ELIMIT" , "ELASTERRNO" , "ECKPT" , "ENOLIMFILE" , "EDISJOINT" , "ENOLOGIN" , "ELOGINLIM" , "EGROUPLOOP" , "ENOATTACH" , "ENOATTR" , "EFSCORRUPTED" , "EDIRCORRUPTED" , "EWRONGFS" , "ECONTROLLER" , "ENOTCONTROLLER" , "EENQUEUED" , "ENOTENQUEUED" , "EJOINED" , "ENOTJOINED" , "ENOPROC" , "EMUSTRUN" , "ENOTSTOPPED" , "ECLOCKCPU" , "EINVALSTATE" , "ENOEXIST" , "EENDOFMINOR" , "EBUFSIZE" , "EEMPTY" , "ENOINTRGROUP" , "EINVALMODE" , "ECANTEXTENT" , "EINVALTIME" , "EDESTROYED" , "EBDHDL" , "EDELAY" , "ENOBWD" , "EBADRSPEC" , "EBADTSPEC" , "EBADFILT" , "EMIGRATED" , "EMIGRATING" , "ECELLDOWN" -- end of SGI symbols -- beginning of Sun symbols , "ENOTSUP" , "EPROCLIM" , "ERREMOTE" -- end of Sun symbols -- beginning of HP symbols , "ENOSYM" , "EREFUSED" , "EREMOTERELEASE" -- end of HP symbols ]