mapsec.c - scc - simple c99 compiler
 (HTM) git clone git://git.simple-cc.org/scc
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) Submodules
 (DIR) README
 (DIR) LICENSE
       ---
       mapsec.c (1206B)
       ---
            1 #include <stdio.h>
            2 #include <stdlib.h>
            3 #include <string.h>
            4 
            5 #include <scc/mach.h>
            6 
            7 #include "libmach.h"
            8 
            9 static int
           10 matchseg(Map *map, Mapsec *msec, FILE *fp)
           11 {
           12         unsigned long long o, e, mo, me;
           13         Section *seg;
           14         Mapsec *mseg, **v;
           15 
           16         mo = msec->sec.load;
           17         me =  mo + msec->sec.size;
           18 
           19         if ((msec->sec.flags & SLOAD) == 0)
           20                 return 0;
           21 
           22         for (mseg = map->seg; mseg < &map->seg[map->nseg]; ++mseg) {
           23                 if (mseg->fp != fp)
           24                         continue;
           25                 o = mseg->sec.load;
           26                 e = o + mseg->sec.size;
           27                 if (mo >= o && me <= e) {
           28                         v = realloc(mseg->child, sizeof(Mapsec *) * (mseg->nchild+1));
           29                         if (!v)
           30                                 return -1;
           31                         mseg->child = v;
           32                         v[mseg->nchild++] = msec;
           33                 }
           34         }
           35 
           36         return 0;
           37 }
           38 
           39 int
           40 mapsec(Map *map, Section *sec, FILE *fp, long fsiz)
           41 {
           42         int n;
           43         char *s;
           44         Mapsec *msec, *mp;
           45 
           46         mp = NULL;
           47         n = map->nsec;
           48         for (msec = map->sec; n--; msec++) {
           49                 s = msec->sec.name;
           50                 if (s && !strcmp(s, sec->name))
           51                         goto found;
           52                 if (!mp && !msec->used)
           53                         mp = msec;
           54         }
           55 
           56         if (mp) {
           57                 msec = mp;
           58                 goto found;
           59         }
           60 
           61         if ((map = remap(map, map->nsec+1, map->nseg)) == NULL)
           62                 return -1;
           63         msec = &map->sec[map->nsec-1];
           64 
           65 found:
           66         msec->used = 1;
           67         msec->sec = *sec;
           68         msec->fp = fp,
           69         msec->fsiz = fsiz;
           70 
           71         return matchseg(map, msec, fp);
           72 }