Some easy OS3 compatibility

Credit for most of this: Bernd Gollesch
This commit is contained in:
Chris Young 2015-01-09 00:10:02 +00:00
parent fa3587f122
commit 5a1aaa4e61
2 changed files with 139 additions and 5 deletions

View File

@ -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

View File

@ -36,18 +36,21 @@
#include <exec/memory.h>
#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