/*
 * $Id: errnoGS.c,v 1.1 1997/10/30 04:57:25 gdr Exp $
 */

#include <gsos.h>
#include <stdarg.h>
#include <stdio.h>
#include "contrib.h"

#pragma lint -1
#pragma debug 0
#pragma optimize 78

#define NONE    "no error"
#define UNKNOWN "unknown error"

#ifdef __ORCAC__
segment "errnoGS___";
#endif

typedef struct errEntry {
	unsigned short num;
	char *str;
} errEntry;

static errEntry
sys_errlistGS[] = {
	{ badSystemCall,    "bad system call number" },
	{ invalidPcount,    "invalid parameter count" },
	{ gsosActive,       "GS/OS already active" },
	{ devNotFound,      "device not found" },
	{ invalidDevNum,    "invalid device number" },
	{ drvrBadReq,       "bad request or command" },
	{ drvrBadCode,      "bad control or status code" },
	{ drvrBadParm,      "bad call parameter" },
	{ drvrNotOpen,      "character device not open" },
	{ drvrPriorOpen,    "character device already open" },
	{ irqTableFull,     "interrupt table full" },
	{ drvrNoResrc,      "resources not available" },
	{ drvrIOError,      "I/O error" },
	{ drvrNoDevice,     "device not connected" },
	{ drvrBusy,         "call aborted; driver is busy" },
	{ drvrWrtProt,      "device is write protected" },
	{ drvrBadCount,     "invalid byte count" },
	{ drvrBadBlock,     "invalid block address" },
	{ drvrDiskSwitch,   "disk has been switched" },
	{ drvrOffLine,      "device off line/ no media present" },
	{ badPathSyntax,    "invalid pathname syntax" },
	{ tooManyFilesOpen, "too many files open on server volume" },
	{ invalidRefNum,    "invalid reference number" },
	{ pathNotFound,     "subdirectory does not exist" },
	{ volNotFound,      "volume not found" },
	{ fileNotFound,     "file not found" },
	{ dupPathname,      "create or rename with existing name" },
	{ volumeFull,       "volume full error" },
	{ volDirFull,       "volume directory full" },
	{ badFileFormat,    "version error (incompatible file format)" },
	{ badStoreType,     "unsupported (or incorrect) storage type" },
	{ eofEncountered,   "end-of-file encountered" },
	{ outOfRange,       "position out of range" },
	{ invalidAccess,    "access not allowed" },
	{ buffTooSmall,     "buffer too small" },
	{ fileBusy,         "file is already open" },
	{ dirError,         "directory error" },
	{ unknownVol,       "unknown volume type" },
	{ paramRangeErr,    "parameter out of range" },
	{ outOfMem,         "out of memory" },
	{ dupVolume,        "duplicate volume name" },
	{ notBlockDev,      "not a block device" },
	{ invalidLevel,     "specifield level outside legal range" },
	{ damagedBitMap,    "block number too large" },
	{ badPathNames,     "invalid pathnames for ChangePath" },
	{ notSystemFile,    "not an executable file" },
	{ osUnsupported,    "Operating System not supported" },
	{ stackOverflow,    "too many applications on stack" },
	{ dataUnavail,      "data unavailable" },
	{ endOfDir,         "end of directory has been reached" },
	{ invalidClass,     "invalid FST call class" },
	{ resForkNotFound,  "file does not contain required resource" },
	{ invalidFSTID,     "error - FST ID is invalid" },
	{ invalidFSTop,     "invalid FST operation" },
	{ fstCaution,       "FST handled call, but result is weird" },
	{ devNameErr,       "device exists with same name as replacement name" },
	{ defListFull,      "device list is full" },
	{ supListFull,      "supervisor list is full" },
	{ fstError,         "generic FST error" },
	{ resExistsErr,     "cannot expand file, resource already exists" },
	{ resAddErr,        "cannot add resource fork to this type file" },
	{ networkError,     "generic network error" },
	{ 0,                NONE } /* we shouldn't see this */
};

unsigned short errnoGS = 0;

char *
strerrorGS(unsigned short num)
{
	int i;

	if (num == 0) {
		return NONE;
	}
	i = 0;
	while (sys_errlistGS[i].num) {
		if (sys_errlistGS[i].num == num) {
			return sys_errlistGS[i].str;
		}
		i++;
	}
	return UNKNOWN;
}

#ifdef __ORCAC__
#pragma debug 0
#pragma optimize 78
#endif

void
perrorGS(char *format, ...)
{
	va_list ap;

	va_start(ap,format);
	vfprintf(stderr,format,ap);
	fprintf(stderr,": %s\n",strerrorGS(errnoGS));
	va_end(ap);
	return;
}
