📄 cslabel.c
字号:
{ "URL open", SubState_B, Punct_LPAREN, &Extension_getURL, 0, 0, 0, &ExtensionData_targetObject, SubState_N, Command_CHAIN|Command_NOTOKEN, 0}, { "URL close", SubState_B, Punct_RPAREN, &Extension_getURL, 0, 0, 0, 0, SubState_X, Command_CLOSE, &Extension_next}, { "more data", SubState_C, Punct_WHITE|Punct_LPAREN|Punct_RPAREN, &hasToken, 0, 0, 0, &ExtensionData_targetObject, SubState_N, Command_CHAIN, 0}, { "nest", SubState_C, Punct_LPAREN, 0, 0, 0, 0, &ExtensionData_targetObject, SubState_N, Command_CHAIN, 0}, { "close", SubState_C, Punct_RPAREN, 0, 0, 0, 0, 0, SubState_X, Command_CLOSE, &Extension_next} };PRIVATE TargetObject_t Extension_targetObject = {"Extension", &Extension_open, &Extension_close, &Extension_destroy, Extension_stateTokens, raysize(Extension_stateTokens), CSLLTC_EXTEN};PRIVATE StateToken_t ExtensionData_stateTokens[] = { /* A: looking for data B: back from recursive ExtensionData (identical to Extension B) */ { "open", SubState_N, Punct_ALL, 0, 0, 0, 0, &ExtensionData_targetObject, SubState_A, Command_MATCHANY|Command_OPEN|Command_CHAIN, 0}, { "lparen", SubState_A, Punct_LPAREN, 0, 0, 0, 0, &ExtensionData_targetObject, SubState_N, 0, 0}, { "close", SubState_A, Punct_RPAREN, 0, 0, 0, 0, 0, SubState_X, Command_CLOSE, &ExtensionData_next}, { "data", SubState_A, Punct_WHITE, &ExtensionData_getData, 0, 0, 0, 0, SubState_X, Command_CLOSE, &ExtensionData_next}, {"data punct", SubState_A, Punct_LPAREN|Punct_RPAREN, &ExtensionData_getData, 0, 0, 0, 0, SubState_X, Command_CLOSE|Command_CHAIN|Command_NOTOKEN, &ExtensionData_next}, { "more data", SubState_B, Punct_WHITE|Punct_LPAREN|Punct_RPAREN, &hasToken, 0, 0, 0, &ExtensionData_targetObject, SubState_N, Command_CHAIN, 0}, { "nest", SubState_B, Punct_LPAREN, 0, 0, 0, 0, &ExtensionData_targetObject, SubState_N, Command_CHAIN, 0}, { "close", SubState_B, Punct_RPAREN, 0, 0, 0, 0, 0, SubState_X, Command_CLOSE, &ExtensionData_next} };PRIVATE TargetObject_t ExtensionData_targetObject = {"ExtensionData", &ExtensionData_open, &ExtensionData_close, &ExtensionData_destroy, ExtensionData_stateTokens, raysize(ExtensionData_stateTokens), CSLLTC_EXTDATA};/* CSParse_doc end *//* S T A T E A S S O C I A T I O N - associate a CSLabel with the label list data The label list data is kept around until all states referencing it are destroyed */typedef struct { CSLabel_t * pCSLabel; CSLLData_t * pCSLLData; } CSLabelAssoc_t;PRIVATE HTList * CSLabelAssocs = 0;PRIVATE void CSLabelAssoc_add(CSLabel_t * pCSLabel, CSLLData_t * pCSLLData){ CSLabelAssoc_t * pElement; if ((pElement = (CSLabelAssoc_t *) HT_CALLOC(1, sizeof(CSLabelAssoc_t))) == NULL) HT_OUTOFMEM("CSLabelAssoc_t"); pElement->pCSLabel = pCSLabel; pElement->pCSLLData = pCSLLData; if (!CSLabelAssocs) CSLabelAssocs = HTList_new(); HTList_appendObject(CSLabelAssocs, (void *)pElement);}PRIVATE CSLabelAssoc_t * CSLabelAssoc_findByData(CSLLData_t * pCSLLData){ HTList * assocs = CSLabelAssocs; CSLabelAssoc_t * pElement; while ((pElement = (CSLabelAssoc_t *) HTList_nextObject(assocs))) if (pElement->pCSLLData == pCSLLData) return pElement; return 0;}PRIVATE CSLabelAssoc_t * CSLabelAssoc_findByState(CSLabel_t * pCSLabel){ HTList * assocs = CSLabelAssocs; CSLabelAssoc_t * pElement; while ((pElement = (CSLabelAssoc_t *) HTList_nextObject(assocs))) if (pElement->pCSLabel == pCSLabel) return pElement; return 0;}PRIVATE void CSLabelAssoc_removeByState(CSLabel_t * pCSLabel){ CSLabelAssoc_t * pElement = CSLabelAssoc_findByState(pCSLabel); if (!pElement) return; HTList_removeObject(CSLabelAssocs, (void *)pElement); HT_FREE(pElement);}/* P R I V A T E C O N S T R U C T O R S / D E S T R U C T O R S *//* These serve the public constructors */PRIVATE LabelError_t * LabelError_new(void){ LabelError_t * me; if ((me = (LabelError_t *) HT_CALLOC(1, sizeof(LabelError_t))) == NULL) HT_OUTOFMEM("LabelError_t"); me->explanations = HTList_new(); return me;}PRIVATE void LabelError_free(LabelError_t * me){ char * explanation; if (!me) return; while ((explanation = (char *) HTList_removeLastObject(me->explanations))) HT_FREE(explanation); HT_FREE(me);}PRIVATE LabelOptions_t * LabelOptions_new(LabelOptions_t * pParentLabelOptions){ LabelOptions_t * me; if ((me = (LabelOptions_t *) HT_CALLOC(1, sizeof(LabelOptions_t))) == NULL) HT_OUTOFMEM("LabelOptions_t"); me->pParentLabelOptions = pParentLabelOptions; return me;}PRIVATE void LabelOptions_free(LabelOptions_t * me){ char * comment; DVal_clear(&me->at); SVal_clear(&me->by); SVal_clear(&me->complete_label); BVal_clear(&me->generic); SVal_clear(&me->fur); SVal_clear(&me->MIC_md5); DVal_clear(&me->on); SVal_clear(&me->signature_PKCS); DVal_clear(&me->until); while ((comment = HTList_removeLastObject(me->comments))) HT_FREE(comment); HT_FREE(me);}PRIVATE ExtensionData_t * ExtensionData_new(void){ ExtensionData_t * me; if ((me = (ExtensionData_t *) HT_CALLOC(1, sizeof(ExtensionData_t))) == NULL) HT_OUTOFMEM("ExtensionData_t"); return me;}PRIVATE void ExtensionData_free(ExtensionData_t * me){ ExtensionData_t * pExtensionData; while ((pExtensionData = (ExtensionData_t *) HTList_removeLastObject(me->moreData))) ExtensionData_free(pExtensionData); HT_FREE(me->text); HT_FREE(me);}PRIVATE Extension_t * Extension_new(void){ Extension_t * me; if ((me = (Extension_t *) HT_CALLOC(1, sizeof(Extension_t))) == NULL) HT_OUTOFMEM("Extension_t"); return me;}PRIVATE void Extension_free(Extension_t * me){ ExtensionData_t * pExtensionData; while ((pExtensionData = (ExtensionData_t *) HTList_removeLastObject(me->extensionData))) ExtensionData_free(pExtensionData); SVal_clear(&me->url); HT_FREE(me);}PRIVATE LabelRating_t * LabelRating_new(void){ LabelRating_t * me; if ((me = (LabelRating_t *) HT_CALLOC(1, sizeof(LabelRating_t))) == NULL) HT_OUTOFMEM("LabelRating_t");/* don't initialize HTList me->ranges as it may be just a value */ return me;}PRIVATE void LabelRating_free(LabelRating_t * me){ Range_t * pRange; while ((pRange = (Range_t *) HTList_removeLastObject(me->ranges))) HT_FREE(pRange); SVal_clear(&me->identifier); HT_FREE(me);}PRIVATE SingleLabel_t * SingleLabel_new(LabelOptions_t * pLabelOptions, LabelOptions_t * pParentLabelOptions){ SingleLabel_t * me; if ((me = (SingleLabel_t *) HT_CALLOC(1, sizeof(SingleLabel_t))) == NULL) HT_OUTOFMEM("SingleLabel_t"); me->labelRatings = HTList_new(); me->pLabelOptions = pLabelOptions ? pLabelOptions : LabelOptions_new(pParentLabelOptions); return me;}PRIVATE void SingleLabel_free(SingleLabel_t * me){ LabelRating_t * pLabelRating; while ((pLabelRating = (LabelRating_t *) HTList_removeLastObject(me->labelRatings))) LabelRating_free(pLabelRating); LabelOptions_free(me->pLabelOptions); HT_FREE(me);}PRIVATE Label_t * Label_new(void){ Label_t * me; if ((me = (Label_t *) HT_CALLOC(1, sizeof(Label_t))) == NULL) HT_OUTOFMEM("Label_t"); /* dont initialize HTList me->singleLabels */ return me;}PRIVATE void Label_free(Label_t * me){ SingleLabel_t * pSingleLabel; if (me->pSingleLabel) SingleLabel_free(me->pSingleLabel); else /* if both of these are (erroneously) defined, mem checkers will pick it up */ while ((pSingleLabel = (SingleLabel_t *) HTList_removeLastObject(me->singleLabels))) SingleLabel_free(pSingleLabel); LabelError_free(me->pLabelError); HT_FREE(me);}PRIVATE ServiceInfo_t * ServiceInfo_new(){ ServiceInfo_t * me; if ((me = (ServiceInfo_t *) HT_CALLOC(1, sizeof(ServiceInfo_t))) == NULL) HT_OUTOFMEM("ServiceInfo_t"); me->labels = HTList_new(); me->pLabelOptions = LabelOptions_new(0); return me;}PRIVATE void ServiceInfo_free(ServiceInfo_t * me){ Label_t * pLabel; while ((pLabel = (Label_t *) HTList_removeLastObject(me->labels))) Label_free(pLabel); SVal_clear(&me->rating_service); LabelOptions_free(me->pLabelOptions); LabelError_free(me->pLabelError); HT_FREE(me);}PRIVATE CSLLData_t * CSLLData_new(void){ CSLLData_t * me; if ((me = (CSLLData_t *) HT_CALLOC(1, sizeof(CSLLData_t))) == NULL) HT_OUTOFMEM("CSLLData_t"); me->serviceInfos = HTList_new(); return me;}PRIVATE void CSLLData_free(CSLLData_t * me){ ServiceInfo_t * pServiceInfo; if (CSLabelAssoc_findByData(me)) return; while ((pServiceInfo = (ServiceInfo_t *) HTList_removeLastObject(me->serviceInfos))) ServiceInfo_free(pServiceInfo); FVal_clear(&me->version); LabelError_free(me->pLabelError); HT_FREE(me);}/* P U B L I C C O N S T R U C T O R S / D E S T R U C T O R S */PUBLIC CSLabel_t * CSLabel_new(CSLLData_t * pCSLLData, LabelTargetCallback_t * pLabelTargetCallback, LLErrorHandler_t * pLLErrorHandler){ CSLabel_t * me; if ((me = (CSLabel_t *) HT_CALLOC(1, sizeof(CSLabel_t))) == NULL) HT_OUTOFMEM("CSLabel_t"); me->pCSLLData = pCSLLData; me->pLabelTargetCallback = pLabelTargetCallback; me->pLLErrorHandler = pLLErrorHandler; CSLabelAssoc_add(me, pCSLLData); return me;}PUBLIC CSLabel_t * CSLabel_copy(CSLabel_t * old){ CSLabel_t * me = CSLabel_new(old->pCSLLData, old->pLabelTargetCallback, old->pLLErrorHandler); memcpy(me, old, sizeof(CSLabel_t)); return me;}PUBLIC void CSLabel_free(CSLabel_t * me){ CSLLData_t * pCSLLData = me->pCSLLData; CSLabelAssoc_removeByState(me); HT_FREE(me); CSLLData_free(pCSLLData);}PUBLIC CSLLData_t * CSLabel_getCSLLData(CSLabel_t * me) {return me->pCSLLData;}PUBLIC LabelError_t * CSLabel_getLabelError(CSLabel_t * pCSLabel) {return pCSLabel->pCurrentLabelError;}PUBLIC LabelOptions_t * CSLabel_getLabelOptions(CSLabel_t * pCSLabel) {return pCSLabel->pCurrentLabelOptions;}PUBLIC ServiceInfo_t * CSLabel_getServiceInfo(CSLabel_t * pCSLabel) {return pCSLabel->pCurrentServiceInfo;}PUBLIC char * CSLabel_getServiceName(CSLabel_t * pCSLabel) {return pCSLabel->pCurrentServiceInfo ? SVal_value(&pCSLabel->pCurrentServiceInfo->rating_service): 0;}PUBLIC Label_t * CSLabel_getLabel(CSLabel_t * pCSLabel) {return pCSLabel->pCurrentLabel;}PUBLIC int CSLabel_getLabelNumber(CSLabel_t * pCSLabel) {return pCSLabel->currentLabelNumber;}PUBLIC SingleLabel_t * CSLabel_getSingleLabel(CSLabel_t * pCSLabel)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -