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

📄 wmlelm.c

📁 是一个手机功能的模拟程序
💻 C
📖 第 1 页 / 共 5 页
字号:
pWMLELEMENT WML_CreateWML (void) 
{
	pWMLELEMENT pElement=NEWSTRUCT(WMLELEMENT);

	#ifndef HAS_SETJMP
	if (pElement!=NULL) 
	{
	#endif

		pElement->iType=Type_WML;
		pElement->pNextElement=NULL;

		/* Element specific */
		pElement->pwchXmlLang=NULL;
		pElement->pContent=NULL;

	#ifndef HAS_SETJMP
	}
	#endif

	return pElement;
}

/*========================================================================

	Implemented function pointers for WML

=========================================================================*/

/*========================================================================
	WML_CreateElement
==========================================================================
	WML-specific implementation of DTD_CreateElementFunc.
==========================================================================*/
pELEMENTTYPE WML_CreateElement (pDECSTR pDecStr, UINT16 iType)
{
	void *pNewElm=NULL;
		
	/* Create specific element */
	switch (iType)
	{
	case Type_A:
		pNewElm=WML_CreateA();
		break;
	case Type_ANCHOR:
		pNewElm=WML_CreateANCHOR();
		break;
	case Type_ACCESS:
		pNewElm=WML_CreateACCESS();
		break;
	case Type_B:
	case Type_BIG:
	case Type_EM:
	case Type_I:
	case Type_SMALL:
	case Type_STRONG:
	case Type_U:
		pNewElm=WML_CreateEMPH(iType);
		break;
	case Type_BR: 
		pNewElm=WML_CreateBR();
		break;
	case Type_CARD: 
		pNewElm=WML_CreateCARD();
		break;
	case Type_DO:
		pNewElm=WML_CreateDO();
		break;
	case Type_FIELDSET:
		pNewElm=WML_CreateFIELDSET();
		break;
	case Type_GO:
		pNewElm=WML_CreateGO();
		break;
	case Type_HEAD:
		pNewElm=WML_CreateHEAD();
		break;
	case Type_IMG:
		pNewElm=WML_CreateIMG();
		break;
	case Type_INPUT:
		pNewElm=WML_CreateINPUT();
		break;
	case Type_META:
		pNewElm=WML_CreateMETA();
		break;
	case Type_NOOP: 
		/* Empty */
		pNewElm=XML_CreateEmptyElement(iType);
		break;
	case Type_ONEVENT:
		pNewElm=WML_CreateONEVENT();
		break;
	case Type_OPTGROUP:
		pNewElm=WML_CreateOPTGROUP();
		break;
	case Type_OPTION:
		pNewElm=WML_CreateOPTION();
		break;
	case Type_P:
		pNewElm=WML_CreateP();
		break;
	case Type_POSTFIELD:
		pNewElm=WML_CreatePOSTFIELD();
		break;
	case Type_PRE:
		/* This element is only allowed if the document is 1.2 or newer */
		if (pDecStr->iVersion>=WML_VERSION_1_2)
		{
			pNewElm=WML_CreatePRE();
		}
		else
		{
			pNewElm=WML_CreateUNKNOWN();
		}
		break;
	case Type_PREV: 
		pNewElm=WML_CreatePREV();
		break;
	case Type_REFRESH:
		pNewElm=WML_CreateREFRESH();
		break;
	case Type_SELECT: 
		pNewElm=WML_CreateSELECT();
		break;
	case Type_SETVAR:
		pNewElm=WML_CreateSETVAR();
		break;
	case Type_TABLE:
		pNewElm=WML_CreateTABLE();
		break;
	case Type_TD:
		pNewElm=WML_CreateTD();
		break;
	case Type_TEMPLATE:
		pNewElm=WML_CreateTEMPLATE();
		break;
	case Type_TIMER:
		pNewElm=WML_CreateTIMER();
		break;
	case Type_TR:
		pNewElm=WML_CreateTR();
		break;
	case Type_WML:
		pNewElm=WML_CreateWML();
		break;
#ifdef CONFIG_WTA
	case WTATAG_wtawml:
		if (((pUA) (pDecStr->pAppSpec))->iUserAgentMode == User_Agent_WTA) {
			pNewElm=WML_CreateWML();
			break;
		}
		/* fall through */
#endif
	default:
		/* The type is unknown. Return an element of the type 
		   Type_Unknown. This element can contain content. 
		   In the function WML_ModifyParse in WMLParse.c the 
		   element is removed and its contents are moved 
		   "one level up" to take its place. This to support
		   paragraph 12.4 in the WML specification.			*/
		pNewElm=WML_CreateUNKNOWN();
		break;
	}

	if (pDecStr->topElement == NULL && ((ELEMENTTYPE*) pNewElm)->iType != Type_WML) {
		/* The only valid top-level element is <wml> */
		WML_DeleteElement(pDecStr, (ELEMENTTYPE**) &pNewElm);
		pDecStr->iDecodeResult |= WBXML_Error_Encoding;
	}

	return ((ELEMENTTYPE*) pNewElm);
}


