/ base / string.c
string.c
  1  /*
  2   * Copyright (c) 2010 Kungliga Tekniska Högskolan
  3   * (Royal Institute of Technology, Stockholm, Sweden).
  4   * All rights reserved.
  5   *
  6   * Portions Copyright (c) 2010 Apple Inc. All rights reserved.
  7   *
  8   * Redistribution and use in source and binary forms, with or without
  9   * modification, are permitted provided that the following conditions
 10   * are met:
 11   *
 12   * 1. Redistributions of source code must retain the above copyright
 13   *    notice, this list of conditions and the following disclaimer.
 14   *
 15   * 2. Redistributions in binary form must reproduce the above copyright
 16   *    notice, this list of conditions and the following disclaimer in the
 17   *    documentation and/or other materials provided with the distribution.
 18   *
 19   * 3. Neither the name of the Institute nor the names of its contributors
 20   *    may be used to endorse or promote products derived from this software
 21   *    without specific prior written permission.
 22   *
 23   * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
 24   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 25   * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 26   * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
 27   * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 28   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 29   * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 30   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 31   * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 32   * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 33   * SUCH DAMAGE.
 34   */
 35  
 36  #include "baselocl.h"
 37  #include <string.h>
 38  
 39  static void
 40  string_dealloc(void *ptr)
 41  {
 42  }
 43  
 44  static int
 45  string_cmp(void *a, void *b)
 46  {
 47      return strcmp(a, b);
 48  }
 49  
 50  static unsigned long
 51  string_hash(void *ptr)
 52  {
 53      const char *s = ptr;
 54      unsigned long n;
 55  
 56      for (n = 0; *s; ++s)
 57  	n += *s;
 58      return n;
 59  }
 60  
 61  struct heim_type_data _heim_string_object = {
 62      HEIM_TID_STRING,
 63      "string-object",
 64      NULL,
 65      string_dealloc,
 66      NULL,
 67      string_cmp,
 68      string_hash
 69  };
 70  
 71  /**
 72   * Create a string object
 73   *
 74   * @param string the string to create, must be an utf8 string
 75   *
 76   * @return string object
 77   */
 78  
 79  heim_string_t
 80  heim_string_create(const char *string)
 81  {
 82      size_t len = strlen(string);
 83      heim_string_t s;
 84  
 85      s = _heim_alloc_object(&_heim_string_object, len + 1);
 86      if (s)
 87  	memcpy(s, string, len + 1);
 88      return s;
 89  }
 90  
 91  /**
 92   * Return the type ID of string objects
 93   *
 94   * @return type id of string objects
 95   */
 96  
 97  heim_tid_t
 98  heim_string_get_type_id(void)
 99  {
100      return HEIM_TID_STRING;
101  }
102  
103  /**
104   * Get the string value of the content.
105   *
106   * @param string the string object to get the value from
107   *
108   * @return a utf8 string
109   */
110  
111  char *
112  heim_string_copy_utf8(heim_string_t string)
113  {
114      return strdup(string);
115  }