newmap.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
       ---
       newmap.c (1178B)
       ---
            1 #include <limits.h>
            2 #include <stdint.h>
            3 #include <stdlib.h>
            4 #include <stdio.h>
            5 #include <string.h>
            6 
            7 #include <scc/mach.h>
            8 
            9 #include "libmach.h"
           10 
           11 Map *
           12 remap(Map *map, int nsec, int nseg)
           13 {
           14         int n;
           15         struct mapsec *sec, *seg;
           16 
           17         if (nseg > SIZE_MAX/sizeof(*sec) || nseg > SIZE_MAX/sizeof(*seg))
           18                 return NULL;
           19 
           20         n = nseg - map->nseg;
           21         if (nseg == 0) {
           22                 free(map->seg);
           23                 seg = NULL;
           24         } else if (n == 0) {
           25                 seg = map->seg;
           26         } else {
           27                 seg = realloc(map->seg, nseg * sizeof(*seg));
           28                 if (!seg)
           29                         return NULL;
           30                 if (n > 0) {
           31                         memset(&seg[map->nseg], 0, n * sizeof(*seg));
           32                 }
           33         }
           34         map->seg = seg;
           35         map->nseg = nseg;
           36 
           37         n = nsec - map->nsec;
           38         if (nsec == 0) {
           39                 free(map->seg);
           40                 sec = NULL;
           41         } else if (n == 0) {
           42                 sec = map->sec;
           43         } else {
           44                 sec = realloc(map->sec, nsec * sizeof(*sec));
           45                 if (!sec)
           46                         return NULL;
           47                 if (n > 0)
           48                         memset(&sec[map->nsec], 0, n * sizeof(*sec));
           49         }
           50         map->sec = sec;
           51         map->nsec = nsec;
           52 
           53         return map;
           54 }
           55 
           56 Map *
           57 newmap(int nsec, int nseg)
           58 {
           59         Map m, *map;
           60 
           61         if (!remap(memset(&m, 0, sizeof(Map)), nsec, nseg))
           62                 goto err;
           63 
           64         if ((map = malloc(sizeof(*map))) == NULL)
           65                 goto err;
           66 
           67         *map = m;
           68         return map;
           69 
           70 err:
           71         free(m.sec);
           72         free(m.seg);
           73         return NULL;
           74 }