Commit | Line | Data |
---|---|---|
53102063 C |
1 | /* ftamfaduid.c - FPM: encode/decode FADU identities */ |
2 | ||
3 | #ifndef lint | |
4 | static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamfaduid.c,v 7.1 91/02/22 09:22:51 mrose Interim $"; | |
5 | #endif | |
6 | ||
7 | /* | |
8 | * $Header: /f/osi/ftam/RCS/ftamfaduid.c,v 7.1 91/02/22 09:22:51 mrose Interim $ | |
9 | * | |
10 | * | |
11 | * $Log: ftamfaduid.c,v $ | |
12 | * Revision 7.1 91/02/22 09:22:51 mrose | |
13 | * Interim 6.8 | |
14 | * | |
15 | * Revision 7.0 89/11/23 21:53:36 mrose | |
16 | * Release 6.0 | |
17 | * | |
18 | */ | |
19 | ||
20 | /* | |
21 | * NOTICE | |
22 | * | |
23 | * Acquisition, use, and distribution of this module and related | |
24 | * materials are subject to the restrictions of a license agreement. | |
25 | * Consult the Preface in the User's Manual for the full terms of | |
26 | * this agreement. | |
27 | * | |
28 | */ | |
29 | ||
30 | ||
31 | /* LINTLIBRARY */ | |
32 | ||
33 | #include <stdio.h> | |
34 | #include "fpkt.h" | |
35 | ||
36 | /* \f */ | |
37 | ||
38 | struct type_FTAM_FADU__Identity *faduid2fpm (fsb, fa, fti) | |
39 | register struct ftamblk *fsb; | |
40 | register struct FADUidentity *fa; | |
41 | struct FTAMindication *fti; | |
42 | { | |
43 | register int n; | |
44 | register char **ap; | |
45 | register struct type_FTAM_FADU__Identity *fpm; | |
46 | register struct name_element **f4; | |
47 | ||
48 | if ((fpm = (struct type_FTAM_FADU__Identity *) calloc (1, sizeof *fpm)) | |
49 | == NULL) { | |
50 | no_mem: ; | |
51 | (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory"); | |
52 | out: ; | |
53 | if (fpm) | |
54 | free_FTAM_FADU__Identity (fpm); | |
55 | return NULL; | |
56 | } | |
57 | ||
58 | switch (fa -> fa_type) { | |
59 | case FA_FIRSTLAST: | |
60 | fpm -> offset = type_FTAM_FADU__Identity_first__last; | |
61 | switch (fa -> fa_firstlast) { | |
62 | case FA_FIRST: | |
63 | case FA_LAST: | |
64 | break; | |
65 | ||
66 | default: | |
67 | bad_value:; | |
68 | (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, | |
69 | "bad value in FADU identity"); | |
70 | goto out; | |
71 | } | |
72 | fpm -> un.first__last = fa -> fa_firstlast; | |
73 | break; | |
74 | ||
75 | case FA_RELATIVE: | |
76 | fpm -> offset = type_FTAM_FADU__Identity_relative; | |
77 | switch (fa -> fa_relative) { | |
78 | case FA_PREVIOUS: | |
79 | case FA_CURRENT: | |
80 | case FA_NEXT: | |
81 | break; | |
82 | ||
83 | default: | |
84 | goto bad_value; | |
85 | } | |
86 | fpm -> un.relative = fa -> fa_relative; | |
87 | break; | |
88 | ||
89 | case FA_BEGINEND: | |
90 | fpm -> offset = type_FTAM_FADU__Identity_begin__end; | |
91 | switch (fa -> fa_beginend) { | |
92 | case FA_BEGIN: | |
93 | case FA_END: | |
94 | break; | |
95 | ||
96 | default: | |
97 | goto out; | |
98 | } | |
99 | fpm -> un.begin__end = fa -> fa_beginend; | |
100 | break; | |
101 | ||
102 | case FA_SINGLE: | |
103 | if (!fa -> fa_singlename) | |
104 | goto bad_value; | |
105 | fpm -> offset = type_FTAM_FADU__Identity_single__name; | |
106 | if ((fpm -> un.single__name = | |
107 | str2qb (fa -> fa_singlename, | |
108 | strlen (fa -> fa_singlename), | |
109 | 1)) == NULL) | |
110 | goto no_mem; | |
111 | break; | |
112 | ||
113 | case FA_NAMELIST: | |
114 | f4 = &fpm -> un.name__list; | |
115 | for (n = fa -> fa_nname - 1, ap = fa -> fa_names; | |
116 | n >= 0; | |
117 | ap++, n--) { | |
118 | if (!*ap) | |
119 | goto bad_value; | |
120 | if ((*f4 = (struct name_element *) calloc (1, sizeof **f4)) | |
121 | == NULL | |
122 | || ((*f4) -> Node__Name = | |
123 | str2qb (*ap, strlen (*ap), 1)) == NULL) | |
124 | goto no_mem; | |
125 | f4 = &((*f4) -> next); | |
126 | } | |
127 | break; | |
128 | ||
129 | case FA_FADUNUMBER: | |
130 | fpm -> offset = type_FTAM_FADU__Identity_fadu__number; | |
131 | fpm -> un.fadu__number = fa -> fa_fadunumber; | |
132 | break; | |
133 | ||
134 | default: | |
135 | (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, | |
136 | "bad type for FADU identity"); | |
137 | goto out; | |
138 | } | |
139 | ||
140 | return fpm; | |
141 | } | |
142 | ||
143 | /* \f */ | |
144 | ||
145 | int fpm2faduid (fsb, fpm, fa, fti) | |
146 | register struct ftamblk *fsb; | |
147 | register struct type_FTAM_FADU__Identity *fpm; | |
148 | register struct FADUidentity *fa; | |
149 | struct FTAMindication *fti; | |
150 | { | |
151 | register int n; | |
152 | register char **ap; | |
153 | register struct name_element *f4; | |
154 | ||
155 | bzero ((char *) fa, sizeof *fa); | |
156 | ||
157 | switch (fpm -> offset) { | |
158 | case type_FTAM_FADU__Identity_first__last: | |
159 | fa -> fa_type = FA_FIRSTLAST; | |
160 | fa -> fa_firstlast = fpm -> un.first__last; | |
161 | break; | |
162 | ||
163 | case type_FTAM_FADU__Identity_relative: | |
164 | fa -> fa_type = FA_RELATIVE; | |
165 | fa -> fa_relative = fpm -> un.relative; | |
166 | break; | |
167 | ||
168 | case type_FTAM_FADU__Identity_begin__end: | |
169 | fa -> fa_type = FA_BEGINEND; | |
170 | fa -> fa_beginend = fpm -> un.begin__end; | |
171 | break; | |
172 | ||
173 | case type_FTAM_FADU__Identity_single__name: | |
174 | fa -> fa_type = FA_SINGLE; | |
175 | if ((fa -> fa_singlename = qb2str (fpm -> un.single__name)) | |
176 | == NULL) { | |
177 | no_mem: ; | |
178 | FUFREE (fa); | |
179 | return ftamlose (fti, FS_GEN (fsb), 1, NULLCP, | |
180 | "out of memory"); | |
181 | } | |
182 | break; | |
183 | ||
184 | case type_FTAM_FADU__Identity_name__list: | |
185 | fa -> fa_type = FA_NAMELIST; | |
186 | ap = fa -> fa_names, n = NANAME; | |
187 | for (f4 = fpm -> un.name__list; f4; f4 = f4 -> next) { | |
188 | if (n-- <= 0) { | |
189 | FUFREE (fa); | |
190 | return ftamlose (fti, FS_GEN (fsb), 1, NULLCP, | |
191 | "too many nodes in FADU name"); | |
192 | } | |
193 | if ((*ap++ = qb2str (f4 -> Node__Name)) == NULL) | |
194 | goto no_mem; | |
195 | } | |
196 | break; | |
197 | ||
198 | case type_FTAM_FADU__Identity_fadu__number: | |
199 | fa -> fa_type = FA_FADUNUMBER; | |
200 | fa -> fa_fadunumber = fpm -> un.fadu__number; | |
201 | break; | |
202 | } | |
203 | ||
204 | return OK; | |
205 | } |