scc

A fork of https://git.simple-cc.org/scc/ for Qute

git clone https://git.8pit.net/scc.git

 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
11Map *
12remap(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
56Map *
57newmap(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
70err:
71	free(m.sec);
72	free(m.seg);
73	return NULL;
74}