/* Chrysalide - Outil d'analyse de fichiers binaires * leb128.c - support des valeurs encodées au format LEB128. * * Copyright (C) 2010 Cyrille Bagard * * This file is part of Chrysalide. * * Chrysalide is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 3 of the License, or * (at your option) any later version. * * Chrysalide is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Foobar. If not, see . */ #include "leb128.h" /****************************************************************************** * * * Paramètres : target = lieu d'enregistrement de la lecture. [OUT] * * data = flux de données à analyser. * * pos = position courante dans ce flux. [OUT] * * len = taille totale des données à analyser. * * * * Description : Lit un nombre non signé encodé au format LEB128. * * * * Retour : Bilan de l'opération : true en cas de succès, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool read_uleb128(uleb128_t *target, const bin_t *data, phys_t *pos, phys_t len) { int shift; /* Décallage à appliquer */ phys_t i; /* Boucle de parcours */ if (*pos < 0) return false; shift = 0; *target = 0; for (i = 0; i < 8; i++) { /* On évite les débordements... */ if (*pos >= len) return false; *target |= (data[*pos] & 0x7f) << shift; shift += 7; (*pos)++; if ((data[*pos - 1] & 0x80) == 0x00) break; } return (i < 8); } /****************************************************************************** * * * Paramètres : target = lieu d'enregistrement de la lecture. [OUT] * * data = flux de données à analyser. * * pos = position courante dans ce flux. [OUT] * * len = taille totale des données à analyser. * * * * Description : Lit un nombre signé encodé au format LEB128. * * * * Retour : Bilan de l'opération : true en cas de succès, false sinon. * * * * Remarques : - * * * ******************************************************************************/ bool read_leb128(leb128_t *target, const bin_t *data, phys_t *pos, phys_t len) { int shift; /* Décallage à appliquer */ phys_t i; /* Boucle de parcours */ if (*pos < 0) return false; shift = 0; *target = 0; for (i = 0; i < 8; i++) { /* On évite les débordements... */ if (*pos >= len) return false; *target |= (data[*pos] & 0x7f) << shift; shift += 7; if ((data[(*pos)++] & 0x80) == 0x00) break; } if (shift < (8 * sizeof(int64_t)) && (data[*pos - 1] & 0x40) == 0x40) *target |= - (1 << shift); return (i < 8); }