File: intern.c

package info (click to toggle)
universal-ctags 6.2.1-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 37,612 kB
  • sloc: ansic: 158,498; sh: 8,621; lisp: 7,742; vhdl: 6,518; cpp: 2,583; perl: 2,578; python: 2,324; javascript: 2,054; cs: 1,193; lex: 1,015; sql: 897; makefile: 787; ruby: 764; php: 755; cobol: 741; f90: 566; ada: 559; asm: 509; yacc: 465; fortran: 412; xml: 405; objc: 289; tcl: 280; java: 173; erlang: 65; pascal: 58; ml: 49; awk: 44; haskell: 42
file content (48 lines) | stat: -rw-r--r-- 958 bytes parent folder | download
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
/*
*
*   Copyright (c) 2024, Red Hat, Inc.
*   Copyright (c) 2024, Masatake YAMATO
*
*   This source code is released for free distribution under the terms of the
*   GNU General Public License version 2 or (at your option) any later version.
*
*/

#include "general.h"

#include "htable.h"
#include "intern.h"
#include "routines.h"

#include <string.h>

struct obentry {
	struct obentry *next;
	char quark [];
};

/* $ find linux -type f | wc -l
   86267 */
#define OBARRAY_SIZE    87719
static struct obentry *obarray [OBARRAY_SIZE];

const char *intern (const char *name)
{
	unsigned int hv = hashCstrhash (name) % OBARRAY_SIZE;
	struct obentry* tmp = obarray [hv];

	while (tmp)
	{
		if (!strcmp (tmp->quark, name))
			return tmp->quark;
		tmp = tmp->next;
	}

	size_t len = strlen (name);
	struct obentry *s = eMalloc (sizeof (struct obentry) + len + 1);
	s->next = obarray[hv];
	memcpy (s->quark, name, len + 1);

	obarray[hv] = s;
	return s->quark;
}