| /* |
| SPDX-License-Identifier: GPL-2.0-only |
| |
| Copyright (C) 2008 Arnaldo Carvalho de Melo <acme@redhat.com> |
| */ |
| |
| #include "pahole_strings.h" |
| #include "gobuffer.h" |
| |
| #include <search.h> |
| #include <stdint.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <zlib.h> |
| |
| #include "dutil.h" |
| #include "lib/bpf/src/libbpf.h" |
| |
| struct strings *strings__new(void) |
| { |
| struct strings *strs = malloc(sizeof(*strs)); |
| |
| if (!strs) |
| return NULL; |
| |
| strs->btf = btf__new_empty(); |
| if (libbpf_get_error(strs->btf)) { |
| free(strs); |
| return NULL; |
| } |
| |
| return strs; |
| } |
| |
| void strings__delete(struct strings *strs) |
| { |
| if (strs == NULL) |
| return; |
| btf__free(strs->btf); |
| free(strs); |
| } |
| |
| strings_t strings__add(struct strings *strs, const char *str) |
| { |
| strings_t index; |
| |
| if (str == NULL) |
| return 0; |
| |
| index = btf__add_str(strs->btf, str); |
| if (index < 0) |
| return 0; |
| |
| return index; |
| } |
| |
| strings_t strings__find(struct strings *strs, const char *str) |
| { |
| return btf__find_str(strs->btf, str); |
| } |
| |
| /* a horrible and inefficient hack to get string section size out of BTF */ |
| strings_t strings__size(const struct strings *strs) |
| { |
| const struct btf_header *p; |
| uint32_t sz; |
| |
| p = btf__get_raw_data(strs->btf, &sz); |
| if (!p) |
| return -1; |
| |
| return p->str_len; |
| } |
| |
| /* similarly horrible hack to copy out string section out of BTF */ |
| int strings__copy(const struct strings *strs, void *dst) |
| { |
| const struct btf_header *p; |
| uint32_t sz; |
| |
| p = btf__get_raw_data(strs->btf, &sz); |
| if (!p) |
| return -1; |
| |
| memcpy(dst, (void *)p + p->str_off, p->str_len); |
| return 0; |
| } |