/*========================================================================
	WML_DeleteElement
==========================================================================
	WML-specific implementation of DTD_DeleteElementFunc.
==========================================================================*/
void WML_DeleteElement (pDECSTR pDecStr, pELEMENTTYPE* ppElement)
{
	if (ppElement==NULL)
	{
		return;
	}

	if (*ppElement!=NULL) 
	{
		switch ((*ppElement)->iType) 
		{
		case Type_A:
			XML_DeleteElementList(&(((AELEMENT*)(*ppElement))->pTitle),pDecStr);
			XML_DeleteElementList(&(((AELEMENT*)(*ppElement))->pHref),pDecStr);
			XML_DeleteElementList(&(((AELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((AELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_ANCHOR:
			XML_DeleteElementList(&(((ANCHORELEMENT*)(*ppElement))->pTitle),pDecStr);
			XML_DeleteElementList(&(((ANCHORELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((ANCHORELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_ACCESS:
			DEALLOC(&(((ACCESSELEMENT*)(*ppElement))->pchDomain));
			DEALLOC(&(((ACCESSELEMENT*)(*ppElement))->pchPath));
			break;
		case Type_B:
		case Type_BIG:
		case Type_EM:
		case Type_I:
		case Type_SMALL:
		case Type_STRONG:
		case Type_U:
			XML_DeleteElementList(&(((EMPHELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((EMPHELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_BR:
			DEALLOC(&(((BRELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_CARD: 
			DEALLOC(&(((CARDELEMENT*)(*ppElement))->pchId));
			XML_DeleteElementList(&(((CARDELEMENT*)(*ppElement))->pTitle),pDecStr);
			XML_DeleteElementList(&(((CARDELEMENT*)(*ppElement))->pOnEntForw),pDecStr);
			XML_DeleteElementList(&(((CARDELEMENT*)(*ppElement))->pOnEntBack),pDecStr);
			XML_DeleteElementList(&(((CARDELEMENT*)(*ppElement))->pOnTimer),pDecStr);
			XML_DeleteElementList(&(((CARDELEMENT*)(*ppElement))->pContent),pDecStr);
			WML_DeleteEventTab(((CARDELEMENT*)(*ppElement))->pEventTab);
			WML_DeleteTemplateDO(((CARDELEMENT*)(*ppElement))->pTemplateDO);
			DEALLOC(&(((CARDELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_DO:
			DEALLOC(&(((DOELEMENT*)(*ppElement))->pchType));
			DEALLOC(&(((DOELEMENT*)(*ppElement))->pchName));
			XML_DeleteElementList(&(((DOELEMENT*)(*ppElement))->pLabel),pDecStr);
			XML_DeleteElementList(&(((DOELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((DOELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_FIELDSET:
			XML_DeleteElementList(&(((FIELDSETELEMENT*)(*ppElement))->pTitle),pDecStr);
			XML_DeleteElementList(&(((FIELDSETELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((FIELDSETELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_GO:
			DEALLOC(&(((GOELEMENT*)(*ppElement))->pchAccChar));
			XML_DeleteElementList(&(((GOELEMENT*)(*ppElement))->pHref),pDecStr);
			XML_DeleteElementList(&(((GOELEMENT*)(*ppElement))->pContent),pDecStr);
			break;
		case Type_HEAD:
			XML_DeleteElementList(&(((HEADELEMENT*)(*ppElement))->pContent),pDecStr);
			break;
		case Type_IMG:
			XML_DeleteElementList(&(((IMGELEMENT*)(*ppElement))->pAlt),pDecStr);
			XML_DeleteElementList(&(((IMGELEMENT*)(*ppElement))->pSrc),pDecStr);
			XML_DeleteElementList(&(((IMGELEMENT*)(*ppElement))->pLocalSrc),pDecStr);
			DEALLOC(&(((IMGELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_INPUT:
			DEALLOC(&(((INPUTELEMENT*)(*ppElement))->pchName));
			DEALLOC(&(((INPUTELEMENT*)(*ppElement))->pchFormat));
			XML_DeleteElementList(&(((INPUTELEMENT*)(*ppElement))->pValue),pDecStr);
			XML_DeleteElementList(&(((INPUTELEMENT*)(*ppElement))->pTitle),pDecStr);
			DEALLOC(&(((INPUTELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_META:
			DEALLOC(&(((METAELEMENT*)(*ppElement))->pchHttpEquiv));
			DEALLOC(&(((METAELEMENT*)(*ppElement))->pchName));
			DEALLOC(&(((METAELEMENT*)(*ppElement))->pchContent));
			DEALLOC(&(((METAELEMENT*)(*ppElement))->pchScheme));
			break;
		case Type_NOOP: 
			/* No attributes to delete */
			break;
		case Type_ONEVENT:
			XML_DeleteElementList(&(((ONEVENTELEMENT*)(*ppElement))->pContent),pDecStr);
			break;
		case Type_OPTGROUP:
			XML_DeleteElementList(&(((OPTGROUPELEMENT*)(*ppElement))->pTitle),pDecStr);
			XML_DeleteElementList(&(((OPTGROUPELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((OPTGROUPELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_OPTION:
			XML_DeleteElementList(&(((OPTIONELEMENT*)(*ppElement))->pValue),pDecStr);
			XML_DeleteElementList(&(((OPTIONELEMENT*)(*ppElement))->pTitle),pDecStr);
			XML_DeleteElementList(&(((OPTIONELEMENT*)(*ppElement))->pOnpick),pDecStr);
			XML_DeleteElementList(&(((OPTIONELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((OPTIONELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_P: 
			XML_DeleteElementList(&(((PELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((PELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_POSTFIELD: 
			XML_DeleteElementList(&(((POSTFIELDELEMENT*)(*ppElement))->pName),pDecStr);
			XML_DeleteElementList(&(((POSTFIELDELEMENT*)(*ppElement))->pValue),pDecStr);
			break;
		case Type_PRE: 
			XML_DeleteElementList(&(((PREELEMENT*)(*ppElement))->pContent),pDecStr);
			break;
		case Type_PREV: 
			XML_DeleteElementList(&(((PREVELEMENT*)(*ppElement))->pContent),pDecStr);
			break;
		case Type_REFRESH:
			XML_DeleteElementList(&(((REFRESHELEMENT*)(*ppElement))->pContent),pDecStr);
			break;
		case Type_SELECT: 
			DEALLOC(&(((SELECTELEMENT*)(*ppElement))->pchName));
			DEALLOC(&(((SELECTELEMENT*)(*ppElement))->pchIName));
			XML_DeleteElementList(&(((SELECTELEMENT*)(*ppElement))->pValue),pDecStr);
			XML_DeleteElementList(&(((SELECTELEMENT*)(*ppElement))->pIValue),pDecStr);
			XML_DeleteElementList(&(((SELECTELEMENT*)(*ppElement))->pTitle),pDecStr);
			XML_DeleteElementList(&(((SELECTELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((SELECTELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_SETVAR:
			XML_DeleteElementList(&(((SETVARELEMENT*)(*ppElement))->pName),pDecStr);
			XML_DeleteElementList(&(((SETVARELEMENT*)(*ppElement))->pValue),pDecStr);
			break;
		case Type_TABLE:
			DEALLOC(&(((TABLEELEMENT*)(*ppElement))->pchAlign));
			XML_DeleteElementList(&(((TABLEELEMENT*)(*ppElement))->pTitle),pDecStr);
			XML_DeleteElementList(&(((TABLEELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((TABLEELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_TD:
			XML_DeleteElementList(&(((TDELEMENT*)(*ppElement))->pContent),pDecStr);
			DEALLOC(&(((TDELEMENT*)(*ppElement))->pwchXmlLang));
			break;
		case Type_TEMPLATE:
			XML_DeleteElementList(&(((TEMPLATEELEMENT*)(*ppElement))->pOnEntForw),pDecStr);
			XML_DeleteElementList(&(((TEMPLATEELEMENT*)(*ppElement))->pOnEntBack),pDecStr);
			XML_DeleteElementList(&(((TEMPLATEELEMENT*)(*ppElement))->pOnTimer),pDecStr);
			XML_DeleteElementList(&(((TEMPLATEELEMENT*)(*ppElement))->pContent),pDecStr);
			WML_DeleteEventTab(((TEMPLATEELEMENT*)(*ppElement))->pEventTab);
			break;
		case Type_TIMER:	
			DEALLOC(&(((TIMERELEMENT*)(*ppElement))->pchName));
			XML_DeleteElementList(&(((TIMERELEMENT*)(*ppElement))->pValue),pDecStr);
			break;
		case Type_TR:
			XML_DeleteElementList(&(((TRELEMENT*)(*ppElement))->pContent),pDecStr);
			break;
		case Type_UNKNOWN:
			XML_DeleteElementList(&(((UNKNOWNELEMENT*)(*ppElement))->pContent),pDecStr);
			break;
		case Type_WML:
			DEALLOC(&(((WMLELEMENT*)(*ppElement))->pwchXmlLang));
			XML_DeleteElementList(&(((WMLELEMENT*)(*ppElement))->pContent),pDecStr);
			break;
		}

		/* Delete element */
		DEALLOC(ppElement);		
	}
}


/*========================================================================
	WML_ValidContent
==========================================================================
	WML-specific implementation of DTD_ValidContentFunc.
==========================================================================*/
BOOL WML_ValidContent (pDECSTR pDecStr, pELEMENTTYPE pElement) 
{
	pDecStr=pDecStr;

	if (pElement!=NULL) 
	{
		switch (pElement->iType) 
		{
		case Type_A:
		case Type_ANCHOR:
		case Type_B:
		case Type_BIG:
		case Type_EM:
		case Type_I:
		case Type_SMALL:
		case Type_STRONG:
		case Type_U:
		case Type_CARD:
		case Type_DO:
		case Type_FIELDSET:
		case Type_GO:
		case Type_HEAD:
		case Type_ONEVENT:
		case Type_OPTGROUP:
		case Type_OPTION:
		case Type_P:
		case Type_PRE:
		case Type_PREV:
		case Type_REFRESH:
		case Type_SELECT:
		case Type_TABLE:
		case Type_TD:
		case Type_TEMPLATE:
		case Type_TR:
		case Type_UNKNOWN:
		case Type_WML:

			return TRUE;
		}
	}

	return FALSE;
}


/*========================================================================
	WML_GetContent
==========================================================================
	WML-specific implementation of DTD_GetContentFunc.
==========================================================================*/
pELEMENTTYPE WML_GetContent (pELEMENTTYPE pElement)
{
	if (pElement!=NULL && WML_ValidContent(NULL, pElement))
		return (XML_GetContent(pElement));
	else
		return NULL;
}



/*========================================================================

	Attribute functions

=========================================================================*/

/*========================================================================
	WML_Set...
==========================================================================
	The following functions sets the attribute values in the elements. If
	the attribute field and the attribute value is valid for the element 
	it is and stored and TRUE is returned. Otherwise, FALSE is returned. 

	NOTE! It is the callers responsibility to deallocate all parts NOT 
	used by the functions. For example, if ppAlign is not used in the 
	function WML_SetAlign, this memory must be deallocated.
	
	Input: Element (NOT NULL) and attribute value.						
	Output: BOOL
==========================================================================*/
BOOL WML_SetAccChar	(pDECSTR pDecStr, pELEMENTTYPE pElement, pELEMENTTYPE* ppAccChar)
{		
	if (pElement->iType==Type_GO) 
	{
		if (((GOELEMENT*)(pElement))->pchAccChar==NULL) 
		{
			((GOELEMENT*)(pElement))->pchAccChar=XML_ConvertToString(ppAccChar,pDecStr);
			return TRUE;
		}
	}

	return FALSE;
}


BOOL WML_SetAccesskey (pDECSTR pDecStr, pELEMENTTYPE pElement, pELEMENTTYPE* ppAccesskey)
{
	BOOL fResult=FALSE;

	/* The function returns FALSE if the document is not 1.2 or newer (greater) */
	if (pDecStr->iVersion>=WML_VERSION_1_2)
	{
		WCHAR* pwchAccess=XML_ConvertToString(ppAccesskey,pDecStr);

		/* Check if accesskey is exactly one character */
		if ((pwchAccess!=NULL)&&(STRINGLENGTH(pwchAccess)==1))
		{
			/* Store character */
			switch (pElement->iType)
			{
			case Type_A:
				((AELEMENT *)(pElement))->wchAccessKey=*pwchAccess;
				fResult=TRUE;
				break;
			case Type_ANCHOR:
				((ANCHORELEMENT *)(pElement))->wchAccessKey=*pwchAccess;
				fResult=TRUE;
				break;
			case Type_INPUT:
				((INPUTELEMENT *)(pElement))->wchAccessKey=*pwchAccess;
				fResult=TRUE;
				break;
			}
		}

		/* Delete string */
		DEALLOC(&pwchAccess);
	}

	return fResult;
}


BOOL WML_SetAlign (pDECSTR pDecStr, pELEMENTTYPE pElement, pELEMENTTYPE* ppAlign, INT8 iAlign)
{
	BOOL fResult=FALSE;
	WCHAR* pwchAlign=XML_ConvertToString(ppAlign,pDecStr);
	
	/* Table - WCHAR* */
	if (pElement->iType==Type_TABLE) 
	{
		((TABLEELEMENT*)(pElement))->pchAlign=pwchAlign;
		return TRUE;
	}

	/* img and p - INT8 */
	else if (iAlign==DEF_TYPE_STRING)
	{
		/* Convert type to INT8 */
		iAlign=WML_ConvertAlign(&pwchAlign);
	}
	else
	{
		DEALLOC(&pwchAlign);
	}

	/* Store */
	if (pElement->iType==Type_IMG)
	{
		((IMGELEMENT*)(pElement))->iIAlign=iAlign;
		fResult=TRUE;
	}
	else if (pElement->iType==Type_P) 
	{
		((PELEMENT*)(pElement))->iAlign=iAlign;
		fResult=TRUE;
	}

	return fResult;
}


BOOL WML_SetAlt	(pDECSTR pDecStr, pELEMENTTYPE pElement, pELEMENTTYPE* ppAlt)
{
	pDecStr=pDecStr;

	if (pElement->iType==Type_IMG) 
	{
		if (((IMGELEMENT*)(pElement))->pAlt==NULL) 
		{
			((IMGELEMENT*)(pElement))->pAlt=*ppAlt;
			*ppAlt=NULL;
			return TRUE;
		}
	}

	return FALSE;
}


BOOL WML_SetCacheControl (pDECSTR pDecStr, pELEMENTTYPE pElement, 
						  pELEMENTTYPE* ppCacheControl, enum CacheControl iCache)
{
	/* The function returns FALSE if the document is not 1.3 or newer (greater) */
	if (pDecStr->iVersion>=WML_VERSION_1_3)
	{
		/* Convert ppCacheControl (text) to enum CacheControl. The ELEMENTTYPE is removed
			 in the XML_ConvertToString function and the string is removed in the 
			 ConvertCacheControl function. */
		WCHAR* pwchCache=XML_ConvertToString(ppCacheControl,pDecStr);

		if (pElement->iType==Type_GO) 
		{
			if (pwchCache!=NULL)
			{
				((GOELEMENT*)(pElement))->iCacheControl=WML_ConvertCacheControl(&pwchCache);
			}
			else
			{
				((GOELEMENT*)(pElement))->iCacheControl=iCache;
			}
			return TRUE;
		}
	}

⌨️ 快捷键说明

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