xref: /plan9/sys/src/cmd/aux/antiword/options.c (revision 25b329d522281a8cdd35da0dcc08c3fc621059a9)
1f5736e95SDavid du Colombier /*
2f5736e95SDavid du Colombier  * options.c
3*25b329d5SDavid du Colombier  * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL
4f5736e95SDavid du Colombier  *
5f5736e95SDavid du Colombier  * Description:
6f5736e95SDavid du Colombier  * Read and write the options
7f5736e95SDavid du Colombier  */
8f5736e95SDavid du Colombier 
9f5736e95SDavid du Colombier #include <stdio.h>
10f5736e95SDavid du Colombier #include <stdlib.h>
11f5736e95SDavid du Colombier #include <string.h>
12f5736e95SDavid du Colombier #if defined(__riscos)
13*25b329d5SDavid du Colombier #include "DeskLib:Error.h"
14*25b329d5SDavid du Colombier #include "DeskLib:Wimp.h"
15f5736e95SDavid du Colombier #else
16f5736e95SDavid du Colombier #include <stdlib.h>
17*25b329d5SDavid du Colombier #if defined(__dos) || defined(N_PLAT_NLM)
18f5736e95SDavid du Colombier extern int getopt(int, char **, const char *);
19f5736e95SDavid du Colombier #else
20f5736e95SDavid du Colombier #include <unistd.h>
21f5736e95SDavid du Colombier #endif /* __dos */
22f5736e95SDavid du Colombier #endif /* __riscos */
23f5736e95SDavid du Colombier #include "antiword.h"
24f5736e95SDavid du Colombier 
25f5736e95SDavid du Colombier #if defined(__riscos)
26f5736e95SDavid du Colombier #define PARAGRAPH_BREAK		"set paragraph_break=%d"
27f5736e95SDavid du Colombier #define AUTOFILETYPE		"set autofiletype_allowed=%d"
28f5736e95SDavid du Colombier #define USE_OUTLINEFONTS	"set use_outlinefonts=%d"
29f5736e95SDavid du Colombier #define SHOW_IMAGES		"set show_images=%d"
30f5736e95SDavid du Colombier #define HIDE_HIDDEN_TEXT	"set hide_hidden_text=%d"
31f5736e95SDavid du Colombier #define SCALE_FACTOR_START	"set scale_factor_start=%d"
32*25b329d5SDavid du Colombier #else
33*25b329d5SDavid du Colombier #define LEAFNAME_SIZE		(32+1)
34f5736e95SDavid du Colombier #endif /* __riscos */
35f5736e95SDavid du Colombier 
36f5736e95SDavid du Colombier /* Current values for options */
37f5736e95SDavid du Colombier static options_type	tOptionsCurr;
38f5736e95SDavid du Colombier #if defined(__riscos)
39f5736e95SDavid du Colombier /* Temporary values for options */
40f5736e95SDavid du Colombier static options_type	tOptionsTemp;
41f5736e95SDavid du Colombier #else
42f5736e95SDavid du Colombier typedef struct papersize_tag {
43f5736e95SDavid du Colombier 	char	szName[16];	/* Papersize name */
44f5736e95SDavid du Colombier 	USHORT	usWidth;	/* In points */
45f5736e95SDavid du Colombier 	USHORT	usHeight;	/* In points */
46f5736e95SDavid du Colombier } papersize_type;
47f5736e95SDavid du Colombier 
48f5736e95SDavid du Colombier static const papersize_type atPaperSizes[] = {
49f5736e95SDavid du Colombier 	{	"10x14",	 720,	1008	},
50f5736e95SDavid du Colombier 	{	"a3",		 842,	1191	},
51f5736e95SDavid du Colombier 	{	"a4",		 595,	 842	},
52f5736e95SDavid du Colombier 	{	"a5",		 420,	 595	},
53f5736e95SDavid du Colombier 	{	"b4",		 729,	1032	},
54f5736e95SDavid du Colombier 	{	"b5",		 516,	 729	},
55f5736e95SDavid du Colombier 	{	"executive",	 540,	 720	},
56f5736e95SDavid du Colombier 	{	"folio",	 612,	 936	},
57f5736e95SDavid du Colombier 	{	"legal",	 612,	1008	},
58f5736e95SDavid du Colombier 	{	"letter",	 612,	 792	},
59f5736e95SDavid du Colombier 	{	"note",		 540,	 720	},
60f5736e95SDavid du Colombier 	{	"quarto",	 610,	 780	},
61f5736e95SDavid du Colombier 	{	"statement",	 396,	 612	},
62f5736e95SDavid du Colombier 	{	"tabloid",	 792,	1224	},
63f5736e95SDavid du Colombier 	{	"",		   0,	   0	},
64f5736e95SDavid du Colombier };
65f5736e95SDavid du Colombier #endif /* __riscos */
66f5736e95SDavid du Colombier /* Default values for options */
67f5736e95SDavid du Colombier static const options_type	tOptionsDefault = {
68f5736e95SDavid du Colombier 	DEFAULT_SCREEN_WIDTH,
69f5736e95SDavid du Colombier #if defined(__riscos)
70f5736e95SDavid du Colombier 	conversion_draw,
71f5736e95SDavid du Colombier #else
72f5736e95SDavid du Colombier 	conversion_text,
73f5736e95SDavid du Colombier #endif /* __riscos */
74f5736e95SDavid du Colombier 	TRUE,
75*25b329d5SDavid du Colombier 	TRUE,
76f5736e95SDavid du Colombier 	FALSE,
77*25b329d5SDavid du Colombier 	encoding_latin_1,
78f5736e95SDavid du Colombier 	INT_MAX,
79f5736e95SDavid du Colombier 	INT_MAX,
80f5736e95SDavid du Colombier 	level_default,
81f5736e95SDavid du Colombier #if defined(__riscos)
82f5736e95SDavid du Colombier 	TRUE,
83f5736e95SDavid du Colombier 	DEFAULT_SCALE_FACTOR,
84f5736e95SDavid du Colombier #endif /* __riscos */
85f5736e95SDavid du Colombier };
86f5736e95SDavid du Colombier 
87f5736e95SDavid du Colombier 
88*25b329d5SDavid du Colombier #if !defined(__riscos)
89*25b329d5SDavid du Colombier /*
90*25b329d5SDavid du Colombier  * bCorrectPapersize - see if the papersize is correct
91*25b329d5SDavid du Colombier  *
92*25b329d5SDavid du Colombier  * TRUE if the papersize is correct, otherwise FALSE
93*25b329d5SDavid du Colombier  */
94*25b329d5SDavid du Colombier static BOOL
bCorrectPapersize(const char * szName,conversion_type eConversionType)95*25b329d5SDavid du Colombier bCorrectPapersize(const char *szName, conversion_type eConversionType)
96*25b329d5SDavid du Colombier {
97*25b329d5SDavid du Colombier 	const papersize_type	*pPaperSize;
98*25b329d5SDavid du Colombier 
99*25b329d5SDavid du Colombier 	for (pPaperSize = atPaperSizes;
100*25b329d5SDavid du Colombier 	     pPaperSize->szName[0] != '\0';
101*25b329d5SDavid du Colombier 	     pPaperSize++) {
102*25b329d5SDavid du Colombier 		if (!STRCEQ(pPaperSize->szName,  szName)) {
103*25b329d5SDavid du Colombier 			continue;
104*25b329d5SDavid du Colombier 		}
105*25b329d5SDavid du Colombier 		DBG_DEC(pPaperSize->usWidth);
106*25b329d5SDavid du Colombier 		DBG_DEC(pPaperSize->usHeight);
107*25b329d5SDavid du Colombier 		tOptionsCurr.eConversionType = eConversionType;
108*25b329d5SDavid du Colombier 		tOptionsCurr.iPageHeight = (int)pPaperSize->usHeight;
109*25b329d5SDavid du Colombier 		tOptionsCurr.iPageWidth = (int)pPaperSize->usWidth;
110*25b329d5SDavid du Colombier 		return TRUE;
111*25b329d5SDavid du Colombier 	}
112*25b329d5SDavid du Colombier 	return FALSE;
113*25b329d5SDavid du Colombier } /* end of bCorrectPapersize */
114*25b329d5SDavid du Colombier 
115*25b329d5SDavid du Colombier /*
116*25b329d5SDavid du Colombier  * szCreateSuffix - create a suffix for the file
117*25b329d5SDavid du Colombier  *
118*25b329d5SDavid du Colombier  * Returns the suffix
119*25b329d5SDavid du Colombier  */
120*25b329d5SDavid du Colombier static const char *
szCreateSuffix(const char * szLeafname)121*25b329d5SDavid du Colombier szCreateSuffix(const char *szLeafname)
122*25b329d5SDavid du Colombier {
123*25b329d5SDavid du Colombier 	const char	*pcDot;
124*25b329d5SDavid du Colombier 
125*25b329d5SDavid du Colombier 	pcDot = strrchr(szLeafname, '.');
126*25b329d5SDavid du Colombier 	if (pcDot != NULL && STRCEQ(pcDot, ".txt")) {
127*25b329d5SDavid du Colombier 		/* There is already a .txt suffix, no need for another one */
128*25b329d5SDavid du Colombier 		return "";
129*25b329d5SDavid du Colombier 	}
130*25b329d5SDavid du Colombier 	return ".txt";
131*25b329d5SDavid du Colombier } /* end of szCreateSuffix */
132*25b329d5SDavid du Colombier 
133*25b329d5SDavid du Colombier /*
134*25b329d5SDavid du Colombier  * eMappingFile2Encoding - convert the mapping file to an encoding
135*25b329d5SDavid du Colombier  */
136*25b329d5SDavid du Colombier static encoding_type
eMappingFile2Encoding(const char * szLeafname)137*25b329d5SDavid du Colombier eMappingFile2Encoding(const char *szLeafname)
138*25b329d5SDavid du Colombier {
139*25b329d5SDavid du Colombier 	char	szMappingFile[LEAFNAME_SIZE+4];
140*25b329d5SDavid du Colombier 
141*25b329d5SDavid du Colombier 	fail(szLeafname == NULL);
142*25b329d5SDavid du Colombier 
143*25b329d5SDavid du Colombier 	if (strlen(szLeafname) + 4 >= sizeof(szMappingFile)) {
144*25b329d5SDavid du Colombier 		DBG_MSG(szLeafname);
145*25b329d5SDavid du Colombier 		return encoding_latin_1;
146*25b329d5SDavid du Colombier 	}
147*25b329d5SDavid du Colombier 
148*25b329d5SDavid du Colombier 	sprintf(szMappingFile, "%s%s", szLeafname, szCreateSuffix(szLeafname));
149*25b329d5SDavid du Colombier 
150*25b329d5SDavid du Colombier 	DBG_MSG(szMappingFile);
151*25b329d5SDavid du Colombier 
152*25b329d5SDavid du Colombier 	if (STRCEQ(szMappingFile, MAPPING_FILE_UTF_8)) {
153*25b329d5SDavid du Colombier 		return encoding_utf_8;
154*25b329d5SDavid du Colombier 	}
155*25b329d5SDavid du Colombier 	if (STRCEQ(szMappingFile, MAPPING_FILE_CP852) ||
156*25b329d5SDavid du Colombier 	    STRCEQ(szMappingFile, MAPPING_FILE_CP1250) ||
157*25b329d5SDavid du Colombier 	    STRCEQ(szMappingFile, MAPPING_FILE_8859_2)) {
158*25b329d5SDavid du Colombier 		return encoding_latin_2;
159*25b329d5SDavid du Colombier 	}
160*25b329d5SDavid du Colombier 	if (STRCEQ(szMappingFile, MAPPING_FILE_KOI8_R) ||
161*25b329d5SDavid du Colombier 	    STRCEQ(szMappingFile, MAPPING_FILE_KOI8_U) ||
162*25b329d5SDavid du Colombier 	    STRCEQ(szMappingFile, MAPPING_FILE_CP866) ||
163*25b329d5SDavid du Colombier 	    STRCEQ(szMappingFile, MAPPING_FILE_CP1251) ||
164*25b329d5SDavid du Colombier 	    STRCEQ(szMappingFile, MAPPING_FILE_8859_5)) {
165*25b329d5SDavid du Colombier 		return encoding_cyrillic;
166*25b329d5SDavid du Colombier 	}
167*25b329d5SDavid du Colombier 	return encoding_latin_1;
168*25b329d5SDavid du Colombier } /* end of eMappingFile2Encoding */
169*25b329d5SDavid du Colombier #endif /* !__riscos */
170*25b329d5SDavid du Colombier 
171*25b329d5SDavid du Colombier /*
172*25b329d5SDavid du Colombier  * pOpenCharacterMappingFile - open the mapping file
173*25b329d5SDavid du Colombier  *
174*25b329d5SDavid du Colombier  * Returns the file pointer or NULL
175*25b329d5SDavid du Colombier  */
176*25b329d5SDavid du Colombier static FILE *
pOpenCharacterMappingFile(const char * szLeafname)177*25b329d5SDavid du Colombier pOpenCharacterMappingFile(const char *szLeafname)
178*25b329d5SDavid du Colombier {
179*25b329d5SDavid du Colombier #if !defined(__riscos)
180*25b329d5SDavid du Colombier 	FILE	*pFile;
181*25b329d5SDavid du Colombier 	const char	*szHome, *szAntiword, *szSuffix;
182*25b329d5SDavid du Colombier 	size_t	tFilenameLen;
183*25b329d5SDavid du Colombier 	char	szMappingFile[PATH_MAX+1];
184*25b329d5SDavid du Colombier #endif /* !__riscos */
185*25b329d5SDavid du Colombier 
186*25b329d5SDavid du Colombier 	if (szLeafname == NULL || szLeafname[0] == '\0') {
187*25b329d5SDavid du Colombier 		return NULL;
188*25b329d5SDavid du Colombier 	}
189*25b329d5SDavid du Colombier 
190*25b329d5SDavid du Colombier 	DBG_MSG(szLeafname);
191*25b329d5SDavid du Colombier 
192*25b329d5SDavid du Colombier #if defined(__riscos)
193*25b329d5SDavid du Colombier 	return fopen(szLeafname, "r");
194*25b329d5SDavid du Colombier #else
195*25b329d5SDavid du Colombier 	/* Set the suffix */
196*25b329d5SDavid du Colombier 	szSuffix = szCreateSuffix(szLeafname);
197*25b329d5SDavid du Colombier 
198*25b329d5SDavid du Colombier 	/* Set length */
199*25b329d5SDavid du Colombier 	tFilenameLen = strlen(szLeafname) + strlen(szSuffix);
200*25b329d5SDavid du Colombier 
201*25b329d5SDavid du Colombier 	/* Try the environment version of the mapping file */
202*25b329d5SDavid du Colombier 	szAntiword = szGetAntiwordDirectory();
203*25b329d5SDavid du Colombier 	if (szAntiword != NULL && szAntiword[0] != '\0') {
204*25b329d5SDavid du Colombier 	    if (strlen(szAntiword) + tFilenameLen <
205*25b329d5SDavid du Colombier 		sizeof(szMappingFile) -
206*25b329d5SDavid du Colombier 		sizeof(FILE_SEPARATOR)) {
207*25b329d5SDavid du Colombier 			sprintf(szMappingFile,
208*25b329d5SDavid du Colombier 				"%s" FILE_SEPARATOR "%s%s",
209*25b329d5SDavid du Colombier 				szAntiword, szLeafname, szSuffix);
210*25b329d5SDavid du Colombier 			DBG_MSG(szMappingFile);
211*25b329d5SDavid du Colombier 			pFile = fopen(szMappingFile, "r");
212*25b329d5SDavid du Colombier 			if (pFile != NULL) {
213*25b329d5SDavid du Colombier 				return pFile;
214*25b329d5SDavid du Colombier 			}
215*25b329d5SDavid du Colombier 		} else {
216*25b329d5SDavid du Colombier 			werr(0, "Environment mappingfilename ignored");
217*25b329d5SDavid du Colombier 		}
218*25b329d5SDavid du Colombier 	}
219*25b329d5SDavid du Colombier 
220*25b329d5SDavid du Colombier 	/* Try the local version of the mapping file */
221*25b329d5SDavid du Colombier 	szHome = szGetHomeDirectory();
222*25b329d5SDavid du Colombier 	if (strlen(szHome) + tFilenameLen <
223*25b329d5SDavid du Colombier 	    sizeof(szMappingFile) -
224*25b329d5SDavid du Colombier 	    sizeof(ANTIWORD_DIR) -
225*25b329d5SDavid du Colombier 	    2 * sizeof(FILE_SEPARATOR)) {
226*25b329d5SDavid du Colombier 		sprintf(szMappingFile,
227*25b329d5SDavid du Colombier 			"%s" FILE_SEPARATOR ANTIWORD_DIR FILE_SEPARATOR "%s%s",
228*25b329d5SDavid du Colombier 			szHome, szLeafname, szSuffix);
229*25b329d5SDavid du Colombier 		DBG_MSG(szMappingFile);
230*25b329d5SDavid du Colombier 		pFile = fopen(szMappingFile, "r");
231*25b329d5SDavid du Colombier 		if (pFile != NULL) {
232*25b329d5SDavid du Colombier 			return pFile;
233*25b329d5SDavid du Colombier 		}
234*25b329d5SDavid du Colombier 	} else {
235*25b329d5SDavid du Colombier 		werr(0, "Local mappingfilename too long, ignored");
236*25b329d5SDavid du Colombier 	}
237*25b329d5SDavid du Colombier 
238*25b329d5SDavid du Colombier 	/* Try the global version of the mapping file */
239*25b329d5SDavid du Colombier 	if (tFilenameLen <
240*25b329d5SDavid du Colombier 	    sizeof(szMappingFile) -
241*25b329d5SDavid du Colombier 	    sizeof(GLOBAL_ANTIWORD_DIR) -
242*25b329d5SDavid du Colombier 	    sizeof(FILE_SEPARATOR)) {
243*25b329d5SDavid du Colombier 		sprintf(szMappingFile,
244*25b329d5SDavid du Colombier 			GLOBAL_ANTIWORD_DIR FILE_SEPARATOR "%s%s",
245*25b329d5SDavid du Colombier 			szLeafname, szSuffix);
246*25b329d5SDavid du Colombier 		DBG_MSG(szMappingFile);
247*25b329d5SDavid du Colombier 		pFile = fopen(szMappingFile, "r");
248*25b329d5SDavid du Colombier 		if (pFile != NULL) {
249*25b329d5SDavid du Colombier 			return pFile;
250*25b329d5SDavid du Colombier 		}
251*25b329d5SDavid du Colombier 	} else {
252*25b329d5SDavid du Colombier 		werr(0, "Global mappingfilename too long, ignored");
253*25b329d5SDavid du Colombier 	}
254*25b329d5SDavid du Colombier 	werr(0, "I can't open your mapping file (%s%s)\n"
255*25b329d5SDavid du Colombier 		"It is not in '%s" FILE_SEPARATOR ANTIWORD_DIR "' nor in '"
256*25b329d5SDavid du Colombier 		GLOBAL_ANTIWORD_DIR "'.", szLeafname, szSuffix, szHome);
257*25b329d5SDavid du Colombier 	return NULL;
258*25b329d5SDavid du Colombier #endif /* __riscos */
259*25b329d5SDavid du Colombier } /* end of pOpenCharacterMappingFile */
260*25b329d5SDavid du Colombier 
261*25b329d5SDavid du Colombier /*
262*25b329d5SDavid du Colombier  * vCloseCharacterMappingFile - close the mapping file
263*25b329d5SDavid du Colombier  */
264*25b329d5SDavid du Colombier static void
vCloseCharacterMappingFile(FILE * pFile)265*25b329d5SDavid du Colombier vCloseCharacterMappingFile(FILE *pFile)
266*25b329d5SDavid du Colombier {
267*25b329d5SDavid du Colombier 	(void)fclose(pFile);
268*25b329d5SDavid du Colombier } /* end of pCloseCharacterMappingFile */
269*25b329d5SDavid du Colombier 
270*25b329d5SDavid du Colombier 
271f5736e95SDavid du Colombier /*
272f5736e95SDavid du Colombier  * iReadOptions - read options
273f5736e95SDavid du Colombier  *
274f5736e95SDavid du Colombier  * returns:	-1: error
275f5736e95SDavid du Colombier  *		 0: help
276f5736e95SDavid du Colombier  *		>0: index first file argument
277f5736e95SDavid du Colombier  */
278f5736e95SDavid du Colombier int
iReadOptions(int argc,char ** argv)279f5736e95SDavid du Colombier iReadOptions(int argc, char **argv)
280f5736e95SDavid du Colombier {
281f5736e95SDavid du Colombier #if defined(__riscos)
282f5736e95SDavid du Colombier 	FILE	*pFile;
283f5736e95SDavid du Colombier 	const char	*szAlphabet;
284f5736e95SDavid du Colombier 	int	iAlphabet;
285f5736e95SDavid du Colombier 	char	szLine[81];
286f5736e95SDavid du Colombier #else
287f5736e95SDavid du Colombier 	extern	char	*optarg;
288f5736e95SDavid du Colombier 	extern int	optind;
289f5736e95SDavid du Colombier 	char	*pcChar, *szTmp;
290f5736e95SDavid du Colombier 	int	iChar;
291*25b329d5SDavid du Colombier 	char	szLeafname[LEAFNAME_SIZE];
292f5736e95SDavid du Colombier #endif /* __riscos */
293*25b329d5SDavid du Colombier 	FILE	*pCharacterMappingFile;
294f5736e95SDavid du Colombier 	int	iTmp;
295*25b329d5SDavid du Colombier 	BOOL	bSuccess;
296f5736e95SDavid du Colombier 
297f5736e95SDavid du Colombier 	DBG_MSG("iReadOptions");
298f5736e95SDavid du Colombier 
299f5736e95SDavid du Colombier /* Defaults */
300f5736e95SDavid du Colombier 	tOptionsCurr = tOptionsDefault;
301f5736e95SDavid du Colombier 
302f5736e95SDavid du Colombier #if defined(__riscos)
303f5736e95SDavid du Colombier /* Choices file */
304f5736e95SDavid du Colombier 	pFile = fopen("<AntiWord$ChoicesFile>", "r");
305f5736e95SDavid du Colombier 	DBG_MSG_C(pFile == NULL, "Choices file not found");
306f5736e95SDavid du Colombier 	DBG_HEX_C(pFile != NULL, pFile);
307f5736e95SDavid du Colombier 	if (pFile != NULL) {
308f5736e95SDavid du Colombier 		while (fgets(szLine, (int)sizeof(szLine), pFile) != NULL) {
309f5736e95SDavid du Colombier 			DBG_MSG(szLine);
310f5736e95SDavid du Colombier 			if (szLine[0] == '#' ||
311f5736e95SDavid du Colombier 			    szLine[0] == '\r' ||
312f5736e95SDavid du Colombier 			    szLine[0] == '\n') {
313f5736e95SDavid du Colombier 				continue;
314f5736e95SDavid du Colombier 			}
315f5736e95SDavid du Colombier 			if (sscanf(szLine, PARAGRAPH_BREAK, &iTmp) == 1 &&
316f5736e95SDavid du Colombier 			    (iTmp == 0 ||
317f5736e95SDavid du Colombier 			    (iTmp >= MIN_SCREEN_WIDTH &&
318f5736e95SDavid du Colombier 			     iTmp <= MAX_SCREEN_WIDTH))) {
319f5736e95SDavid du Colombier 				tOptionsCurr.iParagraphBreak = iTmp;
320f5736e95SDavid du Colombier 				DBG_DEC(tOptionsCurr.iParagraphBreak);
321f5736e95SDavid du Colombier 			} else if (sscanf(szLine, AUTOFILETYPE, &iTmp)
322f5736e95SDavid du Colombier 								== 1) {
323f5736e95SDavid du Colombier 				tOptionsCurr.bAutofiletypeAllowed =
324f5736e95SDavid du Colombier 								iTmp != 0;
325f5736e95SDavid du Colombier 				DBG_DEC(tOptionsCurr.bAutofiletypeAllowed);
326f5736e95SDavid du Colombier 			} else if (sscanf(szLine, USE_OUTLINEFONTS, &iTmp)
327f5736e95SDavid du Colombier 								== 1) {
328f5736e95SDavid du Colombier 				tOptionsCurr.eConversionType =
329f5736e95SDavid du Colombier 					iTmp == 0 ?
330f5736e95SDavid du Colombier 					conversion_text : conversion_draw;
331f5736e95SDavid du Colombier 				DBG_DEC(tOptionsCurr.eConversionType);
332f5736e95SDavid du Colombier 			} else if (sscanf(szLine, SHOW_IMAGES, &iTmp)
333f5736e95SDavid du Colombier 								== 1) {
334f5736e95SDavid du Colombier 				tOptionsCurr.eImageLevel = iTmp != 0 ?
335f5736e95SDavid du Colombier 					level_default : level_no_images;
336f5736e95SDavid du Colombier 			} else if (sscanf(szLine, HIDE_HIDDEN_TEXT, &iTmp)
337f5736e95SDavid du Colombier 								== 1) {
338f5736e95SDavid du Colombier 				tOptionsCurr.bHideHiddenText = iTmp != 0;
339f5736e95SDavid du Colombier 				DBG_DEC(tOptionsCurr.bHideHiddenText);
340f5736e95SDavid du Colombier 			} else if (sscanf(szLine, SCALE_FACTOR_START, &iTmp)
341f5736e95SDavid du Colombier 								== 1) {
342f5736e95SDavid du Colombier 				if (iTmp >= MIN_SCALE_FACTOR &&
343f5736e95SDavid du Colombier 				    iTmp <= MAX_SCALE_FACTOR) {
344f5736e95SDavid du Colombier 					tOptionsCurr.iScaleFactor = iTmp;
345f5736e95SDavid du Colombier 					DBG_DEC(tOptionsCurr.iScaleFactor);
346f5736e95SDavid du Colombier 				}
347f5736e95SDavid du Colombier 			}
348f5736e95SDavid du Colombier 		}
349f5736e95SDavid du Colombier 		(void)fclose(pFile);
350f5736e95SDavid du Colombier 	}
351f5736e95SDavid du Colombier 	iAlphabet = iReadCurrentAlphabetNumber();
352f5736e95SDavid du Colombier 	switch (iAlphabet) {
353f5736e95SDavid du Colombier 	case 101:	/* ISO-8859-1 aka Latin1 */
354f5736e95SDavid du Colombier 		szAlphabet = "<AntiWord$Latin1>";
355f5736e95SDavid du Colombier 		break;
356f5736e95SDavid du Colombier 	case 112:	/* ISO-8859-15 aka Latin9 */
357f5736e95SDavid du Colombier 		szAlphabet = "<AntiWord$Latin9>";
358f5736e95SDavid du Colombier 		break;
359f5736e95SDavid du Colombier 	default:
360f5736e95SDavid du Colombier 		werr(0, "Alphabet '%d' is not supported", iAlphabet);
361f5736e95SDavid du Colombier 		return -1;
362f5736e95SDavid du Colombier 	}
363*25b329d5SDavid du Colombier 	pCharacterMappingFile = pOpenCharacterMappingFile(szAlphabet);
364*25b329d5SDavid du Colombier 	if (pCharacterMappingFile != NULL) {
365*25b329d5SDavid du Colombier 		bSuccess = bReadCharacterMappingTable(pCharacterMappingFile);
366*25b329d5SDavid du Colombier 		vCloseCharacterMappingFile(pCharacterMappingFile);
367*25b329d5SDavid du Colombier 	} else {
368*25b329d5SDavid du Colombier 		bSuccess = FALSE;
369f5736e95SDavid du Colombier 	}
370*25b329d5SDavid du Colombier 	return bSuccess ? 1 : -1;
371f5736e95SDavid du Colombier #else
372f5736e95SDavid du Colombier /* Environment */
373f5736e95SDavid du Colombier 	szTmp = getenv("COLUMNS");
374f5736e95SDavid du Colombier 	if (szTmp != NULL) {
375f5736e95SDavid du Colombier 		DBG_MSG(szTmp);
376f5736e95SDavid du Colombier 		iTmp = (int)strtol(szTmp, &pcChar, 10);
377f5736e95SDavid du Colombier 		if (*pcChar == '\0') {
378f5736e95SDavid du Colombier 			iTmp -= 4;	/* This is for the edge */
379f5736e95SDavid du Colombier 			if (iTmp < MIN_SCREEN_WIDTH) {
380f5736e95SDavid du Colombier 				iTmp = MIN_SCREEN_WIDTH;
381f5736e95SDavid du Colombier 			} else if (iTmp > MAX_SCREEN_WIDTH) {
382f5736e95SDavid du Colombier 				iTmp = MAX_SCREEN_WIDTH;
383f5736e95SDavid du Colombier 			}
384f5736e95SDavid du Colombier 			tOptionsCurr.iParagraphBreak = iTmp;
385f5736e95SDavid du Colombier 			DBG_DEC(tOptionsCurr.iParagraphBreak);
386f5736e95SDavid du Colombier 		}
387f5736e95SDavid du Colombier 	}
388*25b329d5SDavid du Colombier 	strncpy(szLeafname, szGetDefaultMappingFile(), sizeof(szLeafname) - 1);
389*25b329d5SDavid du Colombier 	szLeafname[sizeof(szLeafname) - 1] = '\0';
390f5736e95SDavid du Colombier /* Command line */
391*25b329d5SDavid du Colombier 	while ((iChar = getopt(argc, argv, "La:fhi:m:p:rstw:x:")) != -1) {
392f5736e95SDavid du Colombier 		switch (iChar) {
393f5736e95SDavid du Colombier 		case 'L':
394f5736e95SDavid du Colombier 			tOptionsCurr.bUseLandscape = TRUE;
395f5736e95SDavid du Colombier 			break;
396*25b329d5SDavid du Colombier 		case 'a':
397*25b329d5SDavid du Colombier 			if (!bCorrectPapersize(optarg, conversion_pdf)) {
398*25b329d5SDavid du Colombier 				werr(0, "-a without a valid papersize");
399*25b329d5SDavid du Colombier 				return -1;
400*25b329d5SDavid du Colombier 			}
401*25b329d5SDavid du Colombier 			break;
402*25b329d5SDavid du Colombier 		case 'f':
403*25b329d5SDavid du Colombier 			tOptionsCurr.eConversionType = conversion_fmt_text;
404*25b329d5SDavid du Colombier 			break;
405f5736e95SDavid du Colombier 		case 'h':
406f5736e95SDavid du Colombier 			return 0;
407f5736e95SDavid du Colombier 		case 'i':
408f5736e95SDavid du Colombier 			iTmp = (int)strtol(optarg, &pcChar, 10);
409f5736e95SDavid du Colombier 			if (*pcChar != '\0') {
410f5736e95SDavid du Colombier 				break;
411f5736e95SDavid du Colombier 			}
412f5736e95SDavid du Colombier 			switch (iTmp) {
413f5736e95SDavid du Colombier 			case 0:
414f5736e95SDavid du Colombier 				tOptionsCurr.eImageLevel = level_gs_special;
415f5736e95SDavid du Colombier 				break;
416f5736e95SDavid du Colombier 			case 1:
417f5736e95SDavid du Colombier 				tOptionsCurr.eImageLevel = level_no_images;
418f5736e95SDavid du Colombier 				break;
419f5736e95SDavid du Colombier 			case 2:
420f5736e95SDavid du Colombier 				tOptionsCurr.eImageLevel = level_ps_2;
421f5736e95SDavid du Colombier 				break;
422f5736e95SDavid du Colombier 			case 3:
423f5736e95SDavid du Colombier 				tOptionsCurr.eImageLevel = level_ps_3;
424f5736e95SDavid du Colombier 				break;
425f5736e95SDavid du Colombier 			default:
426f5736e95SDavid du Colombier 				tOptionsCurr.eImageLevel = level_default;
427f5736e95SDavid du Colombier 				break;
428f5736e95SDavid du Colombier 			}
429f5736e95SDavid du Colombier 			DBG_DEC(tOptionsCurr.eImageLevel);
430f5736e95SDavid du Colombier 			break;
431f5736e95SDavid du Colombier 		case 'm':
432f5736e95SDavid du Colombier 			if (tOptionsCurr.eConversionType == conversion_xml) {
433f5736e95SDavid du Colombier 				werr(0, "XML doesn't need a mapping file");
434f5736e95SDavid du Colombier 				break;
435f5736e95SDavid du Colombier 			}
436f5736e95SDavid du Colombier 			strncpy(szLeafname, optarg, sizeof(szLeafname) - 1);
437f5736e95SDavid du Colombier 			szLeafname[sizeof(szLeafname) - 1] = '\0';
438f5736e95SDavid du Colombier 			DBG_MSG(szLeafname);
439f5736e95SDavid du Colombier 			break;
440f5736e95SDavid du Colombier 		case 'p':
441*25b329d5SDavid du Colombier 			if (!bCorrectPapersize(optarg, conversion_ps)) {
442f5736e95SDavid du Colombier 				werr(0, "-p without a valid papersize");
443f5736e95SDavid du Colombier 				return -1;
444f5736e95SDavid du Colombier 			}
445f5736e95SDavid du Colombier 			break;
446*25b329d5SDavid du Colombier 		case 'r':
447*25b329d5SDavid du Colombier 			tOptionsCurr.bRemoveRemovedText = FALSE;
448*25b329d5SDavid du Colombier 			break;
449f5736e95SDavid du Colombier 		case 's':
450f5736e95SDavid du Colombier 			tOptionsCurr.bHideHiddenText = FALSE;
451f5736e95SDavid du Colombier 			break;
452f5736e95SDavid du Colombier 		case 't':
453f5736e95SDavid du Colombier 			tOptionsCurr.eConversionType = conversion_text;
454f5736e95SDavid du Colombier 			break;
455f5736e95SDavid du Colombier 		case 'w':
456f5736e95SDavid du Colombier 			iTmp = (int)strtol(optarg, &pcChar, 10);
457f5736e95SDavid du Colombier 			if (*pcChar == '\0') {
458f5736e95SDavid du Colombier 				if (iTmp != 0 && iTmp < MIN_SCREEN_WIDTH) {
459f5736e95SDavid du Colombier 					iTmp = MIN_SCREEN_WIDTH;
460f5736e95SDavid du Colombier 				} else if (iTmp > MAX_SCREEN_WIDTH) {
461f5736e95SDavid du Colombier 					iTmp = MAX_SCREEN_WIDTH;
462f5736e95SDavid du Colombier 				}
463f5736e95SDavid du Colombier 				tOptionsCurr.iParagraphBreak = iTmp;
464f5736e95SDavid du Colombier 				DBG_DEC(tOptionsCurr.iParagraphBreak);
465f5736e95SDavid du Colombier 			}
466f5736e95SDavid du Colombier 			break;
467f5736e95SDavid du Colombier 		case 'x':
468f5736e95SDavid du Colombier 			if (STREQ(optarg, "db")) {
469f5736e95SDavid du Colombier 				tOptionsCurr.iParagraphBreak = 0;
470f5736e95SDavid du Colombier 				tOptionsCurr.eConversionType = conversion_xml;
471*25b329d5SDavid du Colombier 				strcpy(szLeafname, MAPPING_FILE_UTF_8);
472f5736e95SDavid du Colombier 			} else {
473f5736e95SDavid du Colombier 				werr(0, "-x %s is not supported", optarg);
474f5736e95SDavid du Colombier 				return -1;
475f5736e95SDavid du Colombier 			}
476f5736e95SDavid du Colombier 			break;
477f5736e95SDavid du Colombier 		default:
478f5736e95SDavid du Colombier 			return -1;
479f5736e95SDavid du Colombier 		}
480f5736e95SDavid du Colombier 	}
481f5736e95SDavid du Colombier 
482*25b329d5SDavid du Colombier 	tOptionsCurr.eEncoding = eMappingFile2Encoding(szLeafname);
483*25b329d5SDavid du Colombier 	DBG_DEC(tOptionsCurr.eEncoding);
484*25b329d5SDavid du Colombier 
485f5736e95SDavid du Colombier 	if (tOptionsCurr.eConversionType == conversion_ps &&
486*25b329d5SDavid du Colombier 	    tOptionsCurr.eEncoding == encoding_utf_8) {
487f5736e95SDavid du Colombier 		werr(0,
488f5736e95SDavid du Colombier 		"The combination PostScript and UTF-8 is not supported");
489f5736e95SDavid du Colombier 		return -1;
490f5736e95SDavid du Colombier 	}
491f5736e95SDavid du Colombier 
492*25b329d5SDavid du Colombier 	if (tOptionsCurr.eConversionType == conversion_pdf &&
493*25b329d5SDavid du Colombier 	    tOptionsCurr.eEncoding == encoding_utf_8) {
494*25b329d5SDavid du Colombier 		werr(0,
495*25b329d5SDavid du Colombier 		"The combination PDF and UTF-8 is not supported");
496*25b329d5SDavid du Colombier 		return -1;
497*25b329d5SDavid du Colombier 	}
498*25b329d5SDavid du Colombier 
499*25b329d5SDavid du Colombier 	if (tOptionsCurr.eConversionType == conversion_pdf &&
500*25b329d5SDavid du Colombier 	    tOptionsCurr.eEncoding == encoding_cyrillic) {
501*25b329d5SDavid du Colombier 		werr(0,
502*25b329d5SDavid du Colombier 		"The combination PDF and Cyrillic is not supported");
503*25b329d5SDavid du Colombier 		return -1;
504*25b329d5SDavid du Colombier 	}
505*25b329d5SDavid du Colombier 
506*25b329d5SDavid du Colombier 	if (tOptionsCurr.eConversionType == conversion_ps ||
507*25b329d5SDavid du Colombier 	    tOptionsCurr.eConversionType == conversion_pdf) {
508*25b329d5SDavid du Colombier 		/* PostScript or PDF mode */
509f5736e95SDavid du Colombier 		if (tOptionsCurr.bUseLandscape) {
510f5736e95SDavid du Colombier 			/* Swap the page height and width */
511f5736e95SDavid du Colombier 			iTmp = tOptionsCurr.iPageHeight;
512f5736e95SDavid du Colombier 			tOptionsCurr.iPageHeight = tOptionsCurr.iPageWidth;
513f5736e95SDavid du Colombier 			tOptionsCurr.iPageWidth = iTmp;
514f5736e95SDavid du Colombier 		}
515f5736e95SDavid du Colombier 		/* The paragraph break depends on the width of the paper */
516f5736e95SDavid du Colombier 		tOptionsCurr.iParagraphBreak = iMilliPoints2Char(
517f5736e95SDavid du Colombier 			(long)tOptionsCurr.iPageWidth * 1000 -
518f5736e95SDavid du Colombier 			lDrawUnits2MilliPoints(
519f5736e95SDavid du Colombier 				PS_LEFT_MARGIN + PS_RIGHT_MARGIN));
520f5736e95SDavid du Colombier 		DBG_DEC(tOptionsCurr.iParagraphBreak);
521f5736e95SDavid du Colombier 	}
522f5736e95SDavid du Colombier 
523*25b329d5SDavid du Colombier 	pCharacterMappingFile = pOpenCharacterMappingFile(szLeafname);
524*25b329d5SDavid du Colombier 	if (pCharacterMappingFile != NULL) {
525*25b329d5SDavid du Colombier 		bSuccess = bReadCharacterMappingTable(pCharacterMappingFile);
526*25b329d5SDavid du Colombier 		vCloseCharacterMappingFile(pCharacterMappingFile);
527f5736e95SDavid du Colombier 	} else {
528*25b329d5SDavid du Colombier 		bSuccess = FALSE;
529f5736e95SDavid du Colombier 	}
530*25b329d5SDavid du Colombier 	return bSuccess ? optind : -1;
531f5736e95SDavid du Colombier #endif /* __riscos */
532f5736e95SDavid du Colombier } /* end of iReadOptions */
533f5736e95SDavid du Colombier 
534f5736e95SDavid du Colombier /*
535f5736e95SDavid du Colombier  * vGetOptions - get a copy of the current option values
536f5736e95SDavid du Colombier  */
537f5736e95SDavid du Colombier void
vGetOptions(options_type * pOptions)538f5736e95SDavid du Colombier vGetOptions(options_type *pOptions)
539f5736e95SDavid du Colombier {
540f5736e95SDavid du Colombier 	fail(pOptions == NULL);
541f5736e95SDavid du Colombier 
542f5736e95SDavid du Colombier 	*pOptions = tOptionsCurr;
543f5736e95SDavid du Colombier } /* end of vGetOptions */
544f5736e95SDavid du Colombier 
545f5736e95SDavid du Colombier #if defined(__riscos)
546f5736e95SDavid du Colombier /*
547f5736e95SDavid du Colombier  * vWriteOptions - write the current options to the Options file
548f5736e95SDavid du Colombier  */
549f5736e95SDavid du Colombier static void
vWriteOptions(void)550f5736e95SDavid du Colombier vWriteOptions(void)
551f5736e95SDavid du Colombier {
552f5736e95SDavid du Colombier 	FILE	*pFile;
553f5736e95SDavid du Colombier 	char	*szOptionsFile;
554f5736e95SDavid du Colombier 
555*25b329d5SDavid du Colombier 	TRACE_MSG("vWriteOptions");
556f5736e95SDavid du Colombier 
557f5736e95SDavid du Colombier 	szOptionsFile = getenv("AntiWord$ChoicesSave");
558f5736e95SDavid du Colombier 	if (szOptionsFile == NULL) {
559f5736e95SDavid du Colombier 		werr(0, "Warning: Name of the Choices file not found");
560f5736e95SDavid du Colombier 		return;
561f5736e95SDavid du Colombier 	}
562f5736e95SDavid du Colombier 	if (!bMakeDirectory(szOptionsFile)) {
563f5736e95SDavid du Colombier 		werr(0,
564f5736e95SDavid du Colombier 		"Warning: I can't make a directory for the Choices file");
565f5736e95SDavid du Colombier 		return;
566f5736e95SDavid du Colombier 	}
567f5736e95SDavid du Colombier 	pFile = fopen(szOptionsFile, "w");
568f5736e95SDavid du Colombier 	if (pFile == NULL) {
569f5736e95SDavid du Colombier 		werr(0, "Warning: I can't write the Choices file");
570f5736e95SDavid du Colombier 		return;
571f5736e95SDavid du Colombier 	}
572f5736e95SDavid du Colombier 	(void)fprintf(pFile, PARAGRAPH_BREAK"\n",
573f5736e95SDavid du Colombier 		tOptionsCurr.iParagraphBreak);
574f5736e95SDavid du Colombier 	(void)fprintf(pFile, AUTOFILETYPE"\n",
575f5736e95SDavid du Colombier 		tOptionsCurr.bAutofiletypeAllowed);
576f5736e95SDavid du Colombier 	(void)fprintf(pFile, USE_OUTLINEFONTS"\n",
577f5736e95SDavid du Colombier 		tOptionsCurr.eConversionType == conversion_text ? 0 : 1);
578f5736e95SDavid du Colombier 	(void)fprintf(pFile, SHOW_IMAGES"\n",
579f5736e95SDavid du Colombier 		tOptionsCurr.eImageLevel == level_no_images ? 0 : 1);
580f5736e95SDavid du Colombier 	(void)fprintf(pFile, HIDE_HIDDEN_TEXT"\n",
581f5736e95SDavid du Colombier 		tOptionsCurr.bHideHiddenText);
582f5736e95SDavid du Colombier 	(void)fprintf(pFile, SCALE_FACTOR_START"\n",
583f5736e95SDavid du Colombier 		tOptionsCurr.iScaleFactor);
584f5736e95SDavid du Colombier 	(void)fclose(pFile);
585f5736e95SDavid du Colombier } /* end of vWriteOptions */
586f5736e95SDavid du Colombier 
587f5736e95SDavid du Colombier /*
588f5736e95SDavid du Colombier  * vChoicesOpenAction - action to be taken when the Choices window opens
589f5736e95SDavid du Colombier  */
590f5736e95SDavid du Colombier void
vChoicesOpenAction(window_handle tWindow)591*25b329d5SDavid du Colombier vChoicesOpenAction(window_handle tWindow)
592f5736e95SDavid du Colombier {
593*25b329d5SDavid du Colombier 	TRACE_MSG("vChoicesOpenAction");
594f5736e95SDavid du Colombier 
595f5736e95SDavid du Colombier 	tOptionsTemp = tOptionsCurr;
596f5736e95SDavid du Colombier 	if (tOptionsTemp.iParagraphBreak == 0) {
597f5736e95SDavid du Colombier 		vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, FALSE);
598f5736e95SDavid du Colombier 		vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, TRUE);
599f5736e95SDavid du Colombier 		vUpdateWriteableNumber(tWindow, CHOICES_BREAK_WRITEABLE,
600f5736e95SDavid du Colombier 					DEFAULT_SCREEN_WIDTH);
601f5736e95SDavid du Colombier 	} else {
602f5736e95SDavid du Colombier 		vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, TRUE);
603f5736e95SDavid du Colombier 		vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, FALSE);
604f5736e95SDavid du Colombier 		vUpdateWriteableNumber(tWindow,
605f5736e95SDavid du Colombier 			CHOICES_BREAK_WRITEABLE,
606f5736e95SDavid du Colombier 			tOptionsTemp.iParagraphBreak);
607f5736e95SDavid du Colombier 	}
608f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow, CHOICES_AUTOFILETYPE_BUTTON,
609f5736e95SDavid du Colombier 					tOptionsTemp.bAutofiletypeAllowed);
610f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow, CHOICES_HIDDEN_TEXT_BUTTON,
611f5736e95SDavid du Colombier 					tOptionsTemp.bHideHiddenText);
612f5736e95SDavid du Colombier 	if (tOptionsTemp.eConversionType == conversion_draw) {
613f5736e95SDavid du Colombier 		vUpdateRadioButton(tWindow,
614f5736e95SDavid du Colombier 			CHOICES_WITH_IMAGES_BUTTON,
615f5736e95SDavid du Colombier 			tOptionsTemp.eImageLevel != level_no_images);
616f5736e95SDavid du Colombier 		vUpdateRadioButton(tWindow,
617f5736e95SDavid du Colombier 			CHOICES_NO_IMAGES_BUTTON,
618f5736e95SDavid du Colombier 			tOptionsTemp.eImageLevel == level_no_images);
619f5736e95SDavid du Colombier 		vUpdateRadioButton(tWindow,
620f5736e95SDavid du Colombier 			CHOICES_TEXTONLY_BUTTON, FALSE);
621f5736e95SDavid du Colombier 	} else {
622f5736e95SDavid du Colombier 		vUpdateRadioButton(tWindow,
623f5736e95SDavid du Colombier 			CHOICES_WITH_IMAGES_BUTTON, FALSE);
624f5736e95SDavid du Colombier 		vUpdateRadioButton(tWindow,
625f5736e95SDavid du Colombier 			CHOICES_NO_IMAGES_BUTTON, FALSE);
626f5736e95SDavid du Colombier 		vUpdateRadioButton(tWindow,
627f5736e95SDavid du Colombier 			CHOICES_TEXTONLY_BUTTON, TRUE);
628f5736e95SDavid du Colombier 	}
629f5736e95SDavid du Colombier 	vUpdateWriteableNumber(tWindow,
630f5736e95SDavid du Colombier 		CHOICES_SCALE_WRITEABLE, tOptionsTemp.iScaleFactor);
631*25b329d5SDavid du Colombier 	TRACE_MSG("end of vChoicesOpenAction");
632f5736e95SDavid du Colombier } /* end of vChoicesOpenAction */
633f5736e95SDavid du Colombier 
634f5736e95SDavid du Colombier /*
635f5736e95SDavid du Colombier  * vDefaultButtonAction - action when the default button is clicked
636f5736e95SDavid du Colombier  */
637f5736e95SDavid du Colombier static void
vDefaultButtonAction(window_handle tWindow)638*25b329d5SDavid du Colombier vDefaultButtonAction(window_handle tWindow)
639f5736e95SDavid du Colombier {
640*25b329d5SDavid du Colombier 	TRACE_MSG("vDefaultButtonAction");
641f5736e95SDavid du Colombier 
642f5736e95SDavid du Colombier 	tOptionsTemp = tOptionsDefault;
643f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow, CHOICES_BREAK_BUTTON, TRUE);
644f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow, CHOICES_NO_BREAK_BUTTON, FALSE);
645f5736e95SDavid du Colombier 	vUpdateWriteableNumber(tWindow, CHOICES_BREAK_WRITEABLE,
646f5736e95SDavid du Colombier 			tOptionsTemp.iParagraphBreak);
647f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow, CHOICES_AUTOFILETYPE_BUTTON,
648f5736e95SDavid du Colombier 			tOptionsTemp.bAutofiletypeAllowed);
649f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow, CHOICES_HIDDEN_TEXT_BUTTON,
650f5736e95SDavid du Colombier 			tOptionsTemp.bHideHiddenText);
651f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow, CHOICES_WITH_IMAGES_BUTTON,
652f5736e95SDavid du Colombier 			tOptionsTemp.eConversionType == conversion_draw &&
653f5736e95SDavid du Colombier 			tOptionsTemp.eImageLevel != level_no_images);
654f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow, CHOICES_NO_IMAGES_BUTTON,
655f5736e95SDavid du Colombier 			tOptionsTemp.eConversionType == conversion_draw &&
656f5736e95SDavid du Colombier 			tOptionsTemp.eImageLevel == level_no_images);
657f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow, CHOICES_TEXTONLY_BUTTON,
658f5736e95SDavid du Colombier 			tOptionsTemp.eConversionType == conversion_text);
659f5736e95SDavid du Colombier 	vUpdateWriteableNumber(tWindow, CHOICES_SCALE_WRITEABLE,
660f5736e95SDavid du Colombier 			tOptionsTemp.iScaleFactor);
661f5736e95SDavid du Colombier } /* end of vDefaultButtonAction */
662f5736e95SDavid du Colombier 
663f5736e95SDavid du Colombier /*
664f5736e95SDavid du Colombier  * vApplyButtonAction - action to be taken when the OK button is clicked
665f5736e95SDavid du Colombier  */
666f5736e95SDavid du Colombier static void
vApplyButtonAction(void)667f5736e95SDavid du Colombier vApplyButtonAction(void)
668f5736e95SDavid du Colombier {
669*25b329d5SDavid du Colombier 	TRACE_MSG("vApplyButtonAction");
670f5736e95SDavid du Colombier 
671f5736e95SDavid du Colombier 	tOptionsCurr = tOptionsTemp;
672f5736e95SDavid du Colombier } /* end of vApplyButtonAction */
673f5736e95SDavid du Colombier 
674f5736e95SDavid du Colombier /*
675f5736e95SDavid du Colombier  * vSaveButtonAction - action to be taken when the save button is clicked
676f5736e95SDavid du Colombier  */
677f5736e95SDavid du Colombier static void
vSaveButtonAction(void)678f5736e95SDavid du Colombier vSaveButtonAction(void)
679f5736e95SDavid du Colombier {
680*25b329d5SDavid du Colombier 	TRACE_MSG("vSaveButtonAction");
681f5736e95SDavid du Colombier 
682f5736e95SDavid du Colombier 	vApplyButtonAction();
683f5736e95SDavid du Colombier 	vWriteOptions();
684f5736e95SDavid du Colombier } /* end of vSaveButtonAction */
685f5736e95SDavid du Colombier 
686f5736e95SDavid du Colombier /*
687f5736e95SDavid du Colombier  * vSetParagraphBreak - set the paragraph break to the given number
688f5736e95SDavid du Colombier  */
689f5736e95SDavid du Colombier static void
vSetParagraphBreak(window_handle tWindow,int iNumber)690*25b329d5SDavid du Colombier vSetParagraphBreak(window_handle tWindow, int iNumber)
691f5736e95SDavid du Colombier {
692f5736e95SDavid du Colombier 	tOptionsTemp.iParagraphBreak = iNumber;
693f5736e95SDavid du Colombier 	if (tOptionsTemp.iParagraphBreak == 0) {
694f5736e95SDavid du Colombier 		return;
695f5736e95SDavid du Colombier 	}
696f5736e95SDavid du Colombier 	vUpdateWriteableNumber(tWindow,
697f5736e95SDavid du Colombier 			CHOICES_BREAK_WRITEABLE,
698f5736e95SDavid du Colombier 			tOptionsTemp.iParagraphBreak);
699f5736e95SDavid du Colombier } /* end of vSetParagraphBreak */
700f5736e95SDavid du Colombier 
701f5736e95SDavid du Colombier /*
702f5736e95SDavid du Colombier  * vChangeParagraphBreak - change the paragraph break with the given number
703f5736e95SDavid du Colombier  */
704f5736e95SDavid du Colombier static void
vChangeParagraphBreak(window_handle tWindow,int iNumber)705*25b329d5SDavid du Colombier vChangeParagraphBreak(window_handle tWindow, int iNumber)
706f5736e95SDavid du Colombier {
707f5736e95SDavid du Colombier 	int	iTmp;
708f5736e95SDavid du Colombier 
709f5736e95SDavid du Colombier 	iTmp = tOptionsTemp.iParagraphBreak + iNumber;
710f5736e95SDavid du Colombier 	if (iTmp < MIN_SCREEN_WIDTH || iTmp > MAX_SCREEN_WIDTH) {
711f5736e95SDavid du Colombier 	  	/* Ignore */
712f5736e95SDavid du Colombier 		return;
713f5736e95SDavid du Colombier 	}
714f5736e95SDavid du Colombier 	tOptionsTemp.iParagraphBreak = iTmp;
715f5736e95SDavid du Colombier 	vUpdateWriteableNumber(tWindow,
716f5736e95SDavid du Colombier 			CHOICES_BREAK_WRITEABLE,
717f5736e95SDavid du Colombier 			tOptionsTemp.iParagraphBreak);
718f5736e95SDavid du Colombier } /* end of vChangeParagraphBreak */
719f5736e95SDavid du Colombier 
720f5736e95SDavid du Colombier /*
721f5736e95SDavid du Colombier  * vChangeAutofiletype - invert the permission to autofiletype
722f5736e95SDavid du Colombier  */
723f5736e95SDavid du Colombier static void
vChangeAutofiletype(window_handle tWindow)724*25b329d5SDavid du Colombier vChangeAutofiletype(window_handle tWindow)
725f5736e95SDavid du Colombier {
726f5736e95SDavid du Colombier 	tOptionsTemp.bAutofiletypeAllowed =
727f5736e95SDavid du Colombier 				!tOptionsTemp.bAutofiletypeAllowed;
728f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow,
729f5736e95SDavid du Colombier 			CHOICES_AUTOFILETYPE_BUTTON,
730f5736e95SDavid du Colombier 			tOptionsTemp.bAutofiletypeAllowed);
731f5736e95SDavid du Colombier } /* end of vChangeAutofiletype */
732f5736e95SDavid du Colombier 
733f5736e95SDavid du Colombier /*
734f5736e95SDavid du Colombier  * vChangeHiddenText - invert the hide/show hidden text
735f5736e95SDavid du Colombier  */
736f5736e95SDavid du Colombier static void
vChangeHiddenText(window_handle tWindow)737*25b329d5SDavid du Colombier vChangeHiddenText(window_handle tWindow)
738f5736e95SDavid du Colombier {
739f5736e95SDavid du Colombier 	tOptionsTemp.bHideHiddenText = !tOptionsTemp.bHideHiddenText;
740f5736e95SDavid du Colombier 	vUpdateRadioButton(tWindow,
741f5736e95SDavid du Colombier 			CHOICES_HIDDEN_TEXT_BUTTON,
742f5736e95SDavid du Colombier 			tOptionsTemp.bHideHiddenText);
743f5736e95SDavid du Colombier } /* end of vChangeHiddenText */
744f5736e95SDavid du Colombier 
745f5736e95SDavid du Colombier /*
746f5736e95SDavid du Colombier  * vUseFontsImages - use outline fonts, show images
747f5736e95SDavid du Colombier  */
748f5736e95SDavid du Colombier static void
vUseFontsImages(BOOL bUseOutlineFonts,BOOL bShowImages)749f5736e95SDavid du Colombier vUseFontsImages(BOOL bUseOutlineFonts, BOOL bShowImages)
750f5736e95SDavid du Colombier {
751f5736e95SDavid du Colombier 	tOptionsTemp.eConversionType =
752f5736e95SDavid du Colombier 		bUseOutlineFonts ? conversion_draw : conversion_text;
753f5736e95SDavid du Colombier 	tOptionsTemp.eImageLevel =
754f5736e95SDavid du Colombier 		bUseOutlineFonts && bShowImages ?
755f5736e95SDavid du Colombier 		level_default : level_no_images;
756f5736e95SDavid du Colombier } /* end of vUseFontsImages */
757f5736e95SDavid du Colombier 
758f5736e95SDavid du Colombier /*
759f5736e95SDavid du Colombier  * vSetScaleFactor - set the scale factor to the given number
760f5736e95SDavid du Colombier  */
761f5736e95SDavid du Colombier static void
vSetScaleFactor(window_handle tWindow,int iNumber)762*25b329d5SDavid du Colombier vSetScaleFactor(window_handle tWindow, int iNumber)
763f5736e95SDavid du Colombier {
764f5736e95SDavid du Colombier   	tOptionsTemp.iScaleFactor = iNumber;
765f5736e95SDavid du Colombier 	vUpdateWriteableNumber(tWindow,
766f5736e95SDavid du Colombier 			CHOICES_SCALE_WRITEABLE,
767f5736e95SDavid du Colombier 			tOptionsTemp.iScaleFactor);
768f5736e95SDavid du Colombier } /* end of vSetScaleFactor */
769f5736e95SDavid du Colombier 
770f5736e95SDavid du Colombier /*
771f5736e95SDavid du Colombier  * vChangeScaleFactor - change the scale factor with the given number
772f5736e95SDavid du Colombier  */
773f5736e95SDavid du Colombier static void
vChangeScaleFactor(window_handle tWindow,int iNumber)774*25b329d5SDavid du Colombier vChangeScaleFactor(window_handle tWindow, int iNumber)
775f5736e95SDavid du Colombier {
776f5736e95SDavid du Colombier 	int	iTmp;
777f5736e95SDavid du Colombier 
778f5736e95SDavid du Colombier 	iTmp = tOptionsTemp.iScaleFactor + iNumber;
779f5736e95SDavid du Colombier 	if (iTmp < MIN_SCALE_FACTOR || iTmp > MAX_SCALE_FACTOR) {
780f5736e95SDavid du Colombier 	  	/* Ignore */
781f5736e95SDavid du Colombier 		return;
782f5736e95SDavid du Colombier 	}
783f5736e95SDavid du Colombier 	tOptionsTemp.iScaleFactor = iTmp;
784f5736e95SDavid du Colombier 	vUpdateWriteableNumber(tWindow,
785f5736e95SDavid du Colombier 			CHOICES_SCALE_WRITEABLE,
786f5736e95SDavid du Colombier 			tOptionsTemp.iScaleFactor);
787f5736e95SDavid du Colombier } /* end of vChangeScaleFactor */
788f5736e95SDavid du Colombier 
789f5736e95SDavid du Colombier /*
790f5736e95SDavid du Colombier  * bChoicesMouseClick - handle a mouse click in the Choices window
791f5736e95SDavid du Colombier  */
792*25b329d5SDavid du Colombier BOOL
bChoicesMouseClick(event_pollblock * pEvent,void * pvReference)793*25b329d5SDavid du Colombier bChoicesMouseClick(event_pollblock *pEvent, void *pvReference)
794f5736e95SDavid du Colombier {
795*25b329d5SDavid du Colombier 	icon_handle	tAction;
796*25b329d5SDavid du Colombier 	mouse_block	*pMouse;
797*25b329d5SDavid du Colombier 	BOOL		bCloseWindow;
798f5736e95SDavid du Colombier 
799*25b329d5SDavid du Colombier 	TRACE_MSG("bChoicesMouseClick");
800*25b329d5SDavid du Colombier 
801*25b329d5SDavid du Colombier 	fail(pEvent == NULL);
802*25b329d5SDavid du Colombier 	fail(pEvent->type != event_CLICK);
803*25b329d5SDavid du Colombier 
804*25b329d5SDavid du Colombier 	pMouse = &pEvent->data.mouse;
805*25b329d5SDavid du Colombier 	if (!pMouse->button.data.select && !pMouse->button.data.adjust) {
806*25b329d5SDavid du Colombier 		/* Not handled here */
807*25b329d5SDavid du Colombier 		DBG_HEX(pMouse->button.value);
808*25b329d5SDavid du Colombier 		return FALSE;
809f5736e95SDavid du Colombier 	}
810f5736e95SDavid du Colombier 
811f5736e95SDavid du Colombier 	/* Which action should be taken */
812*25b329d5SDavid du Colombier 	tAction = pMouse->icon;
813*25b329d5SDavid du Colombier 	if (pMouse->button.data.adjust) {
814*25b329d5SDavid du Colombier 	  	/* The adjust button reverses the direction */
815*25b329d5SDavid du Colombier 		switch (pMouse->icon) {
816f5736e95SDavid du Colombier 		case CHOICES_BREAK_UP_BUTTON:
817f5736e95SDavid du Colombier 			tAction = CHOICES_BREAK_DOWN_BUTTON;
818f5736e95SDavid du Colombier 			break;
819f5736e95SDavid du Colombier 		case CHOICES_BREAK_DOWN_BUTTON:
820f5736e95SDavid du Colombier 			tAction = CHOICES_BREAK_UP_BUTTON;
821f5736e95SDavid du Colombier 			break;
822f5736e95SDavid du Colombier 		case CHOICES_SCALE_UP_BUTTON:
823f5736e95SDavid du Colombier 			tAction = CHOICES_SCALE_DOWN_BUTTON;
824f5736e95SDavid du Colombier 			break;
825f5736e95SDavid du Colombier 		case CHOICES_SCALE_DOWN_BUTTON:
826f5736e95SDavid du Colombier 			tAction = CHOICES_SCALE_UP_BUTTON;
827f5736e95SDavid du Colombier 			break;
828f5736e95SDavid du Colombier 		default:
829f5736e95SDavid du Colombier 			break;
830f5736e95SDavid du Colombier 		}
831f5736e95SDavid du Colombier 	}
832f5736e95SDavid du Colombier 
833f5736e95SDavid du Colombier 	/* Actions */
834f5736e95SDavid du Colombier 	bCloseWindow = FALSE;
835f5736e95SDavid du Colombier 	switch (tAction) {
836f5736e95SDavid du Colombier 	case CHOICES_DEFAULT_BUTTON:
837*25b329d5SDavid du Colombier 		vDefaultButtonAction(pMouse->window);
838f5736e95SDavid du Colombier 		break;
839f5736e95SDavid du Colombier 	case CHOICES_SAVE_BUTTON:
840f5736e95SDavid du Colombier 		vSaveButtonAction();
841f5736e95SDavid du Colombier 		break;
842f5736e95SDavid du Colombier 	case CHOICES_CANCEL_BUTTON:
843f5736e95SDavid du Colombier 		bCloseWindow = TRUE;
844f5736e95SDavid du Colombier 		break;
845f5736e95SDavid du Colombier 	case CHOICES_APPLY_BUTTON:
846f5736e95SDavid du Colombier 		vApplyButtonAction();
847f5736e95SDavid du Colombier 		bCloseWindow = TRUE;
848f5736e95SDavid du Colombier 		break;
849f5736e95SDavid du Colombier 	case CHOICES_BREAK_BUTTON:
850*25b329d5SDavid du Colombier 		vSetParagraphBreak(pMouse->window, DEFAULT_SCREEN_WIDTH);
851f5736e95SDavid du Colombier 		break;
852f5736e95SDavid du Colombier 	case CHOICES_BREAK_UP_BUTTON:
853*25b329d5SDavid du Colombier 		vChangeParagraphBreak(pMouse->window, 1);
854f5736e95SDavid du Colombier 		break;
855f5736e95SDavid du Colombier 	case CHOICES_BREAK_DOWN_BUTTON:
856*25b329d5SDavid du Colombier 		vChangeParagraphBreak(pMouse->window, -1);
857f5736e95SDavid du Colombier 		break;
858f5736e95SDavid du Colombier 	case CHOICES_NO_BREAK_BUTTON:
859*25b329d5SDavid du Colombier 		vSetParagraphBreak(pMouse->window, 0);
860f5736e95SDavid du Colombier 		break;
861f5736e95SDavid du Colombier 	case CHOICES_AUTOFILETYPE_BUTTON:
862*25b329d5SDavid du Colombier 		vChangeAutofiletype(pMouse->window);
863f5736e95SDavid du Colombier 		break;
864f5736e95SDavid du Colombier 	case CHOICES_HIDDEN_TEXT_BUTTON:
865*25b329d5SDavid du Colombier 		vChangeHiddenText(pMouse->window);
866f5736e95SDavid du Colombier 		break;
867f5736e95SDavid du Colombier 	case CHOICES_WITH_IMAGES_BUTTON:
868f5736e95SDavid du Colombier 		vUseFontsImages(TRUE, TRUE);
869f5736e95SDavid du Colombier 		break;
870f5736e95SDavid du Colombier 	case CHOICES_NO_IMAGES_BUTTON:
871f5736e95SDavid du Colombier 		vUseFontsImages(TRUE, FALSE);
872f5736e95SDavid du Colombier 		break;
873f5736e95SDavid du Colombier 	case CHOICES_TEXTONLY_BUTTON:
874f5736e95SDavid du Colombier 		vUseFontsImages(FALSE, FALSE);
875f5736e95SDavid du Colombier 		break;
876f5736e95SDavid du Colombier 	case CHOICES_SCALE_UP_BUTTON:
877*25b329d5SDavid du Colombier 		vChangeScaleFactor(pMouse->window, 5);
878f5736e95SDavid du Colombier 		break;
879f5736e95SDavid du Colombier 	case CHOICES_SCALE_DOWN_BUTTON:
880*25b329d5SDavid du Colombier 		vChangeScaleFactor(pMouse->window, -5);
881f5736e95SDavid du Colombier 		break;
882f5736e95SDavid du Colombier 	default:
883*25b329d5SDavid du Colombier 		DBG_DEC(pMouse->icon);
884f5736e95SDavid du Colombier 		break;
885f5736e95SDavid du Colombier 	}
886f5736e95SDavid du Colombier 	if (bCloseWindow) {
887*25b329d5SDavid du Colombier 		Error_CheckFatal(Wimp_CloseWindow(pMouse->window));
888f5736e95SDavid du Colombier 	}
889*25b329d5SDavid du Colombier 	return TRUE;
890*25b329d5SDavid du Colombier } /* end of bChoicesMouseClick */
891f5736e95SDavid du Colombier 
892*25b329d5SDavid du Colombier /*
893*25b329d5SDavid du Colombier  * bChoicesKeyPressed - handle a key in the Choices window
894*25b329d5SDavid du Colombier  */
895*25b329d5SDavid du Colombier BOOL
bChoicesKeyPressed(event_pollblock * pEvent,void * pvReference)896*25b329d5SDavid du Colombier bChoicesKeyPressed(event_pollblock *pEvent, void *pvReference)
897f5736e95SDavid du Colombier {
898*25b329d5SDavid du Colombier 	icon_block	tIcon;
899*25b329d5SDavid du Colombier 	caret_block	*pCaret;
900f5736e95SDavid du Colombier 	char		*pcChar;
901f5736e95SDavid du Colombier 	int		iNumber;
902f5736e95SDavid du Colombier 
903*25b329d5SDavid du Colombier 	DBG_MSG("bChoicesKeyPressed");
904f5736e95SDavid du Colombier 
905*25b329d5SDavid du Colombier 	fail(pEvent == NULL);
906*25b329d5SDavid du Colombier 	fail(pEvent->type != event_KEY);
907f5736e95SDavid du Colombier 
908*25b329d5SDavid du Colombier 	if (pEvent->data.key.code != '\r') {
909*25b329d5SDavid du Colombier 		Error_CheckFatal(Wimp_ProcessKey(pEvent->data.key.code));
910*25b329d5SDavid du Colombier 		return TRUE;
911*25b329d5SDavid du Colombier 	}
912*25b329d5SDavid du Colombier 
913*25b329d5SDavid du Colombier 	pCaret = &pEvent->data.key.caret;
914*25b329d5SDavid du Colombier 
915*25b329d5SDavid du Colombier 	Error_CheckFatal(Wimp_GetIconState(pCaret->window, pCaret->icon, &tIcon));
916*25b329d5SDavid du Colombier 	if (!tIcon.flags.data.text || !tIcon.flags.data.indirected) {
917*25b329d5SDavid du Colombier 		werr(1, "Icon %d must be indirected text", (int)pCaret->icon);
918f5736e95SDavid du Colombier 	}
919f5736e95SDavid du Colombier 	iNumber = (int)strtol(tIcon.data.indirecttext.buffer, &pcChar, 10);
920f5736e95SDavid du Colombier 
921*25b329d5SDavid du Colombier 	switch(pCaret->icon) {
922f5736e95SDavid du Colombier 	case CHOICES_BREAK_WRITEABLE:
923f5736e95SDavid du Colombier 		if (*pcChar != '\0' && *pcChar != '\r') {
924f5736e95SDavid du Colombier 			DBG_DEC(*pcChar);
925f5736e95SDavid du Colombier 			iNumber = DEFAULT_SCREEN_WIDTH;
926f5736e95SDavid du Colombier 		} else if (iNumber < MIN_SCREEN_WIDTH) {
927f5736e95SDavid du Colombier 			iNumber = MIN_SCREEN_WIDTH;
928f5736e95SDavid du Colombier 		} else if (iNumber > MAX_SCREEN_WIDTH) {
929f5736e95SDavid du Colombier 			iNumber = MAX_SCREEN_WIDTH;
930f5736e95SDavid du Colombier 		}
931*25b329d5SDavid du Colombier 		vSetParagraphBreak(pCaret->window, iNumber);
932f5736e95SDavid du Colombier 		break;
933f5736e95SDavid du Colombier 	case CHOICES_SCALE_WRITEABLE:
934f5736e95SDavid du Colombier 		if (*pcChar != '\0' && *pcChar != '\r') {
935f5736e95SDavid du Colombier 			DBG_DEC(*pcChar);
936f5736e95SDavid du Colombier 			iNumber = DEFAULT_SCALE_FACTOR;
937f5736e95SDavid du Colombier 		} else if (iNumber < MIN_SCALE_FACTOR) {
938f5736e95SDavid du Colombier 			iNumber = MIN_SCALE_FACTOR;
939f5736e95SDavid du Colombier 		} else if (iNumber > MAX_SCALE_FACTOR) {
940f5736e95SDavid du Colombier 			iNumber = MAX_SCALE_FACTOR;
941f5736e95SDavid du Colombier 		}
942*25b329d5SDavid du Colombier 		vSetScaleFactor(pCaret->window, iNumber);
943f5736e95SDavid du Colombier 		break;
944f5736e95SDavid du Colombier 	default:
945*25b329d5SDavid du Colombier 		DBG_DEC(pCaret->icon);
946f5736e95SDavid du Colombier 		break;
947f5736e95SDavid du Colombier 	}
948*25b329d5SDavid du Colombier 	return TRUE;
949*25b329d5SDavid du Colombier } /* end of bChoicesKeyPressed */
950f5736e95SDavid du Colombier #endif /* __riscos */
951