Mercurial > hg > toybox
comparison lib/lib.c @ 1399:a0c328bc2c14 draft
Little endian and big endian versions of peek (for host.c).
author | Rob Landley <rob@landley.net> |
---|---|
date | Mon, 21 Jul 2014 19:56:53 -0500 |
parents | 9dbfd5390b92 |
children | d7be3d62a5cb |
comparison
equal
deleted
inserted
replaced
1398:7402cae7889f | 1399:a0c328bc2c14 |
---|---|
370 ts.tv_sec = miliseconds/1000; | 370 ts.tv_sec = miliseconds/1000; |
371 ts.tv_nsec = (miliseconds%1000)*1000000; | 371 ts.tv_nsec = (miliseconds%1000)*1000000; |
372 nanosleep(&ts, &ts); | 372 nanosleep(&ts, &ts); |
373 } | 373 } |
374 | 374 |
375 int64_t peek(void *ptr, int size) | 375 // Inefficient, but deals with unaligned access |
376 { | 376 int64_t peek_le(void *ptr, unsigned size) |
377 if (size & 8) { | 377 { |
378 volatile int64_t *p = (int64_t *)ptr; | 378 int64_t ret = 0; |
379 return *p; | 379 char *c = ptr; |
380 } else if (size & 4) { | 380 int i; |
381 volatile int *p = (int *)ptr; | 381 |
382 return *p; | 382 for (i=0; i<size; i++) ret |= ((int64_t)c[i])<<i; |
383 } else if (size & 2) { | 383 |
384 volatile short *p = (short *)ptr; | 384 return ret; |
385 return *p; | 385 } |
386 } else { | 386 |
387 volatile char *p = (char *)ptr; | 387 int64_t peek_be(void *ptr, unsigned size) |
388 return *p; | 388 { |
389 } | 389 int64_t ret = 0; |
390 char *c = ptr; | |
391 | |
392 while (size--) ret = (ret<<8)|c[size]; | |
393 | |
394 return ret; | |
395 } | |
396 | |
397 int64_t peek(void *ptr, unsigned size) | |
398 { | |
399 return IS_BIG_ENDIAN ? peek_be(ptr, size) : peek_le(ptr, size); | |
390 } | 400 } |
391 | 401 |
392 void poke(void *ptr, uint64_t val, int size) | 402 void poke(void *ptr, uint64_t val, int size) |
393 { | 403 { |
394 if (size & 8) { | 404 if (size & 8) { |