jdk/src/jdk.hprof.agent/share/native/libhprof/hprof_string.c
changeset 32249 ba2c9c7773b6
parent 32248 13967da712ff
parent 32247 9f3dd33507b9
child 32253 637b00638ed6
equal deleted inserted replaced
32248:13967da712ff 32249:ba2c9c7773b6
     1 /*
       
     2  * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
       
     3  *
       
     4  * Redistribution and use in source and binary forms, with or without
       
     5  * modification, are permitted provided that the following conditions
       
     6  * are met:
       
     7  *
       
     8  *   - Redistributions of source code must retain the above copyright
       
     9  *     notice, this list of conditions and the following disclaimer.
       
    10  *
       
    11  *   - Redistributions in binary form must reproduce the above copyright
       
    12  *     notice, this list of conditions and the following disclaimer in the
       
    13  *     documentation and/or other materials provided with the distribution.
       
    14  *
       
    15  *   - Neither the name of Oracle nor the names of its
       
    16  *     contributors may be used to endorse or promote products derived
       
    17  *     from this software without specific prior written permission.
       
    18  *
       
    19  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
       
    20  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
       
    21  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
       
    23  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    24  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    25  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    26  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
       
    27  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
       
    28  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
       
    29  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
       
    30  */
       
    31 
       
    32 /*
       
    33  * This source code is provided to illustrate the usage of a given feature
       
    34  * or technique and has been deliberately simplified. Additional steps
       
    35  * required for a production-quality application, such as security checks,
       
    36  * input validation and proper error handling, might not be present in
       
    37  * this sample code.
       
    38  */
       
    39 
       
    40 
       
    41 /* Table of byte arrays (e.g. char* string + NULL byte) */
       
    42 
       
    43 /*
       
    44  * Strings are unique by their own contents, since the string itself
       
    45  *   is the Key, and the hprof_table.c guarantees that keys don't move,
       
    46  *   this works out perfect. Any key in this table can be used as
       
    47  *   an char*.
       
    48  *
       
    49  * This does mean that this table has dynamically sized keys.
       
    50  *
       
    51  * Care needs to be taken to make sure the NULL byte is included, not for
       
    52  *   the sake of hprof_table.c, but so that the key can be used as a char*.
       
    53  *
       
    54  */
       
    55 
       
    56 #include "hprof.h"
       
    57 
       
    58 void
       
    59 string_init(void)
       
    60 {
       
    61     HPROF_ASSERT(gdata->string_table==NULL);
       
    62     gdata->string_table = table_initialize("Strings", 4096, 4096, 1024, 0);
       
    63 }
       
    64 
       
    65 StringIndex
       
    66 string_find_or_create(const char *str)
       
    67 {
       
    68     return table_find_or_create_entry(gdata->string_table,
       
    69                 (void*)str, (int)strlen(str)+1, NULL, NULL);
       
    70 }
       
    71 
       
    72 static void
       
    73 list_item(TableIndex index, void *str, int len, void *info_ptr, void *arg)
       
    74 {
       
    75     debug_message( "0x%08x: String \"%s\"\n", index, (const char *)str);
       
    76 }
       
    77 
       
    78 void
       
    79 string_list(void)
       
    80 {
       
    81     debug_message(
       
    82         "-------------------- String Table ------------------------\n");
       
    83     table_walk_items(gdata->string_table, &list_item, NULL);
       
    84     debug_message(
       
    85         "----------------------------------------------------------\n");
       
    86 }
       
    87 
       
    88 void
       
    89 string_cleanup(void)
       
    90 {
       
    91     table_cleanup(gdata->string_table, NULL, NULL);
       
    92     gdata->string_table = NULL;
       
    93 }
       
    94 
       
    95 char *
       
    96 string_get(StringIndex index)
       
    97 {
       
    98     void *key;
       
    99     int   key_len;
       
   100 
       
   101     table_get_key(gdata->string_table, index, &key, &key_len);
       
   102     HPROF_ASSERT(key_len>0);
       
   103     return (char*)key;
       
   104 }
       
   105 
       
   106 int
       
   107 string_get_len(StringIndex index)
       
   108 {
       
   109     void *key;
       
   110     int   key_len;
       
   111 
       
   112     table_get_key(gdata->string_table, index, &key, &key_len);
       
   113     HPROF_ASSERT(key_len>0);
       
   114     return key_len-1;
       
   115 }