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

📄 xml.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 3 页
字号:
 * vAddEndTag - add the specified end tag to the file */static voidvAddEndTag(diagram_type *pDiag, UCHAR ucTag){	UCHAR	ucTopTag;	fail(pDiag == NULL);	fail(pDiag->pOutFile == NULL);	fail((size_t)ucTag >= elementsof(atDocBookTags));#if defined(DEBUG)	ucTopTag = ucReadStack();	if (ucTag != ucTopTag) {		DBG_DEC(ucTag);		DBG_MSG(atDocBookTags[(UINT)ucTag].szTagname);		vStackTrace();	}#endif /* DEBUG */	ucTopTag = ucPopStack();	fail((size_t)ucTopTag >= elementsof(atDocBookTags));	if (ucTag != ucTopTag) {		DBG_DEC(ucTag);		DBG_DEC(ucTopTag);		DBG_FIXME();		werr(1, "Impossible tag sequence, unable to continue");	}	if (atDocBookTags[(UINT)ucTag].bAddNewlineEnd) {		fprintf(pDiag->pOutFile, "\n");		vPrintLevel(pDiag->pOutFile);	}	fprintf(pDiag->pOutFile, "</%s>", atDocBookTags[(UINT)ucTag].szTagname);	if (atDocBookTags[(UINT)ucTag].bAddNewlineStart) {		fprintf(pDiag->pOutFile, "\n");		pDiag->lXleft = 0;	}	/* Set global variables */	switch (ucTag) {	case TAG_CHAPTER:		usHeaderLevelCurrent = 0;		break;	case TAG_SECT1:		usHeaderLevelCurrent = 1;		break;	case TAG_SECT2:		usHeaderLevelCurrent = 2;		break;	case TAG_SECT3:		usHeaderLevelCurrent = 3;		break;	case TAG_SECT4:		usHeaderLevelCurrent = 4;		break;	case TAG_SECT5:		usHeaderLevelCurrent = 5;		break;	case TAG_TITLE:		bTitleOpen = FALSE;		break;	case TAG_FOOTNOTE:		bFootnoteOpen = FALSE;		break;	case TAG_PARA:		uiParagraphLevel--;		break;	case TAG_EMPHASIS:		bEmphasisOpen = FALSE;		break;	case TAG_SUPERSCRIPT:		bSuperscriptOpen = FALSE;		break;	case TAG_ITEMIZEDLIST:	case TAG_ORDEREDLIST:		uiListLevel--;		break;	case TAG_SUBSCRIPT:		bSubscriptOpen = FALSE;		break;	case TAG_INFORMALTABLE:		bTableOpen = FALSE;		iTableColumnsCurrent = 0;		break;	default:		break;	}} /* end of vAddEndTag *//* * vAddEndTagOptional - add the specified end tag to the file if needed */static voidvAddEndTagOptional(diagram_type *pDiag, UCHAR ucTag){	UCHAR	ucTopTag;	ucTopTag = ucReadStack();	if (ucTag == ucTopTag) {		vAddEndTag(pDiag, ucTag);	}} /* end of vAddEndTagOptional *//* * vAddCombinedTag - add the specified start and end tag to the file */static voidvAddCombinedTag(diagram_type *pDiag, UCHAR ucTag, const char *szAttribute){	fail(pDiag == NULL);	fail(pDiag->pOutFile == NULL);	fail((size_t)ucTag >= elementsof(atDocBookTags));	if (atDocBookTags[(UINT)ucTag].bAddNewlineStart) {		fprintf(pDiag->pOutFile, "\n");		vPrintLevel(pDiag->pOutFile);	}	if (szAttribute == NULL || szAttribute[0] == '\0') {		fprintf(pDiag->pOutFile, "<%s/>",			atDocBookTags[(UINT)ucTag].szTagname);	} else {		fprintf(pDiag->pOutFile, "<%s %s/>",			atDocBookTags[(UINT)ucTag].szTagname, szAttribute);	}	if (atDocBookTags[(UINT)ucTag].bAddNewlineStart) {		fprintf(pDiag->pOutFile, "\n");		pDiag->lXleft = 0;	}} /* end of vAddCombinedTag *//* * vAddEndTagsUntil2 - add end tags until one the specified tags is seen */static voidvAddEndTagsUntil2(diagram_type *pDiag, UCHAR ucTag1, UCHAR ucTag2){	UCHAR	ucTopTag;	do {		ucTopTag = ucReadStack();		switch (ucTopTag) {                case TAG_CHAPTER:                case TAG_SECT1:                case TAG_SECT2:                case TAG_SECT3:                case TAG_SECT4:                case TAG_SECT5:			if (bEmptyHeaderLevel) {				/*				 * An empty chapter is legal in Word,				 * but not in DocBook.				 */				vAddCombinedTag(pDiag, TAG_PARA, NULL);				bEmptyHeaderLevel = FALSE;			}			break;		case TAG_ITEMIZEDLIST:		case TAG_ORDEREDLIST:			if (bEmptyListLevel) {				/*				 * A list without items is legal in Word,				 * but not in DocBook. (Nor are empty items)				 */				vAddStartTag(pDiag, TAG_LISTITEM, NULL);				vAddCombinedTag(pDiag, TAG_PARA, NULL);				vAddEndTag(pDiag, TAG_LISTITEM);				bEmptyListLevel = FALSE;			}			break;		default:			break;		}		vAddEndTag(pDiag, ucTopTag);	} while (ucTopTag != ucTag1 && ucTopTag != ucTag2);} /* end of vAddEndTagsUntil2 *//* * vCreateBookIntro - create title and bookinfo */voidvCreateBookIntro(diagram_type *pDiag, int iVersion){	const char	*szTitle, *szSubject, *szAuthor;	const char	*szLastSaveDtm, *szCompany;	const char	*szLanguage;	char		szTmp[13];	fail(pDiag == NULL);	fail(pDiag->pOutFile == NULL);	fail(iVersion < 0);	fail(eEncoding == encoding_neutral);	iWordVersion = iVersion;	bOldMacFile = bIsOldMacFile();	szTitle = szGetTitle();	szSubject = szGetSubject();	szAuthor = szGetAuthor();	szLastSaveDtm = szGetLastSaveDtm();	szCompany = szGetCompany();	/* Start Book */	szLanguage = szGetLanguage();	if (szLanguage != NULL) {		DBG_MSG(szLanguage);		sprintf(szTmp, "lang='%.5s'", szLanguage);		szLanguage = szTmp;	}	vAddStartTag(pDiag, TAG_BOOK, szLanguage);	/* Book title */	if (szTitle != NULL && szTitle[0] != '\0') {		vAddStartTag(pDiag, TAG_TITLE, NULL);		vPrintSpecialString(pDiag, szTitle);		vAddEndTag(pDiag, TAG_TITLE);	}	/* Bookinfo */	if ((szTitle != NULL && szTitle[0] != '\0') ||	    (szSubject != NULL && szSubject[0] != '\0') ||	    (szAuthor != NULL && szAuthor[0] != '\0') ||	    (szLastSaveDtm != NULL && szLastSaveDtm[0] != '\0') ||	    (szCompany != NULL && szCompany[0] != '\0')) {		vAddStartTag(pDiag, TAG_BOOKINFO, NULL);		if (szTitle != NULL && szTitle[0] != '\0') {			vAddStartTag(pDiag, TAG_TITLE, NULL);			vPrintSpecialString(pDiag, szTitle);			vAddEndTag(pDiag, TAG_TITLE);		}		if (szSubject != NULL && szSubject[0] != '\0') {			vAddStartTag(pDiag, TAG_SUBTITLE, NULL);			vPrintSpecialString(pDiag, szSubject);			vAddEndTag(pDiag, TAG_SUBTITLE);		}		if (szAuthor != NULL && szAuthor[0] != '\0') {			vAddStartTag(pDiag, TAG_AUTHOR, NULL);			vAddStartTag(pDiag, TAG_SURNAME, NULL);			vPrintSpecialString(pDiag, szAuthor);			vAddEndTag(pDiag, TAG_SURNAME);			vAddEndTag(pDiag, TAG_AUTHOR);		}		if (szLastSaveDtm != NULL && szLastSaveDtm[0] != '\0') {			vAddStartTag(pDiag, TAG_DATE, NULL);			vPrintSpecialString(pDiag, szLastSaveDtm);			vAddEndTag(pDiag, TAG_DATE);		}		if (szCompany != NULL && szCompany[0] != '\0') {			vAddStartTag(pDiag, TAG_CORPNAME, NULL);			vPrintSpecialString(pDiag, szCompany);			vAddEndTag(pDiag, TAG_CORPNAME);		}		vAddEndTag(pDiag, TAG_BOOKINFO);	}} /* end of vCreateBookIntro *//* * vPrologueXML - perform the XML initialization */voidvPrologueXML(diagram_type *pDiag, const options_type *pOptions){	fail(pDiag == NULL);	fail(pDiag->pOutFile == NULL);	fail(pOptions == NULL);#if defined(DEBUG)	vCheckTagTable();#endif /* DEBUG */	/* Set global variables to their start values */	eEncoding = pOptions->eEncoding;	bEmphasisOpen = FALSE;	bSuperscriptOpen = FALSE;	bSubscriptOpen = FALSE;	bTitleOpen = FALSE;	bTableOpen = FALSE;	bFootnoteOpen = FALSE;	uiParagraphLevel = 0;	uiListLevel = 0;	bEmptyListLevel = TRUE;	usHeaderLevelCurrent = 0;	bEmptyHeaderLevel = TRUE;	iTableColumnsCurrent = 0;	uiFootnoteNumber = 0;	pDiag->lXleft = 0;	pDiag->lYtop = 0;	/* Create an empty stack */	tStacksize = INITIAL_STACK_SIZE;	aucStack = xcalloc(tStacksize, sizeof(UCHAR));	tStackNextFree = 0;} /* end of vPrologueXML *//* * vEpilogueXML - clean up after everything is done */voidvEpilogueXML(diagram_type *pDiag){	vStackTrace();	vAddEndTagsUntil1(pDiag, TAG_BOOK);	vStackTrace();	/* Destroy the stack */	fail(tStackNextFree != 0);	tStacksize = 0;	aucStack = xfree(aucStack);	tStackNextFree = 0;} /* end of vEpilogueXML *//* * vPrintXML - print a XML string */static voidvPrintXML(diagram_type *pDiag, const char *szString, size_t tStringLength,		USHORT usFontstyle){	const char	*szAttr;	int	iCount;	size_t	tNextFree;	BOOL	bNotReady, bEmphasisNew, bSuperscriptNew, bSubscriptNew;	UCHAR	ucTopTag, aucStorage[3];	fail(szString == NULL);	if (szString == NULL || szString[0] == '\0' || tStringLength == 0) {		return;	}	if (tStringLength == 1 && szString[0] == FOOTNOTE_OR_ENDNOTE) {		/* Don't do anything special for just a single footnote */		bEmphasisNew = FALSE;		bSuperscriptNew = FALSE;		bSubscriptNew = FALSE;	} else {		/* Situation normal */		bEmphasisNew = bIsBold(usFontstyle) ||				bIsItalic(usFontstyle) ||				bIsUnderline(usFontstyle) ||				bIsStrike(usFontstyle);		bSuperscriptNew = bIsSuperscript(usFontstyle);		bSubscriptNew = bIsSubscript(usFontstyle);	}	/* End what has to be ended (or more to keep the stack happy) */	tNextFree = 0;	bNotReady = TRUE;	do {		ucTopTag = ucReadStack();		switch (ucTopTag) {		case TAG_EMPHASIS:			fail(!bEmphasisOpen);			if (bEmphasisNew) {				aucStorage[tNextFree++] = ucTopTag;			}			vAddEndTag(pDiag, ucTopTag);			break;		case TAG_SUPERSCRIPT:			fail(!bSuperscriptOpen);			if (bSuperscriptNew) {				aucStorage[tNextFree++] = ucTopTag;			}			vAddEndTag(pDiag, ucTopTag);			break;		case TAG_SUBSCRIPT:			fail(!bSubscriptOpen);			if (bSubscriptNew) {				aucStorage[tNextFree++] = ucTopTag;			}			vAddEndTag(pDiag, ucTopTag);			break;		default:			bNotReady = FALSE;			break;		}		fail(tNextFree > elementsof(aucStorage));		fail(bNotReady && tNextFree == elementsof(aucStorage));	} while (bNotReady);	/* Just te make sure */	vStartOfParagraphXML(pDiag, 1);	/* Restart to keep the stack happy */	for (iCount = (int)tNextFree - 1; iCount > 0; iCount--) {		vAddStartTag(pDiag, aucStorage[iCount], NULL);	}	/* Start what has to be started */	if (bEmphasisNew && !bEmphasisOpen) {		if (bIsBold(usFontstyle)) {			szAttr = "role='bold'";		} else if (bIsItalic(usFontstyle)) {			szAttr = NULL;		} else if (bIsUnderline(usFontstyle)) {			szAttr = "role='underline'";		} else if (bIsStrike(usFontstyle)) {			szAttr = "role='strikethrough'";		} else {			szAttr = NULL;		}		vAddStartTag(pDiag, TAG_EMPHASIS, szAttr);	}	if (bSuperscriptNew && !bSuperscriptOpen) {		vAddStartTag(pDiag, TAG_SUPERSCRIPT, NULL);	}	if (bSubscriptNew && !bSubscriptOpen) {		vAddStartTag(pDiag, TAG_SUBSCRIPT, NULL);	}	/* The print the string */	for (iCount = 0; iCount < (int)tStringLength; iCount++) {		vPrintChar(pDiag, szString[iCount]);	}} /* end of vPrintXML *//* * vMove2NextLineXML - move to the next line */voidvMove2NextLineXML(diagram_type *pDiag){	fail(pDiag == NULL);	/*	if (uiParagraphLevel != 0) {		We need something like HTML's <BR> tag	}	*/} /* end of vMove2NextLineXML *//* * vSubstringXML - put a sub string into a diagram */voidvSubstringXML(diagram_type *pDiag,	const char *szString, size_t tStringLength, long lStringWidth,	USHORT usFontstyle){	fail(pDiag == NULL || szString == NULL);	fail(pDiag->pOutFile == NULL);	fail(pDiag->lXleft < 0);	fail(tStringLength != strlen(szString));	if (szString[0] == '\0' || tStringLength == 0) {		return;	}	vPrintXML(pDiag, szString, tStringLength, usFontstyle);	pDiag->lXleft += lStringWidth;} /* end of vSubstringXML *//* * Create an start of a paragraph * Only works on paragraph level one, because Word doesn't allow paragraphs * in paragraphs. Other paragraph levels result from DocBooks special needs. */voidvStartOfParagraphXML(diagram_type *pDiag, UINT uiMaxLevel){	fail(pDiag == NULL);	if (uiParagraphLevel >= uiMaxLevel || bTitleOpen) {		/* In Word a title is just a paragraph */		return;	}	if (uiListLevel != 0 && bEmptyListLevel) {		/* No paragraphs in a list before the first listitem */		return;	}	if (usHeaderLevelCurrent == 0) {		/* No paragraphs without an open header */		vAddStartTag(pDiag, TAG_CHAPTER, NULL);		/* Dummy title */

⌨️ 快捷键说明

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