Line data Source code
1 : /*
2 : * Copyright (c) 1997, 1998, 2001 Kungliga Tekniska Högskolan
3 : * (Royal Institute of Technology, Stockholm, Sweden).
4 : * All rights reserved.
5 : *
6 : * Redistribution and use in source and binary forms, with or without
7 : * modification, are permitted provided that the following conditions
8 : * are met:
9 : *
10 : * 1. Redistributions of source code must retain the above copyright
11 : * notice, this list of conditions and the following disclaimer.
12 : *
13 : * 2. Redistributions in binary form must reproduce the above copyright
14 : * notice, this list of conditions and the following disclaimer in the
15 : * documentation and/or other materials provided with the distribution.
16 : *
17 : * 3. Neither the name of the Institute nor the names of its contributors
18 : * may be used to endorse or promote products derived from this software
19 : * without specific prior written permission.
20 : *
21 : * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 : * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 : * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 : * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 : * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 : * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 : * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 : * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 : * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 : * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 : * SUCH DAMAGE.
32 : */
33 :
34 :
35 : #include <config.h>
36 :
37 : #include <stdio.h>
38 : #include <stdlib.h>
39 : #include <string.h>
40 : #include <com_right.h>
41 : #include <roken.h>
42 :
43 : #ifdef LIBINTL
44 : #include <libintl.h>
45 : #else
46 : #define dgettext(d,s) (s)
47 : #endif
48 :
49 : KRB5_LIB_FUNCTION const char * KRB5_LIB_CALL
50 15588 : com_right(struct et_list *list, long code)
51 : {
52 0 : struct et_list *p;
53 25312 : for (p = list; p; p = p->next)
54 15588 : if (code >= p->table->base && code < p->table->base + p->table->n_msgs)
55 5864 : return p->table->msgs[code - p->table->base];
56 9724 : return NULL;
57 : }
58 :
59 : KRB5_LIB_FUNCTION const char * KRB5_LIB_CALL
60 735 : com_right_r(struct et_list *list, long code, char *str, size_t len)
61 : {
62 0 : struct et_list *p;
63 745 : for (p = list; p; p = p->next) {
64 745 : if (code >= p->table->base && code < p->table->base + p->table->n_msgs) {
65 735 : const char *msg = p->table->msgs[code - p->table->base];
66 : #ifdef LIBINTL
67 0 : char domain[12 + 20];
68 735 : snprintf(domain, sizeof(domain), "heim_com_err%ld", p->table->base);
69 : #endif
70 735 : strlcpy(str, dgettext(domain, msg), len);
71 735 : return str;
72 : }
73 : }
74 0 : return NULL;
75 : }
76 :
77 : struct foobar {
78 : struct et_list etl;
79 : struct error_table et;
80 : };
81 :
82 : KRB5_LIB_FUNCTION void KRB5_LIB_CALL
83 6970616 : initialize_error_table_r(struct et_list **list,
84 : const char *const *messages,
85 : int num_errors,
86 : long base)
87 : {
88 171876 : struct et_list *et, **end;
89 171876 : struct foobar *f;
90 19862220 : for (end = list, et = *list; et; end = &et->next, et = et->next)
91 13455916 : if (et->table->msgs == messages)
92 551379 : return;
93 6406304 : f = malloc(sizeof(*f));
94 6406304 : if (f == NULL)
95 0 : return;
96 6406304 : et = &f->etl;
97 6406304 : et->table = &f->et;
98 6406304 : et->table->msgs = messages;
99 6406304 : et->table->n_msgs = num_errors;
100 6406304 : et->table->base = base;
101 6406304 : et->next = NULL;
102 6406304 : *end = et;
103 : }
104 :
105 :
106 : KRB5_LIB_FUNCTION void KRB5_LIB_CALL
107 2259519 : free_error_table(struct et_list *et)
108 : {
109 8284996 : while(et){
110 6025477 : struct et_list *p = et;
111 6025477 : et = et->next;
112 6025477 : free(p);
113 : }
114 2259519 : }
|