diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2010-12-31 11:49:34 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2010-12-31 11:49:34 (GMT) |
commit | 651c94450df8619c26e26a133289dbaa197616f4 (patch) | |
tree | 1a81a2625687116d205cb5c6583497cb657f8460 /src/common/endianness.c | |
parent | dbec8e8af5f296f0b95cd9c07e7d96b1a4277137 (diff) |
Supported a first basic packet of the Java Debug Wire Protocol.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@204 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/common/endianness.c')
-rwxr-xr-x | src/common/endianness.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/src/common/endianness.c b/src/common/endianness.c index 0b7e192..15ca52a 100755 --- a/src/common/endianness.c +++ b/src/common/endianness.c @@ -25,6 +25,7 @@ #include <stdarg.h> +#include <string.h> @@ -323,6 +324,94 @@ bool read_u64(uint64_t *target, const bin_t *data, off_t *pos, off_t len, Source } + + + + + +/****************************************************************************** +* * +* Paramètres : value = source de la valeur à transcrire. * +* size = taille de cette source de données. * +* data = flux de données à modifier. [OUT] * +* pos = position courante dans ce flux. [OUT] * +* len = taille totale des données à analyser. * +* endian = ordre des bits dans la source. * +* * +* Description : Ecrit un nombre non signé sur n octets. * +* * +* Retour : Bilan de l'opération : true en cas de succès, false sinon. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool _write_un(const bin_t *value, size_t size, bin_t *data, off_t *pos, off_t len, SourceEndian endian) +{ + size_t i; /* Boucle de parcours */ + + if (*pos < 0) return false; + if ((len - *pos) < size) return false; + + switch (endian) + { + case SRE_LITTLE: + +#if __BYTE_ORDER == __LITTLE_ENDIAN + + memcpy(&data[*pos], value, size); + (*pos) += size; + +#elif __BYTE_ORDER == __BIG_ENDIAN + + for (i = 0; i < size; i++, (*pos)++) + *(data + *pos) = *(value + size - i - 1); + +#else + +# error "TODO : PDP !" + +#endif + + break; + + case SRE_MIDDLE: + return false; /* TODO ! */ + break; + + case SRE_BIG: + +#if __BYTE_ORDER == __LITTLE_ENDIAN + + for (i = 0; i < size; i++, (*pos)++) + *(data + *pos) = *(value + size - i - 1); + +#elif __BYTE_ORDER == __BIG_ENDIAN + + memcpy(&data[*pos], value, size); + (*pos) += size; + +#else + +# error "TODO : PDP !" + +#endif + + break; + + } + + return true; + +} + + + + + + + + /****************************************************************************** * * * Paramètres : target = lieu d'enregistrement de la lecture. [OUT] * |