1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier * riscos.c
3f5736e95SDavid du Colombier * Copyright (C) 2001,2002 A.J. van Os; Released under GPL
4f5736e95SDavid du Colombier *
5f5736e95SDavid du Colombier * Description:
6f5736e95SDavid du Colombier * RISC OS only functions
7f5736e95SDavid du Colombier */
8f5736e95SDavid du Colombier
9f5736e95SDavid du Colombier #include <string.h>
10*25b329d5SDavid du Colombier #include <stdlib.h>
11*25b329d5SDavid du Colombier #include <stdarg.h>
12*25b329d5SDavid du Colombier #include "DeskLib:Error.h"
13*25b329d5SDavid du Colombier #include "DeskLib:SWI.h"
14f5736e95SDavid du Colombier #include "antiword.h"
15f5736e95SDavid du Colombier
16f5736e95SDavid du Colombier #if !defined(DrawFile_Render)
17f5736e95SDavid du Colombier #define DrawFile_Render 0x045540
18f5736e95SDavid du Colombier #endif /* !DrawFile_Render */
19f5736e95SDavid du Colombier #if !defined(JPEG_Info)
20f5736e95SDavid du Colombier #define JPEG_Info 0x049980
21f5736e95SDavid du Colombier #endif /* !JPEG_Info */
22f5736e95SDavid du Colombier
23*25b329d5SDavid du Colombier /*
24*25b329d5SDavid du Colombier * werr - write an error message and exit if needed
25*25b329d5SDavid du Colombier */
26*25b329d5SDavid du Colombier void
werr(int iFatal,const char * szFormat,...)27*25b329d5SDavid du Colombier werr(int iFatal, const char *szFormat, ...)
28*25b329d5SDavid du Colombier {
29*25b329d5SDavid du Colombier va_list tArg;
30*25b329d5SDavid du Colombier
31*25b329d5SDavid du Colombier va_start(tArg, szFormat);
32*25b329d5SDavid du Colombier Error_Report(iFatal, (char *)szFormat, tArg);
33*25b329d5SDavid du Colombier va_end(tArg);
34*25b329d5SDavid du Colombier switch (iFatal) {
35*25b329d5SDavid du Colombier case 0: /* The message is just a warning, so no exit */
36*25b329d5SDavid du Colombier return;
37*25b329d5SDavid du Colombier case 1: /* Fatal error with a standard exit */
38*25b329d5SDavid du Colombier exit(EXIT_FAILURE);
39*25b329d5SDavid du Colombier default: /* Fatal error with a non-standard exit */
40*25b329d5SDavid du Colombier exit(iFatal);
41*25b329d5SDavid du Colombier }
42*25b329d5SDavid du Colombier } /* end of werr */
43f5736e95SDavid du Colombier
44f5736e95SDavid du Colombier /*
45f5736e95SDavid du Colombier * iGetFiletype
46f5736e95SDavid du Colombier * This function will get the filetype of the given file.
47f5736e95SDavid du Colombier * returns the filetype.
48f5736e95SDavid du Colombier */
49f5736e95SDavid du Colombier int
iGetFiletype(const char * szFilename)50f5736e95SDavid du Colombier iGetFiletype(const char *szFilename)
51f5736e95SDavid du Colombier {
52*25b329d5SDavid du Colombier os_error *e;
53*25b329d5SDavid du Colombier int iType;
54f5736e95SDavid du Colombier
55f5736e95SDavid du Colombier fail(szFilename == NULL || szFilename[0] == '\0');
56f5736e95SDavid du Colombier
57*25b329d5SDavid du Colombier e = SWI(2, 7, SWI_OS_File | XOS_Bit,
58*25b329d5SDavid du Colombier 23, szFilename,
59*25b329d5SDavid du Colombier NULL, NULL, NULL, NULL, NULL, NULL, &iType);
60f5736e95SDavid du Colombier if (e == NULL) {
61*25b329d5SDavid du Colombier return iType;
62f5736e95SDavid du Colombier }
63f5736e95SDavid du Colombier werr(0, "Get Filetype error %d: %s", e->errnum, e->errmess);
64f5736e95SDavid du Colombier return -1;
65f5736e95SDavid du Colombier } /* end of iGetFiletype */
66f5736e95SDavid du Colombier
67f5736e95SDavid du Colombier /*
68f5736e95SDavid du Colombier * vSetFiletype
69f5736e95SDavid du Colombier * This procedure will set the filetype of the given file to the given
70f5736e95SDavid du Colombier * type.
71f5736e95SDavid du Colombier */
72f5736e95SDavid du Colombier void
vSetFiletype(const char * szFilename,int iFiletype)73f5736e95SDavid du Colombier vSetFiletype(const char *szFilename, int iFiletype)
74f5736e95SDavid du Colombier {
75*25b329d5SDavid du Colombier os_error *e;
76f5736e95SDavid du Colombier
77f5736e95SDavid du Colombier fail(szFilename == NULL || szFilename[0] == '\0');
78f5736e95SDavid du Colombier
79f5736e95SDavid du Colombier if (iFiletype < 0x000 || iFiletype > 0xfff) {
80f5736e95SDavid du Colombier return;
81f5736e95SDavid du Colombier }
82*25b329d5SDavid du Colombier e = SWI(3, 0, SWI_OS_File | XOS_Bit,
83*25b329d5SDavid du Colombier 18, szFilename, iFiletype);
84f5736e95SDavid du Colombier if (e != NULL) {
85f5736e95SDavid du Colombier switch (e->errnum) {
86f5736e95SDavid du Colombier case 0x000113: /* ROM */
87f5736e95SDavid du Colombier case 0x0104e1: /* Read-only floppy DOSFS */
88f5736e95SDavid du Colombier case 0x0108c9: /* Read-only floppy ADFS */
89f5736e95SDavid du Colombier case 0x013803: /* Read-only ArcFS */
90f5736e95SDavid du Colombier case 0x80344a: /* CD-ROM */
91f5736e95SDavid du Colombier break;
92f5736e95SDavid du Colombier default:
93f5736e95SDavid du Colombier werr(0, "Set Filetype error %d: %s",
94f5736e95SDavid du Colombier e->errnum, e->errmess);
95f5736e95SDavid du Colombier break;
96f5736e95SDavid du Colombier }
97f5736e95SDavid du Colombier }
98f5736e95SDavid du Colombier } /* end of vSetFileType */
99f5736e95SDavid du Colombier
100f5736e95SDavid du Colombier /*
101f5736e95SDavid du Colombier * Check if the directory part of the given file exists, make the directory
102f5736e95SDavid du Colombier * if it does not exist yet.
103f5736e95SDavid du Colombier * Returns TRUE in case of success, otherwise FALSE.
104f5736e95SDavid du Colombier */
105f5736e95SDavid du Colombier BOOL
bMakeDirectory(const char * szFilename)106f5736e95SDavid du Colombier bMakeDirectory(const char *szFilename)
107f5736e95SDavid du Colombier {
108*25b329d5SDavid du Colombier os_error *e;
109f5736e95SDavid du Colombier char *pcLastDot;
110*25b329d5SDavid du Colombier int iObjectType;
111f5736e95SDavid du Colombier char szDirectory[PATH_MAX+1];
112f5736e95SDavid du Colombier
113f5736e95SDavid du Colombier DBG_MSG("bMakeDirectory");
114f5736e95SDavid du Colombier fail(szFilename == NULL || szFilename[0] == '\0');
115f5736e95SDavid du Colombier DBG_MSG(szFilename);
116f5736e95SDavid du Colombier
117f5736e95SDavid du Colombier if (strlen(szFilename) >= sizeof(szDirectory)) {
118f5736e95SDavid du Colombier DBG_DEC(strlen(szFilename));
119f5736e95SDavid du Colombier return FALSE;
120f5736e95SDavid du Colombier }
121f5736e95SDavid du Colombier strcpy(szDirectory, szFilename);
122f5736e95SDavid du Colombier pcLastDot = strrchr(szDirectory, '.');
123f5736e95SDavid du Colombier if (pcLastDot == NULL) {
124f5736e95SDavid du Colombier /* No directory equals current directory */
125f5736e95SDavid du Colombier DBG_MSG("No directory part given");
126f5736e95SDavid du Colombier return TRUE;
127f5736e95SDavid du Colombier }
128f5736e95SDavid du Colombier *pcLastDot = '\0';
129f5736e95SDavid du Colombier DBG_MSG(szDirectory);
130f5736e95SDavid du Colombier /* Check if the name exists */
131*25b329d5SDavid du Colombier e = SWI(2, 1, SWI_OS_File | XOS_Bit,
132*25b329d5SDavid du Colombier 17, szDirectory,
133*25b329d5SDavid du Colombier &iObjectType);
134f5736e95SDavid du Colombier if (e != NULL) {
135f5736e95SDavid du Colombier werr(0, "Directory check %d: %s", e->errnum, e->errmess);
136f5736e95SDavid du Colombier return FALSE;
137f5736e95SDavid du Colombier }
138*25b329d5SDavid du Colombier if (iObjectType == 2) {
139f5736e95SDavid du Colombier /* The name exists and it is a directory */
140f5736e95SDavid du Colombier DBG_MSG("The directory already exists");
141f5736e95SDavid du Colombier return TRUE;
142f5736e95SDavid du Colombier }
143*25b329d5SDavid du Colombier if (iObjectType != 0) {
144f5736e95SDavid du Colombier /* The name exists and it is not a directory */
145*25b329d5SDavid du Colombier DBG_DEC(iObjectType);
146f5736e95SDavid du Colombier return FALSE;
147f5736e95SDavid du Colombier }
148f5736e95SDavid du Colombier /* The name does not exist, make the directory */
149*25b329d5SDavid du Colombier e = SWI(5, 0, SWI_OS_File | XOS_Bit,
150*25b329d5SDavid du Colombier 8, szDirectory, 0, 0, 0);
151f5736e95SDavid du Colombier if (e != NULL) {
152f5736e95SDavid du Colombier werr(0, "I can't make a directory %d: %s",
153f5736e95SDavid du Colombier e->errnum, e->errmess);
154f5736e95SDavid du Colombier return FALSE;
155f5736e95SDavid du Colombier }
156f5736e95SDavid du Colombier return TRUE;
157f5736e95SDavid du Colombier } /* end of bMakeDirectory */
158f5736e95SDavid du Colombier
159f5736e95SDavid du Colombier /*
160f5736e95SDavid du Colombier * iReadCurrentAlphabetNumber
161f5736e95SDavid du Colombier * This function reads the current Alphabet number.
162f5736e95SDavid du Colombier * Returns the current Alphabet number when successful, otherwise -1
163f5736e95SDavid du Colombier */
164f5736e95SDavid du Colombier int
iReadCurrentAlphabetNumber(void)165f5736e95SDavid du Colombier iReadCurrentAlphabetNumber(void)
166f5736e95SDavid du Colombier {
167*25b329d5SDavid du Colombier os_error *e;
168*25b329d5SDavid du Colombier int iAlphabetNumber;
169f5736e95SDavid du Colombier
170*25b329d5SDavid du Colombier e = SWI(2, 2, SWI_OS_Byte | XOS_Bit,
171*25b329d5SDavid du Colombier 71, 127,
172*25b329d5SDavid du Colombier NULL, &iAlphabetNumber);
173f5736e95SDavid du Colombier if (e == NULL) {
174*25b329d5SDavid du Colombier return iAlphabetNumber;
175f5736e95SDavid du Colombier }
176f5736e95SDavid du Colombier werr(0, "Read alphabet error %d: %s", e->errnum, e->errmess);
177f5736e95SDavid du Colombier return -1;
178f5736e95SDavid du Colombier } /* end of iReadCurrentAlphabetNumber */
179f5736e95SDavid du Colombier
180f5736e95SDavid du Colombier /*
181f5736e95SDavid du Colombier * iGetRiscOsVersion - get the RISC OS version number
182f5736e95SDavid du Colombier *
183f5736e95SDavid du Colombier * returns the RISC OS version * 100
184f5736e95SDavid du Colombier */
185f5736e95SDavid du Colombier int
iGetRiscOsVersion(void)186f5736e95SDavid du Colombier iGetRiscOsVersion(void)
187f5736e95SDavid du Colombier {
188*25b329d5SDavid du Colombier os_error *e;
189*25b329d5SDavid du Colombier int iVersion;
190f5736e95SDavid du Colombier
191*25b329d5SDavid du Colombier e = SWI(3, 2, SWI_OS_Byte | XOS_Bit,
192*25b329d5SDavid du Colombier 129, 0, 0xff,
193*25b329d5SDavid du Colombier NULL, &iVersion);
194f5736e95SDavid du Colombier if (e != NULL) {
195f5736e95SDavid du Colombier werr(0, "Read RISC OS version error %d: %s",
196f5736e95SDavid du Colombier e->errnum, e->errmess);
197f5736e95SDavid du Colombier return 0;
198f5736e95SDavid du Colombier }
199*25b329d5SDavid du Colombier switch (iVersion) {
200f5736e95SDavid du Colombier case 0xa0: /* Arthur 1.20 */
201f5736e95SDavid du Colombier return 120;
202f5736e95SDavid du Colombier case 0xa1: /* RISC OS 2.00 */
203f5736e95SDavid du Colombier return 200;
204f5736e95SDavid du Colombier case 0xa2: /* RISC OS 2.01 */
205f5736e95SDavid du Colombier return 201;
206f5736e95SDavid du Colombier case 0xa3: /* RISC OS 3.00 */
207f5736e95SDavid du Colombier return 300;
208f5736e95SDavid du Colombier case 0xa4: /* RISC OS 3.1x */
209f5736e95SDavid du Colombier return 310;
210f5736e95SDavid du Colombier case 0xa5: /* RISC OS 3.50 */
211f5736e95SDavid du Colombier return 350;
212f5736e95SDavid du Colombier case 0xa6: /* RISC OS 3.60 */
213f5736e95SDavid du Colombier return 360;
214f5736e95SDavid du Colombier case 0xa7: /* RISC OS 3.7x */
215f5736e95SDavid du Colombier return 370;
216f5736e95SDavid du Colombier case 0xa8: /* RISC OS 4.0x */
217f5736e95SDavid du Colombier return 400;
218f5736e95SDavid du Colombier default:
219*25b329d5SDavid du Colombier if (iVersion >= 0xa9 && iVersion <= 0xaf) {
220f5736e95SDavid du Colombier /* RISC OS 4.10 and up */
221f5736e95SDavid du Colombier return 410;
222f5736e95SDavid du Colombier }
223f5736e95SDavid du Colombier /* Unknown version */
224f5736e95SDavid du Colombier return 0;
225f5736e95SDavid du Colombier }
226f5736e95SDavid du Colombier } /* end of iGetRiscOsVersion */
227f5736e95SDavid du Colombier
228f5736e95SDavid du Colombier #if defined(DEBUG)
229f5736e95SDavid du Colombier BOOL
bGetJpegInfo(UCHAR * pucJpeg,size_t tJpegSize)230f5736e95SDavid du Colombier bGetJpegInfo(UCHAR *pucJpeg, size_t tJpegSize)
231f5736e95SDavid du Colombier {
232*25b329d5SDavid du Colombier os_error *e;
233*25b329d5SDavid du Colombier int iReg0, iReg4, iReg5;
234f5736e95SDavid du Colombier
235*25b329d5SDavid du Colombier e = SWI(3, 6, JPEG_Info | XOS_Bit,
236*25b329d5SDavid du Colombier 0x00, pucJpeg, tJpegSize,
237*25b329d5SDavid du Colombier &iReg0, NULL, NULL, NULL, &iReg4, &iReg5);
238f5736e95SDavid du Colombier if (e == NULL) {
239*25b329d5SDavid du Colombier if (iReg0 & BIT(2)) {
240f5736e95SDavid du Colombier DBG_MSG("Pixel density is a simple ratio");
241f5736e95SDavid du Colombier } else {
242f5736e95SDavid du Colombier DBG_MSG("Pixel density is in dpi");
243f5736e95SDavid du Colombier }
244*25b329d5SDavid du Colombier DBG_DEC(iReg4);
245*25b329d5SDavid du Colombier DBG_DEC(iReg5);
246f5736e95SDavid du Colombier return TRUE;
247f5736e95SDavid du Colombier }
248f5736e95SDavid du Colombier werr(0, "JPEG Info error %d: %s", e->errnum, e->errmess);
249f5736e95SDavid du Colombier return FALSE;
250f5736e95SDavid du Colombier } /* end of bGetJpegInfo */
251f5736e95SDavid du Colombier #endif /* DEBUG */
252