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