1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
|
#include "byte.h"
#include "buffer.h"
/*
* The functions that are beginning with byte_ offer some handy functions, to
* manipulate with raw bytes.
*/
int
main()
{ /* The indices: 0123456 */
char memory1[42] = "foo bar";
char memory2[23] = "fnord";
unsigned int pos;
int diff;
/* First we want to search forward for a certain char - we can achieve it
* by using:
*
* unsigned int byte_chr(const char *haystack,unsigned int len,char
* needle);
*
* which returns the _first_ position of the searched char ("needle") or
* the supplied length ("len") if the search fails.
*/
pos = byte_chr(memory1, 7, 'b'); /* Returns 4. */
buffer_puts(buffer_1, "byte_chr(memory1, 7, 'b'): ");
buffer_putulong(buffer_1, pos);
buffer_putnlflush(buffer_1);
/* Now let's focus on the opposite: we want to search backward in a
* mem-region:
*
* unsigned int byte_rchr(const void* haystack,unsigned int len,char
* needle);
*
* now it returns the _last_ position of the "needle" or len.
*/
pos = byte_rchr(memory1, 7, 'o'); /* Returns 2.*/
buffer_puts(buffer_1, "byte_rchr(memory1, 7, 'o'): ");
buffer_putulong(buffer_1, pos);
buffer_putnlflush(buffer_1);
/* Enough of searching for now -- another important task is copying of
* memory. Of course, libowfat helps you also in this point:
*
* void byte_copy(void* out, unsigned int len, const void* in);
*
* It simply copies len bytes from in to out -- starting at in[0] and
* out[0]. Please recog that it has an another API than memcpy() that has
* the last two parameters swapped.
*/
byte_copy(memory1, 2, memory2); /* Makes memory1 look: "fno bar" */
buffer_puts(buffer_1, "byte_copy(memory1, 2, memory2): ");
buffer_puts(buffer_1, memory1);
buffer_putnlflush(buffer_1);
/* There is also a function byte_copyr() that does exactly the same except
* of starting at the _end_ of the strings, i.e. in[len-1] and out[len-1].
* I won't dicuss it in detail as only the internals has changed.
*/
/* Another point is the comparing between memory regions -- in the libowfat
* is
*
* int byte_diff(const void* a, unsigned int len, const void* b);
*
* the utility of choice. It returns 0 if the regions are equal, <0 if
* a[0]...a[len] is lexicographically smaller and >0 if it is greater than
* b. After the first difference is found, no further reading beyond this
* difference is done. Beware of checking only for 1 and -1!
*/
diff = byte_diff(memory1, 5, memory2);
buffer_puts(buffer_1, "byte_diff(memory1, 5, memory2): ");
buffer_putlong(buffer_1, diff);
buffer_putnlflush(buffer_1);
/* For convience, there is also a macro called byte_equal() for checking
* for equality -- in fact it is just a !byte_diff().
*/
/* Last but not feast a quite simple yet useful function that make it
* possible to ban the BSD-legacy-crap called bzero() from your code w/o
* having to use memset() that confused even Rich Stevens:
*
* void byte_zero(char *out,unsigned int len);
*
* fills the specified block of memory with 0.
*/
byte_zero(memory1, 42);
return 0;
}
|