ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

dwarfget.c
Go to the documentation of this file.
00001 /*
00002  * Dwarf data format parsing routines.
00003  */
00004 
00005 #include <precomp.h>
00006 
00007 #define NDEBUG
00008 #include <debug.h>
00009 
00010 ulong
00011 dwarfget1(DwarfBuf *b)
00012 {
00013     if(b->p==nil || b->p+1 > b->ep){
00014         b->p = nil;
00015         return 0;
00016     }
00017     return *b->p++;
00018 }
00019 
00020 int
00021 dwarfgetn(DwarfBuf *b, uchar *a, int n)
00022 {
00023     if(b->p==nil || b->p+n > b->ep){
00024         b->p = nil;
00025         memset(a, 0, n);
00026         return -1;
00027     }
00028     memmove(a, b->p, n);
00029     b->p += n;
00030     return 0;
00031 }
00032 
00033 uchar*
00034 dwarfgetnref(DwarfBuf *b, ulong n)
00035 {
00036     uchar *p;
00037 
00038     if(b->p==nil || b->p+n > b->ep){
00039         b->p = nil;
00040         return nil;
00041     }
00042     p = b->p;
00043     b->p += n;
00044     return p;
00045 }
00046 
00047 char*
00048 dwarfgetstring(DwarfBuf *b)
00049 {
00050     char *s;
00051 
00052     if(b->p == nil)
00053         return nil;
00054     s = (char*)b->p;
00055     while(b->p < b->ep && *b->p)
00056         b->p++;
00057     if(b->p >= b->ep){
00058         b->p = nil;
00059         return nil;
00060     }
00061     b->p++;
00062     return s;
00063 }
00064 
00065 void
00066 dwarfskip(DwarfBuf *b, int n)
00067 {
00068     if(b->p==nil || b->p+n > b->ep)
00069         b->p = nil;
00070     else
00071         b->p += n;
00072 }
00073 
00074 ulong
00075 dwarfget2(DwarfBuf *b)
00076 {
00077     ulong v;
00078 
00079     if(b->p==nil || b->p+2 > b->ep){
00080         b->p = nil;
00081         return 0;
00082     }
00083     v = b->d->pe->e2(b->p);
00084     b->p += 2;
00085     return v;
00086 }
00087 
00088 ulong
00089 dwarfget4(DwarfBuf *b)
00090 {
00091     ulong v;
00092 
00093     if(b->p==nil || b->p+4 > b->ep){
00094         b->p = nil;
00095         return 0;
00096     }
00097     v = b->d->pe->e4(b->p);
00098     b->p += 4;
00099     return v;
00100 }
00101 
00102 uvlong
00103 dwarfget8(DwarfBuf *b)
00104 {
00105     uvlong v;
00106 
00107     if(b->p==nil || b->p+8 > b->ep){
00108         b->p = nil;
00109         return 0;
00110     }
00111     v = b->d->pe->e8(b->p);
00112     b->p += 8;
00113     return v;
00114 }
00115 
00116 ulong
00117 dwarfgetaddr(DwarfBuf *b)
00118 {
00119     static int nbad;
00120 
00121     if(b->addrsize == 0)
00122         b->addrsize = b->d->addrsize;
00123 
00124     switch(b->addrsize){
00125     case 1:
00126         return dwarfget1(b);
00127     case 2:
00128         return dwarfget2(b);
00129     case 4:
00130         return dwarfget4(b);
00131     case 8:
00132         return dwarfget8(b);
00133     default:
00134         if(++nbad == 1)
00135             werrstr("dwarf: unexpected address size %lud in dwarfgetaddr", b->addrsize);
00136         b->p = nil;
00137         return 0;
00138     }
00139 }
00140 
00141 int n1, n2, n3, n4, n5;
00142 
00143 /* An inline function picks off the calls to dwarfget128 for 1-byte encodings,
00144  * more than by far the common case (99.999% on most binaries!). */
00145 ulong
00146 dwarfget128(DwarfBuf *b)
00147 {
00148     static int nbad;
00149     ulong c, d;
00150 
00151     if(b->p == nil)
00152         return 0;
00153     c = *b->p++;
00154     if(!(c&0x80))
00155 {n1++;
00156         return c;
00157 }
00158     c &= ~0x80;
00159     d = *b->p++;
00160     c |= (d&0x7F)<<7;
00161     if(!(d&0x80))
00162 {n2++;
00163         return c;
00164 }
00165     d = *b->p++;
00166     c |= (d&0x7F)<<14;
00167     if(!(d&0x80))
00168 {n3++;
00169         return c;
00170 }
00171     d = *b->p++;
00172     c |= (d&0x7F)<<21;
00173     if(!(d&0x80))
00174 {n4++;
00175         return c;
00176 }
00177     d = *b->p++;
00178     c |= (d&0x7F)<<28;
00179     if(!(d&0x80))
00180 {n5++;
00181         return c;
00182 }
00183     while(b->p<b->ep && *b->p&0x80)
00184         b->p++;
00185     if(++nbad == 1)
00186         werrstr("dwarf: overflow during parsing of uleb128 integer");
00187     return c;
00188 }
00189 
00190 long
00191 dwarfget128s(DwarfBuf *b)
00192 {
00193     int nb, c;
00194     ulong v;
00195     static int nbad;
00196 
00197     v = 0;
00198     nb = 0;
00199     if(b->p==nil)
00200         return 0;
00201     while(b->p<b->ep){
00202         c = *b->p++;
00203         v |= (c & 0x7F)<<nb;
00204         nb += 7;
00205         if(!(c&0x80))
00206             break;
00207     }
00208     if(v&(1<<(nb-1)))
00209         v |= ~(((ulong)1<<nb)-1);
00210     if(nb > 8*sizeof(ulong)){
00211         if(0)
00212         if(++nbad == 1)
00213             werrstr("dwarf: overflow during parsing of sleb128 integer: got %d bits", nb);
00214     }
00215     return v;
00216 }
00217 
00218 

Generated on Sun May 27 2012 04:36:17 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.