R_API RAnalData *r_anal_data(RAnal *anal, ut64 addr, const ut8 *buf, int size) { ut64 dst = 0; int n, nsize = 0; int bits = anal->bits; int word = R_MIN (8, bits / 8); if (size < 4) return NULL; if (size >= word && is_invalid (buf, word)) return r_anal_data_new (addr, R_ANAL_DATA_TYPE_INVALID, -1, buf, word); { int i, len = R_MIN (size, 64); int is_pattern = 0; int is_sequence = 0; char ch = buf[0]; char ch2 = ch + 1; for (i = 1; i < len; i++) { if (ch2 == buf[i]) { ch2++; is_sequence++; } else is_sequence = 0; if (ch == buf[i]) { is_pattern++; } } if (is_sequence > len - 2) { return r_anal_data_new (addr, R_ANAL_DATA_TYPE_SEQUENCE, -1, buf, is_sequence); } if (is_pattern > len - 2) { return r_anal_data_new (addr, R_ANAL_DATA_TYPE_PATTERN, -1, buf, is_pattern); } } if (size >= word && is_null (buf, word)) return r_anal_data_new (addr, R_ANAL_DATA_TYPE_NULL, -1, buf, word); if (is_bin (buf, size)) return r_anal_data_new (addr, R_ANAL_DATA_TYPE_HEADER, -1, buf, word); if (size >= word) { dst = is_pointer (anal, buf, word); if (dst) return r_anal_data_new (addr, R_ANAL_DATA_TYPE_POINTER, dst, buf, word); } switch (is_string (buf, size, &nsize)) { case 1: return r_anal_data_new_string (addr, (const char *)buf, nsize, R_ANAL_DATA_TYPE_STRING); case 2: return r_anal_data_new_string (addr, (const char *)buf, nsize, R_ANAL_DATA_TYPE_WIDE_STRING); } if (size >= word) { n = is_number (buf, word); if (n) return r_anal_data_new (addr, R_ANAL_DATA_TYPE_NUMBER, n, buf, word); } return r_anal_data_new (addr, R_ANAL_DATA_TYPE_UNKNOWN, dst, buf, R_MIN (word, size)); }
R_API RAnalData *r_anal_data (RAnal *anal, ut64 addr, const ut8 *buf, int size) { ut64 dst = 0; int n, nsize = 0; int bits = anal->bits; int endi = !anal->big_endian; int word = R_MIN (8, bits/8); if (size >= word && is_invalid (buf, word)) return r_anal_data_new (addr, R_ANAL_DATA_TYPE_INVALID, -1, buf, word); if (size >= word && is_null (buf, word)) return r_anal_data_new (addr, R_ANAL_DATA_TYPE_NULL, 0, buf, word); if (is_bin (buf, size)) return r_anal_data_new (addr, R_ANAL_DATA_TYPE_HEADER, -1, buf, word); if (size>=word) { dst = is_pointer (&anal->iob, buf, endi, word); if (dst) return r_anal_data_new (addr, R_ANAL_DATA_TYPE_POINTER, dst, buf, word); } switch (is_string (buf, size, &nsize)) { case 1: return r_anal_data_new_string (addr, (const char *)buf, nsize, R_ANAL_DATA_TYPE_STRING); case 2: return r_anal_data_new_string (addr, (const char *)buf, nsize, R_ANAL_DATA_TYPE_WIDE_STRING); } if (size >= word) { n = is_number (buf, endi, word); if (n) return r_anal_data_new (addr, R_ANAL_DATA_TYPE_NUMBER, n, buf, word); } return r_anal_data_new (addr, R_ANAL_DATA_TYPE_UNKNOWN, dst, buf, R_MIN(word, size)); }