aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/acid
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2004-09-23 03:04:33 +0000
committerrsc <devnull@localhost>2004-09-23 03:04:33 +0000
commit709efa017c326a283328704fa82d81a99b639932 (patch)
treef50873fac45481f9aba0e2d53867e7b71ffd2713 /src/cmd/acid
parent7966faa931bfa9cf4ca53dd2d5b6e1eb0f174411 (diff)
downloadplan9port-709efa017c326a283328704fa82d81a99b639932.tar.gz
plan9port-709efa017c326a283328704fa82d81a99b639932.tar.bz2
plan9port-709efa017c326a283328704fa82d81a99b639932.zip
Add stringn builtin.
Diffstat (limited to 'src/cmd/acid')
-rw-r--r--src/cmd/acid/builtin.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/cmd/acid/builtin.c b/src/cmd/acid/builtin.c
index ccead4ff..e47e20a8 100644
--- a/src/cmd/acid/builtin.c
+++ b/src/cmd/acid/builtin.c
@@ -43,6 +43,7 @@ void includepipe(Node*, Node*);
void regexp(Node*, Node*);
void textfile(Node*, Node*);
void deltextfile(Node*, Node*);
+void stringn(Node*, Node*);
typedef struct Btab Btab;
struct Btab
@@ -83,6 +84,7 @@ struct Btab
"status", status,
"stop", stop,
"strace", strace,
+ "stringn", stringn,
"sysstop", sysstop,
"textfile", textfile,
"waitstop", waitstop,
@@ -1474,3 +1476,45 @@ deltextfile(Node *r, Node *args)
error("symbol file %s not open", file);
}
+int xget1(Map *m, ulong addr, u8int *a, int n);
+
+void
+stringn(Node *r, Node *args)
+{
+ uint addr;
+ int i, n, ret;
+ Node res, *av[Maxarg];
+ char *buf;
+
+ na = 0;
+ flatten(av, args);
+ if(na != 2)
+ error("stringn(addr, n): arg count");
+
+ expr(av[0], &res);
+ if(res.type != TINT)
+ error("stringn(addr, n): arg type");
+ addr = res.store.u.ival;
+
+ expr(av[1], &res);
+ if(res.type != TINT)
+ error("stringn(addr,n): arg type");
+ n = res.store.u.ival;
+
+ buf = malloc(n+1);
+ if(buf == nil)
+ error("out of memory");
+
+ r->type = TSTRING;
+ for(i=0; i<n; i++){
+ ret = xget1(cormap, addr, (uchar*)&buf[i], 1);
+ if(ret < 0){
+ free(buf);
+ error("indir: %r");
+ }
+ addr++;
+ }
+ buf[n] = 0;
+ r->store.u.string = strnode(buf);
+ free(buf);
+}