mirror of
https://github.com/simon987/antiword.git
synced 2025-04-10 13:06:41 +00:00
252 lines
5.4 KiB
C
252 lines
5.4 KiB
C
/*
|
|
* 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 */
|