static SI_STATUS si_parser_descr_lookup (
u_int16 uLen, /* I: length of descriptor data. */
u_int8 * pData, /* I: ptr to descriptor data. */
u_int8 MaxDescrs, /* I: max number of descriptors. */
PTR_DESCRIPTOR_ENTRY pDescrEntry, /* I: ptr to descriptor entries. */
u_int8 * pNumDescrs /* O: number of descriptors. */
)
{
int16 uCount;
u_int8 * pBuffer;
u_int8 uDescriptorLen;
u_int8 uNumDescriptor;
PTR_DESCRIPTOR_ENTRY pEntry;
u_int8 * p;
if ((NULL == pData) || (0 == MaxDescrs) || (NULL == pDescrEntry) ||
(NULL == pNumDescrs))
{
return (SI_ERROR);
}
uCount = uLen;
pBuffer = pData;
uNumDescriptor = 0;
pEntry = pDescrEntry;
while (uCount > 0)
{
/* store the found descriptor information. */
pEntry->pData = pBuffer;
p = pBuffer;
pEntry->uTag = *pBuffer++;
pEntry->uLen = *pBuffer++;
uDescriptorLen = pEntry->uLen;
pEntry->uLength = uDescriptorLen + 2;
/* go to next */
// printf("###pEntry->uTag:0x%0x\n",pEntry->uTag);
if(pEntry->uTag == 0x4d){
p += 2;
lang_code[0]=p++;
lang_code[1]=p++;
lang_code[2]=p++;
p+=1;
name = p;
p += pEntry->uLen;
p++;
text = p;
// printf("###name:%-30s text:%-30s\n",name,text);
}
uCount = uCount - uDescriptorLen - 2;
if(uCount < 0)
{
return SI_ERROR;
}
pBuffer = pBuffer + uDescriptorLen;
pEntry ++;
uNumDescriptor ++;
/* if there are too many descriptors to store, ignore the rest. */
if (uNumDescriptor >= MaxDescrs)
{
break;
}
}
/* return the number of the found descriptors. */
*pNumDescrs = uNumDescriptor;
return (SI_OK);
} /* si_parser_descr_lookup */