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

📄 xml.c

📁 这是一个同样来自贝尔实验室的和UNIX有着渊源的操作系统, 其简洁的设计和实现易于我们学习和理解
💻 C
📖 第 1 页 / 共 3 页
字号:
		vAddCombinedTag(pDiag, TAG_TITLE, NULL);	}	vAddStartTag(pDiag, TAG_PARA, NULL);} /* end of vStartOfParagraphXML *//* * Create an end of a paragraph * Only for paragraph level one and for titles */voidvEndOfParagraphXML(diagram_type *pDiag, UINT uiMaxLevel){	UCHAR	ucTopTag;	fail(pDiag == NULL);	if (uiParagraphLevel > uiMaxLevel) {		DBG_DEC(uiParagraphLevel);		return;	}	for(;;) {		ucTopTag = ucReadStack();		switch (ucTopTag) {		case TAG_EMPHASIS:			fail(!bEmphasisOpen);			vAddEndTag(pDiag, TAG_EMPHASIS);			break;		case TAG_SUPERSCRIPT:			fail(!bSuperscriptOpen);			vAddEndTag(pDiag, TAG_SUPERSCRIPT);			break;		case TAG_SUBSCRIPT:			fail(!bSubscriptOpen);			vAddEndTag(pDiag, TAG_SUBSCRIPT);			break;		case TAG_TITLE:			fail(!bTitleOpen);			vAddEndTag(pDiag, TAG_TITLE);			return;		case TAG_PARA:			fail(uiParagraphLevel == 0);			vAddEndTag(pDiag, TAG_PARA);			return;		case TAG_TBODY:		case TAG_TGROUP:		case TAG_INFORMALTABLE:			fail(!bTableOpen);			vAddEndTag(pDiag, ucTopTag);			break;		case TAG_NOTAG:			DBG_FIXME();			werr(1, "Impossible tag sequence, unable to continue");			break;		default:			DBG_DEC(ucTopTag);			DBG_MSG_C((size_t)ucTopTag < elementsof(atDocBookTags),				atDocBookTags[(UINT)ucTopTag].szTagname);			return;		}	}} /* end of vEndOfParagraphXML *//* * Create an end of a page */voidvEndOfPageXML(diagram_type *pDiag){	if (bTableOpen || usHeaderLevelCurrent == 0) {		/* No beginpage in a table or outside a chapter */		return;	}	if (bTitleOpen) {		/* A beginpage is not allowed when in a title */		/* So start a new paragraph */		vEndOfParagraphXML(pDiag, UINT_MAX);		vStartOfParagraphXML(pDiag, UINT_MAX);		return;	}	vAddCombinedTag(pDiag, TAG_BEGINPAGE, NULL);} /* end of vEndOfPageXML *//* * vCloseHeaderLevels - close the specified header levels */static voidvCloseHeaderLevels(diagram_type *pDiag, USHORT usIstd){	BOOL	bNotReady;	UCHAR	ucTopTag;	DBG_MSG("vCloseHeaderLevels");	DBG_DEC(usIstd);	DBG_DEC(usHeaderLevelCurrent);	vStackTrace();	bNotReady = TRUE;	do {		ucTopTag = ucReadStack();		switch (ucTopTag) {		case TAG_TITLE:		case TAG_PARA:			vAddEndTag(pDiag, ucTopTag);			break;		default:			bNotReady = FALSE;			break;		}	} while (bNotReady);	vStackTrace();	while (usHeaderLevelCurrent >= usIstd) {		if (bEmptyHeaderLevel) {			vAddCombinedTag(pDiag, TAG_PARA, NULL);			bEmptyHeaderLevel = FALSE;		}		switch (usHeaderLevelCurrent) {		case 1: vAddEndTag(pDiag, TAG_CHAPTER); break;		case 2: vAddEndTag(pDiag, TAG_SECT1); break;		case 3: vAddEndTag(pDiag, TAG_SECT2); break;		case 4: vAddEndTag(pDiag, TAG_SECT3); break;		case 5: vAddEndTag(pDiag, TAG_SECT4); break;		case 6: vAddEndTag(pDiag, TAG_SECT5); break;		default:			DBG_DEC(usHeaderLevelCurrent);			DBG_FIXME();			return;		}	}	DBG_DEC(usHeaderLevelCurrent);	vStackTrace();} /* end of vCloseHeaderLevels *//* * vSetHeadersXML - set the headers */voidvSetHeadersXML(diagram_type *pDiag, USHORT usIstd){	fail(pDiag == NULL);	if (usIstd == 0 || usIstd > 6) {		DBG_DEC_C(usIstd != 0 && usIstd <= 9, usIstd);		return;	}	DBG_DEC(usIstd);	if (bTableOpen || uiListLevel != 0) {		/* No headers when you're in a table or in a list */		return;	}	/* Close levels */	vCloseHeaderLevels(pDiag, usIstd);	DBG_DEC(usHeaderLevelCurrent);	/* Open levels */	while (usHeaderLevelCurrent < usIstd) {		switch (usHeaderLevelCurrent) {		case 0: vAddStartTag(pDiag, TAG_CHAPTER, NULL); break;		case 1: vAddStartTag(pDiag, TAG_SECT1, NULL); break;		case 2: vAddStartTag(pDiag, TAG_SECT2, NULL); break;		case 3: vAddStartTag(pDiag, TAG_SECT3, NULL); break;		case 4: vAddStartTag(pDiag, TAG_SECT4, NULL); break;		case 5: vAddStartTag(pDiag, TAG_SECT5, NULL); break;		default:			DBG_DEC(usHeaderLevelCurrent);			DBG_FIXME();			return;		}		fail(usIstd == 0);		/* The next paragraph should be a title */		if (usHeaderLevelCurrent < usIstd) {			/* This chapter level is not in the Word document */			vAddCombinedTag(pDiag, TAG_TITLE, NULL);		} else {			vAddStartTag(pDiag, TAG_TITLE, NULL);		}	}} /* end of vSetHeadersXML *//* * Create a start of a list */voidvStartOfListXML(diagram_type *pDiag, UCHAR ucNFC, BOOL bIsEndOfTable){	const char	*szAttr;	UCHAR		ucTag;	fail(pDiag == NULL);	if (bIsEndOfTable) {		/* FIXME: until a list in a table is allowed */		vEndOfTableXML(pDiag);	}	if (bTableOpen) {		/* FIXME: a list in a table should be allowed */		return;	}	if (usHeaderLevelCurrent == 0) {		/* No list without an open header */		vAddStartTag(pDiag, TAG_CHAPTER, NULL);		/* Dummy title */		vAddCombinedTag(pDiag, TAG_TITLE, NULL);	}	switch (ucNFC) {	case LIST_ARABIC_NUM:	case LIST_ORDINAL_NUM:	case LIST_NUMBER_TXT:	case LIST_ORDINAL_TXT:	case LIST_OUTLINE_NUM:		ucTag = TAG_ORDEREDLIST;		szAttr = "numeration='arabic'";		break;	case LIST_UPPER_ROMAN:		ucTag = TAG_ORDEREDLIST;		szAttr = "numeration='upperroman'";		break;	case LIST_LOWER_ROMAN:		ucTag = TAG_ORDEREDLIST;		szAttr = "numeration='lowerroman'";		break;	case LIST_UPPER_ALPHA:		ucTag = TAG_ORDEREDLIST;		szAttr = "numeration='upperalpha'";		break;	case LIST_LOWER_ALPHA:		ucTag = TAG_ORDEREDLIST;		szAttr = "numeration='loweralpha'";		break;	case LIST_SPECIAL:	case LIST_SPECIAL2:	case LIST_BULLETS:		ucTag = TAG_ITEMIZEDLIST;		szAttr = "mark='bullet'";		break;	default:		ucTag = TAG_ORDEREDLIST;		szAttr = "numeration='arabic'";		DBG_HEX(ucNFC);		DBG_FIXME();		break;	}	vAddStartTag(pDiag, ucTag, szAttr);} /* end of vStartOfListXML *//* * Create an end of a list */voidvEndOfListXML(diagram_type *pDiag){	fail(pDiag == NULL);	if (bTableOpen) {		/* FIXME: a list in a table should be allowed */		return;	}	if (uiListLevel != 0) {		vStackTrace();		vAddEndTagsUntil2(pDiag, TAG_ITEMIZEDLIST, TAG_ORDEREDLIST);		vStackTrace();	}} /* end of vEndOfListXML *//* * Create a start of a list item */voidvStartOfListItemXML(diagram_type *pDiag, BOOL bNoMarks){	const char	*szAttr;	UCHAR	ucTopTag;	fail(pDiag == NULL);	if (bTableOpen) {		/* FIXME: a list in a table should be allowed */		return;	}	ucTopTag = ucReadStack();	if (ucTopTag != TAG_ITEMIZEDLIST && ucTopTag != TAG_ORDEREDLIST) {		/* Must end a previous list item first */		vAddEndTagsUntil1(pDiag, TAG_LISTITEM);	}	DBG_DEC_C(ucReadStack() != TAG_ITEMIZEDLIST &&		ucReadStack() != TAG_ORDEREDLIST, ucReadStack());	/* Start a new list item */	szAttr = bNoMarks ? "override='none'" : NULL;	vAddStartTag(pDiag, TAG_LISTITEM, szAttr);	/* Start a new paragraph (independant of level) */	vAddStartTag(pDiag, TAG_PARA, NULL);} /* end of vStartOfListItemXML *//* * Create a start of a table */static voidvStartOfTable(diagram_type *pDiag, UCHAR ucBorderInfo){	const char	*szFrame;	BOOL	bNotReady;	UCHAR	ucTopTag;	char	cColSep, cRowSep;	char	szAttr[40];	fail(pDiag == NULL);	/* Close elements that cannot contain a table */	bNotReady = TRUE;	do {		ucTopTag = ucReadStack();		switch (ucTopTag) {		case TAG_TITLE:			fail(!bTitleOpen);			vAddEndTag(pDiag, TAG_TITLE);			break;		case TAG_EMPHASIS:			fail(!bEmphasisOpen);			vAddEndTag(pDiag, TAG_EMPHASIS);			break;		case TAG_SUPERSCRIPT:			fail(!bSuperscriptOpen);			vAddEndTag(pDiag, TAG_SUPERSCRIPT);			break;		case TAG_SUBSCRIPT:			fail(!bSubscriptOpen);			vAddEndTag(pDiag, TAG_SUBSCRIPT);			break;		default:			bNotReady = FALSE;			break;		}	} while (bNotReady);	/* Create table attributes */	switch (ucBorderInfo) {	case TABLE_BORDER_TOP:		szFrame = "top";		break;	case TABLE_BORDER_LEFT|TABLE_BORDER_RIGHT:		szFrame = "sides";		break;	case TABLE_BORDER_TOP|TABLE_BORDER_BOTTOM:		szFrame = "topbot";		break;	case TABLE_BORDER_BOTTOM:		szFrame = "bottom";		break;	case TABLE_BORDER_TOP|TABLE_BORDER_LEFT|	     TABLE_BORDER_BOTTOM|TABLE_BORDER_RIGHT:		szFrame = "all";		break;	default:		szFrame = "none";		break;	}	cColSep = bIsTableBorderLeft(ucBorderInfo) ||		  bIsTableBorderRight(ucBorderInfo) ? '1' : '0';	cRowSep = bIsTableBorderTop(ucBorderInfo) ||		  bIsTableBorderBottom(ucBorderInfo) ? '1' : '0';	sprintf(szAttr, "frame='%.6s' colsep='%c' rowsep='%c'",			szFrame, cColSep, cRowSep);	if (usHeaderLevelCurrent == 0) {		/* No table without an open header */		vAddStartTag(pDiag, TAG_CHAPTER, NULL);		/* Dummy title */		vAddCombinedTag(pDiag, TAG_TITLE, NULL);	}	vAddStartTag(pDiag, TAG_INFORMALTABLE, szAttr);} /* end of vStartOfTable *//* * Create a start of a table group */static voidvStartOfTableGroup(diagram_type *pDiag,	int iNbrOfColumns, const short *asColumnWidth){	double	dWidth;	int	iIndex;	char	szCols[6 + 3 * sizeof(int) + 1 + 1];	char	szColWidth[10 + 3 * sizeof(short) + 3 + 3 + 1];	fail(iNbrOfColumns < 1);	fail(asColumnWidth == NULL);	sprintf(szCols, "cols='%d'", iNbrOfColumns);	vAddStartTag(pDiag, TAG_TGROUP, szCols);	for (iIndex= 0; iIndex < iNbrOfColumns; iIndex++) {		fail(asColumnWidth[iIndex] < 0);		dWidth = dTwips2Points(asColumnWidth[iIndex]);		if (dWidth <= 1.0) {			strcpy(szColWidth, "colwidth='1.00pt'");		} else {			sprintf(szColWidth, "colwidth='%.2fpt'", dWidth);		}		vAddCombinedTag(pDiag, TAG_COLSPEC, szColWidth);	}} /* end of vStartOfTableGroup *//* * Create an end of a table */voidvEndOfTableXML(diagram_type *pDiag){	fail(pDiag == NULL);	if (bTableOpen) {		vAddEndTag(pDiag, TAG_TBODY);		vAddEndTag(pDiag, TAG_TGROUP);		vAddEndTag(pDiag, TAG_INFORMALTABLE);	}} /* end of vEndOfTableXML *//* * Add a table row */voidvAddTableRowXML(diagram_type *pDiag, char **aszColTxt,	int iNbrOfColumns, const short *asColumnWidth, UCHAR ucBorderInfo){	size_t	tCount, tStringLength;	int	iIndex;	fail(pDiag == NULL);	fail(pDiag->pOutFile == NULL);	fail(aszColTxt == NULL);	fail(iNbrOfColumns < 1);	fail(asColumnWidth == NULL);	if (iNbrOfColumns != iTableColumnsCurrent) {		/* A new number of columns */		/* End the old table body and table group (if they exist) */		vAddEndTagOptional(pDiag, TAG_TBODY);		vAddEndTagOptional(pDiag, TAG_TGROUP);		if (!bTableOpen) {			/* No table yet. Start a new table */			vStartOfTable(pDiag, ucBorderInfo);		}		/* Start a new table group and a new table body */		vStartOfTableGroup(pDiag, iNbrOfColumns, asColumnWidth);		vAddStartTag(pDiag, TAG_TBODY, NULL);		iTableColumnsCurrent = iNbrOfColumns;	}	/* Add the table row */	vAddStartTag(pDiag, TAG_ROW, NULL);	for (iIndex = 0; iIndex < iNbrOfColumns; iIndex++) {		/* Add a table cell */		fail(aszColTxt[iIndex] == NULL);		vAddStartTag(pDiag, TAG_ENTRY, NULL);		tStringLength = strlen(aszColTxt[iIndex]);		for (tCount = 0; tCount < tStringLength; tCount++) {			vPrintChar(pDiag, aszColTxt[iIndex][tCount]);		}		vAddEndTag(pDiag, TAG_ENTRY);	}	vAddEndTag(pDiag, TAG_ROW);} /* end of vAddTableRowXML */

⌨️ 快捷键说明

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