MCPcopy Create free account
hub / github.com/GJDuck/e9patch / parseTrampoline

Function parseTrampoline

src/e9patch/e9api.cpp:707–745  ·  view source on GitHub ↗

* Parse a trampoline message. */

Source from the content-addressed store, hash-verified

705 * Parse a trampoline message.
706 */
707static void parseTrampoline(Binary *B, const Message &msg)
708{
709 const char *name = nullptr;
710 Trampoline *T = nullptr;
711 bool dup = false;
712 for (unsigned i = 0; i < msg.num_params; i++)
713 {
714 switch (msg.params[i].name)
715 {
716 case PARAM_NAME:
717 dup = dup || (name != nullptr);
718 name = msg.params[i].value.string;
719 break;
720 case PARAM_TEMPLATE:
721 dup = dup || (T != nullptr);
722 T = msg.params[i].value.trampoline;
723 break;
724 default:
725 break;
726 }
727 }
728 if (name == nullptr)
729 error("failed to parse \"trampoline\" message (id=%u); missing "
730 "\"name\" parameter", msg.id);
731 if (name[0] != '$')
732 error("failed to parse \"trampoline\" message (id=%u); \"name\" "
733 "parameter must begin with a `$', found \"%s\"", msg.id, name);
734 if (T == nullptr)
735 error("failed to parse \"trampoline\" message (id=%u); missing "
736 "\"template\" parameter", msg.id);
737 if (dup)
738 error("failed to parse \"trampoline\" message (id=%u); duplicate "
739 "parameters detected", msg.id);
740
741 auto i = B->Ts.insert(std::make_pair(name, T));
742 if (!i.second)
743 error("failed to parse \"trampoline\" message (id=%u); a trampoline "
744 "with name \"%s\" already exists", msg.id, name);
745}
746
747/*
748 * Parse an option message.

Callers 1

parseMessageFunction · 0.70

Calls 1

errorFunction · 0.85

Tested by

no test coverage detected