diff options
author | rsc <devnull@localhost> | 2004-09-23 03:04:33 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-09-23 03:04:33 +0000 |
commit | 709efa017c326a283328704fa82d81a99b639932 (patch) | |
tree | f50873fac45481f9aba0e2d53867e7b71ffd2713 /src/cmd/acid | |
parent | 7966faa931bfa9cf4ca53dd2d5b6e1eb0f174411 (diff) | |
download | plan9port-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.c | 44 |
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); +} |