📄 cslabel.c
字号:
{return pCSLabel->pCurrentSingleLabel;}PUBLIC LabelRating_t * CSLabel_getLabelRating(CSLabel_t * pCSLabel) {return pCSLabel->pCurrentLabelRating;}PUBLIC char * CSLabel_getRatingName(CSLabel_t * pCSLabel) {return pCSLabel->pCurrentLabelRating ? SVal_value(&pCSLabel->pCurrentLabelRating->identifier): 0;}PUBLIC Range_t * CSLabel_getLabelRatingRange(CSLabel_t * pCSLabel) {return pCSLabel->pCurrentRange;}PUBLIC char * CSLabel_getRatingStr(CSLabel_t * pCSLabel){ HTChunk * pChunk; HTList * ranges; Range_t * curRange; FVal_t fVal; int count = 0; fVal = CSLabel_getLabelRating(pCSLabel)->value; if (FVal_initialized(&fVal)) return FVal_toStr(&fVal); pChunk = HTChunk_new(20); ranges = CSLabel_getLabelRating(pCSLabel)->ranges; while ((curRange = (Range_t *) HTList_nextObject(ranges))) { char * ptr; count++; ptr = Range_toStr(curRange); if (count > 1) HTChunk_puts(pChunk, " "); HTChunk_puts(pChunk, ptr); HT_FREE(ptr); } return HTChunk_toCString(pChunk);}PUBLIC CSParse_t * CSParse_newLabel(LabelTargetCallback_t * pLabelTargetCallback, LLErrorHandler_t * pLLErrorHandler){ CSParse_t * me = CSParse_new(); me->pParseContext->engineOf = &CSParse_targetParser; me->pParseContext->pTargetChangeCallback = &targetChangeCallback; me->pParseContext->pParseErrorHandler = &parseErrorHandler; me->target.pCSLabel = CSLabel_new(CSLLData_new(), pLabelTargetCallback, pLLErrorHandler); me->pTargetObject = &LabelList_targetObject; me->currentSubState = SubState_N; return me;}PUBLIC CSLabel_t * CSParse_getLabel(CSParse_t * me){ return (me->target.pCSLabel);}PUBLIC BOOL CSParse_deleteLabel(CSParse_t * pCSParse){ CSLabel_t * me = GetCSLabel(pCSParse); CSLLData_free(CSLabel_getCSLLData(me)); CSLabel_free(me); CSParse_delete(pCSParse); return YES;}/* D E F A U L T P A R S I N G H A N D L E R S */PRIVATE StateRet_t targetChangeCallback(CSParse_t * pCSParse, TargetObject_t * pTargetObject, CSParseTC_t target, BOOL closed, void * pVoid){ CSLabel_t * pCSLabel = GetCSLabel(pCSParse); if (pCSLabel->pLabelTargetCallback) return (*pCSLabel->pLabelTargetCallback)(pCSLabel, pCSParse, (CSLLTC_t)target, closed, pVoid); return StateRet_OK;}PRIVATE StateRet_t parseErrorHandler(CSParse_t * pCSParse, const char * token, char demark, StateRet_t errorCode){ CSLabel_t * pCSLabel = GetCSLabel(pCSParse); if (pCSLabel->pLLErrorHandler) return (*pCSLabel->pLLErrorHandler)(pCSLabel, pCSParse, token, demark, errorCode); return errorCode;}/* CSParse_doc methods *//* P A R S I N G S T A T E F U N C T I O N S */#ifndef NO_CHAR_TESTPRIVATE BOOL charSetOK(CSParse_t * pCSParse, char * checkMe, CharSet_t set){ for (;*checkMe;checkMe++) { if (set & CharSet_ALPHAS && ((*checkMe >= 'A' && *checkMe <= 'Z') || (*checkMe >= 'a' && *checkMe <= 'z'))) continue; if (set & CharSet_DIGITS && ((*checkMe >= '0' && *checkMe <= '9') || *checkMe == '.')) continue; if (set & CharSet_PLUSMINUS && ((*checkMe == '+' || *checkMe == '-'))) continue; if (set & CharSet_FORSLASH && *checkMe == '/') continue; if (set & CharSet_BASE64_EXTRAS && ((*checkMe == '+' || *checkMe == '/' || *checkMe == '='))) continue; if (set & CharSet_DATE_EXTRAS && (*checkMe == '.' || *checkMe == ':' || *checkMe == '-' || *checkMe == 'T')) continue; /* RFC1738:2.1:"+.-","#%",";/"?:@=&" 2.2:"$-_.+!*'()," */ if (set & CharSet_URL_EXTRAS && (*checkMe == ':' || *checkMe == '?' || *checkMe == '#' || *checkMe == '%' || *checkMe == '/' || *checkMe == '.' || *checkMe == '-' || *checkMe == '_' || *checkMe == '~' || *checkMe == '\\')) continue;/* '.' | ' ' | ',' | ';' | ':' | '&' | '=' | '?' | '!' | '*' | '~' | '@' | '#' */ if (set & CharSet_EXTENS && (*checkMe == '.' || *checkMe == ' ' || *checkMe == ',' || *checkMe == ';' || *checkMe == ':' || *checkMe == '&' || *checkMe == '=' || *checkMe == '?' || *checkMe == '!' || *checkMe == '*' || *checkMe == '~' || *checkMe == '@' || *checkMe == '#' || *checkMe == '\''|| *checkMe == '/' || *checkMe == '-')) continue; pCSParse->pParseContext->pTokenError = checkMe; return FALSE; } return TRUE;}#endif /* !NO_CHAR_TEST */PRIVATE StateRet_t isQuoted(CSParse_t * pCSParse, StateToken_t * pStateToken, char * token, char demark){ ParseContext_t * pParseContext = pCSParse->pParseContext; if (!pParseContext->observedQuotes) return StateRet_WARN_NO_MATCH; if (Punct_badDemark(pStateToken->validPunctuation, demark)) return StateRet_WARN_BAD_PUNCT; return StateRet_OK;}PRIVATE StateRet_t hasToken(CSParse_t * pCSParse, StateToken_t * pStateToken, char * token, char demark){ return token ? StateRet_OK : StateRet_WARN_NO_MATCH;}#if 0PRIVATE StateRet_t clearToken(CSParse_t * pCSParse, char * token, char demark){ HTChunk_clear(pCSParse->token); return StateRet_OK;}#endif/* getOption - see if token matches an option.This may be called by: ServiceInfo: add option to existent options, pCurrentLabelError is set by ServiceInfo_open Label: kick off SingleLabel - SingleLabel_new(), pCurrentLabelError is 0 SingleLabel: add another option to existent options, pCurrentLabelError is set by SingleLabel_open */#define CSOffsetOf(s,m) (size_t)&(((s *)0)->m)#define CHECK_OPTION_TOKEN_BVAL1(text, pointer) \if (!strcasecomp(token, text)) {\ pCSParse->pParseContext->valTarget.pTargetBVal = pointer;\ pCSParse->pParseContext->valType = ValType_BVAL;\ break;\}#define CHECK_OPTION_TOKEN_FVAL1(text, pointer) \if (!strcasecomp(token, text)) {\ pCSParse->pParseContext->valTarget.pTargetFVal = pointer;\ pCSParse->pParseContext->valType = ValType_FVAL;\ break;\}#define CHECK_OPTION_TOKEN_SVAL1(text, pointer, charSet) \if (!strcasecomp(token, text)) {\ pCSParse->pParseContext->valTarget.pTargetSVal = pointer;\ pCSParse->pParseContext->valType = ValType_SVAL;\ SET_CHAR_SET(charSet)\ break;\}#define CHECK_OPTION_TOKEN_DVAL1(text, pointer) \if (!strcasecomp(token, text)) {\ pCSParse->pParseContext->valTarget.pTargetDVal = pointer;\ pCSParse->pParseContext->valType = ValType_DVAL;\ break;\}PRIVATE StateRet_t getOption(CSParse_t * pCSParse, StateToken_t * pStateToken, char * token, char demark){ CSLabel_t * pCSLabel = GetCSLabel(pCSParse); LabelOptions_t * me = pCSLabel->pCurrentLabelOptions; if (!token) return StateRet_WARN_NO_MATCH; if (!me) me = pCSLabel->pCurrentLabelOptions = LabelOptions_new(pCSLabel->pCurrentServiceInfo->pLabelOptions); /* match token against legal options */ pCSParse->pParseContext->valType = ValType_NONE; /* use valType to flag a match */ do { /* fake do loop for break statements (to religiously avoid the goto) */ CHECK_OPTION_TOKEN_DVAL1("at", &me->at) CHECK_OPTION_TOKEN_SVAL1("by", &me->by, CharSet_EXT_ALPHANUM) CHECK_OPTION_TOKEN_SVAL1("complete_label", &me->complete_label, CharSet_URL) CHECK_OPTION_TOKEN_SVAL1("full", &me->complete_label, CharSet_URL) CHECK_OPTION_TOKEN_SVAL1("for", &me->fur, CharSet_URL) CHECK_OPTION_TOKEN_BVAL1("generic", &me->generic) CHECK_OPTION_TOKEN_BVAL1("gen", &me->generic) CHECK_OPTION_TOKEN_SVAL1("MIC-md5", &me->MIC_md5, CharSet_BASE64) CHECK_OPTION_TOKEN_SVAL1("md5", &me->MIC_md5, CharSet_BASE64) CHECK_OPTION_TOKEN_DVAL1("on", &me->on) CHECK_OPTION_TOKEN_SVAL1("signature-PKCS", &me->signature_PKCS, CharSet_BASE64) CHECK_OPTION_TOKEN_DVAL1("until", &me->until) CHECK_OPTION_TOKEN_DVAL1("exp", &me->until) if (!strcasecomp(token, "comment")) { pCSParse->pParseContext->valTarget.pTargetList = &me->comments; pCSParse->pParseContext->valType = ValType_COMMENT; break; } } while (0); if (pCSParse->pParseContext->valType == ValType_NONE) return StateRet_WARN_NO_MATCH; if (Punct_badDemark(pStateToken->validPunctuation, demark)) return StateRet_WARN_BAD_PUNCT; return StateRet_OK;}PRIVATE StateRet_t getOptionValue(CSParse_t * pCSParse, StateToken_t * pStateToken, char * token, char demark){ CSLabel_t * pCSLabel = GetCSLabel(pCSParse); switch (pCSParse->pParseContext->valType) { case ValType_BVAL: BVal_readVal(pCSParse->pParseContext->valTarget.pTargetBVal, token); pCSParse->pParseContext->valType = ValType_NONE; break; case ValType_FVAL: CHECK_CAR_SET(CharSet_NUMBER) FVal_readVal(pCSParse->pParseContext->valTarget.pTargetFVal, token); pCSParse->pParseContext->valType = ValType_NONE; break; case ValType_SVAL: CHECK_CAR_SET(pCSLabel->targetCharSet) SVal_readVal(pCSParse->pParseContext->valTarget.pTargetSVal, token); pCSParse->pParseContext->valType = ValType_NONE; break; case ValType_DVAL: CHECK_CAR_SET(CharSet_DATE) DVal_readVal(pCSParse->pParseContext->valTarget.pTargetDVal, token); pCSParse->pParseContext->valType = ValType_NONE; break; case ValType_COMMENT: CHECK_CAR_SET(CharSet_EXT_ALPHANUM) { char * ptr = 0; StrAllocCopy(ptr, token); HTList_appendObject(*pCSParse->pParseContext->valTarget.pTargetList, (void *)ptr); } break; default: break; } return StateRet_OK;}PRIVATE StateRet_t LabelList_open(CSParse_t * pCSParse, char * token, char demark){ return StateRet_OK;}PRIVATE StateRet_t LabelList_getVersion(CSParse_t * pCSParse, StateToken_t * pStateToken, char * token, char demark){static const char versionPrefix[] = "PICS-"; CSLabel_t * pCSLabel = GetCSLabel(pCSParse); if (!token) return StateRet_WARN_NO_MATCH; if (strncasecomp(token, versionPrefix, sizeof(versionPrefix)-1)) return StateRet_WARN_NO_MATCH; token += sizeof(versionPrefix)-1; CHECK_CAR_SET(CharSet_NUMBER) FVal_readVal(&pCSLabel->pCSLLData->version, token); return StateRet_OK;}PRIVATE StateRet_t LabelList_close(CSParse_t * pCSParse, char * token, char demark){ return StateRet_DONE;}PRIVATE void LabelList_destroy(CSParse_t * pCSParse){}PRIVATE StateRet_t ServiceInfo_open(CSParse_t * pCSParse, char * token, char demark){ CSLabel_t * pCSLabel = GetCSLabel(pCSParse); pCSLabel->pCurrentServiceInfo = ServiceInfo_new(); pCSLabel->currentLabelNumber = 0; HTList_appendObject(pCSLabel->pCSLLData->serviceInfos, (void *)pCSLabel->pCurrentServiceInfo); pCSLabel->pCurrentLabelOptions = pCSLabel->pCurrentServiceInfo->pLabelOptions; return StateRet_OK;}PRIVATE StateRet_t ServiceInfo_getServiceId(CSParse_t * pCSParse, StateToken_t * pStateToken, char * token, char demark)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -