scc

simple c99 compiler
git clone git://git.simple-cc.org/scc
Log | Files | Refs | Submodules | README | 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 }