|
Packit |
cdaae3 |
/*
|
|
Packit |
cdaae3 |
Copyright (C) 2000,2004 Silicon Graphics, Inc. All Rights Reserved.
|
|
Packit |
cdaae3 |
Portions Copyright(C) David Anderson 2016. All Rights reserved.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
This program is free software; you can redistribute it and/or modify it
|
|
Packit |
cdaae3 |
under the terms of version 2 of the GNU General Public License as
|
|
Packit |
cdaae3 |
published by the Free Software Foundation.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
This program is distributed in the hope that it would be useful, but
|
|
Packit |
cdaae3 |
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
cdaae3 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
Further, this software is distributed without any warranty that it is
|
|
Packit |
cdaae3 |
free of the rightful claim of any third person regarding infringement
|
|
Packit |
cdaae3 |
or the like. Any license provided herein, whether implied or
|
|
Packit |
cdaae3 |
otherwise, applies only to this software file. Patent licenses, if
|
|
Packit |
cdaae3 |
any, provided herein do not apply to combinations of this program with
|
|
Packit |
cdaae3 |
other software, or any other product whatsoever.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
You should have received a copy of the GNU General Public License along
|
|
Packit |
cdaae3 |
with this program; if not, write the Free Software Foundation, Inc., 51
|
|
Packit |
cdaae3 |
Franklin Street - Fifth Floor, Boston MA 02110-1301, USA.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
makename.c
|
|
Packit |
cdaae3 |
$Revision: 1.4 $
|
|
Packit |
cdaae3 |
$Date: 2005/11/08 21:48:42 $
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
This used to be elaborate stuff.
|
|
Packit |
cdaae3 |
Now it is trivial, as duplicating names is
|
|
Packit |
cdaae3 |
unimportant in dwarfdump (in general).
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
And in fact, this is only called for attributes and
|
|
Packit |
cdaae3 |
tags etc whose true name is unknown. Not for
|
|
Packit |
cdaae3 |
any normal case.
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
*/
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
#include <stdio.h>
|
|
Packit |
cdaae3 |
#include <string.h>
|
|
Packit |
cdaae3 |
#include <stdlib.h>
|
|
Packit |
cdaae3 |
#include "dwarf_tsearch.h"
|
|
Packit |
cdaae3 |
#include "makename.h"
|
|
Packit |
cdaae3 |
#include "globals.h"
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
#ifdef _WIN32
|
|
Packit |
cdaae3 |
#pragma warning(disable:4996) /* Warning when migrated to VS2010 */
|
|
Packit |
cdaae3 |
#endif /* _WIN32 */
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
#define TRUE 1
|
|
Packit |
cdaae3 |
#define FALSE 0
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
static void * makename_data;
|
|
Packit |
cdaae3 |
#define VALTYPE char *
|
|
Packit |
cdaae3 |
#define DW_TSHASHTYPE char *
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
static int
|
|
Packit |
cdaae3 |
value_compare_func(const void *l, const void *r)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
VALTYPE ml = (VALTYPE)l;
|
|
Packit |
cdaae3 |
VALTYPE mr = (VALTYPE)r;
|
|
Packit |
cdaae3 |
return strcmp(ml,mr);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
/* Nothing to free for the 'value' example. */
|
|
Packit |
cdaae3 |
static void
|
|
Packit |
cdaae3 |
value_node_free(void *valp)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
VALTYPE v = (VALTYPE)valp;
|
|
Packit |
cdaae3 |
free(v);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
void
|
|
Packit |
cdaae3 |
makename_destructor(void)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
dwarf_tdestroy(makename_data,value_node_free);
|
|
Packit |
cdaae3 |
makename_data = 0;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
/* WARNING: the tree walk functions will, if presented **tree
|
|
Packit |
cdaae3 |
when *tree is wanted, simply find nothing. No error,
|
|
Packit |
cdaae3 |
just bad results. So when a walk produces nothing
|
|
Packit |
cdaae3 |
suspect a code mistake here.
|
|
Packit |
cdaae3 |
The basic problem is void* is a terrible way to
|
|
Packit |
cdaae3 |
pass in a pointer. But it's how tsearch was defined
|
|
Packit |
cdaae3 |
long ago.
|
|
Packit |
cdaae3 |
*/
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
char *
|
|
Packit |
cdaae3 |
makename(const char *s)
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
char *newstr = 0;
|
|
Packit |
cdaae3 |
VALTYPE re = 0;
|
|
Packit |
cdaae3 |
void *retval = 0;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
if (!s) {
|
|
Packit |
cdaae3 |
return "";
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
#ifdef SELFTEST
|
|
Packit |
cdaae3 |
printf("Selftest with name %s\n",s);
|
|
Packit |
cdaae3 |
#endif
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
newstr = (char *)strdup(s);
|
|
Packit |
cdaae3 |
retval = dwarf_tfind(newstr,&makename_data, value_compare_func);
|
|
Packit |
cdaae3 |
if (retval) {
|
|
Packit |
cdaae3 |
/* We found our string, it existed already. */
|
|
Packit |
cdaae3 |
re = *(VALTYPE *)retval;
|
|
Packit |
cdaae3 |
free(newstr);
|
|
Packit |
cdaae3 |
return re;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
retval = dwarf_tsearch(newstr,&makename_data, value_compare_func);
|
|
Packit |
cdaae3 |
if (!retval) {
|
|
Packit |
cdaae3 |
/* Out of memory, lets just use the string we dup'd and
|
|
Packit |
cdaae3 |
let it leak. Things will surely fail anyway. */
|
|
Packit |
cdaae3 |
return newstr;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
re = *(VALTYPE *)retval;
|
|
Packit |
cdaae3 |
return re;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
/* We will make a search tree using a simple value
|
|
Packit |
cdaae3 |
(the pointer from an strdup) */
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
#ifdef SELFTEST
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
char *samples[] = {
|
|
Packit |
cdaae3 |
"abcd",
|
|
Packit |
cdaae3 |
"efgh",
|
|
Packit |
cdaae3 |
"a",
|
|
Packit |
cdaae3 |
"abcd",
|
|
Packit |
cdaae3 |
0
|
|
Packit |
cdaae3 |
};
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
int main()
|
|
Packit |
cdaae3 |
{
|
|
Packit |
cdaae3 |
char *e1 = 0;
|
|
Packit |
cdaae3 |
char *e2= 0;
|
|
Packit |
cdaae3 |
char *e3= 0;
|
|
Packit |
cdaae3 |
char *e4= 0;
|
|
Packit |
cdaae3 |
int j = 0;
|
|
Packit |
cdaae3 |
int errct = 0;
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
e1 = makename(samples[0]);
|
|
Packit |
cdaae3 |
e2 = makename(samples[1]);
|
|
Packit |
cdaae3 |
e3 = makename(samples[2]);
|
|
Packit |
cdaae3 |
e4 = makename(samples[3]);
|
|
Packit |
cdaae3 |
|
|
Packit |
cdaae3 |
if (e1 != e4) {
|
|
Packit |
cdaae3 |
printf(" FAIL. mismatch pointers\n");
|
|
Packit |
cdaae3 |
++errct;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
if (e1 == e2 ) {
|
|
Packit |
cdaae3 |
printf(" FAIL. match pointers\n");
|
|
Packit |
cdaae3 |
++errct;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
if ( e1 == e3) {
|
|
Packit |
cdaae3 |
printf(" FAIL. match pointers\n");
|
|
Packit |
cdaae3 |
++errct;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
if (errct) {
|
|
Packit |
cdaae3 |
exit(1);
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
printf("PASS makename test\n");
|
|
Packit |
cdaae3 |
return 0;
|
|
Packit |
cdaae3 |
}
|
|
Packit |
cdaae3 |
#endif /* SELFTEST */
|