#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Binding
{
int* pIntVar;
const char* IntVarName;
struct Binding* pNext;
} Binding;
Binding* Bindings = NULL;
void BindVar(const char* IntVarName, int* pIntVar)
{
Binding* b;
if ((b
= malloc(sizeof(Binding
))) != NULL
) {
b->IntVarName = IntVarName;
b->pIntVar = pIntVar;
b->pNext = NULL;
if (Bindings == NULL)
{
Bindings = b;
}
else
{
Binding* bs = Bindings;
while (bs->pNext != NULL)
{
bs = bs->pNext;
}
bs->pNext = b;
}
}
else
{
fprintf(stderr
, "malloc() failed\n"); }
}
int* GetVarPtr(const char* IntVarName)
{
Binding* bs = Bindings;
while (bs != NULL)
{
if (!strcmp(bs
->IntVarName
, IntVarName
)) {
return bs->pIntVar;
}
bs = bs->pNext;
}
fprintf(stderr
, "variable \"%s\" not bound yet!\n", IntVarName
); }
int main(void)
{
int ABC = 111, DEF = 222, XYZ = 333;
const char* varName = NULL;
BindVar("ABC", &ABC);
BindVar("DEF", &DEF);
BindVar("XYZ", &XYZ);
printf("variable \"%s\" = %d\n", "ABC", *GetVarPtr
("ABC")); printf("variable \"%s\" = %d\n", "DEF", *GetVarPtr
("DEF")); printf("variable \"%s\" = %d\n", "XYZ", *GetVarPtr
("XYZ"));
// Pick a variable randomly by name
{
case 0: varName = "ABC"; break;
case 1: varName = "DEF"; break;
case 2: varName = "XYZ"; break;
}
printf("variable \"%s\" (selected randomly) = %d\n", varName
, *GetVarPtr
(varName
));
// Hide the pointer stuff behind this macro:
#define VARIABLE(NAME) (*GetVarPtr(NAME))
VARIABLE("ABC") = 1;
VARIABLE("DEF") = 2;
VARIABLE("XYZ") = 3;
printf("variable \"%s\" = %d\n", "ABC", VARIABLE
("ABC")); printf("variable \"%s\" = %d\n", "DEF", VARIABLE
("DEF")); printf("variable \"%s\" = %d\n", "XYZ", VARIABLE
("XYZ"));
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKdHlwZWRlZiBzdHJ1Y3QgQmluZGluZwp7CiAgaW50KiBwSW50VmFyOwogIGNvbnN0IGNoYXIqIEludFZhck5hbWU7CiAgc3RydWN0IEJpbmRpbmcqIHBOZXh0Owp9IEJpbmRpbmc7CgpCaW5kaW5nKiBCaW5kaW5ncyA9IE5VTEw7Cgp2b2lkIEJpbmRWYXIoY29uc3QgY2hhciogSW50VmFyTmFtZSwgaW50KiBwSW50VmFyKQp7CiAgQmluZGluZyogYjsKICBpZiAoKGIgPSBtYWxsb2Moc2l6ZW9mKEJpbmRpbmcpKSkgIT0gTlVMTCkKICB7CiAgICBiLT5JbnRWYXJOYW1lID0gSW50VmFyTmFtZTsKICAgIGItPnBJbnRWYXIgPSBwSW50VmFyOwogICAgYi0+cE5leHQgPSBOVUxMOwogICAgaWYgKEJpbmRpbmdzID09IE5VTEwpCiAgICB7CiAgICAgIEJpbmRpbmdzID0gYjsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgQmluZGluZyogYnMgPSBCaW5kaW5nczsKICAgICAgd2hpbGUgKGJzLT5wTmV4dCAhPSBOVUxMKQogICAgICB7CiAgICAgICAgYnMgPSBicy0+cE5leHQ7CiAgICAgIH0KICAgICAgYnMtPnBOZXh0ID0gYjsKICAgIH0KICB9CiAgZWxzZQogIHsKICAgIGZwcmludGYoc3RkZXJyLCAibWFsbG9jKCkgZmFpbGVkXG4iKTsKICAgIGV4aXQoLTEpOwogIH0KfQoKaW50KiBHZXRWYXJQdHIoY29uc3QgY2hhciogSW50VmFyTmFtZSkKewogIEJpbmRpbmcqIGJzID0gQmluZGluZ3M7CiAgd2hpbGUgKGJzICE9IE5VTEwpCiAgewogICAgaWYgKCFzdHJjbXAoYnMtPkludFZhck5hbWUsIEludFZhck5hbWUpKQogICAgewogICAgICByZXR1cm4gYnMtPnBJbnRWYXI7CiAgICB9CiAgICBicyA9IGJzLT5wTmV4dDsKICB9CiAgZnByaW50ZihzdGRlcnIsICJ2YXJpYWJsZSBcIiVzXCIgbm90IGJvdW5kIHlldCFcbiIsIEludFZhck5hbWUpOwogIGV4aXQoLTEpOwp9CgppbnQgbWFpbih2b2lkKQp7CiAgaW50IEFCQyA9IDExMSwgREVGID0gMjIyLCBYWVogPSAzMzM7CiAgY29uc3QgY2hhciogdmFyTmFtZSA9IE5VTEw7CgogIEJpbmRWYXIoIkFCQyIsICZBQkMpOwogIEJpbmRWYXIoIkRFRiIsICZERUYpOwogIEJpbmRWYXIoIlhZWiIsICZYWVopOwoKICBwcmludGYoInZhcmlhYmxlIFwiJXNcIiA9ICVkXG4iLCAiQUJDIiwgKkdldFZhclB0cigiQUJDIikpOwogIHByaW50ZigidmFyaWFibGUgXCIlc1wiID0gJWRcbiIsICJERUYiLCAqR2V0VmFyUHRyKCJERUYiKSk7CiAgcHJpbnRmKCJ2YXJpYWJsZSBcIiVzXCIgPSAlZFxuIiwgIlhZWiIsICpHZXRWYXJQdHIoIlhZWiIpKTsKCiAgLy8gUGljayBhIHZhcmlhYmxlIHJhbmRvbWx5IGJ5IG5hbWUKCiAgc3dpdGNoIChyYW5kKCkgJSAzKQogIHsKICBjYXNlIDA6IHZhck5hbWUgPSAiQUJDIjsgYnJlYWs7CiAgY2FzZSAxOiB2YXJOYW1lID0gIkRFRiI7IGJyZWFrOwogIGNhc2UgMjogdmFyTmFtZSA9ICJYWVoiOyBicmVhazsKICB9CgogIHByaW50ZigidmFyaWFibGUgXCIlc1wiIChzZWxlY3RlZCByYW5kb21seSkgPSAlZFxuIiwgdmFyTmFtZSwgKkdldFZhclB0cih2YXJOYW1lKSk7CgogIC8vIEhpZGUgdGhlIHBvaW50ZXIgc3R1ZmYgYmVoaW5kIHRoaXMgbWFjcm86CiNkZWZpbmUgVkFSSUFCTEUoTkFNRSkgKCpHZXRWYXJQdHIoTkFNRSkpCgogIFZBUklBQkxFKCJBQkMiKSA9IDE7CiAgVkFSSUFCTEUoIkRFRiIpID0gMjsKICBWQVJJQUJMRSgiWFlaIikgPSAzOwoKICBwcmludGYoInZhcmlhYmxlIFwiJXNcIiA9ICVkXG4iLCAiQUJDIiwgVkFSSUFCTEUoIkFCQyIpKTsKICBwcmludGYoInZhcmlhYmxlIFwiJXNcIiA9ICVkXG4iLCAiREVGIiwgVkFSSUFCTEUoIkRFRiIpKTsKICBwcmludGYoInZhcmlhYmxlIFwiJXNcIiA9ICVkXG4iLCAiWFlaIiwgVkFSSUFCTEUoIlhZWiIpKTsKCiAgcmV0dXJuIDA7Cn0K