]> git.cryptolib.org Git - avr-crypto-lib.git/blobdiff - test_src/dump.c
new hash function abstraction layer + shavs + dump util + ...
[avr-crypto-lib.git] / test_src / dump.c
diff --git a/test_src/dump.c b/test_src/dump.c
new file mode 100644 (file)
index 0000000..04b35cb
--- /dev/null
@@ -0,0 +1,127 @@
+/* dump.c */
+/*
+    This file is part of the AVR-Crypto-Lib.
+    Copyright (C) 2008  Daniel Otte (daniel.otte@rub.de)
+
+    This program 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.
+
+    This program 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 this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * \file     dump.c
+ * \email    daniel.otte@rub.de
+ * \author   Daniel Otte 
+ * \date     2009-02-04
+ * \license  GPLv3 or later
+ * 
+ */
+
+#include <stdint.h>
+#include <string.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <ctype.h>
+#include <avr/pgmspace.h>
+#include "cli.h" 
+#include "string-extras.h" 
+#define DUMP_WIDTH 16
+
+static
+void dump_chars(uint8_t* buffer){
+       uint8_t i;
+       cli_putc('|');
+       for(i=0; i<DUMP_WIDTH; ++i){
+               if(isprint(buffer[i])){
+                       cli_putc(buffer[i]);
+               }else{
+                       cli_putc('.');
+               }
+       }
+       cli_putc('|');
+}
+
+
+void dump(char* s){
+       uint8_t flash=1;
+       uint32_t addr=0;
+       uint32_t size=128;
+       uint8_t i,buffer[DUMP_WIDTH];
+       char tstr[9];
+       s=strstrip(s);
+       if(*s=='r' || *s=='R' || *s=='m' || *s=='M')
+               flash=0;
+       if(isalpha(*s)){
+               while(isalpha(*s))
+                       ++s;
+       }
+       char* eptr;
+       if(*s)
+               addr = strtoul(s, &eptr, 0);
+       if(eptr)
+               size = strtoul(eptr, NULL, 0);
+       if(!size)
+               size = 32;      
+       
+       cli_putstr_P(PSTR("\r\ndumping "));     
+       ultoa(size, tstr, 10);
+       cli_putstr(tstr);
+       cli_putstr_P(PSTR(" bytes of "));
+       cli_putstr_P(flash?PSTR("flash"):PSTR("ram"));
+       cli_putstr_P(PSTR(", beginning at 0x"));        
+       ultoa(addr, tstr, 16);
+       cli_putstr(tstr);
+       cli_putstr_P(PSTR(":\r\n"));    
+       while(size>=DUMP_WIDTH){
+               if(flash){
+                       for(i=0; i<DUMP_WIDTH; ++i){
+#ifdef pgm_read_byte_far                               
+                               buffer[i]=pgm_read_byte_far(addr+i);
+#else
+                               buffer[i]=pgm_read_byte(addr+i);
+#endif
+                       }
+               }else{
+                       memcpy(buffer, (void*)((uint16_t)addr), DUMP_WIDTH);
+               }
+               ultoa(addr, tstr, 16);
+               sprintf(tstr,"%6lX", addr);
+               cli_putstr(tstr);
+               cli_putstr_P(PSTR(": "));       
+               cli_hexdump2(buffer, DUMP_WIDTH);
+               cli_putc('\t');
+               dump_chars(buffer);
+               addr+=DUMP_WIDTH;
+               size-=DUMP_WIDTH;
+               cli_putstr_P(PSTR("\r\n"));
+       }
+       if(size){
+               if(flash){
+                       for(i=0; i<size; ++i){
+#ifdef pgm_read_byte_far                               
+                               buffer[i]=pgm_read_byte_far(addr+i);
+#else
+                               buffer[i]=pgm_read_byte(addr+i);
+#endif
+                       }
+               }else{
+                       memcpy(buffer, (void*)((uint16_t)addr), size);
+               }
+               ultoa(addr, tstr, 16);
+               sprintf(tstr,"%6lX", addr);
+               cli_putstr(tstr);
+               cli_putstr_P(PSTR(": "));       
+               cli_hexdump2(buffer, size);
+               cli_putstr_P(PSTR("\r\n"));
+       }
+}
+