static INT32 wmt_conf_parse(P_DEV_WMT pWmtDev, const PINT8 pInBuf, UINT32 size) { PINT8 pch; PINT8 pBuf; PINT8 pLine; PINT8 pKey; PINT8 pVal; PINT8 pPos; INT32 ret = 0; INT32 i = 0; PINT8 pa = NULL; pBuf = osal_malloc(size); if (!pBuf) return -1; osal_memcpy(pBuf, pInBuf, size); pBuf[size] = '\0'; pch = pBuf; /* pch is to be updated by strsep(). Keep pBuf unchanged!! */ #if 0 { PINT8 buf_ptr = pBuf; INT32 k = 0; WMT_INFO_FUNC("%s len=%d", "wmcfg.content:", size); for (k = 0; k < size; k++) { /* if(k%16 == 0) WMT_INFO_FUNC("\n"); */ WMT_INFO_FUNC("%c", buf_ptr[k]); } WMT_INFO_FUNC("--end\n"); } #endif while ((pLine = osal_strsep(&pch, "\r\n")) != NULL) { /* pch is updated to the end of pLine by strsep() and updated to '\0' */ /*WMT_INFO_FUNC("strsep offset(%d), char(%d, '%c' )\n", pLine-pBuf, *pLine, *pLine); */ /* parse each line */ /* WMT_INFO_FUNC("==> Line = (%s)\n", pLine); */ if (!*pLine) continue; pVal = osal_strchr(pLine, '='); if (!pVal) { WMT_WARN_FUNC("mal-format cfg string(%s)\n", pLine); continue; } /* |<-pLine->|'='<-pVal->|'\n' ('\0')| */ *pVal = '\0'; /* replace '=' with '\0' to get key */ /* |<-pKey->|'\0'|<-pVal->|'\n' ('\0')| */ pKey = pLine; if ((pVal - pBuf) < size) pVal++; /*key handling */ pPos = pKey; /*skip space characeter */ while (((*pPos) == ' ') || ((*pPos) == '\t') || ((*pPos) == '\n')) { if ((pPos - pBuf) >= size) break; pPos++; } /*key head */ pKey = pPos; while (((*pPos) != ' ') && ((*pPos) != '\t') && ((*pPos) != '\0') && ((*pPos) != '\n')) { if ((pPos - pBuf) >= size) break; pPos++; } /*key tail */ (*pPos) = '\0'; /*value handling */ pPos = pVal; /*skip space characeter */ while (((*pPos) == ' ') || ((*pPos) == '\t') || ((*pPos) == '\n')) { if ((pPos - pBuf) >= size) break; pPos++; } /*value head */ pVal = pPos; while (((*pPos) != ' ') && ((*pPos) != '\t') && ((*pPos) != '\0') && ((*pPos) != '\n')) { if ((pPos - pBuf) >= size) break; pPos++; } /*value tail */ (*pPos) = '\0'; /* WMT_DBG_FUNC("parse (key: #%s#, value: #%s#)\n", pKey, pVal); */ ret = wmt_conf_parse_pair(pWmtDev, pKey, pVal); WMT_WARN_FUNC("parse (%s, %s, %d)\n", pKey, pVal, ret); if (ret) WMT_WARN_FUNC("parse fail (%s, %s, %d)\n", pKey, pVal, ret); } for (i = 0; i < NUM_WMTCFG_FIELDS; i++) { const struct parse_data *field = &wmtcfg_fields[i]; pa = field->writer(pWmtDev, field); if (pa) { WMT_DBG_FUNC("#%d(%s)=>%s\n", i, field->name, pa); osal_free(pa); } else { WMT_ERR_FUNC("failed to parse '%s'.\n", field->name); } } osal_free(pBuf); return 0; }
INT32 _stp_dbg_parser_assert_str(CHAR *str, ENUM_ASSERT_INFO_PARSER_TYPE type) { char *pStr = NULL; char *pDtr = NULL; char *pTemp = NULL; char *pTemp2 = NULL; char tempBuf[64] = {0}; UINT32 len = 0; char *parser_sub_string[] = { "<ASSERT> ", "id=", "isr=", "irq=", "rc=" }; if (!str) { STP_DBG_ERR_FUNC("NULL string source\n"); return -1; } if (!g_stp_dbg_cpupcr) { STP_DBG_ERR_FUNC("NULL pointer\n"); return -2; } pStr = str; STP_DBG_DBG_FUNC("source infor:%s\n", pStr); switch (type) { case STP_DBG_ASSERT_INFO: pDtr = osal_strstr(pStr, parser_sub_string[type]); if (NULL != pDtr) { pDtr += osal_strlen(parser_sub_string[type]); pTemp = osal_strchr(pDtr, ' '); } else { STP_DBG_ERR_FUNC("parser str is NULL,substring(%s)\n", parser_sub_string[type]); return -3; } len = pTemp - pDtr; osal_memcpy(&g_stp_dbg_cpupcr->assert_info[0], "assert@", osal_strlen("assert@")); osal_memcpy(&g_stp_dbg_cpupcr->assert_info[osal_strlen("assert@")], pDtr, len); g_stp_dbg_cpupcr->assert_info[osal_strlen("assert@") + len] = '_'; pTemp = osal_strchr(pDtr, '#'); pTemp += 1; pTemp2 = osal_strchr(pTemp, ' '); osal_memcpy(&g_stp_dbg_cpupcr->assert_info[osal_strlen("assert@") + len + 1], pTemp, pTemp2 - pTemp); g_stp_dbg_cpupcr->assert_info[osal_strlen("assert@") + len + 1 + pTemp2 - pTemp] = '\0'; STP_DBG_INFO_FUNC("assert info:%s\n", &g_stp_dbg_cpupcr->assert_info[0]); break; case STP_DBG_FW_TASK_ID: pDtr = osal_strstr(pStr, parser_sub_string[type]); if (NULL != pDtr) { pDtr += osal_strlen(parser_sub_string[type]); pTemp = osal_strchr(pDtr, ' '); } else { STP_DBG_ERR_FUNC("parser str is NULL,substring(%s)\n", parser_sub_string[type]); return -3; } len = pTemp - pDtr; osal_memcpy(&tempBuf[0], pDtr, len); tempBuf[len] = '\0'; g_stp_dbg_cpupcr->fwTaskId = osal_strtol(tempBuf, NULL, 16); STP_DBG_INFO_FUNC("fw task id :%x\n", (UINT32)osal_strtol(tempBuf, NULL, 16)); break; case STP_DBG_FW_ISR: pDtr = osal_strstr(pStr, parser_sub_string[type]); if (NULL != pDtr) { pDtr += osal_strlen(parser_sub_string[type]); pTemp = osal_strchr(pDtr, ','); } else { STP_DBG_ERR_FUNC("parser str is NULL,substring(%s)\n", parser_sub_string[type]); return -3; } len = pTemp - pDtr; osal_memcpy(&tempBuf[0], pDtr, len); tempBuf[len] = '\0'; g_stp_dbg_cpupcr->fwIsr = osal_strtol(tempBuf, NULL, 16); STP_DBG_INFO_FUNC("fw isr str:%x\n", (UINT32)osal_strtol(tempBuf, NULL, 16)); break; case STP_DBG_FW_IRQ: pDtr = osal_strstr(pStr, parser_sub_string[type]); if (NULL != pDtr) { pDtr += osal_strlen(parser_sub_string[type]); pTemp = osal_strchr(pDtr, ','); } else { STP_DBG_ERR_FUNC("parser str is NULL,substring(%s)\n", parser_sub_string[type]); return -3; } len = pTemp - pDtr; osal_memcpy(&tempBuf[0], pDtr, len); tempBuf[len] = '\0'; g_stp_dbg_cpupcr->fwRrq = osal_strtol(tempBuf, NULL, 16); STP_DBG_INFO_FUNC("fw irq value:%x\n", (UINT32)osal_strtol(tempBuf, NULL, 16)); break; case STP_DBG_ASSERT_TYPE: pDtr = osal_strstr(pStr, parser_sub_string[type]); if (NULL != pDtr) { pDtr += osal_strlen(parser_sub_string[type]); pTemp = osal_strchr(pDtr, ','); } else { STP_DBG_ERR_FUNC("parser str is NULL,substring(%s)\n", parser_sub_string[type]); return -3; } len = pTemp - pDtr; osal_memcpy(&tempBuf[0], pDtr, len); tempBuf[len] = '\0'; if (0 == osal_memcmp(tempBuf, "*", len)) { osal_memcpy(&g_stp_dbg_cpupcr->assert_type[0], "general assert", osal_strlen("general assert")); } if (0 == osal_memcmp(tempBuf, "Watch Dog Timeout", len)) { osal_memcpy(&g_stp_dbg_cpupcr->assert_type[0], "wdt", osal_strlen("wdt")); } if (0 == osal_memcmp(tempBuf, "RB_FULL", osal_strlen("RB_FULL"))) { osal_memcpy(&g_stp_dbg_cpupcr->assert_type[0], tempBuf, len); pDtr = osal_strstr(&g_stp_dbg_cpupcr->assert_type[0], "RB_FULL("); if (NULL != pDtr) { pDtr += osal_strlen("RB_FULL("); pTemp = osal_strchr(pDtr, ')'); } else { STP_DBG_ERR_FUNC("parser str is NULL,substring(RB_FULL()\n"); return -4; } len = pTemp - pDtr; osal_memcpy(&tempBuf[0], pDtr, len); tempBuf[len] = '\0'; g_stp_dbg_cpupcr->fwTaskId = osal_strtol(tempBuf, NULL, 16); STP_DBG_INFO_FUNC("update fw task id :%x\n", (UINT32)osal_strtol(tempBuf, NULL, 16)); } STP_DBG_INFO_FUNC("fw asert type:%s\n", g_stp_dbg_cpupcr->assert_type); break; default: STP_DBG_ERR_FUNC("unknow parser type\n"); break; } return 0; }