File: mangle_names.c

package info (click to toggle)
fauhdlc 20180504-3.1
  • links: PTS
  • area: main
  • in suites: bookworm, bullseye, sid, trixie
  • size: 3,064 kB
  • sloc: cpp: 23,188; ansic: 6,077; yacc: 3,764; lex: 763; makefile: 605; python: 412; xml: 403; sh: 61
file content (83 lines) | stat: -rw-r--r-- 1,685 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
/* $Id$ 
 *
 * Mangle/Demangle VHDL names to intermediate code names.
 *
 * Copyright (C) 2008-2009 FAUmachine Team <info@faumachine.org>.
 * This program is free software. You can redistribute it and/or modify it
 * under the terms of the GNU General Public License, either version 2 of
 * the License, or (at your option) any later version. See COPYING.
 */

#include "util/mangle_names.h"
#include <assert.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

static void
replace_all(char *b, size_t sz, const char *tok, const char *rep)
{
	size_t tok_len;
	size_t rep_len;
	size_t cnt;
	size_t avail;
	char *remainder;
	char *s;
	char *dest;

	tok_len = strlen(tok);
	rep_len = strlen(rep);


	for (;;) {
		s = strstr(b, tok);
		if (s == NULL) {
			break;
		}
		
		remainder = s + tok_len;
		dest = s + rep_len;
		if (dest != remainder) {
			cnt = strlen(remainder) + 1;
			avail = sz - (dest - b);
			if (cnt < avail) {
				cnt = avail;
			}
			memmove(dest, remainder, cnt);
		}

		memcpy(s, rep, rep_len);
	}

	b[sz - 1] = '\0';
}

int
mangle_name(const char *name, char *dst, size_t sz)
{
	int r;
	
	r = snprintf(dst, sz, "%s", name);
	assert(r >= 0);
	assert((size_t)r < sz);
	replace_all(dst, sz, ":", "__c_");
	replace_all(dst, sz, "[", "__b_");
	replace_all(dst, sz, "]", "__B_");
	replace_all(dst, sz, " ", "__e_");
	replace_all(dst, sz, ",", "__s_");

	return strlen(dst);
}

int
demangle_name(const char *name, char *dst, size_t sz)
{
	snprintf(dst, sz, "%s", name);
	replace_all(dst, sz, "__c_", ":");
	replace_all(dst, sz, "__b_", "[");
	replace_all(dst, sz, "__B_", "]");
	replace_all(dst, sz, "__e_", " ");
	replace_all(dst, sz, "__s_", ",");

	return 0;
}