xref: /freebsd/crypto/heimdal/base/string.c (revision 2e3507c25e42292b45a5482e116d278f5515d04d)
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 const char *
112 heim_string_get_utf8(heim_string_t string)
113 {
114     return (const char *)string;
115 }
116