diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/acid/util.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/acid/util.c')
-rwxr-xr-x | sys/src/cmd/acid/util.c | 304 |
1 files changed, 304 insertions, 0 deletions
diff --git a/sys/src/cmd/acid/util.c b/sys/src/cmd/acid/util.c new file mode 100755 index 000000000..c861d1994 --- /dev/null +++ b/sys/src/cmd/acid/util.c @@ -0,0 +1,304 @@ +#include <u.h> +#include <libc.h> +#include <bio.h> +#include <ctype.h> +#include <mach.h> +#define Extern extern +#include "acid.h" +#include "y.tab.h" + +static int syren; + +Lsym* +unique(char *buf, Sym *s) +{ + Lsym *l; + int i, renamed; + + renamed = 0; + strcpy(buf, s->name); + for(;;) { + l = look(buf); + if(l == 0 || (l->lexval == Tid && l->v->set == 0)) + break; + + if(syren == 0 && !quiet) { + print("Symbol renames:\n"); + syren = 1; + } + i = strlen(buf)+1; + memmove(buf+1, buf, i); + buf[0] = '$'; + renamed++; + if(renamed > 5 && !quiet) { + print("Too many renames; must be X source!\n"); + break; + } + } + if(renamed && !quiet) + print("\t%s=%s %c/%llux\n", s->name, buf, s->type, s->value); + if(l == 0) + l = enter(buf, Tid); + return l; +} + +void +varsym(void) +{ + int i; + Sym *s; + long n; + Lsym *l; + uvlong v; + char buf[1024]; + List *list, **tail, *l2, *tl; + + tail = &l2; + l2 = 0; + + symbase(&n); + for(i = 0; i < n; i++) { + s = getsym(i); + switch(s->type) { + case 'T': + case 'L': + case 'D': + case 'B': + case 'b': + case 'd': + case 'l': + case 't': + if(s->name[0] == '.') + continue; + + v = s->value; + tl = al(TLIST); + *tail = tl; + tail = &tl->next; + + l = unique(buf, s); + + l->v->set = 1; + l->v->type = TINT; + l->v->ival = v; + if(l->v->comt == 0) + l->v->fmt = 'X'; + + /* Enter as list of { name, type, value } */ + list = al(TSTRING); + tl->l = list; + list->string = strnode(buf); + list->fmt = 's'; + list->next = al(TINT); + list = list->next; + list->fmt = 'c'; + list->ival = s->type; + list->next = al(TINT); + list = list->next; + list->fmt = 'X'; + list->ival = v; + + } + } + l = mkvar("symbols"); + l->v->set = 1; + l->v->type = TLIST; + l->v->l = l2; + if(l2 == 0) + print("no symbol information\n"); +} + +void +varreg(void) +{ + Lsym *l; + Value *v; + Reglist *r; + List **tail, *li; + + l = mkvar("registers"); + v = l->v; + v->set = 1; + v->type = TLIST; + v->l = 0; + tail = &v->l; + + for(r = mach->reglist; r->rname; r++) { + l = mkvar(r->rname); + v = l->v; + v->set = 1; + v->ival = r->roffs; + v->fmt = r->rformat; + v->type = TINT; + + li = al(TSTRING); + li->string = strnode(r->rname); + li->fmt = 's'; + *tail = li; + tail = &li->next; + } + + if(machdata == 0) + return; + + l = mkvar("bpinst"); /* Breakpoint text */ + v = l->v; + v->type = TSTRING; + v->fmt = 's'; + v->set = 1; + v->string = gmalloc(sizeof(String)); + v->string->len = machdata->bpsize; + v->string->string = gmalloc(machdata->bpsize); + memmove(v->string->string, machdata->bpinst, machdata->bpsize); +} + +void +loadvars(void) +{ + Lsym *l; + Value *v; + + l = mkvar("proc"); + v = l->v; + v->type = TINT; + v->fmt = 'X'; + v->set = 1; + v->ival = 0; + + l = mkvar("pid"); /* Current process */ + v = l->v; + v->type = TINT; + v->fmt = 'D'; + v->set = 1; + v->ival = 0; + + mkvar("notes"); /* Pending notes */ + + l = mkvar("proclist"); /* Attached processes */ + l->v->type = TLIST; +} + +uvlong +rget(Map *map, char *reg) +{ + Lsym *s; + ulong x; + uvlong v; + int ret; + + s = look(reg); + if(s == 0) + fatal("rget: %s\n", reg); + + switch(s->v->fmt){ + default: + ret = get4(map, s->v->ival, &x); + v = x; + break; + case 'V': + case 'W': + case 'Y': + case 'Z': + ret = get8(map, s->v->ival, &v); + break; + } + if(ret < 0) + error("can't get register %s: %r\n", reg); + return v; +} + +String* +strnodlen(char *name, int len) +{ + String *s; + + s = gmalloc(sizeof(String)+len+1); + s->string = (char*)s+sizeof(String); + s->len = len; + if(name != 0) + memmove(s->string, name, len); + s->string[len] = '\0'; + + s->gclink = gcl; + gcl = s; + + return s; +} + +String* +strnode(char *name) +{ + return strnodlen(name, strlen(name)); +} + +String* +runenode(Rune *name) +{ + int len; + Rune *p; + String *s; + + p = name; + for(len = 0; *p; p++) + len++; + + len++; + len *= sizeof(Rune); + s = gmalloc(sizeof(String)+len); + s->string = (char*)s+sizeof(String); + s->len = len; + memmove(s->string, name, len); + + s->gclink = gcl; + gcl = s; + + return s; +} + +String* +stradd(String *l, String *r) +{ + int len; + String *s; + + len = l->len+r->len; + s = gmalloc(sizeof(String)+len+1); + s->gclink = gcl; + gcl = s; + s->len = len; + s->string = (char*)s+sizeof(String); + memmove(s->string, l->string, l->len); + memmove(s->string+l->len, r->string, r->len); + s->string[s->len] = 0; + return s; +} + +String* +straddrune(String *l, Rune r) +{ + int len; + String *s; + + len = l->len+runelen(r); + s = gmalloc(sizeof(String)+len+1); + s->gclink = gcl; + gcl = s; + s->len = len; + s->string = (char*)s+sizeof(String); + memmove(s->string, l->string, l->len); + runetochar(s->string+l->len, &r); + s->string[s->len] = 0; + return s; +} + +int +scmp(String *sr, String *sl) +{ + if(sr->len != sl->len) + return 0; + + if(memcmp(sr->string, sl->string, sl->len)) + return 0; + + return 1; +} |