diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/aux/antiword/riscos.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/aux/antiword/riscos.c')
-rwxr-xr-x | sys/src/cmd/aux/antiword/riscos.c | 251 |
1 files changed, 251 insertions, 0 deletions
diff --git a/sys/src/cmd/aux/antiword/riscos.c b/sys/src/cmd/aux/antiword/riscos.c new file mode 100755 index 000000000..78bd0fdc0 --- /dev/null +++ b/sys/src/cmd/aux/antiword/riscos.c @@ -0,0 +1,251 @@ +/* + * 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 */ |