#include "game_types.h"

/* Bignum_MultiplyDigit @ 0x0801CF00 (real 152B) -- multiply by table digit + double-and-add. Mirrors src/matched/Bignum_MultiplyDigit.c. */
/* Multiplies by the table digit for (m & 3), then double-and-adds over the
   remaining bits with the ctx+72 doubler (allocated at 0x271 when missing).
   Returns q. */
extern int *Bignum_Multiply(int ctx, int *q, int m, int d);
extern int *Bignum_AllocDigit(int size);
extern int *Bignum_Add(int ctx, int *a, int *b);
extern void Bignum_ShiftRight(int *a, int *b);

int *Bignum_MultiplyDigit(int ctx, int *q, int m)
{
    int *cc;
    if ((m & 3) != 0)
        q = Bignum_Multiply(ctx, q, *(int *)(0x08CA0498 + ((m & 3) - 1) * 4), 0);
    m >>= 2;
    if (m == 0)
        return q;
    cc = *(int **)((char *)ctx + 72);
    if (cc == 0) {
        cc = Bignum_AllocDigit(0x271);
        *(int **)((char *)ctx + 72) = cc;
        cc[0] = 0;
    }
    for (;;) {
        if ((m & 1) != 0) {
            int *r = Bignum_Add(ctx, q, cc);
            Bignum_ShiftRight(ctx, q);
            q = r;
        }
        m >>= 1;
        if (m == 0)
            break;
        {
            int *v = (int *)cc[0];
            if (v == 0) {
                v = Bignum_Add(ctx, cc, cc);
                cc[0] = (int)v;
                v[0] = 0;
            }
            cc = v;
        }
    }
    return q;
}
