Таблица поиска значений в строках C?

Если у меня есть набор небольших строковых значений, и я хочу получить числовое значение для их представления, что лучший способ сделать это с помощью таблицы поиска?

Если бы мне просто нужно было посмотреть прямо, я знаю, что оптимальное решение будет просто серией утверждений if:

if (strcmp(str, "foo") == 0)
    tmp = FOO;
else if (strcmp(str, "bar") == 0)
    tmp = BAR;

Но я прошу об этом, потому что эти маленькие строковые значения представляют собой атрибут в небольшом проекте, который я пишу на языке C, и атрибуты могут быть доступны только для чтения или читать-писать (без записи только сейчас, может быть, никогда).

Итак, что я сейчас делаю, чтобы убедиться, что все работает, есть функция поиска, состоящая из предложения if-then, как указано выше, чтобы посмотреть, какие значения доступны только для чтения, и вторая функция, которая ищет, какие значения считываются, написать. Но для меня это большое и уродливое.

Я думаю, вместо этого есть три функции. Одна функция - это функция поиска, и она возвращает значение int, которое является числовой формой строки. Но эта функция поиска также может принимать флаг, определяющий, извлекает ли значение только для чтения или значение чтения-записи. Если операция записи выполняется над значением, которое действительно доступно только для чтения, функция вернет -EINVAL (или что-то подобное).

Другие две функции, которые теперь все еще читают и пишут, просто вызывают эту функцию поиска, передавая строку значения и флаг, определяющий, предназначены ли они для чтения или записи.

Дело в том, что я не знаю, как это моделируется на C (если его можно смоделировать), и поиск Google утомителен, когда все фермы контента разрывают это место (и вместо этого дают ответы на С++/С#).

Так вот как я думаю, это будет выглядеть:

int lookup_func(const char *name, const char *flag) {
    int tmpval = 0;

    /* code to do the lookup. */

    if (tmpval == 0)
        return -EINVAL;
    else
        return tmpval;
}

int get_readonly_bit(const char *name) {
    return lookup_func(name, "ro");
}

int get_readwrite_bit(const char *name) {
    return lookup_func(name, "rw")
}

Мысли? Идея состоит в том, чтобы уменьшить размер кода, не повторяя ветки if-then для этих двух функций, которые немного отличаются в общем дизайне и просто позволяют какой-то функции поиска выяснить, какая функция служит для этого значения.

Ответ 1

Разве вы не считаете, что просто вставляете стол? Хэш-таблица также хороша, если есть много свойств.

int lookup(const char *name)
{
  typedef struct item_t { const char *name; int writable; int value; } item_t;
  item_t table[] = {
    { "foo", 0, FOO },
    { "bar", 1, BAR },
    { NULL, 0, 0 }
  };
  for (item_t *p = table; p->name != NULL; ++p) {
      if (strcmp(p->name, prop_name) == 0) {
          return p->value;
      }
  }
  return -EINVAL;
}