summaryrefslogtreecommitdiff
path: root/sys/src/cmd/aux/antiword/riscos.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /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-xsys/src/cmd/aux/antiword/riscos.c251
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 */