Add stringn builtin.
This commit is contained in:
parent
7966faa931
commit
709efa017c
1 changed files with 44 additions and 0 deletions
|
|
@ -43,6 +43,7 @@ void includepipe(Node*, Node*);
|
||||||
void regexp(Node*, Node*);
|
void regexp(Node*, Node*);
|
||||||
void textfile(Node*, Node*);
|
void textfile(Node*, Node*);
|
||||||
void deltextfile(Node*, Node*);
|
void deltextfile(Node*, Node*);
|
||||||
|
void stringn(Node*, Node*);
|
||||||
|
|
||||||
typedef struct Btab Btab;
|
typedef struct Btab Btab;
|
||||||
struct Btab
|
struct Btab
|
||||||
|
|
@ -83,6 +84,7 @@ struct Btab
|
||||||
"status", status,
|
"status", status,
|
||||||
"stop", stop,
|
"stop", stop,
|
||||||
"strace", strace,
|
"strace", strace,
|
||||||
|
"stringn", stringn,
|
||||||
"sysstop", sysstop,
|
"sysstop", sysstop,
|
||||||
"textfile", textfile,
|
"textfile", textfile,
|
||||||
"waitstop", waitstop,
|
"waitstop", waitstop,
|
||||||
|
|
@ -1474,3 +1476,45 @@ deltextfile(Node *r, Node *args)
|
||||||
error("symbol file %s not open", file);
|
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);
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue