I was looking at verify_reg_() in programs/reg/tests/reg.c:61 and noticed some simple if statements:
if (todo & TODO_REG_TYPE) todo_wine lok(type == exp_type, "got wrong type %d, expected %d\n", type, exp_type); else lok(type == exp_type, "got wrong type %d, expected %d\n", type, exp_type); if (todo & TODO_REG_SIZE) todo_wine lok(size == exp_size, "got wrong size %d, expected %d\n", size, exp_size); else lok(size == exp_size, "got wrong size %d, expected %d\n", size, exp_size); if (todo & TODO_REG_DATA) todo_wine lok(memcmp(data, exp_data, size) == 0, "got wrong data\n"); else lok(memcmp(data, exp_data, size) == 0, "got wrong data\n");
Simple enough, except if I pass TODO_REG_TYPE to this function it never even tries the size or data blocks. While this makes sense to implement (You can't test the data if you don't know it's size) I have no idea *how* it does it.
I've tried the obvious - the mask values don't overlap in a way that would cause it to fallthrough. The lok and todo_wine macros don't have anything in them that returns.
In fact the todo_wine macro appears to start a loop for some reason and all in all I'm very confused as to how exactly it's doing this.
I'm curious as to how this works under the hood.
I also need to stick a broken() in there somewhere but every time I do it falls through, and I don't want to rewrite the entire verify_reg_() function for a single exception.
(If you're interested, reg add a REG_BINARY with an odd number of characters prefixes a 0 nibble, but suffixes it in XP)