#int memcmp(const void *data, const void *base, size_t sz) #{ # const uint8_t *p = (const uint8_t*)data; # const uint8_t *q = (const uint8_t*)base; # # while (sz-- > 0) # { # int c = *p++ - *q++; # if (c != 0) # return c; # } # return 0; #} # ( p1 p2 sz -- diff ) memcmp: jump .nonempty rel ne drop2 immed 0 nip return # ( 0 // ) .nonempty: push dup push swap dup push # ( p2 p1 // p1 p2 sz ) load byte swap load byte # ( [p1] [p2] // p1 p2 sz ) sub jump .zero rel eq rdrop rdrop rdrop return # ( diff // ) .zero: # ( diff // p1 p2 sz ) drop pop immed 1 add pop immed 1 add pop immed 1 sub jump memcpy # ( p1+1 p2+1 sz-1 // )