diff --git a/amiga/os3support.c b/amiga/os3support.c index b9134ac23..e020d0420 100644 --- a/amiga/os3support.c +++ b/amiga/os3support.c @@ -23,6 +23,7 @@ #ifndef __amigaos4__ #include "os3support.h" +/* DOS */ int64 GetFileSize(BPTR fh) { int32 size = 0; @@ -36,4 +37,127 @@ int64 GetFileSize(BPTR fh) return (int64)size; } +/* Exec */ +struct Node *GetHead(struct List *list) +{ + struct Node *res = NULL; + + if ((NULL != list) && (NULL != list->lh_Head->ln_Succ)) + { + res = list->lh_Head; + } + return res; +} + +/* Utility */ +struct FormatContext +{ + STRPTR Index; + LONG Size; + BOOL Overflow; +}; + +STATIC VOID ASM +StuffChar( + REG(a3, struct FormatContext * Context), + REG(d0, UBYTE Char)) +{ + /* Is there still room? */ + if(Context->Size > 0) + { + (*Context->Index) = Char; + + Context->Index++; + Context->Size--; + + /* Is there only a single character left? */ + if(Context->Size == 1) + { + /* Provide null-termination. */ + (*Context->Index) = '\0'; + + /* Don't store any further characters. */ + Context->Size = 0; + } + } + else + { + Context->Overflow = TRUE; + } +} + +BOOL +VSPrintfN( + LONG MaxLen, + STRPTR Buffer, + const STRPTR FormatString, + const va_list VarArgs) +{ + BOOL result = FAILURE; + + /* format a text, but place only up to MaxLen + * characters in the output buffer (including + * the terminating NUL) + */ + + if (Buffer == NULL || FormatString == NULL) return(result); + + if(MaxLen > 1) + { + struct FormatContext Context; + + Context.Index = Buffer; + Context.Size = MaxLen; + Context.Overflow = FALSE; + + RawDoFmt(FormatString,(APTR)VarArgs,(VOID (*)())StuffChar,(APTR)&Context); + + if(NO Context.Overflow) + result = SUCCESS; + } + + return(result); +} + +BOOL +SPrintfN( + LONG MaxLen, + STRPTR Buffer, + const STRPTR FormatString, + ...) +{ + va_list VarArgs; + BOOL result = FAILURE; + + /* format a text, varargs version */ + + if (Buffer == NULL && FormatString == NULL) return result; + + va_start(VarArgs,FormatString); + result = VSPrintfN(MaxLen,Buffer,FormatString,VarArgs); + va_end(VarArgs); + + return(result); +} + +char *ASPrintf(const char *fmt, ...) +{ + int r; + va_list ap; + static char buffer[2048]; + char *rbuf; + + va_start(ap, fmt); + r = VSPrintfN(2048, buffer, (const STRPTR)fmt, ap); + va_end(ap); + + r = strlen(buffer); + rbuf = AllocVec(r+1, MEMF_CLEAR); + if (rbuf != NULL) + { + strncpy(rbuf, buffer, r); + } + return rbuf; +} + #endif diff --git a/amiga/os3support.h b/amiga/os3support.h index 61b6d06ad..1a4ae4c6d 100644 --- a/amiga/os3support.h +++ b/amiga/os3support.h @@ -36,18 +36,21 @@ #include #endif -/* Library bases */ -struct Library *SysBase; -struct Library *DOSBase; -struct Library *IFFParseBase; - /* Define extra memory type flags */ #define MEMF_PRIVATE MEMF_ANY #define MEMF_SHARED MEMF_ANY +/* Ignore tags that aren't supported */ +#define PDTA_PromoteMask TAG_IGNORE + /* Easy wrapper for AllocVecTagList with no tags */ #define AllocVecTagList(SZ,TAG) AllocVec(SZ,MEMF_ANY); +#define Notify(...) (void)0; + +#define FOpen(A,B,C) Open(A,B); +#define FClose(A) Close(A); + /* Integral type definitions */ typedef int8_t int8; typedef uint8_t uint8; @@ -92,7 +95,14 @@ struct TimeVal { #define IDFMT_DIRECTMAPPED (2) /* Direct mapped icon (truecolor 0xAARRGGBB, V51+) */ /* Functions */ +/* DOS */ int64 GetFileSize(BPTR fh); + +/* Exec */ +struct Node *GetHead(struct List *list); + +/* Utility */ +char *ASPrintf(const char *fmt, ...); #endif #endif