On Tuesday, 15 June 2021 at 12:18:26 UTC, VitaliiY wrote:
It's simple with STARTDATA as mixin, but STOREBITS and ADDBITS use variables defined in STARTDATA scope, so I can't understand how to do mixin template with it.

If the code duplication isn't too bad, consider just expanding the C macros and translating that. I've noticed that some C programmers like to use complex macros just to save 10 lines.

Otherwise, to make STOREBITS and ADDBITS access variables from STARTDATA, you can define them as inner functions.

```D
void f() {
    size_t ressize=0;
    char* blockstart;
    int numbits;
    ulong bitbuffer=0;

    size_t size;

    void storeBits() {
        while(numbits >= 8) {
            if(!size) return 0;
            *(buffer++) = bitbuffer>>(numbits-8);
            numbits -= 8;
            ++ressize;
            --size;
        }
    }
}
```

For the most literal translation, you can use a string mixin. You can't use a template mixin here since those can't insert code, only declarations.

```D
enum string ADDBITS(string a, string b) = `
{
    bitbuffer = (bitbuffer<<(`~a~`))|((`~b~`)&((1<<`~a~`)-1));
    numbits += (`~a~`);
    mixin(STOREBITS);
}`;

// on use: ADDBITS(varA, varB) becomes
mixin(ADDBITS!("varA", "varB"));
```


Reply via email to