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

📄 summary.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 2 页
字号:
	/* Second check the summary information block */	ulBeginSumdInfo = 128 * (ULONG)usGetWord(0x1c, aucHeader);	DBG_HEX(ulBeginSumdInfo);	ulBeginNextBlock = 128 * (ULONG)usGetWord(0x6a, aucHeader);	DBG_HEX(ulBeginNextBlock);	if (ulBeginSumdInfo >= ulBeginNextBlock || ulBeginNextBlock == 0) {		/* There is no summary information block */		return;	}	tLen = (size_t)(ulBeginNextBlock - ulBeginSumdInfo);	aucBuffer = xmalloc(tLen);	/* Read the summary information block */	if (!bReadBytes(aucBuffer, tLen, ulBeginSumdInfo, pFile)) {		return;	}	usOffset = usGetWord(0, aucBuffer);	if (aucBuffer[usOffset] != 0) {		NO_DBG_MSG(aucBuffer + usOffset);		szTitle = xstrdup((char *)aucBuffer + usOffset);	}	usOffset = usGetWord(2, aucBuffer);	if (aucBuffer[usOffset] != 0) {		NO_DBG_MSG(aucBuffer + usOffset);		szAuthor = xstrdup((char *)aucBuffer + usOffset);	}	usOffset = usGetWord(12, aucBuffer);	if (aucBuffer[usOffset] != 0) {		NO_DBG_STRN(aucBuffer + usOffset, 8);		tLastSaveDtm = tConvertDosDate((char *)aucBuffer + usOffset);	}	usOffset = usGetWord(14, aucBuffer);	if (aucBuffer[usOffset] != 0) {		NO_DBG_STRN(aucBuffer + usOffset, 8);		tCreateDtm = tConvertDosDate((char *)aucBuffer + usOffset);	}	aucBuffer = xfree(aucBuffer);} /* end of vSet0SummaryInfo *//* * vSet2SummaryInfo - set summary information from a WinWord 1/2 file */voidvSet2SummaryInfo(FILE *pFile, int iWordVersion, const UCHAR *aucHeader){	UCHAR	*aucBuffer;	ULONG	ulBeginSumdInfo, ulBeginDocpInfo, ulTmp;	size_t	tSumdInfoLen, tDocpInfoLen, tLen, tCounter, tStart;	TRACE_MSG("vSet2SummaryInfo");	fail(pFile == NULL || aucHeader == NULL);	fail(iWordVersion != 1 && iWordVersion != 2);	/* First check the header */	usLid = usGetWord(0x06, aucHeader); /* Language IDentification */	DBG_HEX(usLid);	if (usLid < 999 && iWordVersion == 1) {		switch (usLid) {		case   1: usLid = 0x0409; break;	/* American English */		case   2: usLid = 0x0c0c; break;	/* Canadian French */		case  31: usLid = 0x0413; break;	/* Dutch */		case  33: usLid = 0x040c; break;	/* French */		case  34: usLid = 0x040a; break;	/* Spanish */		case  36: usLid = 0x040e; break;	/* Hungarian */		case  39: usLid = 0x0410; break;	/* Italian */		case  44: usLid = 0x0809; break;	/* British English */		case  45: usLid = 0x0406; break;	/* Danish */		case  46: usLid = 0x041f; break;	/* Swedish */		case  47: usLid = 0x0414; break;	/* Norwegian */		case  48: usLid = 0x0415; break;	/* Polish */		case  49: usLid = 0x0407; break;	/* German */		case 351: usLid = 0x0816; break;	/* Portuguese */		case 358: usLid = 0x040b; break;	/* Finnish */		default:			DBG_DEC(usLid);			DBG_FIXME();			usLid = 0x0409;		/* American English */			break;		}	}	if (iWordVersion != 2) {		/* Unknown where to find the associated strings */		return;	}	/* Second check the associated strings */	ulBeginSumdInfo = ulGetLong(0x118, aucHeader); /* fcSttbfAssoc */	DBG_HEX(ulBeginSumdInfo);	tSumdInfoLen = (size_t)usGetWord(0x11c, aucHeader); /* cbSttbfAssoc */	DBG_DEC(tSumdInfoLen);	if (tSumdInfoLen == 0) {		/* There is no summary information */		return;	}	aucBuffer = xmalloc(tSumdInfoLen);	if (!bReadBytes(aucBuffer, tSumdInfoLen, ulBeginSumdInfo, pFile)) {		aucBuffer = xfree(aucBuffer);		return;	}	NO_DBG_PRINT_BLOCK(aucBuffer, tSumdInfoLen);	tLen = (size_t)ucGetByte(0, aucBuffer);	DBG_DEC_C(tSumdInfoLen != tLen, tSumdInfoLen);	DBG_DEC_C(tSumdInfoLen != tLen, tLen);	tStart = 1;	for (tCounter = 0; tCounter < 17; tCounter++) {		if (tStart >= tSumdInfoLen) {			break;		}		tLen = (size_t)ucGetByte(tStart, aucBuffer);		if (tLen != 0) {			NO_DBG_DEC(tCounter);			NO_DBG_STRN(aucBuffer + tStart + 1, tLen);			switch (tCounter) {			case 3:				szTitle = xmalloc(tLen + 1);				strncpy(szTitle,					(char *)aucBuffer + tStart + 1, tLen);				szTitle[tLen] = '\0';				break;			case 4:				szSubject = xmalloc(tLen + 1);				strncpy(szSubject,					(char *)aucBuffer + tStart + 1, tLen);				szSubject[tLen] = '\0';				break;			case 7:				szAuthor = xmalloc(tLen + 1);				strncpy(szAuthor,					(char *)aucBuffer + tStart + 1, tLen);				szAuthor[tLen] = '\0';				break;			default:				break;			}		}		tStart += tLen + 1;	}	aucBuffer = xfree(aucBuffer);	/* Third check the document properties */	ulBeginDocpInfo = ulGetLong(0x112, aucHeader); /* fcDop */	DBG_HEX(ulBeginDocpInfo);	tDocpInfoLen = (size_t)usGetWord(0x116, aucHeader); /* cbDop */	DBG_DEC(tDocpInfoLen);	if (tDocpInfoLen < 12) {		return;	}	aucBuffer = xmalloc(tDocpInfoLen);	if (!bReadBytes(aucBuffer, tDocpInfoLen, ulBeginDocpInfo, pFile)) {		aucBuffer = xfree(aucBuffer);		return;	}        ulTmp = ulGetLong(0x14, aucBuffer); /* dttmCreated */	tCreateDtm = tConvertDTTM(ulTmp);        ulTmp = ulGetLong(0x18, aucBuffer); /* dttmRevised */	tLastSaveDtm = tConvertDTTM(ulTmp);	aucBuffer = xfree(aucBuffer);} /* end of vSet2SummaryInfo *//* * vSetSummaryInfoOLE - set summary information from a Word 6+ file */static voidvSetSummaryInfoOLE(FILE *pFile, const pps_info_type *pPPS,	const ULONG *aulBBD, size_t tBBDLen,	const ULONG *aulSBD, size_t tSBDLen){	UCHAR	*pucBuffer;	fail(pFile == NULL || pPPS == NULL);	fail(aulBBD == NULL || aulSBD == NULL);	/* Summary Information */	pucBuffer = pucAnalyseSummaryInfoHeader(pFile,		pPPS->tSummaryInfo.ulSB, pPPS->tSummaryInfo.ulSize,		aulBBD, tBBDLen, aulSBD, tSBDLen);	if (pucBuffer != NULL) {		vAnalyseSummaryInfo(pucBuffer);		pucBuffer = xfree(pucBuffer);	}	/* Document Summary Information */	pucBuffer = pucAnalyseSummaryInfoHeader(pFile,		pPPS->tDocSummaryInfo.ulSB, pPPS->tDocSummaryInfo.ulSize,		aulBBD, tBBDLen, aulSBD, tSBDLen);	if (pucBuffer != NULL) {		vAnalyseDocumentSummaryInfo(pucBuffer);		pucBuffer = xfree(pucBuffer);	}} /* end of vSetSummaryInfoOLE *//* * vSet6SummaryInfo - set summary information from a Word 6/7 file */voidvSet6SummaryInfo(FILE *pFile, const pps_info_type *pPPS,	const ULONG *aulBBD, size_t tBBDLen,	const ULONG *aulSBD, size_t tSBDLen,	const UCHAR *aucHeader){	TRACE_MSG("vSet6SummaryInfo");	/* Header Information */	usLid = usGetWord(0x06, aucHeader); /* Language IDentification */	DBG_HEX(usLid);	/* Summery Information */	vSetSummaryInfoOLE(pFile, pPPS, aulBBD, tBBDLen, aulSBD, tSBDLen);} /* end of vSet6SummaryInfo *//* * vSet8SummaryInfo - set summary information a Word 8/9/10 file */voidvSet8SummaryInfo(FILE *pFile, const pps_info_type *pPPS,	const ULONG *aulBBD, size_t tBBDLen,	const ULONG *aulSBD, size_t tSBDLen,	const UCHAR *aucHeader){	USHORT	usTmp;	TRACE_MSG("vSet8SummaryInfo");	/* Header Information */	usTmp = usGetWord(0x0a, aucHeader);	if (usTmp & BIT(14)) {		/* Language IDentification Far East */		usLid = usGetWord(0x3c, aucHeader);	} else {		/* Language IDentification */		usLid = usGetWord(0x06, aucHeader);	}	DBG_HEX(usLid);	/* Summery Information */	vSetSummaryInfoOLE(pFile, pPPS, aulBBD, tBBDLen, aulSBD, tSBDLen);} /* end of vSet8SummaryInfo *//* * szGetTitle - get the title field */const char *szGetTitle(void){	return szTitle;} /* end of szGetTitle *//* * szGetSubject - get the subject field */const char *szGetSubject(void){	return szSubject;} /* end of szGetSubject *//* * szGetAuthor - get the author field */const char *szGetAuthor(void){	return szAuthor;} /* end of szGetAuthor *//* * szGetLastSaveDtm - get the last save date field */const char *szGetLastSaveDtm(void){	static char	szTime[12];	struct tm	*pTime;	if (tLastSaveDtm == (time_t)-1) {		return NULL;	}	pTime = localtime(&tLastSaveDtm);	if (pTime == NULL) {		return NULL;	}	sprintf(szTime, "%04d-%02d-%02d",		pTime->tm_year + 1900, pTime->tm_mon + 1, pTime->tm_mday);	return szTime;} /* end of szGetLastSaveDtm *//* * szGetModDate - get the last save date field */const char *szGetModDate(void){	static char	szTime[20];	struct tm	*pTime;	if (tLastSaveDtm == (time_t)-1) {		return NULL;	}	pTime = localtime(&tLastSaveDtm);	if (pTime == NULL) {		return NULL;	}	sprintf(szTime, "D:%04d%02d%02d%02d%02d",		pTime->tm_year + 1900, pTime->tm_mon + 1, pTime->tm_mday,		pTime->tm_hour, pTime->tm_min);	return szTime;} /* end of szGetModDate *//* * szGetCreationDate - get the last save date field */const char *szGetCreationDate(void){	static char	szTime[20];	struct tm	*pTime;	if (tCreateDtm == (time_t)-1) {		return NULL;	}	pTime = localtime(&tCreateDtm);	if (pTime == NULL) {		return NULL;	}	sprintf(szTime, "D:%04d%02d%02d%02d%02d",		pTime->tm_year + 1900, pTime->tm_mon + 1, pTime->tm_mday,		pTime->tm_hour, pTime->tm_min);	return szTime;} /* end of szGetCreationDate *//* * szGetCompany - get the company field */const char *szGetCompany(void){	return szCompany;} /* end of szGetCompany *//* * szGetLanguage - get de language field */const char *szGetLanguage(void){	if (usLid == (USHORT)-1) {		/* No Language IDentification */		return NULL;	}	if (usLid < 999) {		/* This is a Locale, not a Language IDentification */		DBG_DEC(usLid);		return NULL;	}	/* Exceptions to the general rule */	switch (usLid) {	case 0x0404: return "zh_TW"; /* Traditional Chinese */	case 0x0804: return "zh_CN"; /* Simplified Chinese */	case 0x0c04: return "zh_HK"; /* Hong Kong Chinese */	case 0x1004: return "zh_SG"; /* Singapore Chinese */	case 0x0807: return "de_CH"; /* Swiss German */	case 0x0409: return "en_US"; /* American English */	case 0x0809: return "en_GB"; /* British English */	case 0x0c09: return "en_AU"; /* Australian English */	case 0x080a: return "es_MX"; /* Mexican Spanish */	case 0x080c: return "fr_BE"; /* Belgian French */	case 0x0c0c: return "fr_CA"; /* Canadian French */	case 0x100c: return "fr_CH"; /* Swiss French */	case 0x0810: return "it_CH"; /* Swiss Italian */	case 0x0813: return "nl_BE"; /* Belgian Dutch */	case 0x0416: return "pt_BR"; /* Brazilian Portuguese */	case 0x081a:	case 0x0c1a: return "sr";    /* Serbian */	case 0x081d: return "sv_FI"; /* Finland Swedish */	default:		break;	}	/* The general rule */	switch (usLid & 0x00ff) {	case 0x01: return "ar";	/* Arabic */	case 0x02: return "bg";	/* Bulgarian */	case 0x03: return "ca";	/* Catalan */	case 0x04: return "zh";	/* Chinese */	case 0x05: return "cs";	/* Czech */	case 0x06: return "da";	/* Danish */	case 0x07: return "de";	/* German */	case 0x08: return "el";	/* Greek */	case 0x09: return "en";	/* English */	case 0x0a: return "es";	/* Spanish */	case 0x0b: return "fi";	/* Finnish */	case 0x0c: return "fr";	/* French */	case 0x0d: return "he";	/* Hebrew */	case 0x0e: return "hu";	/* Hungarian */	case 0x0f: return "is";	/* Icelandic */	case 0x10: return "it";	/* Italian */	case 0x11: return "ja";	/* Japanese */	case 0x12: return "ko";	/* Korean */	case 0x13: return "nl";	/* Dutch */	case 0x14: return "no";	/* Norwegian */	case 0x15: return "pl";	/* Polish */	case 0x16: return "pt";	/* Portuguese */	case 0x17: return "rm";	/* Rhaeto-Romance */	case 0x18: return "ro";	/* Romanian */	case 0x19: return "ru";	/* Russian */	case 0x1a: return "hr";	/* Croatian */	case 0x1b: return "sk";	/* Slovak */	case 0x1c: return "sq";	/* Albanian */	case 0x1d: return "sv";	/* Swedish */	case 0x1e: return "th";	/* Thai */	case 0x1f: return "tr";	/* Turkish */	case 0x20: return "ur";	/* Urdu */	case 0x21: return "id";	/* Indonesian */	case 0x22: return "uk";	/* Ukrainian */	case 0x23: return "be";	/* Belarusian */	case 0x24: return "sl";	/* Slovenian */	case 0x25: return "et";	/* Estonian */	case 0x26: return "lv";	/* Latvian */	case 0x27: return "lt";	/* Lithuanian */	case 0x29: return "fa";	/* Farsi */	case 0x2a: return "vi";	/* Viet Nam */	case 0x2b: return "hy";	/* Armenian */	case 0x2c: return "az";	/* Azeri */	case 0x2d: return "eu";	/* Basque */	case 0x2f: return "mk";	/* Macedonian */	case 0x36: return "af";	/* Afrikaans */	case 0x37: return "ka";	/* Georgian */	case 0x38: return "fo";	/* Faeroese */	case 0x39: return "hi";	/* Hindi */	case 0x3e: return "ms";	/* Malay */	case 0x3f: return "kk";	/* Kazakh */	default:		DBG_HEX(usLid);		DBG_FIXME();		return NULL;	}} /* end of szGetLanguage */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -