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