xref: /freebsd/crypto/krb5/src/ccapi/lib/ccapi_string.c (revision b670c9bafc0e31c7609969bf374b2e80bdc00211)
1 /* ccapi/lib/ccapi_string.c */
2 /*
3  * Copyright 2006 Massachusetts Institute of Technology.
4  * All Rights Reserved.
5  *
6  * Export of this software from the United States of America may
7  * require a specific license from the United States Government.
8  * It is the responsibility of any person or organization contemplating
9  * export to obtain such a license before exporting.
10  *
11  * WITHIN THAT CONSTRAINT, permission to use, copy, modify, and
12  * distribute this software and its documentation for any purpose and
13  * without fee is hereby granted, provided that the above copyright
14  * notice appear in all copies and that both that copyright notice and
15  * this permission notice appear in supporting documentation, and that
16  * the name of M.I.T. not be used in advertising or publicity pertaining
17  * to distribution of the software without specific, written prior
18  * permission.  Furthermore if you modify this software you must label
19  * your software as modified software and not distribute it in such a
20  * fashion that it might be confused with the original M.I.T. software.
21  * M.I.T. makes no representations about the suitability of
22  * this software for any purpose.  It is provided "as is" without express
23  * or implied warranty.
24  */
25 
26 #include "ccapi_string.h"
27 
28 /* ------------------------------------------------------------------------ */
29 
30 cc_string_d cci_string_d_initializer = {
31     NULL,
32     NULL
33     VECTOR_FUNCTIONS_INITIALIZER };
34 
35 cc_string_f cci_string_f_initializer = {
36     ccapi_string_release
37 };
38 
39 /* ------------------------------------------------------------------------ */
40 
41 cc_int32 cci_string_new (cc_string_t *out_string,
42                          char        *in_cstring)
43 {
44     cc_int32 err = ccNoError;
45     cc_string_t string = NULL;
46 
47     if (!out_string) { err = cci_check_error (ccErrBadParam); }
48     if (!in_cstring) { err = cci_check_error (ccErrBadParam); }
49 
50     if (!err) {
51         string = malloc (sizeof (*string));
52         if (string) {
53             *string = cci_string_d_initializer;
54         } else {
55             err = cci_check_error (ccErrNoMem);
56         }
57     }
58 
59     if (!err) {
60         string->functions = malloc (sizeof (*string->functions));
61         if (string->functions) {
62             *((cc_string_f *) string->functions) = cci_string_f_initializer;
63         } else {
64             err = cci_check_error (ccErrNoMem);
65         }
66     }
67 
68     if (!err) {
69         string->data = strdup (in_cstring);
70         if (!string->data) {
71             err = cci_check_error (ccErrNoMem);
72         }
73 
74     }
75 
76     if (!err) {
77         *out_string = string;
78         string = NULL; /* take ownership */
79     }
80 
81     if (string) { ccapi_string_release (string); }
82 
83     return cci_check_error (err);
84 }
85 
86 /* ------------------------------------------------------------------------ */
87 
88 cc_int32 ccapi_string_release (cc_string_t in_string)
89 {
90     cc_int32 err = ccNoError;
91 
92     if (!in_string) { err = ccErrBadParam; }
93 
94     if (!err) {
95         free ((char *) in_string->data);
96         free ((char *) in_string->functions);
97         free (in_string);
98     }
99 
100     return err;
101 }
102