Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
 * riscos.c
 * Copyright (C) 2001,2002 A.J. van Os; Released under GPL
 *
 * Description:
 * RISC OS only functions
 */

#include <string.h>
#include <stdlib.h>
#include <stdarg.h>
#include "DeskLib:Error.h"
#include "DeskLib:SWI.h"
#include "antiword.h"

#if !defined(DrawFile_Render)
#define DrawFile_Render         0x045540
#endif /* !DrawFile_Render */
#if !defined(JPEG_Info)
#define JPEG_Info               0x049980
#endif /* !JPEG_Info */

/*
 * werr - write an error message and exit if needed
 */
void
werr(int iFatal, const char *szFormat, ...)
{
        va_list tArg;

        va_start(tArg, szFormat);
        Error_Report(iFatal, (char *)szFormat, tArg);
        va_end(tArg);
        switch (iFatal) {
        case 0:          /* The message is just a warning, so no exit */
                return;
        case 1:         /* Fatal error with a standard exit */
                exit(EXIT_FAILURE);
        default:        /* Fatal error with a non-standard exit */
                exit(iFatal);
        }
} /* end of werr */

/*
 * iGetFiletype
 * This function will get the filetype of the given file.
 * returns the filetype.
 */
int
iGetFiletype(const char *szFilename)
{
        os_error        *e;
        int             iType;

        fail(szFilename == NULL || szFilename[0] == '\0');

        e = SWI(2, 7, SWI_OS_File | XOS_Bit,
                23, szFilename,
                NULL, NULL, NULL, NULL, NULL, NULL, &iType);
        if (e == NULL) {
                return iType;
        }
        werr(0, "Get Filetype error %d: %s", e->errnum, e->errmess);
        return -1;
} /* end of iGetFiletype */

/*
 * vSetFiletype
 * This procedure will set the filetype of the given file to the given
 * type.
 */
void
vSetFiletype(const char *szFilename, int iFiletype)
{
        os_error        *e;

        fail(szFilename == NULL || szFilename[0] == '\0');

        if (iFiletype < 0x000 || iFiletype > 0xfff) {
                return;
        }
        e = SWI(3, 0, SWI_OS_File | XOS_Bit,
                18, szFilename, iFiletype);
        if (e != NULL) {
                switch (e->errnum) {
                case 0x000113:  /* ROM */
                case 0x0104e1:  /* Read-only floppy DOSFS */
                case 0x0108c9:  /* Read-only floppy ADFS */
                case 0x013803:  /* Read-only ArcFS */
                case 0x80344a:  /* CD-ROM */
                        break;
                default:
                        werr(0, "Set Filetype error %d: %s",
                                e->errnum, e->errmess);
                        break;
                }
        }
} /* end of vSetFileType */

/*
 * Check if the directory part of the given file exists, make the directory
 * if it does not exist yet.
 * Returns TRUE in case of success, otherwise FALSE.
 */
BOOL
bMakeDirectory(const char *szFilename)
{
        os_error        *e;
        char    *pcLastDot;
        int     iObjectType;
        char    szDirectory[PATH_MAX+1];

        DBG_MSG("bMakeDirectory");
        fail(szFilename == NULL || szFilename[0] == '\0');
        DBG_MSG(szFilename);

        if (strlen(szFilename) >= sizeof(szDirectory)) {
                DBG_DEC(strlen(szFilename));
                return FALSE;
        }
        strcpy(szDirectory, szFilename);
        pcLastDot = strrchr(szDirectory, '.');
        if (pcLastDot == NULL) {
                /* No directory equals current directory */
                DBG_MSG("No directory part given");
                return TRUE;
        }
        *pcLastDot = '\0';
        DBG_MSG(szDirectory);
        /* Check if the name exists */
        e = SWI(2, 1, SWI_OS_File | XOS_Bit,
                17, szDirectory,
                &iObjectType);
        if (e != NULL) {
                werr(0, "Directory check %d: %s", e->errnum, e->errmess);
                return FALSE;
        }
        if (iObjectType == 2) {
                /* The name exists and it is a directory */
                DBG_MSG("The directory already exists");
                return TRUE;
        }
        if (iObjectType != 0) {
                /* The name exists and it is not a directory */
                DBG_DEC(iObjectType);
                return FALSE;
        }
        /* The name does not exist, make the directory */
        e = SWI(5, 0, SWI_OS_File | XOS_Bit,
                8, szDirectory, 0, 0, 0);
        if (e != NULL) {
                werr(0, "I can't make a directory %d: %s",
                        e->errnum, e->errmess);
                return FALSE;
        }
        return TRUE;
} /* end of bMakeDirectory */

/*
 * iReadCurrentAlphabetNumber
 * This function reads the current Alphabet number.
 * Returns the current Alphabet number when successful, otherwise -1
 */
int
iReadCurrentAlphabetNumber(void)
{
        os_error        *e;
        int             iAlphabetNumber;

        e = SWI(2, 2, SWI_OS_Byte | XOS_Bit,
                71, 127,
                NULL, &iAlphabetNumber);
        if (e == NULL) {
                return iAlphabetNumber;
        }
        werr(0, "Read alphabet error %d: %s", e->errnum, e->errmess);
        return -1;
} /* end of iReadCurrentAlphabetNumber */

/*
 * iGetRiscOsVersion - get the RISC OS version number
 *
 * returns the RISC OS version * 100
 */
int
iGetRiscOsVersion(void)
{
        os_error        *e;
        int             iVersion;

        e = SWI(3, 2, SWI_OS_Byte | XOS_Bit,
                129, 0, 0xff,
                NULL, &iVersion);
        if (e != NULL) {
                werr(0, "Read RISC OS version error %d: %s",
                        e->errnum, e->errmess);
                return 0;
        }
        switch (iVersion) {
        case 0xa0:      /* Arthur 1.20 */
                return 120;
        case 0xa1:      /* RISC OS 2.00 */
                return 200;
        case 0xa2:      /* RISC OS 2.01 */
                return 201;
        case 0xa3:      /* RISC OS 3.00 */
                return 300;
        case 0xa4:      /* RISC OS 3.1x */
                return 310;
        case 0xa5:      /* RISC OS 3.50 */
                return 350;
        case 0xa6:      /* RISC OS 3.60 */
                return 360;
        case 0xa7:      /* RISC OS 3.7x */
                return 370;
        case 0xa8:      /* RISC OS 4.0x */
                return 400;
        default:
                if (iVersion >= 0xa9 && iVersion <= 0xaf) {
                        /* RISC OS 4.10 and up */
                        return 410;
                }
                /* Unknown version */
                return 0;
        }
} /* end of iGetRiscOsVersion */

#if defined(DEBUG)
BOOL
bGetJpegInfo(UCHAR *pucJpeg, size_t tJpegSize)
{
        os_error        *e;
        int     iReg0, iReg4, iReg5;

        e = SWI(3, 6, JPEG_Info | XOS_Bit,
                0x00, pucJpeg, tJpegSize,
                &iReg0, NULL, NULL, NULL, &iReg4, &iReg5);
        if (e == NULL) {
                if (iReg0 & BIT(2)) {
                        DBG_MSG("Pixel density is a simple ratio");
                } else {
                        DBG_MSG("Pixel density is in dpi");
                }
                DBG_DEC(iReg4);
                DBG_DEC(iReg5);
                return TRUE;
        }
        werr(0, "JPEG Info error %d: %s", e->errnum, e->errmess);
        return FALSE;
} /* end of bGetJpegInfo */
#endif /* DEBUG */