in src/apprentice.c [2280:2332]
size_t len __attribute__((__unused__)))
{
const char *l = line;
char *el;
unsigned long factor;
struct magic *m = &me->mp[0];
if (m->factor_op != FILE_FACTOR_OP_NONE) {
file_magwarn(ms,
"Current entry already has a strength type: %c %d",
m->factor_op, m->factor);
return -1;
}
if (m->type == FILE_NAME) {
file_magwarn(ms, "%s: Strength setting is not supported in "
"\"name\" magic entries", m->value.s);
return -1;
}
EATAB;
switch (*l) {
case FILE_FACTOR_OP_NONE:
case FILE_FACTOR_OP_PLUS:
case FILE_FACTOR_OP_MINUS:
case FILE_FACTOR_OP_TIMES:
case FILE_FACTOR_OP_DIV:
m->factor_op = *l++;
break;
default:
file_magwarn(ms, "Unknown factor op `%c'", *l);
return -1;
}
EATAB;
factor = strtoul(l, &el, 0);
if (factor > 255) {
file_magwarn(ms, "Too large factor `%lu'", factor);
goto out;
}
if (*el && !isspace(CAST(unsigned char, *el))) {
file_magwarn(ms, "Bad factor `%s'", l);
goto out;
}
m->factor = CAST(uint8_t, factor);
if (m->factor == 0 && m->factor_op == FILE_FACTOR_OP_DIV) {
file_magwarn(ms, "Cannot have factor op `%c' and factor %u",
m->factor_op, m->factor);
goto out;
}
return 0;
out:
m->factor_op = FILE_FACTOR_OP_NONE;
m->factor = 0;
return -1;
}