コード例 #1
0
ファイル: journal.c プロジェクト: sehugg/Starthinker
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);
}
コード例 #2
0
ファイル: journal.c プロジェクト: sehugg/Starthinker
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
}
コード例 #3
0
ファイル: journal.c プロジェクト: sehugg/Starthinker
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;
}
コード例 #4
0
ファイル: json.cpp プロジェクト: hkahn/qt5-qttools-nacl
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());
    }