/* * memory.c * by Reisyukaku / Aurora Wright * Copyright (c) 2016 All Rights Reserved * * Quick Search algorithm adapted from http://igm.univ-mlv.fr/~lecroq/string/node19.html#SECTION00190 */ #include "memory.h" void memcpy(void *dest, const void *src, u32 size) { u8 *destc = (u8 *)dest; const u8 *srcc = (const u8 *)src; for(u32 i = 0; i < size; i++) destc[i] = srcc[i]; } void memset(void *dest, int filler, u32 size) { u8 *destc = (u8 *)dest; for(u32 i = 0; i < size; i++) destc[i] = (u8)filler; } void memset32(void *dest, u32 filler, u32 size) { u32 *dest32 = (u32 *)dest; for (u32 i = 0; i < size / 4; i++) dest32[i] = filler; } int memcmp(const void *buf1, const void *buf2, u32 size) { const u8 *buf1c = (const u8 *)buf1; const u8 *buf2c = (const u8 *)buf2; for(u32 i = 0; i < size; i++) { int cmp = buf1c[i] - buf2c[i]; if(cmp) return cmp; } return 0; } u8 *memsearch(u8 *startPos, const void *pattern, u32 size, u32 patternSize) { const u8 *patternc = (const u8 *)pattern; //Preprocessing u32 table[256]; for(u32 i = 0; i < 256; ++i) table[i] = patternSize + 1; for(u32 i = 0; i < patternSize; ++i) table[patternc[i]] = patternSize - i; //Searching u32 j = 0; while(j <= size - patternSize) { if(memcmp(patternc, startPos + j, patternSize) == 0) return startPos + j; j += table[startPos[j + patternSize]]; } return NULL; }