blob: a1e3bc76f0c9adaa209262ba132d8375c24e0ba9 [file] [log] [blame]
Harald Welte245daf92015-08-30 22:38:40 +02001#!/usr/bin/python
2
3import re, os, sys, string
4import datetime
5import getopt
6import getpass
7
8version = "0.5"
9
10lines = ""
11iesDefs = {}
12ieofielist = {}
13outdir = './'
14
15filenames = []
16verbosity = 0
17prefix = ""
18
19FAIL = '\033[91m'
20WARN = '\033[93m'
21ENDC = '\033[0m'
22
23fileprefix = ""
24
25def printFail(string):
26 sys.stderr.write(FAIL + string + ENDC + "\n")
27
28def printWarning(string):
29 print WARN + string + ENDC
30
31def printDebug(string):
32 if verbosity > 0:
33 print string
34
35def outputHeaderToFile(f, filename):
36 now = datetime.datetime.now()
Harald Welte245daf92015-08-30 22:38:40 +020037 f.write("/*******************************************************************************\n")
38 f.write(" * This file had been created by asn1tostruct.py script v%s\n" % (version))
39 f.write(" * Please do not modify this file but regenerate it via script.\n")
40 f.write(" * Created on: %s by %s\n * from %s\n" % (str(now), getpass.getuser(), filenames))
41 f.write(" ******************************************************************************/\n")
42
43def lowerFirstCamelWord(word):
44 """ puts the first word in a CamelCase Word in lowercase.
45
46 I.e. CustomerID becomes customerID, XMLInfoTest becomes xmlInfoTest
47 """
48 newstr = ''
49 swapped = word.swapcase()
50 idx = 0
51
52 # if it's all-caps, return an all-lowered version
53 lowered = word.lower()
54
55 if swapped == lowered:
56 return lowered
57
58 for c in swapped:
59 if c in string.lowercase:
60 newstr += c
61 idx += 1
62 else:
63 break
64 if idx < 2:
65 newstr += word[idx:]
66 else:
67 newstr = newstr[:-1]+ word[idx-1:]
68
69 return newstr
70
71def usage():
72 print "Python parser for asn1 v%s" % (version)
73 print "Usage: python asn1tostruct.py [options]"
74 print "Available options:"
75 print "-d Enable script debug"
76 print "-f [file] Input file to parse"
77 print "-o [dir] Output files to given directory"
78 print "-h Print this help and return"
79
80try:
81 opts, args = getopt.getopt(sys.argv[1:], "df:ho:", ["debug", "file", "help", "outdir"])
82except getopt.GetoptError as err:
83 # print help information and exit:
84 usage()
85 sys.exit(2)
86
87for o, a in opts:
88 if o in ("-f", "--file"):
89 filenames.append(a)
90 if o in ("-d", "--debug"):
91 verbosity = 1
92 if o in ("-o", "--outdir"):
93 outdir = a
94 if outdir.rfind('/') != len(outdir):
95 outdir += '/'
96 if o in ("-h", "--help"):
97 usage()
98 sys.exit(2)
99
100for filename in filenames:
101 file = open(filename, 'r')
102 for line in file:
103 # Removing any comment
104 if line.find('--') >= 0:
105 line = line[:line.find('--')]
106 # Removing any carriage return
107 lines += re.sub('\r', '', line)
108
109 for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+SEQUENCE\s+\(\s*SIZE\s*\(\s*\d+\s*\.\.\s*[0-9a-zA-Z-]+\s*\)\s*\)\s*OF\s+[a-zA-Z-]+\s*\{\s*\{\s*([0-9a-zA-Z-]+)\s*\}\s*\}', lines, re.MULTILINE):
110 ieofielist[m[0]] = m[1]
111 for m in re.findall(r'([a-zA-Z0-9-]+)\s*::=\s+E-RAB-IE-ContainerList\s*\{\s*\{\s*([a-zA-Z0-9-]+)\s*\}\s*\}', lines, re.MULTILINE):
112 ieofielist[m[0]] = m[1]
113
114 for i in re.findall(r'([a-zA-Z0-9-]+)\s+([A-Z0-9-]+)\s*::=\s*\{\s+([\,\|\{\}\t\n\.{3}\ \-a-zA-Z0-9]+)\s+}\n', lines, re.MULTILINE):
115 ies = []
116 maxLength = 0
117 # TODO: handle extensions
118 if i[1].find('EXTENSION') >= 0:
119 continue
120 if fileprefix == "":
121 fileprefix = i[1][:i[1].find('-')].lower()
122 for j in re.findall(r'\s*\{\s*([a-zA-Z0-9-\ \t]+)\s*\}\s*[\|,]*', i[2], re.MULTILINE):
123 for k in re.findall(r'ID\s*([a-zA-Z0-9\-]+)\s*CRITICALITY\s*([a-zA-Z0-9\-]+)\s+[A-Z]+\s+([a-zA-Z0-9\-]+)\s*PRESENCE\s*([a-zA-Z0-9\-]+)', j, re.MULTILINE):
124 printDebug("Got new ie for message " + i[0] + ": " + str(k))
125 if len(k[2]) > maxLength:
126 maxLength = len(k[2])
127 ies.append(k)
128
129 if len(ies) > 0:
130 iesDefs[i[0]] = { "length": maxLength, "ies": ies}
131 else:
132 printWarning("Didn't find any information element for message: " + i[0])
133
134if len(iesDefs) == 0:
135 printFail("No Information Element parsed, exiting")
136 sys.exit(0)
137
138f = open(outdir + fileprefix + '_ies_defs.h', 'w')
139outputHeaderToFile(f, filename)
140f.write("#include \"%s_common.h\"\n\n" % (fileprefix))
141f.write("#ifndef %s_IES_DEFS_H_\n#define %s_IES_DEFS_H_\n\n" % (fileprefix.upper(), fileprefix.upper()))
142
143for key in iesDefs:
144
145 if key not in ieofielist.values():
146 continue
147
148 for (i, j) in ieofielist.items():
149 if j == key:
150 break
151
152 f.write("typedef struct %sIEs_s {\n" % (re.sub('-', '_', i)))
153 f.write(" A_SEQUENCE_OF(struct %s_s) %s;\n" % (re.sub('IEs', '', re.sub('-', '_', ieofielist[i])), lowerFirstCamelWord(re.sub('IEs', '', re.sub('-', '_', ieofielist[i])))))
154 f.write("} %sIEs_t;\n\n" % (re.sub('-', '_', i)))
155
156for key in iesDefs:
157 keyupperunderscore = re.sub('-', '_', key.upper())
158 keylowerunderscore = re.sub('-', '_', key.lower())
159 shift = 0
160
161 if len(iesDefs[key]["ies"]) == 0:
162 continue
163
164 # Presence mask
165 for ie in iesDefs[key]["ies"]:
166 ieupperunderscore = re.sub('-', '_', ie[2].upper())
167 if ie[3] == "optional" or ie[3] == "conditional":
168 f.write("#define {0:<{pad}} {1}\n".format("%s_%s_PRESENT" % (keyupperunderscore, ieupperunderscore), "(1 << %d)" % shift,
169 pad=iesDefs[key]["length"] + len(keyupperunderscore) + 9))
170 shift += 1
171 if (shift > 0):
172 f.write("\n")
173
174 f.write("typedef struct %s_s {\n" % (re.sub('-', '_', key)))
175 if (shift > 0):
176 f.write(" {0:<{pad}} {1};\n".format("uint16_t", "presenceMask", pad=iesDefs[key]["length"] + 2))
177 for ie in iesDefs[key]["ies"]:
178 ieunderscore = re.sub('-', '_', ie[2])
179 iename = re.sub('id-', '', ie[0])
180 ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename))
181 if ie[2] in ieofielist:
182 f.write(" %sIEs_t %s;" % (re.sub('-', '_', ie[2]), ienameunderscore))
183 else:
184 f.write(" {0:<{pad}} {1};".format("%s_t" % ieunderscore, ienameunderscore, pad=iesDefs[key]["length"] + 2))
185 if ie[3] == "optional":
186 f.write(" ///< Optional field")
187 elif ie[3] == "conditional":
188 f.write(" ///< Conditional field")
189 f.write("\n")
190
191 f.write("} %s_t;\n\n" % (re.sub('-', '_', key)))
192
193f.write("typedef struct %s_message_s {\n" % (fileprefix))
194f.write(" uint8_t procedureCode;\n")
195f.write(" uint8_t criticality;\n")
196f.write(" uint8_t direction;\n")
197f.write(" union {\n")
198
199messageList = iesDefs.keys()
200messageList.sort()
201for message in messageList:
202 if message in ieofielist.values():
203 continue
204 if len(iesDefs[message]["ies"]) == 0:
205 continue
206 f.write(" %s_t %s;\n" % (re.sub('-', '_', message), lowerFirstCamelWord(re.sub('-', '_', message))))
207f.write(" } msg;\n")
208f.write("} %s_message;\n\n" % (fileprefix))
209
210for key in iesDefs:
211 if key in ieofielist.values():
212 continue
213 structName = re.sub('ies', '', key)
214 asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key)))
215 asn1cStruct = re.sub('Item', 'List', asn1cStruct)
216 keylowerunderscore = re.sub('-', '_', key.lower())
217 firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
218 f.write("/** \\brief Decode function for %s ies.\n" % (key))
219 if len(iesDefs[key]["ies"]) != 0:
220 f.write(" * \\param %s Pointer to ASN1 structure in which data will be stored\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
221 f.write(" * \\param any_p Pointer to the ANY value to decode.\n")
222 f.write(" **/\n")
223 f.write("int %s_decode_%s(\n" % (fileprefix, keylowerunderscore))
224
225 if len(iesDefs[key]["ies"]) != 0:
226 f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
227 f.write(" ANY_t *any_p);\n\n")
228
229 if len(iesDefs[key]["ies"]) == 0:
230 continue
231
232 f.write("/** \\brief Encode function for %s ies.\n" % (key))
233 f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower))
234 f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
235 f.write(" **/\n")
236 f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower())))
237 f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower))
238 f.write(" %s_t *%s);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
239
240for key in iesDefs:
241 if key not in ieofielist.values():
242 continue
243 asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key))
244 asn1cStruct = re.sub('Item', 'List', asn1cStruct)
245 firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
246 f.write("/** \\brief Encode function for %s ies.\n" % (key))
247 f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower))
248 f.write(" * \\param %s Pointer to the IES structure.\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
249 f.write(" **/\n")
250 f.write("int %s_encode_%s(\n" % (fileprefix, firstlower.lower()))
251 f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower))
252 f.write(" %sIEs_t *%sIEs);\n\n" % (asn1cStruct, firstlower))
253 f.write("/** \\brief Decode function for %s ies.\n" % (key))
254 f.write(" * \\param any_p Pointer to the ANY value to decode.\n")
255 f.write(" * \\param callback Callback function called when any_p is successfully decoded.\n")
256 f.write(" **/\n")
257 f.write("int %s_decode_%s(\n" % (fileprefix, firstlower.lower()))
258 f.write(" %sIEs_t *%sIEs,\n" % (asn1cStruct, firstlower))
259 f.write(" %s_t *%s);\n\n" % (asn1cStruct, lowerFirstCamelWord(asn1cStruct)))
260f.write("#endif /* %s_IES_DEFS_H_ */\n\n" % (fileprefix.upper()))
261
262#Generate Decode functions
263f = open(outdir + fileprefix + '_decoder.c', 'w')
264outputHeaderToFile(f, filename)
265f.write("#include \"%s_common.h\"\n#include \"%s_ies_defs.h\"\n\n" % (fileprefix, fileprefix))
266for key in iesDefs:
267 if key in ieofielist.values():
268 continue
269 structName = re.sub('ies', '', key)
270 asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key))
271 asn1cStruct = re.sub('Item', 'List', asn1cStruct)
272 ielistname = re.sub('UE', 'ue', asn1cStruct)
273 ielistnamefirstlower = ielistname[:1].lower() + ielistname[1:]
274 asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:]
275 keyName = re.sub('-', '_', key)
276 keyupperunderscore = keyName.upper()
277 firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
278
279 iesaccess = ""
280 if key not in ieofielist.values():
281 iesaccess = "%s_ies." % (firstlower)
282
283 f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower())))
284 if len(iesDefs[key]["ies"]) != 0:
285 f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
286 f.write(" ANY_t *any_p) {\n\n")
287
288 f.write(" %s_t %s;\n %s_t *%s_p = &%s;\n" % (asn1cStruct, asn1cStructfirstlower, asn1cStruct, asn1cStructfirstlower, asn1cStructfirstlower))
289 f.write(" int i, decoded = 0;\n")
290 if len(iesDefs[key]["ies"]) != 0:
291 f.write(" int tempDecoded = 0;\n")
292
293 f.write(" assert(any_p != NULL);\n")
294 if len(iesDefs[key]["ies"]) != 0:
295 f.write(" assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key))))
296
297 f.write(" %s_DEBUG(\"Decoding message %s (%%s:%%d)\\n\", __FILE__, __LINE__);\n\n" % (fileprefix.upper(), re.sub('-', '_', keyName)))
298 f.write(" ANY_to_type_aper(any_p, &asn_DEF_%s, (void**)&%s_p);\n\n" % (asn1cStruct, asn1cStructfirstlower))
299 f.write(" for (i = 0; i < %s_p->%slist.count; i++) {\n" % (asn1cStructfirstlower, iesaccess))
300 f.write(" IE_t *ie_p;\n")
301 f.write(" ie_p = %s_p->%slist.array[i];\n" % (asn1cStructfirstlower, iesaccess))
302 f.write(" switch(ie_p->id) {\n")
303 for ie in iesDefs[key]["ies"]:
304 iename = re.sub('id-', '', ie[0])
305 ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename))
306 ienameunderscorefirstlower = lowerFirstCamelWord(ienameunderscore)
307 ietypesubst = re.sub('-', '', ie[2])
308 ietypeunderscore = re.sub('-', '_', ie[2])
309 ieupperunderscore = re.sub('-', '_', ie[2]).upper()
310 if ie[3] == "optional":
311 f.write(" /* Optional field */\n")
312 elif ie[3] == "conditional":
313 f.write(" /* Conditional field */\n")
314 f.write(" case ProtocolIE_ID_%s:\n" % (re.sub('-', '_', ie[0])))
315 f.write(" {\n")
316 f.write(" %s_t %s;\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
317 f.write(" %s_t *%s_p = &%s;\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst), lowerFirstCamelWord(ietypesubst)))
318 if ie[3] != "mandatory":
319 f.write(" %s->presenceMask |= %s_%s_PRESENT;\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore))
320 f.write(" tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
321 f.write(" if (tempDecoded < 0) {\n")
322 f.write(" %s_DEBUG(\"Decoding of IE %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore))
323 f.write(" return -1;\n")
324 f.write(" }\n")
325 f.write(" decoded += tempDecoded;\n")
326 f.write(" if (asn1_xer_print)\n")
327 f.write(" xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst)))
328 if ie[2] in ieofielist.keys():
329 f.write(" if (%s_decode_%s(&%s->%s, %s_p) < 0)\n" % (fileprefix, ietypeunderscore.lower(), lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst)))
330 f.write(" %s_DEBUG(\"Decoding of encapsulated IE %s failed\\n\");\n" % (fileprefix.upper(), lowerFirstCamelWord(ietypesubst)))
331 else:
332 f.write(" memcpy(&%s->%s, %s_p, sizeof(%s_t));\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienameunderscore, lowerFirstCamelWord(ietypesubst), ietypeunderscore))
333 f.write(" } break;\n")
334 f.write(" default:\n")
335 f.write(" %s_DEBUG(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower())))
336 f.write(" return -1;\n")
337 f.write(" }\n")
338 f.write(" }\n")
339 f.write(" return decoded;\n")
340 f.write("}\n\n")
341
342for key in iesDefs:
343 if key not in ieofielist.values():
344 continue
345
346 keyname = re.sub('IEs', '', re.sub('Item', 'List', key))
347
348 f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', keyname).lower()))
349 f.write(" %sIEs_t *%sIEs,\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname))))
350 f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname))))
351 f.write(" int i, decoded = 0;\n")
352 f.write(" int tempDecoded = 0;\n\n")
353 f.write(" for (i = 0; i < %s->list.count; i++) {\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname))))
354 f.write(" IE_t *ie_p = %s->list.array[i];\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname))))
355 f.write(" switch (ie_p->id) {\n")
356 for ie in iesDefs[key]["ies"]:
357 iename = re.sub('id-', '', ie[0])
358 ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename))
359 f.write(" case ProtocolIE_ID_%s:\n" % (re.sub('-', '_', ie[0])))
360 f.write(" {\n")
361 f.write(" %s_t *%s_p;\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2]))))
362 f.write(" tempDecoded = ANY_to_type_aper(&ie_p->value, &asn_DEF_%s, (void**)&%s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2]))))
363 f.write(" if (tempDecoded < 0) {\n")
364 f.write(" %s_DEBUG(\"Decoding of IE %s for message %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore, re.sub('-', '_', keyname)))
365 f.write(" return -1;\n")
366 f.write(" }\n")
367 f.write(" decoded += tempDecoded;\n")
368 f.write(" if (asn1_xer_print)\n")
369 f.write(" xer_fprint(stdout, &asn_DEF_%s, %s_p);\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2]))))
370 f.write(" ASN_SEQUENCE_ADD(&%sIEs->%s, %s_p);\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)),
371 re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))), lowerFirstCamelWord(re.sub('-', '', ie[2]))))
372 f.write(" } break;\n")
373 f.write(" default:\n")
374 f.write(" %s_DEBUG(\"Unknown protocol IE id (%%d) for message %s\\n\", (int)ie_p->id);\n" % (fileprefix.upper(), re.sub('-', '_', structName.lower())))
375 f.write(" return -1;\n")
376 f.write(" }\n")
377 f.write(" }\n")
378 f.write(" return decoded;\n")
379 f.write("}\n\n")
380
381
382#Generate IES Encode functions
383f = open(outdir + fileprefix + '_encoder.c', 'w')
384outputHeaderToFile(f,filename)
385f.write("#include \"%s_common.h\"\n" % (fileprefix))
386f.write("#include \"%s_ies_defs.h\"\n\n" % (fileprefix))
387for key in iesDefs:
388 if key in ieofielist.values():
389 continue
390
391 structName = re.sub('ies', '', key)
392 asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key))
393 asn1cStruct = re.sub('Item', 'List', asn1cStruct)
394 asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:]
395 firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
396
397 iesaccess = ""
398 if key not in ieofielist.values():
399 iesaccess = "%s_ies." % (firstwordlower)
400
401 keyName = re.sub('-', '_', key)
402 keyupperunderscore = keyName.upper()
403 # No IE to encode...
404 if len(iesDefs[key]["ies"]) == 0:
405 continue
406
407 f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower())))
408 f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower))
409 f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key))))
410
411 f.write(" IE_t *ie;\n\n")
412
413 for ie in iesDefs[key]["ies"]:
414 iename = re.sub('-', '_', re.sub('id-', '', ie[0]))
415 ienameunderscore = re.sub('-', '_', iename)
416 ienamefirstwordlower = lowerFirstCamelWord(iename)
417 ieupperunderscore = re.sub('-', '_', ie[2]).upper()
418 ietypeunderscore = re.sub('-', '_', ie[2])
419 if ie[3] != "mandatory":
420 if ie[3] == "optional":
421 f.write(" /* Optional field */\n")
422 elif ie[3] == "conditional":
423 f.write(" /* Conditional field */\n")
424 f.write(" if ((%s->presenceMask & %s_%s_PRESENT)\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore))
425 f.write(" == %s_%s_PRESENT) {\n" % (keyupperunderscore, ieupperunderscore))
426 f.write(" if ((ie = %s_new_ie(ProtocolIE_ID_%s,\n" % (fileprefix, re.sub('-', '_', ie[0])))
427 f.write(" Criticality_%s,\n" % (ie[1]))
428 f.write(" &asn_DEF_%s,\n" % (ietypeunderscore))
429 f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower))
430 f.write(" return -1;\n")
431 f.write(" }\n")
432 f.write(" ASN_SEQUENCE_ADD(&%s->%slist, ie);\n" % (firstwordlower, iesaccess))
433 f.write(" }\n\n")
434 else:
435 if ie[2] in ieofielist.keys():
436 f.write(" %s_t %s;\n\n" % (ietypeunderscore, ienamefirstwordlower))
437 f.write(" memset(&%s, 0, sizeof(%s_t));\n" % (ienamefirstwordlower, ietypeunderscore))
438 f.write("\n")
439 f.write(" if (%s_encode_%s(&%s, &%s->%s) < 0) return -1;\n" % (fileprefix, ietypeunderscore.lower(), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower))
440 f.write(" if ((ie = %s_new_ie(ProtocolIE_ID_%s,\n" % (fileprefix, re.sub('-', '_', ie[0])))
441 f.write(" Criticality_%s,\n" % (ie[1]))
442 f.write(" &asn_DEF_%s,\n" % (ietypeunderscore))
443 if ie[2] in ieofielist.keys():
444 f.write(" &%s)) == NULL) {\n" % (ienamefirstwordlower))
445 else:
446 f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower))
447 f.write(" return -1;\n")
448 f.write(" }\n")
449 f.write(" ASN_SEQUENCE_ADD(&%s->%slist, ie);\n\n" % (firstwordlower, iesaccess))
450
451 f.write(" return 0;\n")
452 f.write("}\n\n")
453
454for (key, value) in iesDefs.items():
455 if key not in ieofielist.values():
456 continue
457
458 ie = value["ies"][0]
459 ietypeunderscore = re.sub('-', '_', ie[2])
460 asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key)))
461 asn1cStruct = re.sub('Item', 'List', asn1cStruct)
462 firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct)))
463
464 for (i, j) in ieofielist.items():
465 if j == key:
466 break
467 f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', i).lower()))
468 f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower))
469 f.write(" %sIEs_t *%sIEs) {\n\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i))))
470 f.write(" int i;\n")
471
472 f.write(" IE_t *ie;\n\n")
473
474 f.write(" for (i = 0; i < %sIEs->%s.count; i++) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key)))))
475 f.write(" if ((ie = %s_new_ie(ProtocolIE_ID_%s,\n" % (fileprefix, re.sub('-', '_', ie[0])))
476 f.write(" Criticality_%s,\n" % (ie[1]))
477 f.write(" &asn_DEF_%s,\n" % (ietypeunderscore))
478 f.write(" %sIEs->%s.array[i])) == NULL) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key)))))
479 f.write(" return -1;\n")
480 f.write(" }\n")
481 f.write(" ASN_SEQUENCE_ADD(&%s->list, ie);\n" % (firstwordlower))
482 f.write(" }\n")
483 f.write(" return 0;\n")
484 f.write("}\n\n")