Blame dwarfdump/makename.c

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 */