- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
bool decode_hex(void *p, size_t max_len, const char *hexstr, size_t *out_len_)
{
static const unsigned char hexdigit_val[256] = {
['0'] = 0,
['1'] = 1,
['2'] = 2,
['3'] = 3,
['4'] = 4,
['5'] = 5,
['6'] = 6,
['7'] = 7,
['8'] = 8,
['9'] = 9,
['a'] = 0xa,
['b'] = 0xb,
['c'] = 0xc,
['d'] = 0xd,
['e'] = 0xe,
['f'] = 0xf,
['A'] = 0xa,
['B'] = 0xb,
['C'] = 0xc,
['D'] = 0xd,
['E'] = 0xe,
['F'] = 0xf,};
if (!p || !hexstr)
return false;
if (!strncmp(hexstr, "0x", 2))
hexstr += 2;
if (strlen(hexstr) > (max_len * 2))
return false;
unsigned char *buf = p;
size_t out_len = 0;
while (*hexstr) {
unsigned char c1 = (unsigned char) hexstr[0];
unsigned char c2 = (unsigned char) hexstr[1];
unsigned char v1 = hexdigit_val[c1];
unsigned char v2 = hexdigit_val[c2];
if (!v1 && (c1 != '0'))
return false;
if (!v2 && (c2 != '0'))
return false;
*buf = (v1 << 4) | v2;
out_len++;
buf++;
hexstr += 2;
}
if (out_len_)
*out_len_ = out_len;
return true;
}
Питушня, из-за которой "" или "0x" будет способствовать неопределённому поведению в вызывающем коде?
как-то так.
b = hexdigit_val(a)*2; //счастливой отладки
лисперы привнесли главным образом то что макропроцессор может быть полноценной частью высокоуровнего языка. я бы им за это памятник поставил, но они к сожалению в конце решили язык программирования все таки не далать. "lisp is not a programming language - lisp is an environment!"
Fixed
зачем это?
Компиляторы повсюду
А если серьезно, то программа, которая из мнемоник делает двоичные инструкции проца это скорее транслятор, чем компилятор. В компиляторе куча какой-то ебнутой херни например парсим код на си, строим AST, потом переводим из AST в какое-то говно, потом из этого говна еще в какое-то SSA говно, пойди исходники GCC читни
это как напитон, только хуже?
Не, тогда тебя бы послали читать реализацию STL в libstdc++. Я не утверждаю, что она плохая. Просто нечитабельная.
И там используется эта хрень с goto через метки в массиве
ага