int get_casn_file( struct casn *casnp, const char *name, int fd) { long siz, tmp; uchar *b, *c; // if name is NULL, we were passed an active file descriptor if (name) { struct stat statbuf; if (stat(name, &statbuf) < 0 || !(b = (uchar *) calloc(1, statbuf.st_size + 4)) || (fd = open(name, (O_RDONLY | O_DOS))) < 0 || (siz = read(fd, b, statbuf.st_size + 1)) < 0) return _casn_obj_err(casnp, ASN_FILE_ERR); close(fd); } else { for (siz = 2048, b = c = (uchar *) calloc(1, siz); 1;) { if ((tmp = read(fd, c, 2048)) == 2048) { b = (uchar *) realloc(b, siz + 2048); c = &b[siz]; siz += 2048; } else if (tmp < 0) { if (name) close(fd); // if we opened it return _casn_obj_err(casnp, ASN_FILE_ERR); } else break; } siz = (siz - 1024 + tmp); } // defend against a truncated file c = b; tmp = _get_tag(&c); if ((tmp = _calc_lth(&c, *b)) >= 0) { tmp += (c - b); if (tmp != siz) { free(b); return _casn_obj_err(casnp, ASN_FILE_SIZE_ERR); } } tmp = decode_casn_lth(casnp, b, siz); free(b); return tmp; }
/* ---------------------------------------------------------------- * 功 能:将字符串解包为TLV格式数据 * 输入参数:szBuf 输入字符串 * iBufLen 输入字符串长度 * 输出参数:pTLV TLV格式数据 * 返 回 值:0 成功; -1 失败 * 作 者:fengwei * 日 期:2012-9-24 * 调用说明:UnpackTLV(pTLV, szBuf, iLen) * 修改日志:修改日期 修改者 修改内容简述 * ---------------------------------------------------------------- */ int UnpackTLV(T_TLVStru *pTLV, char* szBuf, int iBufLen) { int i, iIndex, iLen; char szTagBuf[MAX_TAG_LEN+1]; T_TLVData *pData; iIndex = 0; i = 0; while (iIndex < iBufLen) { pData = pTLV->tTLVData + i; iLen = _get_tag(szBuf+iIndex, pTLV->iTagType, pData->szTag); if (iLen == 0) { WriteLog(ERROR, "unpack tlv Tag error"); return FAIL; } iIndex += iLen; iLen = _get_len(szBuf+iIndex, pTLV->iLenType, &(pData->iLen)); if (iLen == 0) { WriteLog(ERROR, "unpack tlv len error"); return FAIL; } iIndex += iLen; iLen = _get_value(szBuf+iIndex, pData->iLen, pTLV->iValueType, pData->szValue); if (iLen < 0) { WriteLog(ERROR, "unpack tlv value error"); return FAIL; } iIndex += iLen; pData->iFlag = DATA_NOTNULL; i++; } return SUCC; }
char * _nedje_text_escape(const char *text) { Eina_Strbuf *txt; char *ret; const char *text_end; size_t text_len; Eina_Array *arr; const char *cur_tag = NULL; if (!text) return NULL; txt = eina_strbuf_new(); text_len = strlen(text); arr = eina_array_new(3); text_end = text + text_len; while (text < text_end) { int advance; if ((text[0] == '<') && text[1]) { const char *tag, *popped; Eina_Bool closing = EINA_FALSE; if (text[1] == '/') //closing tag { closing = EINA_TRUE; tag = _get_tag(text + 2); } else tag = _get_tag(text + 1); if (closing) { if (cur_tag && (tag != cur_tag)) { /* tag mismatch: autoclose all failure tags * not technically required by the spec, * but it makes me feel better about myself */ do { popped = eina_array_pop(arr); if (eina_array_count(arr)) cur_tag = eina_array_data_get(arr, eina_array_count(arr) - 1); else cur_tag = NULL; eina_strbuf_append_printf(txt, "</%c>", popped[1]); } while (cur_tag && (popped != tag)); advance = 4; } else if (cur_tag) { /* tag match: just pop */ popped = eina_array_pop(arr); if (eina_array_count(arr)) cur_tag = eina_array_data_get(arr, eina_array_count(arr) - 1); else cur_tag = NULL; eina_strbuf_append_printf(txt, "</%c>", popped[1]); advance = 4; } else { /* no current tag: escape */ advance = _text_escape(txt, text); } } else { if (tag) { cur_tag = tag; eina_array_push(arr, tag); eina_strbuf_append_printf(txt, "<%c>", tag[1]); advance = 3; } else advance = _text_escape(txt, text); } } else if (text[0] == '&') { const char *s; s = strchr(text, ';'); if (s) s = evas_textblock_escape_string_range_get(text, s + 1); if (s) { eina_strbuf_append_char(txt, text[0]); advance = 1; } else advance = _text_escape(txt, text); } else advance = _text_escape(txt, text); text += advance; } eina_array_free(arr); ret = eina_strbuf_string_steal(txt); eina_strbuf_free(txt); return ret; }