void ai_journal(const void* base, const void* dst, const void* src, unsigned int size) { ai_journal_save(dst, size); // TODO: copy and hash at same time int index0 = (intptr_t)dst - (intptr_t)base; // use buffer offset as part of CRC current_hash ^= compute_hash(src, size, index0) ^ compute_hash(dst, size, index0); JDEBUG("%d -> %x\n", index0, current_hash); memcpyfast((void*)dst, src, size); }
static void rollback_entry(Journal* j) { JDEBUG("journal: rollback %p (%u bytes)\n", j->dest, j->size); assert(j->size>0); if (j->size > sizeof(j->mem)) memcpy(j->dest, j->mem, j->size); else memcpyfast(j->dest, &j->mem, j->size); current_hash = j->hash; //TODO: redundant if multiple rollbacks }
void ai_journal_save(const void* dst, unsigned int size) { // TODO: assert ai_state is correct assert(size>0); if (jbuffer_top == jbuffer_size) { jbuffer_size += jbuffer_inc; jbuffer = (Journal*) realloc(jbuffer, sizeof(Journal) * jbuffer_size); } Journal* j = &jbuffer[jbuffer_top++]; JDEBUG("journal: log -> %p (%u bytes)\n", dst, size); j->dest = (void*)dst; j->size = size; if (size > sizeof(j->mem)) { j->mem = malloc(size); memcpy(j->mem, dst, size); } else { memcpyfast(&j->mem, dst, size); } j->hash = current_hash; }
QByteArray JsonValue::parseCString(const char *&from, const char *to) { QByteArray result; JDEBUG("parseCString: " << QByteArray(from, to - from)); if (*from != '"') { qDebug() << "JSON Parse Error, double quote expected"; ++from; // So we don't hang return QByteArray(); } const char *ptr = from; ++ptr; while (ptr < to) { if (*ptr == '"') { ++ptr; result = QByteArray(from + 1, ptr - from - 2); break; } if (*ptr == '\\') { ++ptr; if (ptr == to) { qDebug() << "JSON Parse Error, unterminated backslash escape"; from = ptr; // So we don't hang return QByteArray(); } } ++ptr; } from = ptr; int idx = result.indexOf('\\'); if (idx >= 0) { char *dst = result.data() + idx; const char *src = dst + 1, *end = result.data() + result.length(); do { char c = *src++; switch (c) { case 'a': *dst++ = '\a'; break; case 'b': *dst++ = '\b'; break; case 'f': *dst++ = '\f'; break; case 'n': *dst++ = '\n'; break; case 'r': *dst++ = '\r'; break; case 't': *dst++ = '\t'; break; case 'v': *dst++ = '\v'; break; case '"': *dst++ = '"'; break; case '\\': *dst++ = '\\'; break; default: { int chars = 0; uchar prod = 0; forever { if (c < '0' || c > '7') { --src; break; } prod = prod * 8 + c - '0'; if (++chars == 3 || src == end) break; c = *src++; } if (!chars) { qDebug() << "JSON Parse Error, unrecognized backslash escape"; return QByteArray(); } *dst++ = prod; } } while (src != end) { char c = *src++; if (c == '\\') break; *dst++ = c; } } while (src != end); *dst = 0; result.truncate(dst - result.data()); }