]> granicus.if.org Git - strace/blob - dyxlat.c
maint: update for linux v5.3-rc8
[strace] / dyxlat.c
1 /*
2  * Copyright (c) 2017-2018 The strace developers.
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  */
6
7 #include "defs.h"
8
9 struct dyxlat {
10         size_t allocated;
11         struct xlat xlat;
12         struct xlat_data *data;
13 };
14
15 struct dyxlat *
16 dyxlat_alloc(const size_t nmemb)
17 {
18         struct dyxlat *const dyxlat = xmalloc(sizeof(*dyxlat));
19
20         dyxlat->xlat.type = XT_NORMAL;
21         dyxlat->xlat.size = 0;
22         dyxlat->allocated = nmemb;
23         dyxlat->xlat.data = dyxlat->data = xgrowarray(NULL, &dyxlat->allocated,
24                                                       sizeof(struct xlat_data));
25
26         return dyxlat;
27 }
28
29 void
30 dyxlat_free(struct dyxlat *const dyxlat)
31 {
32         size_t i;
33
34         for (i = 0; i < dyxlat->xlat.size; ++i) {
35                 free((void *) dyxlat->data[i].str);
36                 dyxlat->data[i].str = NULL;
37         }
38
39         free(dyxlat->data);
40         dyxlat->xlat.data = NULL;
41         free(dyxlat);
42 }
43
44 const struct xlat *
45 dyxlat_get(const struct dyxlat *const dyxlat)
46 {
47         return &dyxlat->xlat;
48 }
49
50 void
51 dyxlat_add_pair(struct dyxlat *const dyxlat, const uint64_t val,
52                 const char *const str, const size_t len)
53 {
54         size_t i;
55
56         for (i = 0; i < dyxlat->xlat.size; ++i) {
57                 if (dyxlat->data[i].val == val) {
58                         if (strncmp(dyxlat->data[i].str, str, len) == 0
59                             && dyxlat->data[i].str[len] == '\0')
60                                 return;
61
62                         free((void *) dyxlat->data[i].str);
63                         dyxlat->data[i].str = xstrndup(str, len);
64                         return;
65                 }
66         }
67
68         if (dyxlat->xlat.size >= dyxlat->allocated)
69                 dyxlat->xlat.data = dyxlat->data =
70                         xgrowarray(dyxlat->data, &dyxlat->allocated,
71                                    sizeof(struct xlat_data));
72
73         dyxlat->data[dyxlat->xlat.size].val = val;
74         dyxlat->data[dyxlat->xlat.size].str = xstrndup(str, len);
75         dyxlat->xlat.size++;
76 }