[LWIP] Fix src/core/init.c a bit (#1620)
[reactos.git] / sdk / lib / rossym_new / dwarfpubnames.c
1
2 #include <precomp.h>
3 #define NDEBUG
4 #include <debug.h>
5
6 static int
7 _dwarfnametounit(Dwarf *d, char *name, DwarfBlock *bl, DwarfSym *s)
8 {
9 int vers;
10 ulong len, unit, off;
11 uchar *next;
12 char *str;
13 DwarfBuf b;
14
15 b.d = d;
16 b.p = bl->data;
17 b.ep = b.p + bl->len;
18
19 while(b.p < b.ep){
20 len = dwarfget4(&b);
21 if(len > b.ep-b.p){
22 werrstr("bad length in dwarf name header");
23 return -1;
24 }
25 next = b.p + len;
26 vers = dwarfget2(&b);
27 if(vers != 1 && vers != 2){
28 werrstr("bad version %d in dwarf name header", vers);
29 return -1;
30 }
31 unit = dwarfget4(&b);
32 dwarfget4(&b); /* unit length */
33 while(b.p < next){
34 off = dwarfget4(&b);
35 if(off == 0)
36 break;
37 str = dwarfgetstring(&b);
38 if(strcmp(str, name) == 0){
39 if(dwarfenumunit(d, unit, s) < 0)
40 return -1;
41 if(unit + off >= s->b.ep - d->info.data){
42 werrstr("bad offset in name entry");
43 return -1;
44 }
45 s->b.p = d->info.data + unit + off;
46 if(dwarfnextsym(d, s) < 0)
47 return -1;
48 if(s->attrs.name==nil || strcmp(s->attrs.name, name)!=0){
49 werrstr("unexpected name %#q in lookup for %#q", s->attrs.name, name);
50 return -1;
51 }
52 return 0;
53 }
54 }
55 b.p = next;
56 }
57 werrstr("unknown name '%s'", name);
58 return -1;
59 }
60
61 int
62 dwarflookupname(Dwarf *d, char *name, DwarfSym *sym)
63 {
64 return _dwarfnametounit(d, name, &d->pubnames, sym);
65 }
66
67 /*
68
69 int
70 dwarflookuptype(Dwarf *d, char *name, DwarfSym *sym)
71 {
72 return _dwarfnametounit(d, name, &d->pubtypes, sym);
73 }
74
75 */
76