aboutsummaryrefslogtreecommitdiff
path: root/arclib
diff options
context:
space:
mode:
authorGuido Guenther <agx@sigxcpu.org>2006-11-18 23:48:07 +0100
committerGuido Guenther <agx@bogon.sigxcpu.org>2006-11-18 23:48:07 +0100
commitd1e063beb43e595680c65e3804d1f8ddff53373b (patch)
treef7256dfe1b807920270ec5113df6f6e4abf1ed0f /arclib
Imported Debian version 0.3.8.80.3.8.8
Diffstat (limited to 'arclib')
-rw-r--r--arclib/Makefile20
-rw-r--r--arclib/arc.c226
-rw-r--r--arclib/arc.h262
-rw-r--r--arclib/spb.h96
-rw-r--r--arclib/stddef.h11
-rw-r--r--arclib/stdio.c281
-rw-r--r--arclib/stdio.h31
-rw-r--r--arclib/stdlib.c118
-rw-r--r--arclib/stdlib.h16
-rw-r--r--arclib/string.c126
-rw-r--r--arclib/string.h23
-rw-r--r--arclib/types.h14
12 files changed, 1224 insertions, 0 deletions
diff --git a/arclib/Makefile b/arclib/Makefile
new file mode 100644
index 0000000..4a53c26
--- /dev/null
+++ b/arclib/Makefile
@@ -0,0 +1,20 @@
+#
+# Copyright 1999 Silicon Graphics, Inc.
+#
+CFLAGS += -O2 -Werror -Wall -mno-abicalls -G 0 -fno-pic
+
+TARGETS = libarc.a
+OBJECTS = arc.o stdio.o stdlib.o string.o
+
+all: $(TARGETS)
+
+$(TARGETS): $(OBJECTS)
+ rm -f $@
+ $(AR) -crs $@ $(OBJECTS)
+
+install: $(TARGETS)
+ install -d ${PREFIX}/${LIBDIR}
+ install -m 644 $< ${PREFIX}/${LIBDIR}
+
+clean:
+ rm -f libarc.a $(OBJECTS) *~ tags
diff --git a/arclib/arc.c b/arclib/arc.c
new file mode 100644
index 0000000..957f012
--- /dev/null
+++ b/arclib/arc.c
@@ -0,0 +1,226 @@
+/*
+ * Copyright 1999 Silicon Graphics, Inc.
+ */
+#include "types.h"
+#include "arc.h"
+#include "spb.h"
+
+
+LONG ArcLoad(CHAR * Path, ULONG TopAddr, ULONG * ExecAddr, ULONG * LowAddr)
+{
+ return FVector->Load(Path, TopAddr, ExecAddr, LowAddr);
+}
+
+
+LONG
+ArcInvoke(ULONG ExecAddr,
+ ULONG StackAddr, ULONG Argc, CHAR * Argv[], CHAR * Envp[]
+ )
+{
+ return FVector->Invoke(ExecAddr, StackAddr, Argc, Argv, Envp);
+}
+
+
+LONG ArcExecute(CHAR * Path, ULONG Argc, CHAR * Argv[], CHAR * Envp[])
+{
+ return FVector->Execute(Path, Argc, Argv, Envp);
+}
+
+
+VOID ArcHalt(VOID)
+{
+ FVector->Halt();
+}
+
+
+VOID ArcPowerDown(VOID)
+{
+ FVector->PowerDown();
+}
+
+
+VOID ArcRestart(VOID)
+{
+ FVector->Restart();
+}
+
+
+VOID ArcReboot(VOID)
+{
+ FVector->Reboot();
+}
+
+
+VOID ArcEnterInteractiveMode(VOID)
+{
+ FVector->EnterInteractiveMode();
+}
+
+
+COMPONENT *ArcGetPeer(COMPONENT * Current)
+{
+ return FVector->GetPeer(Current);
+}
+
+
+COMPONENT *ArcGetChild(COMPONENT * Current)
+{
+ return FVector->GetChild(Current);
+}
+
+
+COMPONENT *ArcGetParent(COMPONENT * Current)
+{
+ return FVector->GetParent(Current);
+}
+
+
+LONG
+ArcGetConfigurationData(VOID * ConfigurationData, COMPONENT * Component)
+{
+ return FVector->GetConfigurationData(ConfigurationData, Component);
+}
+
+
+COMPONENT *ArcAddChild(COMPONENT * Current, COMPONENT * Template,
+ VOID * ConfigurationData)
+{
+ return FVector->AddChild(Current, Template, ConfigurationData);
+}
+
+
+LONG ArcDeleteComponent(COMPONENT * ComponentToDelete)
+{
+ return FVector->DeleteComponent(ComponentToDelete);
+}
+
+
+COMPONENT *ArcGetComponent(CHAR * Path)
+{
+ return FVector->GetComponent(Path);
+}
+
+
+LONG ArcSaveConfiguration(VOID)
+{
+ return FVector->SaveConfiguration();
+}
+
+
+SYSTEMID *ArcGetSystemId(VOID)
+{
+ return FVector->GetSystemId();
+}
+
+
+MEMORYDESCRIPTOR *ArcGetMemoryDescriptor(MEMORYDESCRIPTOR * Current)
+{
+ return FVector->GetMemoryDescriptor(Current);
+}
+
+
+TIMEINFO *ArcGetTime(VOID)
+{
+ return FVector->GetTime();
+}
+
+
+ULONG ArcGetRelativeTime(VOID)
+{
+ return FVector->GetRelativeTime();
+}
+
+
+LONG
+ArcGetDirectoryEntry(ULONG FileID,
+ DIRECTORYENTRY * Buffer, ULONG N, ULONG * Count)
+{
+ return FVector->GetDirectoryEntry(FileID, Buffer, N, Count);
+}
+
+
+LONG ArcOpen(CHAR * Path, OPENMODE OpenMode, ULONG * FileID)
+{
+ return FVector->Open(Path, OpenMode, FileID);
+}
+
+
+LONG ArcClose(ULONG FileID)
+{
+ return FVector->Close(FileID);
+}
+
+
+LONG ArcRead(ULONG FileID, VOID * Buffer, ULONG N, ULONG * Count)
+{
+ return FVector->Read(FileID, Buffer, N, Count);
+}
+
+
+LONG ArcGetReadStatus(ULONG FileID)
+{
+ return FVector->GetReadStatus(FileID);
+}
+
+
+LONG ArcWrite(ULONG FileID, VOID * Buffer, ULONG N, ULONG * Count)
+{
+ return FVector->Write(FileID, Buffer, N, Count);
+}
+
+
+LONG ArcSeek(ULONG FileID, LARGEINTEGER * Position, SEEKMODE SeekMode)
+{
+ return FVector->Seek(FileID, Position, SeekMode);
+}
+
+
+LONG ArcMount(CHAR * Path, MOUNTOPERATION Operation)
+{
+ return FVector->Mount(Path, Operation);
+}
+
+
+CHAR *ArcGetEnvironmentVariable(CHAR * Name)
+{
+ return FVector->GetEnvironmentVariable(Name);
+}
+
+
+LONG ArcSetEnvironmentVariable(CHAR * Name, CHAR * Value)
+{
+ return FVector->SetEnvironmentVariable(Name, Value);
+}
+
+
+LONG ArcGetFileInformation(ULONG FileID, FILEINFORMATION * Information)
+{
+ return FVector->GetFileInformation(FileID, Information);
+}
+
+
+LONG
+ArcSetFileInformation(ULONG FileID, ULONG AttributeFlags,
+ ULONG AttributeMask)
+{
+ return FVector->SetFileInformation(FileID, AttributeFlags,
+ AttributeMask);
+}
+
+
+VOID ArcFlushAllCaches(VOID)
+{
+ FVector->FlushAllCaches();
+}
+
+
+LONG ArcTestUnicodeCharacter(ULONG FileID, USHORT UnicodeCharacter)
+{
+ return FVector->TestUnicodeCharacter(FileID, UnicodeCharacter);
+}
+
+
+DISPLAY_STATUS *ArcGetDisplayStatus(ULONG FileID)
+{
+ return FVector->GetDisplayStatus(FileID);
+}
diff --git a/arclib/arc.h b/arclib/arc.h
new file mode 100644
index 0000000..2920276
--- /dev/null
+++ b/arclib/arc.h
@@ -0,0 +1,262 @@
+/*
+ * Copyright 1999 Silicon Graphics, Inc.
+ * 2001-03 Guido Guenther <agx@sixcpu.org>
+ */
+#ifndef _ARC_H_
+#define _ARC_H_
+
+#include "types.h"
+
+#define ESUCCESS 0 /* No error */
+#define E2BIG 1 /* Argument list too long */
+#define EACCES 2 /* Permission denied */
+#define EAGAIN 3 /* Resource temporarily unavailable */
+#define EBADF 4 /* Bad file descriptor */
+#define EBUSY 5 /* Resource busy */
+#define EFAULT 6 /* Bad address */
+#define EINVAL 7 /* Invalid argument */
+#define EIO 8 /* Input/output error */
+#define EISDIR 9 /* Is a directory */
+#define EMFILE 10 /* Too many open files */
+#define EMLINK 11 /* Too many links */
+#define ENAMETOOLONG 12 /* Filename too long */
+#define ENODEV 13 /* No such device */
+#define ENOENT 14 /* No such file or directory */
+#define ENOEXEC 15 /* Execute format error */
+#define ENOMEM 16 /* Not enough space */
+#define ENOSPC 17 /* No space left on device */
+#define ENOTDIR 18 /* Not a directory */
+#define ENOTTY 19 /* Inappropriate I/O control operation */
+#define ENXIO 20 /* Media not loaded */
+#define EROFS 21 /* Read-only file system */
+
+
+typedef enum {
+ SystemClass = 0,
+ ProcessorClass = 1,
+ CacheClass = 2,
+ AdapterClass = 3,
+ ControllerClass = 4,
+ PeripheralClass = 5,
+ MemoryClass = 6
+} COMPONENT_CLASS;
+
+typedef enum {
+ ARC = 0,
+ CPU = 1,
+ FPU = 2,
+ PrimaryICache = 3,
+ PrimaryDCache = 4,
+ SecondaryICache = 5,
+ SecondaryDCache = 6,
+ SecondaryCache = 7,
+ EISAAdapter = 8,
+ TCAdapter = 9,
+ SCSIAdapter = 10,
+ DTIAdapter = 11,
+ MultiFunctionAdapter = 12,
+ DiskController = 13,
+ TapeController = 14,
+ CDROMController = 15,
+ WORMController = 16,
+ SerialController = 17,
+ NetworkController = 18,
+ DisplayController = 19,
+ ParallelController = 20,
+ PointerController = 21,
+ KeyboardController = 22,
+ AudioController = 23,
+ OtherController = 24,
+ DiskPeripheral = 25,
+ FloppyDiskPeripheral = 26,
+ TapePeripheral = 27,
+ ModemPeripheral = 28,
+ MonitorPeripheral = 29,
+ PrinterPeripheral = 30,
+ PointerPeripheral = 31,
+ KeyboardPeripheral = 32,
+ TerminalPeripheral = 33,
+ OtherPeripheral = 34,
+ LinePeripheral = 35,
+ NetworkPeripheral = 36,
+ MemoryUnit = 37
+} COMPONENT_TYPE;
+
+typedef enum {
+ Failed = 1,
+ ReadOnly = 2,
+ Removable = 4,
+ ConsoleIn = 8,
+ ConsoleOut = 16,
+ Input = 32,
+ Output = 64
+} COMPONENT_FLAGS;
+
+typedef struct {
+ COMPONENT_CLASS Class;
+ COMPONENT_TYPE Type;
+ COMPONENT_FLAGS Flags;
+ USHORT Version;
+ USHORT Revision;
+ ULONG Key;
+ ULONG AffinityMask;
+ ULONG ConfigurationDataSize;
+ ULONG IdentifierLength;
+ CHAR *Identifier;
+} COMPONENT;
+
+typedef struct {
+ CHAR VendorId[8];
+ UCHAR ProductId[8];
+} SYSTEMID;
+
+/* This is ARCS not ARC */
+typedef enum {
+ ExceptionBlock,
+ SystemParameterBlock,
+ FreeContiguous,
+ FreeMemory,
+ BadMemory,
+ LoadedProgram,
+ FirmwareTemporary,
+ FirmwarePermanent,
+} MEMORYTYPE;
+
+typedef struct {
+ MEMORYTYPE Type;
+ ULONG BasePage;
+ ULONG PageCount;
+} MEMORYDESCRIPTOR;
+
+typedef struct {
+ USHORT Year;
+ USHORT Month;
+ USHORT Day;
+ USHORT Hour;
+ USHORT Minutes;
+ USHORT Seconds;
+ USHORT Milliseconds;
+} TIMEINFO;
+
+#define ARC_NAME_MAX 32
+
+typedef struct {
+ ULONG FileNameLength;
+ ULONG FileAttribute;
+ ULONG FileName[ARC_NAME_MAX];
+} DIRECTORYENTRY;
+
+typedef enum {
+ OpenReadOnly,
+ OpenWriteOnly,
+ OpenReadWrite,
+ CreateWriteOnly,
+ CreateReadWrite,
+ SupersedeWriteOnly,
+ SupersedeReadWrite,
+ OpenDirectory,
+ CreateDirectory
+} OPENMODE;
+
+typedef struct {
+#ifdef __MIPSEL__
+ ULONG LowPart;
+ *LONG HighPart;
+#else /* !(__MIPSEL__) */
+ LONG HighPart;
+ ULONG LowPart;
+#endif
+} LARGEINTEGER;
+
+typedef enum {
+ SeekAbsolute,
+ SeekRelative
+} SEEKMODE;
+
+typedef enum {
+ LoadMedia,
+ UnloadMedia
+} MOUNTOPERATION;
+
+typedef struct {
+ LARGEINTEGER StartingAddress;
+ LARGEINTEGER EndingAddress;
+ LARGEINTEGER CurrentAddress;
+ COMPONENT_TYPE Type;
+ ULONG FileNameLength;
+ UCHAR Attributes;
+ CHAR Filename[ARC_NAME_MAX];
+} FILEINFORMATION;
+
+typedef enum {
+ ReadOnlyFile = 1,
+ HiddenFile = 2,
+ SystemFile = 4,
+ ArchiveFile = 8,
+ DirectoryFile = 16,
+ DeleteFile = 32
+} FILEATTRIBUTES;
+
+typedef struct {
+ USHORT CursorXPosition;
+ USHORT CursorYPosition;
+ USHORT CursorMaxXPosition;
+ USHORT CursorMaxYPosition;
+ UCHAR ForegroundColor;
+ UCHAR BackgroundColor;
+ UCHAR HighIntensity;
+ UCHAR Underscored;
+ UCHAR ReverseVideo;
+} DISPLAY_STATUS;
+
+
+#define ARC_STDIN 0
+#define ARC_STDOUT 1
+
+extern LONG ArcLoad(CHAR * Path, ULONG TopAddr, ULONG * ExecAddr,
+ ULONG * LowAddr);
+extern LONG ArcInvoke(ULONG ExecAddr, ULONG StackAddr, ULONG Argc,
+ CHAR * Argv[], CHAR * Envp[]);
+extern LONG ArcExecute(CHAR * Path, ULONG Argc, CHAR * Argv[],
+ CHAR * Envp[]);
+extern VOID ArcHalt(VOID);
+extern VOID ArcPowerDown(VOID);
+extern VOID ArcRestart(VOID);
+extern VOID ArcReboot(VOID);
+extern VOID ArcEnterInteractiveMode(VOID);
+extern COMPONENT *ArcGetPeer(COMPONENT * Current);
+extern COMPONENT *ArcGetChild(COMPONENT * Current);
+extern COMPONENT *ArcGetParent(COMPONENT * Current);
+extern LONG ArcGetConfigurationData
+ (VOID * ConfigurationData, COMPONENT * Component);
+extern COMPONENT *ArcAddChild
+ (COMPONENT * Current, COMPONENT * Template, VOID * ConfigurationData);
+extern LONG ArcDeleteComponent(COMPONENT * ComponentToDelete);
+extern COMPONENT *ArcGetComponent(CHAR * Path);
+extern LONG ArcSaveConfiguration(VOID);
+extern SYSTEMID *ArcGetSystemId(VOID);
+extern MEMORYDESCRIPTOR *ArcGetMemoryDescriptor(MEMORYDESCRIPTOR *
+ Current);
+extern TIMEINFO *ArcGetTime(VOID);
+extern ULONG ArcGetRelativeTime(VOID);
+extern LONG ArcGetDirectoryEntry
+ (ULONG FileID, DIRECTORYENTRY * Buffer, ULONG N, ULONG * Count);
+extern LONG ArcOpen(CHAR * Path, OPENMODE OpenMode, ULONG * FileID);
+extern LONG ArcClose(ULONG FileID);
+extern LONG ArcRead(ULONG FileID, VOID * Buffer, ULONG N, ULONG * Count);
+extern LONG ArcGetReadStatus(ULONG FileID);
+extern LONG ArcWrite(ULONG FileID, VOID * Buffer, ULONG N, ULONG * Count);
+extern LONG ArcSeek(ULONG FileID, LARGEINTEGER * Position,
+ SEEKMODE SeekMode);
+extern LONG ArcMount(CHAR * Path, MOUNTOPERATION Operation);
+extern CHAR *ArcGetEnvironmentVariable(CHAR * Name);
+extern LONG ArcSetEnvironmentVariable(CHAR * Name, CHAR * Value);
+extern LONG ArcGetFileInformation(ULONG FileID,
+ FILEINFORMATION * Information);
+extern LONG ArcSetFileInformation(ULONG FileID, ULONG AttributeFlags,
+ ULONG AttributeMask);
+extern VOID ArcFlushAllCaches(VOID);
+extern LONG ArcTestUnicodeCharacter(ULONG FileID, USHORT UnicodeCharacter);
+extern DISPLAY_STATUS *ArcGetDisplayStatus(ULONG FileID);
+
+#endif /* _ARC_H_ */
diff --git a/arclib/spb.h b/arclib/spb.h
new file mode 100644
index 0000000..fffc20a
--- /dev/null
+++ b/arclib/spb.h
@@ -0,0 +1,96 @@
+/*
+ * Copyright 1999, 2001 Silicon Graphics, Inc.
+ * Copyright 2001 Ralf Baechle
+ */
+#ifndef _SPB_H_
+#define _SPB_H_
+
+#include "types.h"
+#include "arc.h"
+
+typedef struct {
+ LONG(*Load) (CHAR *, ULONG, ULONG *, ULONG *);
+ LONG(*Invoke) (ULONG, ULONG, ULONG, CHAR *[], CHAR *[]);
+ LONG(*Execute) (CHAR *, ULONG, CHAR *[], CHAR *[]);
+ VOID(*Halt) (VOID);
+ VOID(*PowerDown) (VOID);
+ VOID(*Restart) (VOID);
+ VOID(*Reboot) (VOID);
+ VOID(*EnterInteractiveMode) (VOID);
+ VOID *reserved1;
+ COMPONENT *(*GetPeer) (COMPONENT *);
+ COMPONENT *(*GetChild) (COMPONENT *);
+ COMPONENT *(*GetParent) (COMPONENT *);
+ LONG(*GetConfigurationData) (VOID *, COMPONENT *);
+ COMPONENT *(*AddChild) (COMPONENT *, COMPONENT *, VOID *);
+ LONG(*DeleteComponent) (COMPONENT *);
+ COMPONENT *(*GetComponent) (CHAR *);
+ LONG(*SaveConfiguration) (VOID);
+ SYSTEMID *(*GetSystemId) (VOID);
+ MEMORYDESCRIPTOR *(*GetMemoryDescriptor) (MEMORYDESCRIPTOR *);
+ VOID *reserved2;
+ TIMEINFO *(*GetTime) (VOID);
+ ULONG(*GetRelativeTime) (VOID);
+ LONG(*GetDirectoryEntry) (ULONG, DIRECTORYENTRY *, ULONG, ULONG *);
+ LONG(*Open) (CHAR *, OPENMODE, ULONG *);
+ LONG(*Close) (ULONG);
+ LONG(*Read) (ULONG, VOID *, ULONG, ULONG *);
+ LONG(*GetReadStatus) (ULONG);
+ LONG(*Write) (ULONG, VOID *, ULONG, ULONG *);
+ LONG(*Seek) (ULONG, LARGEINTEGER *, SEEKMODE);
+ LONG(*Mount) (CHAR *, MOUNTOPERATION);
+ CHAR *(*GetEnvironmentVariable) (CHAR *);
+ LONG(*SetEnvironmentVariable) (CHAR *, CHAR *);
+ LONG(*GetFileInformation) (ULONG, FILEINFORMATION *);
+ LONG(*SetFileInformation) (ULONG, ULONG, ULONG);
+ VOID(*FlushAllCaches) (VOID);
+ LONG(*TestUnicodeCharacter) (ULONG, USHORT);
+ DISPLAY_STATUS *(*GetDisplayStatus) (ULONG);
+} FIRMWAREVECTOR;
+
+#define RSTB_SIGNATURE 0x42545352
+
+typedef struct _rstb {
+ ULONG RSTBSignature;
+ ULONG RSTBLength;
+ USHORT Version;
+ USHORT Revision;
+ struct _rstb *NextRSTB;
+ VOID *RestartAddress;
+ ULONG BootMasterID;
+ ULONG ProcessorID;
+ ULONG BootStatus;
+ ULONG Checksum;
+ ULONG SaveAreaLength;
+ ULONG SavedStateArea[1];
+} RESTARTBLOCK;
+
+typedef struct {
+ ULONG AdapterType;
+ ULONG AdapterVectorLength;
+ VOID *AdapterVector;
+} ADAPTER;
+
+#define SPB_SIGNATURE 0x53435241
+
+typedef struct {
+ ULONG SPBSignature;
+ ULONG SPBLength;
+ USHORT Version;
+ USHORT Revision;
+ RESTARTBLOCK *RestartBlock;
+ VOID *DebugBlock;
+ VOID *GEVector;
+ VOID *UTLBMissVector;
+ ULONG FirmwareVectorLength;
+ FIRMWAREVECTOR *FirmwareVector;
+ ULONG PrivateVectorLength;
+ VOID *PrivateVector;
+ ULONG AdapterCount;
+ ADAPTER Adapters[1];
+} SPB;
+
+#define SystemParameterBlock ((SPB *) 0xA0001000UL)
+#define FVector (SystemParameterBlock->FirmwareVector)
+
+#endif /* _SPB_H_ */
diff --git a/arclib/stddef.h b/arclib/stddef.h
new file mode 100644
index 0000000..97ee87f
--- /dev/null
+++ b/arclib/stddef.h
@@ -0,0 +1,11 @@
+/*
+ * Copyright 1999 Silicon Graphics, Inc.
+ */
+#ifndef _STDDEF_H_
+#define _STDDEF_H_
+
+typedef unsigned int size_t;
+
+#define NULL ((void *) 0)
+
+#endif /* _STDDEF_H_ */
diff --git a/arclib/stdio.c b/arclib/stdio.c
new file mode 100644
index 0000000..9825594
--- /dev/null
+++ b/arclib/stdio.c
@@ -0,0 +1,281 @@
+/*
+ * Copyright 1999 Silicon Graphics, Inc.
+ */
+#include "arc.h"
+#include "string.h"
+
+#include "stdio.h"
+
+#include <stdarg.h>
+
+static FILE arc_stdin = ARC_STDIN;
+FILE *stdin = &arc_stdin;
+
+static FILE arc_stdout = ARC_STDOUT;
+FILE *stdout = &arc_stdout;
+
+
+int fputs(const char *s, FILE * stream)
+{
+ LONG status;
+ ULONG count;
+
+ if (strlen(s) > 0) {
+ status = ArcWrite(*stream, (char *) s, strlen(s), &count);
+ if ((status != ESUCCESS) || (count != strlen(s)))
+ return EOF;
+ }
+ return 0;
+}
+
+
+int puts(const char *s)
+{
+ int status = fputs(s, stdout);
+
+ if (status != EOF)
+ status = fputs("\n\r", stdout);
+ return status;
+}
+
+
+int fgetc(FILE * stream)
+{
+ LONG status;
+ CHAR ch;
+ ULONG count;
+
+ status = ArcRead(*stream, &ch, sizeof(CHAR), &count);
+ if ((status != ESUCCESS) || (count != sizeof(CHAR)))
+ return EOF;
+ return (int) ch;
+}
+
+
+static const char *numtostr(unsigned int num, unsigned int base)
+{
+ static char str[33];
+ static char digits[] = {
+ '0', '1', '2', '3', '4', '5', '6', '7',
+ '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
+ };
+ int pos = 32;
+
+ str[pos] = '\0';
+ do {
+ str[--pos] = digits[num % base];
+ num /= base;
+ } while (num > 0);
+
+ return &str[pos];
+}
+
+
+int vfprintf(FILE * stream, const char *format, va_list ap)
+{
+ int count = 0;
+ const char *str;
+ unsigned int uint;
+ char tmp[2];
+
+ if (format != NULL) {
+ while (*format != '\0') {
+ str = strchr(format, '%');
+ if (str == NULL) {
+ count += strlen(format);
+ fputs(format, stream);
+ break;
+ } else {
+ if (format < str) {
+ LONG status;
+ ULONG count;
+ ULONG len = str - format;
+
+ status =
+ ArcWrite(*stream,
+ (char *) format, len,
+ &count);
+ if ((status != ESUCCESS)
+ || (count != len))
+ return EOF;
+ count += len;
+ }
+
+ format = str + 1;
+ if(*format == 'l')
+ format = str + 2;
+
+ switch (*format) {
+ case 'u':
+ uint = va_arg(ap, unsigned int);
+ str = numtostr(uint, 10);
+ if (fputs(str, stream) == EOF)
+ return EOF;
+ count += strlen(str);
+ break;
+
+ case 'p':
+ case 'x':
+ uint = va_arg(ap, unsigned int);
+ str = numtostr(uint, 16);
+ if (fputs(str, stream) == EOF)
+ return EOF;
+ count += strlen(str);
+ break;
+
+ case 's':
+ str = va_arg(ap, const char *);
+ if( !str )
+ str = "(NULL)";
+ if (fputs(str, stream) == EOF)
+ return EOF;
+ count += strlen(str);
+ break;
+
+ case 'c':
+ tmp[0] = (char)va_arg(ap, int);
+ tmp[1] = '\0';
+ if (fputs(tmp, stream) == EOF)
+ return EOF;
+ count++;
+ break;
+
+ case '%':
+ if (fputs("%", stream) == EOF)
+ return EOF;
+ count += 1;
+ break;
+
+ case '\0': /* format error */
+ default:
+ return EOF;
+ }
+
+ format += 1;
+ }
+ }
+ }
+
+ return count;
+}
+
+
+int vprintf(const char *format, va_list ap)
+{
+ return vfprintf(stdout, format, ap);
+}
+
+
+int fprintf(FILE * stream, const char *format, ...)
+{
+ va_list ap;
+ int result;
+
+ va_start(ap, format);
+ result = vfprintf(stream, format, ap);
+ va_end(ap);
+
+ return result;
+}
+
+
+int printf(const char *format, ...)
+{
+ va_list ap;
+ int result;
+
+ va_start(ap, format);
+ result = vfprintf(stdout, format, ap);
+ va_end(ap);
+
+ return result;
+}
+
+int vsprintf(char* string, const char *format, va_list ap)
+{
+ int count = 0;
+ const char *str;
+ unsigned int uint;
+ char tmp[2];
+
+ if (format != NULL) {
+ while (*format != '\0') {
+ str = strchr(format, '%');
+ if (str == NULL) {
+ strcpy(&string[count], format);
+ count += strlen(format);
+ break;
+ } else {
+ if (format < str) {
+ ULONG len = str - format;
+
+ strncpy(&string[count],
+ (char *) format, len);
+ count += len;
+ }
+
+ format = str + 1;
+ if(*format == 'l')
+ format = str + 2;
+
+ switch (*format) {
+ case 'u':
+ uint = va_arg(ap, unsigned int);
+ str = numtostr(uint, 10);
+ strcpy(&string[count], str);
+ count += strlen(str);
+ break;
+
+ case 'p':
+ case 'x':
+ uint = va_arg(ap, unsigned int);
+ str = numtostr(uint, 16);
+ strcpy(&string[count], str);
+ count += strlen(str);
+ break;
+
+ case 's':
+ str = va_arg(ap, const char *);
+ if( !str )
+ str = "(NULL)";
+ strcpy(&string[count], str);
+ count += strlen(str);
+ break;
+
+ case 'c':
+ tmp[0] = (char)va_arg(ap, int);
+ tmp[1] = '\0';
+ strcpy(&string[count], tmp);
+ count++;
+ break;
+
+ case '%':
+ strcpy(&string[count], "%");
+ count++;
+ break;
+
+ case '\0': /* format error */
+ default:
+ return EOF;
+ }
+
+ format += 1;
+ }
+ }
+ }
+ string[count]='\0';
+ return count;
+}
+
+
+int sprintf(char* str, const char *format, ...)
+{
+ va_list ap;
+ int result;
+
+ va_start(ap, format);
+ result = vsprintf(str, format, ap);
+ va_end(ap);
+
+ return result;
+}
diff --git a/arclib/stdio.h b/arclib/stdio.h
new file mode 100644
index 0000000..4a29336
--- /dev/null
+++ b/arclib/stdio.h
@@ -0,0 +1,31 @@
+/*
+ * Copyright 1999 Silicon Graphics, Inc.
+ */
+#ifndef _STDIO_H_
+#define _STDIO_H_
+
+#include "types.h"
+#include <stdarg.h>
+
+typedef ULONG FILE;
+
+#define EOF (-1)
+
+extern FILE *stdin;
+extern FILE *stdout;
+
+extern int fputs(const char *s, FILE * stream);
+extern int puts(const char *s);
+
+extern int fgetc(FILE * stream);
+#define getc(stream) fgetc(stream)
+#define getchar() getc(stdin)
+
+extern int printf(const char *format, ...);
+extern int fprintf(FILE * stream, const char *format, ...);
+extern int sprintf(char* string, const char* format, ...);
+extern int vprintf(const char *format, va_list ap);
+extern int vfprintf(FILE * stream, const char *format, va_list ap);
+extern int vsprtinf(char* string, const char* format, va_list ap);
+
+#endif /* _STDIO_H_ */
diff --git a/arclib/stdlib.c b/arclib/stdlib.c
new file mode 100644
index 0000000..1377ff0
--- /dev/null
+++ b/arclib/stdlib.c
@@ -0,0 +1,118 @@
+/*
+ * Copyright 1999 Silicon Graphics, Inc.
+ */
+#include "stdlib.h"
+#include "string.h"
+#include "arc.h"
+
+
+typedef struct _Node {
+ size_t size;
+ struct _Node *next;
+} Node;
+
+static Node *freeList = NULL;
+
+
+void *malloc(size_t size)
+{
+ Node **free, *mem;
+
+ size +=
+ /* header */ sizeof(Node) + /* round up */ (sizeof(Node) - 1);
+ size -= size % sizeof(Node);
+
+ free = &freeList;
+ while ((*free != NULL) && ((*free)->size < size))
+ free = &((*free)->next);
+
+ mem = *free;
+ if (mem != NULL) {
+ if (mem->size > size) {
+ Node *split = mem + (size / sizeof(Node));
+
+ split->size = mem->size - size;
+ split->next = mem->next;
+ mem->size = size;
+ mem->next = split;
+ }
+ *free = mem->next;
+ mem += 1;
+ }
+
+ return ((void *) mem);
+}
+
+
+void free(void *ptr)
+{
+ if (ptr != NULL) {
+ Node *mem = ((Node *) ptr) - 1;
+ Node **free = &freeList;
+
+ while ((*free != NULL) && (*free < mem)) {
+ if (mem ==
+ (*free + ((*free)->size / sizeof(Node)))) {
+ (*free)->size += mem->size;
+ mem = *free;
+ break;
+ }
+ free = &((*free)->next);
+ }
+
+ if (mem != *free) {
+ mem->next = *free;
+ *free = mem;
+ }
+
+ if (mem->next == (mem + (mem->size / sizeof(Node)))) {
+ mem->size += mem->next->size;
+ mem->next = mem->next->next;
+ }
+ }
+}
+
+
+void *realloc(void *ptr, size_t size)
+{
+ if (ptr == NULL) {
+ ptr = malloc(size);
+ } else {
+ Node *mem = ((Node *) ptr) - 1;
+
+ size +=
+ /* header */ sizeof(Node) +
+ /* round up */ (sizeof(Node) - 1);
+ size -= size % sizeof(Node);
+
+ if (size > mem->size) {
+ /* Should try to grow */
+ void *optr = ptr;
+
+ ptr = malloc(size);
+ if (ptr != NULL) {
+ memcpy(ptr, optr,
+ mem->size - sizeof(Node));
+ free(optr);
+ }
+ } else if (size < mem->size) {
+ Node *split = mem + (size / sizeof(Node));
+
+ split->size = mem->size - size;
+ split->next = mem->next;
+ mem->size = size;
+ free((void *) (split + 1));
+ }
+ }
+
+ return ptr;
+}
+
+
+void arclib_malloc_add(ULONG start, ULONG size)
+{
+ Node *node = (Node *) start;
+
+ node->size = size - (size % sizeof(Node));
+ free((void *) (node + 1));
+}
diff --git a/arclib/stdlib.h b/arclib/stdlib.h
new file mode 100644
index 0000000..7fb829f
--- /dev/null
+++ b/arclib/stdlib.h
@@ -0,0 +1,16 @@
+/*
+ * Copyright 1999 Silicon Graphics, Inc.
+ */
+#ifndef _STDLIB_H_
+#define _STDLIB_H_
+
+#include "stddef.h"
+#include "types.h"
+
+extern void *malloc(size_t size);
+extern void free(void *ptr);
+extern void *realloc(void *ptr, size_t size);
+
+extern void arclib_malloc_add(ULONG start, ULONG size);
+
+#endif /* _STDLIB_H_ */
diff --git a/arclib/string.c b/arclib/string.c
new file mode 100644
index 0000000..6ff3cfb
--- /dev/null
+++ b/arclib/string.c
@@ -0,0 +1,126 @@
+/*
+ * Copyright 1999, 2001 Silicon Graphics, Inc.
+ * Copyright 2001 Ralf Baechle
+ * 2001 Guido Guenther <agx@sgixcpu.org>
+ */
+#include "string.h"
+
+#include "stdlib.h"
+
+size_t strlen(const char *s)
+{
+ size_t len = 0;
+
+ while (*(s++) != '\0')
+ len += 1;
+
+ return len;
+}
+
+
+int strncmp(const char *s1, const char *s2, size_t n)
+{
+ while (n-- > 0) {
+ if (*s1 < *s2)
+ return -1;
+ else if (*s1 > *s2)
+ return 1;
+ else if (*s1 == '\0')
+ return 0;
+ s1 += 1;
+ s2 += 1;
+ }
+
+ return 0;
+}
+
+/* from lib/string.c in the kernel sources */
+int strcmp(const char * cs,const char * ct)
+{
+ register signed char __res;
+
+ while (1) {
+ if ((__res = *cs - *ct++) != 0 || !*cs++)
+ break;
+ }
+
+ return __res;
+}
+
+char *strchr(const char *s, int c)
+{
+ while ((*s != (char) c) && (*s != '\0'))
+ s += 1;
+ return (char *) ((*s == '\0') ? NULL : s);
+}
+
+
+char *strcpy(char *s1, const char *s2)
+{
+ char *s = s1;
+
+ do {
+ *(s1++) = *(s2);
+ } while(*s2++ != 0x0);
+
+ return s;
+}
+
+
+char *strncpy(char *s1, const char *s2, size_t n)
+{
+ char *s = s1;
+
+ while (n-- > 0) {
+ if ((*(s1++) = *(s2++)) == '\0')
+ break;
+ }
+
+ return s;
+}
+
+
+char *strdup(const char *s1)
+{
+ char *str = malloc(strlen(s1) + 1);
+
+ if (str != NULL)
+ strcpy(str, s1);
+ return str;
+}
+
+int memcmp(const void * cs,const void * ct,size_t count)
+{
+ const unsigned char *su1, *su2;
+ signed char res = 0;
+
+ for (su1 = cs, su2 = ct; 0 < count; ++su1, ++su2, count--)
+ if ((res = *su1 - *su2) != 0)
+ break;
+ return res;
+}
+
+void *memcpy(void *s1, const void *s2, size_t n)
+{
+ char *c1 = (char *) s1;
+ const char *c2 = (const char *) s2;
+
+ while (n-- > 0)
+ *(c1++) = *(c2++);
+ return s1;
+}
+
+
+void *memset(void *s, int c, size_t n)
+{
+ char *mem = (char *) s;
+
+ while (n-- > 0)
+ *(mem++) = (char) c;
+ return s;
+}
+
+void __bzero(char *p, int len)
+{
+ memset(p, 0, len);
+}
diff --git a/arclib/string.h b/arclib/string.h
new file mode 100644
index 0000000..53bf111
--- /dev/null
+++ b/arclib/string.h
@@ -0,0 +1,23 @@
+/*
+ * Copyright 1999 Silicon Graphics, Inc.
+ * 2001 Guido Guenther <agx@sigxcpu.org>
+ */
+#ifndef _STRING_H_
+#define _STRING_H_
+
+#include "stddef.h"
+
+extern size_t strlen(const char *s);
+extern int strcmp(const char *s1,const char *s2);
+extern int strncmp(const char *s1, const char *s2, size_t n);
+extern char *strchr(const char *s, int c);
+extern char *strcpy(char *s1, const char *s2);
+extern char *strncpy(char *s1, const char *s2, size_t n);
+extern char *strdup(const char *s1);
+
+extern void *memcpy(void *s1, const void *s2, size_t n);
+extern void *memset(void *s, int c, size_t n);
+int memcmp(const void * cs,const void * ct,size_t count);
+extern void __bzero(char *p, int len);
+
+#endif /* _STRING_H_ */
diff --git a/arclib/types.h b/arclib/types.h
new file mode 100644
index 0000000..6467169
--- /dev/null
+++ b/arclib/types.h
@@ -0,0 +1,14 @@
+/*
+ * Copyright 1999 Silicon Graphics, Inc.
+ */
+#ifndef _TYPES_H_
+#define _TYPES_H_
+
+typedef unsigned short USHORT;
+typedef long LONG;
+typedef unsigned long ULONG;
+typedef void VOID;
+typedef char CHAR;
+typedef unsigned char UCHAR;
+
+#endif /* _TYPES_H_ */