1.1 --- a/Makefile Tue Jul 26 11:06:41 2011 +0200
1.2 +++ b/Makefile Thu Jul 28 18:04:01 2011 +0200
1.3 @@ -37,7 +37,7 @@
1.4 cp ired.1 ${DESTDIR}${PREFIX}/share/man/man1
1.5 cp vired.1 ${DESTDIR}${PREFIX}/share/man/man1
1.6
1.7 -uninstall:
1.8 +deinstall uninstall:
1.9 rm -f ${DESTDIR}${PREFIX}/bin/ired
1.10 rm -f ${DESTDIR}${PREFIX}/bin/vired
1.11 rm -f ${DESTDIR}${PREFIX}/share/man/man1/ired.1
2.1 --- a/cmd.c Tue Jul 26 11:06:41 2011 +0200
2.2 +++ b/cmd.c Thu Jul 28 18:04:01 2011 +0200
2.3 @@ -25,7 +25,7 @@
2.4 "./:/* skip 1 or 4 chars, repeat last format instead of cycle\n");
2.5 }
2.6
2.7 -static void cmd_bytedump(char *arg) {
2.8 +static void cmd_bytedump(const char *arg) {
2.9 int i, len = bsize;
2.10 ut8 *buf = getcurblk(arg, &len);
2.11 if(buf) {
2.12 @@ -36,25 +36,32 @@
2.13 }
2.14 }
2.15
2.16 -static void cmd_search(unsigned char *arg) {
2.17 - ut8 *buf;
2.18 - int i, len, hit = 0;
2.19 - arg = skipspaces(arg);
2.20 +static void cmd_search(const char *arg) {
2.21 + ut8 *buf, *barg;
2.22 + size_t len;
2.23 + int i, hit = 0;
2.24 + SKIPSPACES(arg);
2.25 if(*arg=='"') {
2.26 arg++;
2.27 - len = strlen(arg)-1;
2.28 - arg[len]='\0';
2.29 - } else len = hexstr2raw(arg);
2.30 + barg = (ut8*)strdup(arg);
2.31 + len = strlen((const char *)barg)-1;
2.32 + // TODO: ensure last char is '"'
2.33 + barg[len]='\0';
2.34 + } else {
2.35 + barg = (ut8*)strdup(arg);
2.36 + len = hexstr2raw(barg);
2.37 + }
2.38 if((buf = getcurblk("", &bsize)))
2.39 do {
2.40 for(i=0;i<bsize;i++) {
2.41 - if(arg[hit++]!=buf[i]) hit = 0;
2.42 + if(barg[hit++]!=buf[i]) hit = 0;
2.43 else if(hit == len)
2.44 printf("0x%"LLF"x\n", curseek+i-len+1);
2.45 }
2.46 curseek += bsize;
2.47 } while(io_read(buf, bsize)>0);
2.48 free(buf);
2.49 + free(barg);
2.50 }
2.51
2.52 static void cmd_bsize(char *arg) {
2.53 @@ -104,16 +111,23 @@
2.54 } else perror("fopen");
2.55 }
2.56
2.57 -static void cmd_write(char *arg) {
2.58 +static void cmd_write(const char *arg) {
2.59 + ut8 *barg;
2.60 int len;
2.61 - arg = skipspaces(arg);
2.62 + SKIPSPACES(arg);
2.63 if(*arg=='"') {
2.64 + barg = (ut8*)strdup (arg+1);
2.65 len = strlen(++arg)-1;
2.66 - arg[len]='\0';
2.67 - } else len = hexstr2raw(arg);
2.68 + // TODO: ensure last char is "
2.69 + barg[len] = '\0';
2.70 + } else {
2.71 + barg = (ut8*)strdup (arg);
2.72 + len = hexstr2raw(barg);
2.73 + }
2.74 io_seek(curseek, SEEK_SET);
2.75 if(len<1 || io_write(arg, len)<len)
2.76 perror("io_write");
2.77 + free (arg);
2.78 }
2.79
2.80 static void cmd_help(char *arg) {
2.81 @@ -183,7 +197,8 @@
2.82
2.83 static void cmd_system(char *arg) {
2.84 int len = bsize;
2.85 - char *buf, str[1024];
2.86 + char str[1024];
2.87 + ut8 *buf;
2.88 if(strstr(arg, "BLOCK")) {
2.89 FILE *fd = fopen(".curblk", "wb");
2.90 if(fd) {
3.1 --- a/ired.c Tue Jul 26 11:06:41 2011 +0200
3.2 +++ b/ired.c Thu Jul 28 18:04:01 2011 +0200
3.3 @@ -38,22 +38,24 @@
3.4 }
3.5
3.6 static int red_cmd(char *cmd) {
3.7 + char *arg = cmd+1;
3.8 + SKIPSPACES(arg);
3.9 switch(*cmd) {
3.10 case 'q': return 0;
3.11 case ';': case '#': break; // comment
3.12 - case '>': cmd_dump(cmd+1); break;
3.13 - case '<': cmd_load(cmd+1); break;
3.14 - case '.': red_interpret(skipspaces(cmd+1)); break;
3.15 - case 's': cmd_seek(cmd+1); break;
3.16 - case 'b': cmd_bsize(cmd+1); break;
3.17 - case '/': cmd_search(cmd+1); break;
3.18 - case 'p': cmd_print(cmd+1); break;
3.19 - case 'r': cmd_resize(cmd+1); break;
3.20 - case 'x': cmd_hexdump(cmd+1); break;
3.21 - case 'X': cmd_bytedump(cmd+1); break;
3.22 - case 'w': cmd_write(cmd+1); break;
3.23 - case '!': cmd_system(cmd+1); break;
3.24 - case '?': cmd_help(cmd+1); break;
3.25 + case '>': cmd_dump(arg); break;
3.26 + case '<': cmd_load(arg); break;
3.27 + case '.': red_interpret(arg); break;
3.28 + case 's': cmd_seek(arg); break;
3.29 + case 'b': cmd_bsize(arg); break;
3.30 + case '/': cmd_search(arg); break;
3.31 + case 'p': cmd_print(arg); break;
3.32 + case 'r': cmd_resize(arg); break;
3.33 + case 'x': cmd_hexdump(arg); break;
3.34 + case 'X': cmd_bytedump(arg); break;
3.35 + case 'w': cmd_write(arg); break;
3.36 + case '!': cmd_system(arg); break;
3.37 + case '?': cmd_help(arg); break;
3.38 default: fprintf(stderr, "? %s\n", cmd);
3.39 }
3.40 return 1;
3.41 @@ -82,7 +84,9 @@
3.42 if(*at) curseek = str2ut64(at);
3.43 }
3.44 }
3.45 - return red_cmd(skipspaces(line));
3.46 + at = line;
3.47 + SKIPSPACES(at);
3.48 + return red_cmd(at);
3.49 }
3.50
3.51 static int red_open(char *file) {
4.1 --- a/ired.h Tue Jul 26 11:06:41 2011 +0200
4.2 +++ b/ired.h Thu Jul 28 18:04:01 2011 +0200
4.3 @@ -8,6 +8,8 @@
4.4 #include <string.h>
4.5 #include <stdlib.h>
4.6
4.7 +#define SKIPSPACES(x) for(;*(x)==' '||*(x)=='\t';x++);
4.8 +
4.9 #if(plan9)
4.10 static int setenv(char *var, char *val, int force) {
4.11 char str[256];
5.1 --- a/util.c Tue Jul 26 11:06:41 2011 +0200
5.2 +++ b/util.c Thu Jul 28 18:04:01 2011 +0200
5.3 @@ -2,11 +2,6 @@
5.4
5.5 #include <ctype.h>
5.6
5.7 -static inline char *skipspaces(char *arg) {
5.8 - while(*arg==' '||*arg=='\t') arg++;
5.9 - return arg;
5.10 -}
5.11 -
5.12 static inline void hexdump(const ut8 *buf, unsigned int len, int w) {
5.13 unsigned int i, j;
5.14 for(i=0;i<len;i+=w) {
5.15 @@ -63,9 +58,9 @@
5.16 } while(!rep && inc && inc<len);
5.17 }
5.18
5.19 -static ut64 str2ut64(char *str) {
5.20 +static ut64 str2ut64(const char *str) {
5.21 ut64 ret = 0LL;
5.22 - str = skipspaces(str);
5.23 + SKIPSPACES(str);
5.24 if(str[0]=='b'&&str[1]=='\0')
5.25 ret = bsize;
5.26 else if(str[0]=='0') {
5.27 @@ -87,7 +82,7 @@
5.28 return 0;
5.29 }
5.30
5.31 -static unsigned int hexstr2raw(char *arg) {
5.32 +static unsigned int hexstr2raw(ut8 *arg) {
5.33 ut8 *ptr, d, c = 0;
5.34 unsigned int j = 0, len = 0;
5.35 for(ptr=(ut8 *)arg; *ptr; ptr++) {
5.36 @@ -105,10 +100,10 @@
5.37 return len;
5.38 }
5.39
5.40 -static void *getcurblk(char *arg, int *len) {
5.41 - void *buf = NULL;
5.42 +static ut8 *getcurblk(const char *arg, int *len) {
5.43 + ut8 *buf = NULL;
5.44 if(*arg) {
5.45 - *len = (int)str2ut64(arg);
5.46 + *len = (int)str2ut64((const char *)arg);
5.47 if(*len<1) *len = bsize;
5.48 }
5.49 if(*len>0 && (buf = malloc(*len)) != NULL) {