⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 options.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * 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 + -