📄 options.c
字号:
/* * options.c * Copyright (C) 1998-2004 A.J. van Os; Released under GNU GPL * * Description: * Read and write the options */#include <stdio.h>#include <stdlib.h>#include <string.h>#if defined(__riscos)#include "DeskLib:Error.h"#include "DeskLib:Wimp.h"#else#include <stdlib.h>#if defined(__dos) || defined(N_PLAT_NLM)extern int getopt(int, char **, const char *);#else#include <unistd.h>#endif /* __dos */#endif /* __riscos */#include "antiword.h"#if defined(__riscos)#define PARAGRAPH_BREAK "set paragraph_break=%d"#define AUTOFILETYPE "set autofiletype_allowed=%d"#define USE_OUTLINEFONTS "set use_outlinefonts=%d"#define SHOW_IMAGES "set show_images=%d"#define HIDE_HIDDEN_TEXT "set hide_hidden_text=%d"#define SCALE_FACTOR_START "set scale_factor_start=%d"#else#define LEAFNAME_SIZE (32+1)#endif /* __riscos *//* Current values for options */static options_type tOptionsCurr;#if defined(__riscos)/* Temporary values for options */static options_type tOptionsTemp;#elsetypedef struct papersize_tag { char szName[16]; /* Papersize name */ USHORT usWidth; /* In points */ USHORT usHeight; /* In points */} papersize_type;static const papersize_type atPaperSizes[] = { { "10x14", 720, 1008 }, { "a3", 842, 1191 }, { "a4", 595, 842 }, { "a5", 420, 595 }, { "b4", 729, 1032 }, { "b5", 516, 729 }, { "executive", 540, 720 }, { "folio", 612, 936 }, { "legal", 612, 1008 }, { "letter", 612, 792 }, { "note", 540, 720 }, { "quarto", 610, 780 }, { "statement", 396, 612 }, { "tabloid", 792, 1224 }, { "", 0, 0 },};#endif /* __riscos *//* Default values for options */static const options_type tOptionsDefault = { DEFAULT_SCREEN_WIDTH,#if defined(__riscos) conversion_draw,#else conversion_text,#endif /* __riscos */ TRUE, TRUE, FALSE, encoding_latin_1, INT_MAX, INT_MAX, level_default,#if defined(__riscos) TRUE, DEFAULT_SCALE_FACTOR,#endif /* __riscos */};#if !defined(__riscos)/* * bCorrectPapersize - see if the papersize is correct * * TRUE if the papersize is correct, otherwise FALSE */static BOOLbCorrectPapersize(const char *szName, conversion_type eConversionType){ const papersize_type *pPaperSize; for (pPaperSize = atPaperSizes; pPaperSize->szName[0] != '\0'; pPaperSize++) { if (!STRCEQ(pPaperSize->szName, szName)) { continue; } DBG_DEC(pPaperSize->usWidth); DBG_DEC(pPaperSize->usHeight); tOptionsCurr.eConversionType = eConversionType; tOptionsCurr.iPageHeight = (int)pPaperSize->usHeight; tOptionsCurr.iPageWidth = (int)pPaperSize->usWidth; return TRUE; } return FALSE;} /* end of bCorrectPapersize *//* * szCreateSuffix - create a suffix for the file * * Returns the suffix */static const char *szCreateSuffix(const char *szLeafname){ const char *pcDot; pcDot = strrchr(szLeafname, '.'); if (pcDot != NULL && STRCEQ(pcDot, ".txt")) { /* There is already a .txt suffix, no need for another one */ return ""; } return ".txt";} /* end of szCreateSuffix *//* * eMappingFile2Encoding - convert the mapping file to an encoding */static encoding_typeeMappingFile2Encoding(const char *szLeafname){ char szMappingFile[LEAFNAME_SIZE+4]; fail(szLeafname == NULL); if (strlen(szLeafname) + 4 >= sizeof(szMappingFile)) { DBG_MSG(szLeafname); return encoding_latin_1; } sprintf(szMappingFile, "%s%s", szLeafname, szCreateSuffix(szLeafname)); DBG_MSG(szMappingFile); if (STRCEQ(szMappingFile, MAPPING_FILE_UTF_8)) { return encoding_utf_8; } if (STRCEQ(szMappingFile, MAPPING_FILE_CP852) || STRCEQ(szMappingFile, MAPPING_FILE_CP1250) || STRCEQ(szMappingFile, MAPPING_FILE_8859_2)) { return encoding_latin_2; } if (STRCEQ(szMappingFile, MAPPING_FILE_KOI8_R) || STRCEQ(szMappingFile, MAPPING_FILE_KOI8_U) || STRCEQ(szMappingFile, MAPPING_FILE_CP866) || STRCEQ(szMappingFile, MAPPING_FILE_CP1251) || STRCEQ(szMappingFile, MAPPING_FILE_8859_5)) { return encoding_cyrillic; } return encoding_latin_1;} /* end of eMappingFile2Encoding */#endif /* !__riscos *//* * pOpenCharacterMappingFile - open the mapping file * * Returns the file pointer or NULL */static FILE *pOpenCharacterMappingFile(const char *szLeafname){#if !defined(__riscos) FILE *pFile; const char *szHome, *szAntiword, *szSuffix; size_t tFilenameLen; char szMappingFile[PATH_MAX+1];#endif /* !__riscos */ if (szLeafname == NULL || szLeafname[0] == '\0') { return NULL; } DBG_MSG(szLeafname);#if defined(__riscos) return fopen(szLeafname, "r");#else /* Set the suffix */ szSuffix = szCreateSuffix(szLeafname); /* Set length */ tFilenameLen = strlen(szLeafname) + strlen(szSuffix); /* Try the environment version of the mapping file */ szAntiword = szGetAntiwordDirectory(); if (szAntiword != NULL && szAntiword[0] != '\0') { if (strlen(szAntiword) + tFilenameLen < sizeof(szMappingFile) - sizeof(FILE_SEPARATOR)) { sprintf(szMappingFile, "%s" FILE_SEPARATOR "%s%s", szAntiword, szLeafname, szSuffix); DBG_MSG(szMappingFile); pFile = fopen(szMappingFile, "r"); if (pFile != NULL) { return pFile; } } else { werr(0, "Environment mappingfilename ignored"); } } /* Try the local version of the mapping file */ szHome = szGetHomeDirectory(); if (strlen(szHome) + tFilenameLen < sizeof(szMappingFile) - sizeof(ANTIWORD_DIR) - 2 * sizeof(FILE_SEPARATOR)) { sprintf(szMappingFile, "%s" FILE_SEPARATOR ANTIWORD_DIR FILE_SEPARATOR "%s%s", szHome, szLeafname, szSuffix); DBG_MSG(szMappingFile); pFile = fopen(szMappingFile, "r"); if (pFile != NULL) { return pFile; } } else { werr(0, "Local mappingfilename too long, ignored"); } /* Try the global version of the mapping file */ if (tFilenameLen < sizeof(szMappingFile) - sizeof(GLOBAL_ANTIWORD_DIR) - sizeof(FILE_SEPARATOR)) { sprintf(szMappingFile, GLOBAL_ANTIWORD_DIR FILE_SEPARATOR "%s%s", szLeafname, szSuffix); DBG_MSG(szMappingFile); pFile = fopen(szMappingFile, "r"); if (pFile != NULL) { return pFile; } } else { werr(0, "Global mappingfilename too long, ignored"); } werr(0, "I can't open your mapping file (%s%s)\n" "It is not in '%s" FILE_SEPARATOR ANTIWORD_DIR "' nor in '" GLOBAL_ANTIWORD_DIR "'.", szLeafname, szSuffix, szHome); return NULL;#endif /* __riscos */} /* end of pOpenCharacterMappingFile *//* * vCloseCharacterMappingFile - close the mapping file */static voidvCloseCharacterMappingFile(FILE *pFile){ (void)fclose(pFile);} /* end of pCloseCharacterMappingFile *//* * iReadOptions - read options * * returns: -1: error * 0: help * >0: index first file argument */intiReadOptions(int argc, char **argv){#if defined(__riscos) FILE *pFile; const char *szAlphabet; int iAlphabet; char szLine[81];#else extern char *optarg; extern int optind; char *pcChar, *szTmp; int iChar; char szLeafname[LEAFNAME_SIZE];#endif /* __riscos */ FILE *pCharacterMappingFile; int iTmp; BOOL bSuccess; DBG_MSG("iReadOptions");/* Defaults */ tOptionsCurr = tOptionsDefault;#if defined(__riscos)/* Choices file */ pFile = fopen("<AntiWord$ChoicesFile>", "r"); DBG_MSG_C(pFile == NULL, "Choices file not found"); DBG_HEX_C(pFile != NULL, pFile); if (pFile != NULL) { while (fgets(szLine, (int)sizeof(szLine), pFile) != NULL) { DBG_MSG(szLine); if (szLine[0] == '#' || szLine[0] == '\r' || szLine[0] == '\n') { continue; } if (sscanf(szLine, PARAGRAPH_BREAK, &iTmp) == 1 && (iTmp == 0 || (iTmp >= MIN_SCREEN_WIDTH && iTmp <= MAX_SCREEN_WIDTH))) { tOptionsCurr.iParagraphBreak = iTmp; DBG_DEC(tOptionsCurr.iParagraphBreak); } else if (sscanf(szLine, AUTOFILETYPE, &iTmp) == 1) { tOptionsCurr.bAutofiletypeAllowed = iTmp != 0; DBG_DEC(tOptionsCurr.bAutofiletypeAllowed); } else if (sscanf(szLine, USE_OUTLINEFONTS, &iTmp) == 1) { tOptionsCurr.eConversionType = iTmp == 0 ? conversion_text : conversion_draw; DBG_DEC(tOptionsCurr.eConversionType); } else if (sscanf(szLine, SHOW_IMAGES, &iTmp) == 1) { tOptionsCurr.eImageLevel = iTmp != 0 ? level_default : level_no_images; } else if (sscanf(szLine, HIDE_HIDDEN_TEXT, &iTmp) == 1) { tOptionsCurr.bHideHiddenText = iTmp != 0; DBG_DEC(tOptionsCurr.bHideHiddenText); } else if (sscanf(szLine, SCALE_FACTOR_START, &iTmp) == 1) { if (iTmp >= MIN_SCALE_FACTOR && iTmp <= MAX_SCALE_FACTOR) { tOptionsCurr.iScaleFactor = iTmp; DBG_DEC(tOptionsCurr.iScaleFactor); } } } (void)fclose(pFile); } iAlphabet = iReadCurrentAlphabetNumber(); switch (iAlphabet) { case 101: /* ISO-8859-1 aka Latin1 */ szAlphabet = "<AntiWord$Latin1>"; break; case 112: /* ISO-8859-15 aka Latin9 */ szAlphabet = "<AntiWord$Latin9>"; break; default: werr(0, "Alphabet '%d' is not supported", iAlphabet); return -1; } pCharacterMappingFile = pOpenCharacterMappingFile(szAlphabet); if (pCharacterMappingFile != NULL) { bSuccess = bReadCharacterMappingTable(pCharacterMappingFile); vCloseCharacterMappingFile(pCharacterMappingFile); } else { bSuccess = FALSE; } return bSuccess ? 1 : -1;#else/* Environment */ szTmp = getenv("COLUMNS"); if (szTmp != NULL) { DBG_MSG(szTmp); iTmp = (int)strtol(szTmp, &pcChar, 10); if (*pcChar == '\0') { iTmp -= 4; /* This is for the edge */ if (iTmp < MIN_SCREEN_WIDTH) { iTmp = MIN_SCREEN_WIDTH; } else if (iTmp > MAX_SCREEN_WIDTH) { iTmp = MAX_SCREEN_WIDTH; } tOptionsCurr.iParagraphBreak = iTmp; DBG_DEC(tOptionsCurr.iParagraphBreak); } } strncpy(szLeafname, szGetDefaultMappingFile(), sizeof(szLeafname) - 1); szLeafname[sizeof(szLeafname) - 1] = '\0';/* Command line */ while ((iChar = getopt(argc, argv, "La:fhi:m:p:rstw:x:")) != -1) { switch (iChar) { case 'L': tOptionsCurr.bUseLandscape = TRUE; break; case 'a': if (!bCorrectPapersize(optarg, conversion_pdf)) { werr(0, "-a without a valid papersize"); return -1; } break; case 'f': tOptionsCurr.eConversionType = conversion_fmt_text; break; case 'h': return 0; case 'i': iTmp = (int)strtol(optarg, &pcChar, 10); if (*pcChar != '\0') { break; } switch (iTmp) { case 0: tOptionsCurr.eImageLevel = level_gs_special; break; case 1: tOptionsCurr.eImageLevel = level_no_images; break; case 2: tOptionsCurr.eImageLevel = level_ps_2; break; case 3: tOptionsCurr.eImageLevel = level_ps_3; break; default: tOptionsCurr.eImageLevel = level_default; break; } DBG_DEC(tOptionsCurr.eImageLevel); break; case 'm': if (tOptionsCurr.eConversionType == conversion_xml) { werr(0, "XML doesn't need a mapping file"); break; } strncpy(szLeafname, optarg, sizeof(szLeafname) - 1); szLeafname[sizeof(szLeafname) - 1] = '\0'; DBG_MSG(szLeafname); break; case 'p': if (!bCorrectPapersize(optarg, conversion_ps)) { werr(0, "-p without a valid papersize"); return -1; } break; case 'r': tOptionsCurr.bRemoveRemovedText = FALSE; break; case 's': tOptionsCurr.bHideHiddenText = FALSE; break; case 't': tOptionsCurr.eConversionType = conversion_text; break; case 'w': iTmp = (int)strtol(optarg, &pcChar, 10); if (*pcChar == '\0') { if (iTmp != 0 && iTmp < MIN_SCREEN_WIDTH) { iTmp = MIN_SCREEN_WIDTH; } else if (iTmp > MAX_SCREEN_WIDTH) { iTmp = MAX_SCREEN_WIDTH; } tOptionsCurr.iParagraphBreak = iTmp; DBG_DEC(tOptionsCurr.iParagraphBreak); } break; case 'x': if (STREQ(optarg, "db")) { tOptionsCurr.iParagraphBreak = 0; tOptionsCurr.eConversionType = conversion_xml; strcpy(szLeafname, MAPPING_FILE_UTF_8); } else { werr(0, "-x %s is not supported", optarg); return -1; } break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -