DukeSS
Танкист Апокалипсиса
// Принимает на входе строку, которая может содержать 1, 0, on, off, yes, no, true, false
// Возвращает 1 в случае true, 0 - в случае false и -1 в случае, если строка не распознана
//
int parse_boolean_param(char *param_value) {
int ret = -1;
unsigned long long like_string = 0;
char *ptr = (char *)&like_string;
int size = 0;
// Строки длиннее 8 символов даже не рассматриваем (они не поместятся в long long)
for (; size < 9; size++) {
if (str[size])
ptr[size] = str[size];
else
break;
}
// Самая длинная строка - false. Если строка длинее, это заведомо неверный аргумент
if (size > 5) return ret;

// Битовая маска для побитового сложения со строкой (приведение к строчным буквам)
static const unsigned long long to_lower = 0x2020202020202020;
// приведение к строчным буквам
string |= to_lower;

// Через преобразование строки в число long long (до 8 символов char)
// Проверялось на Win64 и Linux64
switch (string) {
case 2314885530818453553: // 1
case 2314885530818473583: // on
case 2314885530823910777: // yes
case 2314885531981673076: ret = 1; break; // true
case 2314885530818453552: // 0
case 2314885530823059055: // off
case 2314885530818473838: // no
case 2314885828568703334: ret = 0; break; // false
default: break;
}
return ret;
}

@темы: рабочий склерозник, Опыт сын ошибок трудных, Информационные технологии