Implement enough state in cmd_dump so that if it is called with no

arguments, it successively dumps the next chunk of data of the same
previously specified length.


git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@39 81a1dc3b-b13d-400b-aceb-764788c761c2
This commit is contained in:
Brian S. Dean 2001-01-19 03:10:53 +00:00
parent 4265bfa150
commit 7dc244ac12
1 changed files with 45 additions and 37 deletions

82
term.c
View File

@ -197,42 +197,54 @@ int cmd_dump ( int fd, struct avrpart * p, int argc, char * argv[] )
{ {
char * e; char * e;
int i, j; int i, j;
int len, maxsize; unsigned short daddr;
AVRMEM memtype;
unsigned short addr, daddr;
char * buf; char * buf;
int maxsize;
static AVRMEM memtype=AVR_FLASH;
static unsigned short addr=0;
static int len=64;
if (argc != 4) { if (argc == 1) {
fprintf(stderr, "Usage: dump flash|eeprom <addr> <len>\n"); addr += len;
return -1;
}
if (strcmp(argv[1],"flash")==0) {
memtype = AVR_FLASH;
maxsize = p->flash_size;
}
else if (strcmp(argv[1],"eeprom")==0) {
memtype = AVR_EEPROM;
maxsize = p->eeprom_size;
} }
else { else {
fprintf(stderr, "%s (dump): invalid memory type \"%s\"\n", if (argc != 4) {
progname, argv[1]); fprintf(stderr, "Usage: dump flash|eeprom <addr> <len>\n");
return -1; return -1;
}
if (strcmp(argv[1],"flash")==0) {
memtype = AVR_FLASH;
}
else if (strcmp(argv[1],"eeprom")==0) {
memtype = AVR_EEPROM;
}
else {
fprintf(stderr, "%s (dump): invalid memory type \"%s\"\n",
progname, argv[1]);
return -1;
}
addr = strtoul(argv[2], &e, 0);
if (*e || (e == argv[2])) {
fprintf(stderr, "%s (dump): can't parse address \"%s\"\n",
progname, argv[2]);
return -1;
}
len = strtol(argv[3], &e, 0);
if (*e || (e == argv[3])) {
fprintf(stderr, "%s (dump): can't parse length \"%s\"\n",
progname, argv[3]);
return -1;
}
} }
addr = strtoul(argv[2], &e, 0); switch (memtype) {
if (*e || (e == argv[2])) { case AVR_FLASH : maxsize = p->flash_size; break;
fprintf(stderr, "%s (dump): can't parse address \"%s\"\n", case AVR_EEPROM : maxsize = p->eeprom_size; break;
progname, argv[2]); default : return -1; /* this can't happen, but is silences gcc
return -1; warnings */
}
len = strtol(argv[3], &e, 0);
if (*e || (e == argv[3])) {
fprintf(stderr, "%s (dump): can't parse length \"%s\"\n",
progname, argv[3]);
return -1;
} }
if (addr > maxsize) { if (addr > maxsize) {
@ -242,13 +254,9 @@ int cmd_dump ( int fd, struct avrpart * p, int argc, char * argv[] )
return -1; return -1;
} }
if ((addr + len) > maxsize) { /* trim len if nessary to not read past the end of memory */
fprintf(stderr, if ((addr + len) > maxsize)
"%s (dump): selected address and length exceed " len = maxsize - addr;
"range for %s memory\n",
progname, avr_memtstr(memtype));
return -1;
}
buf = malloc(len); buf = malloc(len);
if (buf == NULL) { if (buf == NULL) {