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