std::string UpdateFieldDumper::FormatValue(std::uint32_t val, std::string const& valueBase) { std::ostringstream str; if (!valueBase.empty()) str << valueBase << " + "; str << hex_number(val); return str.str(); }
void unconvert_meta(char *input, char *output) { char *pti, *pto; pti = input; pto = output; while (*pti) { switch (pti[0]) { case '\\': switch (pti[1]) { case 'C': if (pti[2] == '-' && pti[3]) { *pto++ = pti[3] - 'a' + 1; pti += 4; } else { *pto++ = *pti++; } break; case 'c': *pto++ = pti[2] % 32; pti += 3; break; case 'a': *pto++ = '\a'; pti += 2; break; case 'b': *pto++ = 127; pti += 2; break; case 'e': *pto++ = ESCAPE; pti += 2; break; case 't': *pto++ = '\t'; pti += 2; break; case 'x': if (pti[2] && pti[3]) { *pto++ = hex_number(&pti[2]); pti += 4; } else { *pto++ = *pti++; } break; default: *pto++ = *pti++; break; } break; default: *pto++ = *pti++; break; } } *pto = 0; }
int substitute(struct session *ses, char *string, char *result, int flags) { struct listnode *node; char temp[BUFFER_SIZE], buf[BUFFER_SIZE], buffer[BUFFER_SIZE], *pti, *pto, *ptt; char *pte, old[6] = { 0 }; int i, cnt, escape = FALSE, flags_neol = flags; push_call("substitute(%p,%p,%p,%d)", ses, string, result, flags); pti = string; pto = (string == result) ? buffer : result; DEL_BIT(flags_neol, SUB_EOL | SUB_LNF); while (TRUE) { if (HAS_BIT(ses->flags, SES_FLAG_BIG5) && *pti & 128 && pti[1] != 0) { *pto++ = *pti++; *pto++ = *pti++; continue; } switch (*pti) { case '\0': if (HAS_BIT(flags, SUB_EOL)) { if (HAS_BIT(ses->flags, SES_FLAG_RUN)) { *pto++ = '\r'; } else { *pto++ = '\r'; *pto++ = '\n'; } } if (HAS_BIT(flags, SUB_LNF)) { *pto++ = '\n'; } *pto = 0; pop_call(); if (string == result) { strcpy(result, buffer); return pto - buffer; } else { return pto - result; } break; case '$': if (HAS_BIT(flags, SUB_VAR) && (pti[1] == DEFAULT_OPEN || isalpha((int)pti[1]) || pti[1] == '$')) { int def = FALSE; if (pti[1] == '$') { while (pti[1] == '$') { *pto++ = *pti++; } if (pti[1] == DEFAULT_OPEN || isalnum((int)pti[1])) { pti++; } else { *pto++ = *pti++; } continue; } pti++; if (*pti == DEFAULT_OPEN) { def = TRUE; pti = get_arg_in_braces(ses, pti, buf, TRUE); substitute(ses, buf, temp, flags_neol); } else { ptt = temp; while (isalnum((int)*pti) || *pti == '_') { *ptt++ = *pti++; } *ptt = 0; } pti = get_arg_at_brackets(ses, pti, temp + strlen(temp)); substitute(ses, temp, buf, flags_neol); get_nest_node(ses->list[LIST_VARIABLE], buf, temp, def); substitute(ses, temp, pto, flags_neol - SUB_VAR); pto += strlen(pto); } else { *pto++ = *pti++; } break; case '<': if (HAS_BIT(flags, SUB_COL)) { if (HAS_BIT(flags, SUB_CMP) && !strncmp(old, pti, 5)) { pti += 5; } else if (isdigit((int)pti[1]) && isdigit((int)pti[2]) && isdigit((int)pti[3]) && pti[4] == '>') { if (pti[1] != '8' || pti[2] != '8' || pti[3] != '8') { *pto++ = ESCAPE; *pto++ = '['; switch (pti[1]) { case '2': *pto++ = '2'; *pto++ = '2'; *pto++ = ';'; break; case '8': break; default: *pto++ = pti[1]; *pto++ = ';'; } switch (pti[2]) { case '8': break; default: *pto++ = '3'; *pto++ = pti[2]; *pto++ = ';'; break; } switch (pti[3]) { case '8': break; default: *pto++ = '4'; *pto++ = pti[3]; *pto++ = ';'; break; } pto--; *pto++ = 'm'; } pti += sprintf(old, "<%c%c%c>", pti[1], pti[2], pti[3]); } else if (pti[1] >= 'a' && pti[1] <= 'f' && pti[2] >= 'a' && pti[2] <= 'f' && pti[3] >= 'a' && pti[3] <= 'f' && pti[4] == '>') { *pto++ = ESCAPE; *pto++ = '['; *pto++ = '3'; *pto++ = '8'; *pto++ = ';'; *pto++ = '5'; *pto++ = ';'; cnt = 16 + (pti[1] - 'a') * 36 + (pti[2] - 'a') * 6 + (pti[3] - 'a'); *pto++ = '0' + cnt / 100; *pto++ = '0' + cnt % 100 / 10; *pto++ = '0' + cnt % 10; *pto++ = 'm'; pti += sprintf(old, "<%c%c%c>", pti[1], pti[2], pti[3]); } else if (pti[1] >= 'A' && pti[1] <= 'F' && pti[2] >= 'A' && pti[2] <= 'F' && pti[3] >= 'A' && pti[3] <= 'F' && pti[4] == '>') { *pto++ = ESCAPE; *pto++ = '['; *pto++ = '4'; *pto++ = '8'; *pto++ = ';'; *pto++ = '5'; *pto++ = ';'; cnt = 16 + (pti[1] - 'A') * 36 + (pti[2] - 'A') * 6 + (pti[3] - 'A'); *pto++ = '0' + cnt / 100; *pto++ = '0' + cnt % 100 / 10; *pto++ = '0' + cnt % 10; *pto++ = 'm'; pti += sprintf(old, "<%c%c%c>", pti[1], pti[2], pti[3]); } else if (pti[1] == 'g' && isdigit((int)pti[2]) && isdigit((int)pti[3]) && pti[4] == '>') { *pto++ = ESCAPE; *pto++ = '['; *pto++ = '3'; *pto++ = '8'; *pto++ = ';'; *pto++ = '5'; *pto++ = ';'; cnt = 232 + (pti[2] - '0') * 10 + (pti[3] - '0'); *pto++ = '0' + cnt / 100; *pto++ = '0' + cnt % 100 / 10; *pto++ = '0' + cnt % 10; *pto++ = 'm'; pti += sprintf(old, "<%c%c%c>", pti[1], pti[2], pti[3]); } else if (pti[1] == 'G' && isdigit((int)pti[2]) && isdigit((int)pti[3]) && pti[4] == '>') { *pto++ = ESCAPE; *pto++ = '['; *pto++ = '4'; *pto++ = '8'; *pto++ = ';'; *pto++ = '5'; *pto++ = ';'; cnt = 232 + (pti[2] - '0') * 10 + (pti[3] - '0'); *pto++ = '0' + cnt / 100; *pto++ = '0' + cnt % 100 / 10; *pto++ = '0' + cnt % 10; *pto++ = 'm'; pti += sprintf(old, "<%c%c%c>", pti[1], pti[2], pti[3]); } else { *pto++ = *pti++; } } else { *pto++ = *pti++; } break; case '@': if (HAS_BIT(flags, SUB_FUN)) { if (pti[1] == '@') { escape = TRUE; *pto++ = *pti++; continue; } for (ptt = temp, i = 1; isalnum((int)pti[i]) || pti[i] == '_'; i++) { *ptt++ = pti[i]; } *ptt = 0; node = search_node_list(ses->list[LIST_FUNCTION], temp); if (node == NULL || pti[i] != DEFAULT_OPEN) { escape = FALSE; *pto++ = *pti++; continue; } if (escape) { pti++; continue; } pti = get_arg_in_braces(ses, &pti[i], temp, FALSE); substitute(ses, temp, buf, flags_neol); show_debug(ses, LIST_FUNCTION, "#DEBUG FUNCTION {%s}", node->left); RESTRING(gtd->vars[0], buf); pte = buf; for (i = 1; i < 100; i++) { pte = get_arg_in_braces(ses, pte, temp, TRUE); RESTRING(gtd->vars[i], temp); if (*pte == 0) { break; } if (*pte == COMMAND_SEPARATOR) { pte++; } } substitute(ses, node->right, buf, SUB_ARG); script_driver(ses, LIST_FUNCTION, buf); substitute(ses, "$result", pto, flags_neol | SUB_VAR); pto += strlen(pto); } else { *pto++ = *pti++; } break; case '%': if (HAS_BIT(flags, SUB_ARG) && (isdigit((int)pti[1]) || pti[1] == '%')) { if (pti[1] == '%') { while (pti[1] == '%') { *pto++ = *pti++; } pti++; } else { i = isdigit((int)pti[2]) ? (pti[1] - '0') * 10 + pti[2] - '0' : pti[1] - '0'; ptt = gtd->vars[i]; while (*ptt) { if (HAS_BIT(ses->flags, SES_FLAG_BIG5) && *ptt & 128 && ptt[1] != 0) { *pto++ = *ptt++; *pto++ = *ptt++; continue; } if (HAS_BIT(flags, SUB_SEC)) { switch (*ptt) { case '\\': *pto++ = '\\'; *pto++ = '\\'; break; case '{': *pto++ = '\\'; *pto++ = 'x'; *pto++ = '7'; *pto++ = 'B'; break; case '}': *pto++ = '\\'; *pto++ = 'x'; *pto++ = '7'; *pto++ = 'D'; break; case COMMAND_SEPARATOR: *pto++ = '\\'; *pto++ = COMMAND_SEPARATOR; break; default: *pto++ = *ptt; break; } ptt++; } else { *pto++ = *ptt++; } } pti += isdigit((int)pti[2]) ? 3 : 2; } } else { *pto++ = *pti++; } break; case '&': if (HAS_BIT(flags, SUB_CMD) && (isdigit((int)pti[1]) || pti[1] == '&')) { if (pti[1] == '&') { while (pti[1] == '&') { *pto++ = *pti++; } if (isdigit((int)pti[1])) { pti++; } else { *pto++ = *pti++; } } else { i = isdigit((int)pti[2]) ? (pti[1] - '0') * 10 + pti[2] - '0' : pti[1] - '0'; for (cnt = 0; gtd->cmds[i][cnt]; cnt++) { *pto++ = gtd->cmds[i][cnt]; } pti += isdigit((int)pti[2]) ? 3 : 2; } } else if (HAS_BIT(flags, SUB_VAR) && (pti[1] == DEFAULT_OPEN || isalpha((int)pti[1]) || pti[1] == '&')) { int def = 0; if (pti[1] == '&') { while (pti[1] == '&') { *pto++ = *pti++; } if (pti[1] == DEFAULT_OPEN || isalnum((int)pti[1])) { pti++; } else { *pto++ = *pti++; } continue; } pti++; if (*pti == DEFAULT_OPEN) { def = TRUE; pti = get_arg_in_braces(ses, pti, buf, TRUE); substitute(ses, buf, temp, flags_neol); } else { for (ptt = temp; isalnum((int)*pti) || *pti == '_'; i++) { *ptt++ = *pti++; } *ptt = 0; } pti = get_arg_at_brackets(ses, pti, temp + strlen(temp)); substitute(ses, temp, buf, flags_neol); get_nest_index(ses->list[LIST_VARIABLE], buf, temp, def); substitute(ses, temp, pto, flags_neol - SUB_VAR); pto += strlen(pto); } else { *pto++ = *pti++; } break; case '\\': if (HAS_BIT(flags, SUB_ESC)) { pti++; switch (*pti) { case 'a': *pto++ = '\a'; break; case 'b': *pto++ = '\b'; break; case 'c': if (pti[1]) { pti++; *pto++ = *pti % 32; } break; case 'e': *pto++ = '\033'; break; case 'n': *pto++ = '\n'; break; case 'r': *pto++ = '\r'; break; case 't': *pto++ = '\t'; break; case 'x': if (pti[1] && pti[2]) { pti++; *pto++ = hex_number(pti); pti++; } break; case '0': if (pti[1] && pti[2]) { pti++; *pto++ = oct_number(pti); pti++; } break; case '\0': DEL_BIT(flags, SUB_EOL); DEL_BIT(flags, SUB_LNF); continue; default: *pto++ = *pti; break; } pti++; } else { *pto++ = *pti++; } break; case ESCAPE: *pto++ = *pti++; break; default: if (HAS_BIT(flags, SUB_SEC) && !HAS_BIT(flags, SUB_ARG)) { switch (*pti) { case '\\': *pto++ = '\\'; *pto++ = '\\'; break; case '{': *pto++ = '\\'; *pto++ = 'x'; *pto++ = '7'; *pto++ = 'B'; break; case '}': *pto++ = '\\'; *pto++ = 'x'; *pto++ = '7'; *pto++ = 'D'; break; case COMMAND_SEPARATOR: *pto++ = '\\'; *pto++ = COMMAND_SEPARATOR; break; default: *pto++ = *pti; break; } pti++; } else { *pto++ = *pti++; } break; } } }