static inline void expandEncodingAfterAltPrefix()

in src/agent/DefaultInputMap.cc [331:383]


static inline void expandEncodingAfterAltPrefix(
        const ExpandContext &ctx, char *p, uint16_t extraKeyState) {
    auto appendId = [&](char *&ptr) {
        const auto idstr = decOfInt(ctx.e.id);
        ASSERT(ptr <= ctx.bufferEnd - idstr.size());
        std::copy(idstr.data(), idstr.data() + idstr.size(), ptr);
        ptr += idstr.size();
    };
    ASSERT(p <= ctx.bufferEnd - 2);
    *p++ = '\x1b';
    *p++ = ctx.e.prefix;
    if (ctx.e.modifiers & kBare) {
        char *q = p;
        if (is_numeric) {
            appendId(q);
            expandNumericEncodingSuffix(ctx, q, extraKeyState);
        } else {
            ASSERT(q <= ctx.bufferEnd - 1);
            *q++ = ctx.e.id;
            setEncoding(ctx, q, extraKeyState);
        }
    }
    if (ctx.e.modifiers & kBareMod) {
        ASSERT(!is_numeric && "kBareMod is invalid with numeric sequences");
        for (int mod = 2; mod <= 8; ++mod) {
            char *q = p;
            ASSERT(q <= ctx.bufferEnd - 2);
            *q++ = '0' + mod;
            *q++ = ctx.e.id;
            setEncoding(ctx, q, extraKeyState | keyStateForMod(mod));
        }
    }
    if (ctx.e.modifiers & kSemiMod) {
        for (int mod = 2; mod <= 8; ++mod) {
            char *q = p;
            if (is_numeric) {
                appendId(q);
                ASSERT(q <= ctx.bufferEnd - 2);
                *q++ = ';';
                *q++ = '0' + mod;
                expandNumericEncodingSuffix(
                    ctx, q, extraKeyState | keyStateForMod(mod));
            } else {
                ASSERT(q <= ctx.bufferEnd - 4);
                *q++ = '1';
                *q++ = ';';
                *q++ = '0' + mod;
                *q++ = ctx.e.id;
                setEncoding(ctx, q, extraKeyState | keyStateForMod(mod));
            }
        }
    }
}