xref: /plan9/sys/src/cmd/aux/antiword/riscos.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
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