13aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/** 23aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * \file util.c 33aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 43aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This file contains generic utility functions such as can be 53aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * used for debugging for example. 63aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 73aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Copyright (C) 2005-2007 Linus Walleij <triad@df.lth.se> 83aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 93aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This library is free software; you can redistribute it and/or 103aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * modify it under the terms of the GNU Lesser General Public 113aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * License as published by the Free Software Foundation; either 123aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * version 2 of the License, or (at your option) any later version. 133aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 143aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This library is distributed in the hope that it will be useful, 153aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * but WITHOUT ANY WARRANTY; without even the implied warranty of 163aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 173aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Lesser General Public License for more details. 183aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 193aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * You should have received a copy of the GNU Lesser General Public 203aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * License along with this library; if not, write to the 213aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Free Software Foundation, Inc., 59 Temple Place - Suite 330, 223aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * Boston, MA 02111-1307, USA. 233aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */ 243aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 253aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/* MSVC does not have these */ 263aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#ifndef _MSC_VER 273aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <sys/time.h> 283aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <unistd.h> 293aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#endif 303aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 313aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <stdio.h> 323aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <stdlib.h> 333aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <errno.h> 343aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <sys/stat.h> 353aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include <fcntl.h> 363aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include "libmtp.h" 373aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev#include "util.h" 383aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 393aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/** 403aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This dumps out a number of bytes to a textual, hexadecimal 413aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * dump. 423aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 433aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * @param f the file to dump to (e.g. stdout or stderr) 443aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * @param buf a pointer to the buffer containing the bytes to 453aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * be dumped out in hex 463aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * @param n the number of bytes to dump from this buffer 473aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */ 483aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid data_dump (FILE *f, void *buf, uint32_t n) 493aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{ 503aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev unsigned char *bp = (unsigned char *) buf; 513aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev uint32_t i; 523aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 533aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev for (i = 0; i < n; i++) { 543aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fprintf(f, "%02x ", *bp); 553aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev bp++; 563aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 573aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fprintf(f, "\n"); 583aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} 593aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 603aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev/** 613aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * This dumps out a number of bytes to a textual, hexadecimal 623aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * dump, and also prints out the string ASCII representation 633aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * for each line of bytes. It will also print the memory address 643aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * offset from a certain boundry. 653aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * 663aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * @param f the file to dump to (e.g. stdout or stderr) 673aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * @param buf a pointer to the buffer containing the bytes to 683aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * be dumped out in hex 693aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * @param n the number of bytes to dump from this buffer 703aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev * @param dump_boundry the address offset to start at (usually 0) 713aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev */ 723aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishevvoid data_dump_ascii (FILE *f, void *buf, uint32_t n, uint32_t dump_boundry) 733aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev{ 743aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev uint32_t remain = n; 753aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev uint32_t ln, lc; 763aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev int i; 773aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev unsigned char *bp = (unsigned char *) buf; 783aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 793aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev lc = 0; 803aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev while (remain) { 813aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fprintf(f, "\t%04x:", dump_boundry-0x10); 823aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 833aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev ln = ( remain > 16 ) ? 16 : remain; 843aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 853aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev for (i = 0; i < ln; i++) { 863aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if ( ! (i%2) ) fprintf(f, " "); 873aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fprintf(f, "%02x", bp[16*lc+i]); 883aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 893aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 903aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev if ( ln < 16 ) { 913aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev int width = ((16-ln)/2)*5 + (2*(ln%2)); 923aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fprintf(f, "%*.*s", width, width, ""); 933aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 943aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 953aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fprintf(f, "\t"); 963aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev for (i = 0; i < ln; i++) { 973aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev unsigned char ch= bp[16*lc+i]; 983aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fprintf(f, "%c", ( ch >= 0x20 && ch <= 0x7e ) ? 993aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev ch : '.'); 1003aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 1013aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev fprintf(f, "\n"); 1023aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev 1033aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev lc++; 1043aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev remain -= ln; 1053aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev dump_boundry += ln; 1063aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev } 1073aa430dc5437a98734b36f996f9b17081a589143Yavor Goulishev} 108