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