From d1e063beb43e595680c65e3804d1f8ddff53373b Mon Sep 17 00:00:00 2001 From: Guido Guenther Date: Sat, 18 Nov 2006 23:48:07 +0100 Subject: Imported Debian version 0.3.8.8 --- arclib/Makefile | 20 ++++ arclib/arc.c | 226 +++++++++++++++++++++++++++++++++++++++++++++ arclib/arc.h | 262 ++++++++++++++++++++++++++++++++++++++++++++++++++++ arclib/spb.h | 96 +++++++++++++++++++ arclib/stddef.h | 11 +++ arclib/stdio.c | 281 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ arclib/stdio.h | 31 +++++++ arclib/stdlib.c | 118 ++++++++++++++++++++++++ arclib/stdlib.h | 16 ++++ arclib/string.c | 126 +++++++++++++++++++++++++ arclib/string.h | 23 +++++ arclib/types.h | 14 +++ 12 files changed, 1224 insertions(+) create mode 100644 arclib/Makefile create mode 100644 arclib/arc.c create mode 100644 arclib/arc.h create mode 100644 arclib/spb.h create mode 100644 arclib/stddef.h create mode 100644 arclib/stdio.c create mode 100644 arclib/stdio.h create mode 100644 arclib/stdlib.c create mode 100644 arclib/stdlib.h create mode 100644 arclib/string.c create mode 100644 arclib/string.h create mode 100644 arclib/types.h (limited to 'arclib') 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 + */ +#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 + +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 + +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 + */ +#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 + */ +#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_ */ -- cgit v1.2.3