49 lines
744 B
Plaintext
49 lines
744 B
Plaintext
#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 // )
|