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 }