From 84839c04ea7ee2db17b5b0010a2f46786d13dcba Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Thu, 10 Sep 2015 18:33:14 +0200 Subject: asn1tostruct.py: Add support for type prefixing If asn1c generates prefixed type names, the asn1tostruct.py of course also needs to be modified to do so. --- asn1/utils/asn1tostruct.py | 85 ++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 41 deletions(-) (limited to 'asn1') diff --git a/asn1/utils/asn1tostruct.py b/asn1/utils/asn1tostruct.py index a1e3bc7..92fc074 100755 --- a/asn1/utils/asn1tostruct.py +++ b/asn1/utils/asn1tostruct.py @@ -5,7 +5,7 @@ import datetime import getopt import getpass -version = "0.5" +version = "0.5osmo1" lines = "" iesDefs = {} @@ -75,10 +75,11 @@ def usage(): print "-d Enable script debug" print "-f [file] Input file to parse" print "-o [dir] Output files to given directory" + print "-p [pfx] Prefix all types with given prefix" print "-h Print this help and return" try: - opts, args = getopt.getopt(sys.argv[1:], "df:ho:", ["debug", "file", "help", "outdir"]) + opts, args = getopt.getopt(sys.argv[1:], "df:ho:p:", ["debug", "file", "help", "outdir", "prefix"]) except getopt.GetoptError as err: # print help information and exit: usage() @@ -93,6 +94,8 @@ for o, a in opts: outdir = a if outdir.rfind('/') != len(outdir): outdir += '/' + if o in ("-p", "--prefix"): + prefix = a if o in ("-h", "--help"): usage() sys.exit(2) @@ -149,9 +152,9 @@ for key in iesDefs: if j == key: break - f.write("typedef struct %sIEs_s {\n" % (re.sub('-', '_', i))) - 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]))))) - f.write("} %sIEs_t;\n\n" % (re.sub('-', '_', i))) + f.write("typedef struct %sIEs_s {\n" % (prefix + re.sub('-', '_', i))) + f.write(" A_SEQUENCE_OF(struct %s_s) %s;\n" % (prefix + re.sub('IEs', '', re.sub('-', '_', ieofielist[i])), lowerFirstCamelWord(re.sub('IEs', '', re.sub('-', '_', ieofielist[i]))))) + f.write("} %sIEs_t;\n\n" % (prefix + re.sub('-', '_', i))) for key in iesDefs: keyupperunderscore = re.sub('-', '_', key.upper()) @@ -165,17 +168,17 @@ for key in iesDefs: for ie in iesDefs[key]["ies"]: ieupperunderscore = re.sub('-', '_', ie[2].upper()) if ie[3] == "optional" or ie[3] == "conditional": - f.write("#define {0:<{pad}} {1}\n".format("%s_%s_PRESENT" % (keyupperunderscore, ieupperunderscore), "(1 << %d)" % shift, + f.write("#define {0:<{pad}} {1}\n".format("%s_%s%s_PRESENT" % (keyupperunderscore, prefix, ieupperunderscore), "(1 << %d)" % shift, pad=iesDefs[key]["length"] + len(keyupperunderscore) + 9)) shift += 1 if (shift > 0): f.write("\n") - f.write("typedef struct %s_s {\n" % (re.sub('-', '_', key))) + f.write("typedef struct %s_s {\n" % (prefix + re.sub('-', '_', key))) if (shift > 0): f.write(" {0:<{pad}} {1};\n".format("uint16_t", "presenceMask", pad=iesDefs[key]["length"] + 2)) for ie in iesDefs[key]["ies"]: - ieunderscore = re.sub('-', '_', ie[2]) + ieunderscore = prefix + re.sub('-', '_', ie[2]) iename = re.sub('id-', '', ie[0]) ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) if ie[2] in ieofielist: @@ -188,7 +191,7 @@ for key in iesDefs: f.write(" ///< Conditional field") f.write("\n") - f.write("} %s_t;\n\n" % (re.sub('-', '_', key))) + f.write("} %s_t;\n\n" % (prefix + re.sub('-', '_', key))) f.write("typedef struct %s_message_s {\n" % (fileprefix)) f.write(" uint8_t procedureCode;\n") @@ -203,7 +206,7 @@ for message in messageList: continue if len(iesDefs[message]["ies"]) == 0: continue - f.write(" %s_t %s;\n" % (re.sub('-', '_', message), lowerFirstCamelWord(re.sub('-', '_', message)))) + f.write(" %s_t %s;\n" % (prefix + re.sub('-', '_', message), lowerFirstCamelWord(re.sub('-', '_', message)))) f.write(" } msg;\n") f.write("} %s_message;\n\n" % (fileprefix)) @@ -212,7 +215,7 @@ for key in iesDefs: continue structName = re.sub('ies', '', key) asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) + asn1cStruct = prefix + re.sub('Item', 'List', asn1cStruct) keylowerunderscore = re.sub('-', '_', key.lower()) firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) f.write("/** \\brief Decode function for %s ies.\n" % (key)) @@ -223,7 +226,7 @@ for key in iesDefs: f.write("int %s_decode_%s(\n" % (fileprefix, keylowerunderscore)) if len(iesDefs[key]["ies"]) != 0: - f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) + f.write(" %s_t *%s,\n" % (prefix + re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) f.write(" ANY_t *any_p);\n\n") if len(iesDefs[key]["ies"]) == 0: @@ -235,13 +238,13 @@ for key in iesDefs: f.write(" **/\n") f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) f.write(" %s_t *%s,\n" % (asn1cStruct, firstlower)) - f.write(" %s_t *%s);\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) + f.write(" %s_t *%s);\n\n" % (prefix + re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) for key in iesDefs: if key not in ieofielist.values(): continue asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) + asn1cStruct = prefix + re.sub('Item', 'List', asn1cStruct) firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) f.write("/** \\brief Encode function for %s ies.\n" % (key)) f.write(" * \\param %s Pointer to the ASN1 structure.\n" % (firstlower)) @@ -268,13 +271,13 @@ for key in iesDefs: continue structName = re.sub('ies', '', key) asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) ielistname = re.sub('UE', 'ue', asn1cStruct) ielistnamefirstlower = ielistname[:1].lower() + ielistname[1:] asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] keyName = re.sub('-', '_', key) keyupperunderscore = keyName.upper() firstlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) + asn1cStruct = prefix + re.sub('Item', 'List', asn1cStruct) iesaccess = "" if key not in ieofielist.values(): @@ -282,7 +285,7 @@ for key in iesDefs: f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) if len(iesDefs[key]["ies"]) != 0: - f.write(" %s_t *%s,\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) + f.write(" %s_t *%s,\n" % (prefix + re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) f.write(" ANY_t *any_p) {\n\n") f.write(" %s_t %s;\n %s_t *%s_p = &%s;\n" % (asn1cStruct, asn1cStructfirstlower, asn1cStruct, asn1cStructfirstlower, asn1cStructfirstlower)) @@ -294,24 +297,24 @@ for key in iesDefs: if len(iesDefs[key]["ies"]) != 0: f.write(" assert(%s != NULL);\n\n" % (lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" %s_DEBUG(\"Decoding message %s (%%s:%%d)\\n\", __FILE__, __LINE__);\n\n" % (fileprefix.upper(), re.sub('-', '_', keyName))) + f.write(" %s_DEBUG(\"Decoding message %s (%%s:%%d)\\n\", __FILE__, __LINE__);\n\n" % (fileprefix.upper(), prefix + re.sub('-', '_', keyName))) f.write(" ANY_to_type_aper(any_p, &asn_DEF_%s, (void**)&%s_p);\n\n" % (asn1cStruct, asn1cStructfirstlower)) f.write(" for (i = 0; i < %s_p->%slist.count; i++) {\n" % (asn1cStructfirstlower, iesaccess)) - f.write(" IE_t *ie_p;\n") + f.write(" %sIE_t *ie_p;\n" % (prefix)) f.write(" ie_p = %s_p->%slist.array[i];\n" % (asn1cStructfirstlower, iesaccess)) f.write(" switch(ie_p->id) {\n") for ie in iesDefs[key]["ies"]: iename = re.sub('id-', '', ie[0]) ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) ienameunderscorefirstlower = lowerFirstCamelWord(ienameunderscore) - ietypesubst = re.sub('-', '', ie[2]) - ietypeunderscore = re.sub('-', '_', ie[2]) - ieupperunderscore = re.sub('-', '_', ie[2]).upper() + ietypesubst = prefix + re.sub('-', '', ie[2]) + ietypeunderscore = prefix + re.sub('-', '_', ie[2]) + ieupperunderscore = prefix + re.sub('-', '_', ie[2]).upper() if ie[3] == "optional": f.write(" /* Optional field */\n") elif ie[3] == "conditional": f.write(" /* Conditional field */\n") - f.write(" case ProtocolIE_ID_%s:\n" % (re.sub('-', '_', ie[0]))) + f.write(" case %sProtocolIE_ID_%s:\n" % (prefix, re.sub('-', '_', ie[0]))) f.write(" {\n") f.write(" %s_t %s;\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst))) f.write(" %s_t *%s_p = &%s;\n" % (ietypeunderscore, lowerFirstCamelWord(ietypesubst), lowerFirstCamelWord(ietypesubst))) @@ -346,19 +349,19 @@ for key in iesDefs: keyname = re.sub('IEs', '', re.sub('Item', 'List', key)) f.write("int %s_decode_%s(\n" % (fileprefix, re.sub('-', '_', keyname).lower())) - f.write(" %sIEs_t *%sIEs,\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) + f.write(" %sIEs_t *%sIEs,\n" % (prefix + re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) + f.write(" %s_t *%s) {\n\n" % (prefix + re.sub('-', '_', keyname), lowerFirstCamelWord(re.sub('-', '_', keyname)))) f.write(" int i, decoded = 0;\n") f.write(" int tempDecoded = 0;\n\n") f.write(" for (i = 0; i < %s->list.count; i++) {\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))) - f.write(" IE_t *ie_p = %s->list.array[i];\n" % (lowerFirstCamelWord(re.sub('-', '_', keyname)))) + f.write(" %sIE_t *ie_p = %s->list.array[i];\n" % (prefix, lowerFirstCamelWord(re.sub('-', '_', keyname)))) f.write(" switch (ie_p->id) {\n") for ie in iesDefs[key]["ies"]: iename = re.sub('id-', '', ie[0]) ienameunderscore = lowerFirstCamelWord(re.sub('-', '_', iename)) f.write(" case ProtocolIE_ID_%s:\n" % (re.sub('-', '_', ie[0]))) f.write(" {\n") - f.write(" %s_t *%s_p;\n" % (re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) + f.write(" %s_t *%s_p;\n" % (prefix + re.sub('-', '_', ie[2]), lowerFirstCamelWord(re.sub('-', '', ie[2])))) 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])))) f.write(" if (tempDecoded < 0) {\n") f.write(" %s_DEBUG(\"Decoding of IE %s for message %s failed\\n\");\n" % (fileprefix.upper(), ienameunderscore, re.sub('-', '_', keyname))) @@ -390,9 +393,9 @@ for key in iesDefs: structName = re.sub('ies', '', key) asn1cStruct = re.sub('-', '_', re.sub('IEs', '', key)) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) - asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) + asn1cStruct = prefix + re.sub('Item', 'List', asn1cStruct) + asn1cStructfirstlower = asn1cStruct[:1].lower() + asn1cStruct[1:] iesaccess = "" if key not in ieofielist.values(): @@ -406,16 +409,16 @@ for key in iesDefs: f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', structName.lower()))) f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower)) - f.write(" %s_t *%s) {\n\n" % (re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) + f.write(" %s_t *%s) {\n\n" % (prefix + re.sub('-', '_', key), lowerFirstCamelWord(re.sub('-', '_', key)))) - f.write(" IE_t *ie;\n\n") + f.write(" %sIE_t *ie;\n\n" % (prefix)) for ie in iesDefs[key]["ies"]: iename = re.sub('-', '_', re.sub('id-', '', ie[0])) - ienameunderscore = re.sub('-', '_', iename) + ienameunderscore = prefix + re.sub('-', '_', iename) ienamefirstwordlower = lowerFirstCamelWord(iename) - ieupperunderscore = re.sub('-', '_', ie[2]).upper() - ietypeunderscore = re.sub('-', '_', ie[2]) + ieupperunderscore = prefix + re.sub('-', '_', ie[2]).upper() + ietypeunderscore = prefix + re.sub('-', '_', ie[2]) if ie[3] != "mandatory": if ie[3] == "optional": f.write(" /* Optional field */\n") @@ -423,8 +426,8 @@ for key in iesDefs: f.write(" /* Conditional field */\n") f.write(" if ((%s->presenceMask & %s_%s_PRESENT)\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), keyupperunderscore, ieupperunderscore)) f.write(" == %s_%s_PRESENT) {\n" % (keyupperunderscore, ieupperunderscore)) - f.write(" if ((ie = %s_new_ie(ProtocolIE_ID_%s,\n" % (fileprefix, re.sub('-', '_', ie[0]))) - f.write(" Criticality_%s,\n" % (ie[1])) + f.write(" if ((ie = %s_new_ie(%sProtocolIE_ID_%s,\n" % (fileprefix, prefix, re.sub('-', '_', ie[0]))) + f.write(" %sCriticality_%s,\n" % (prefix, ie[1])) f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) f.write(" &%s->%s)) == NULL) {\n" % (lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) f.write(" return -1;\n") @@ -433,12 +436,12 @@ for key in iesDefs: f.write(" }\n\n") else: if ie[2] in ieofielist.keys(): - f.write(" %s_t %s;\n\n" % (ietypeunderscore, ienamefirstwordlower)) + f.write(" %s_t %s;\n\n" % (prefix + ietypeunderscore, ienamefirstwordlower)) f.write(" memset(&%s, 0, sizeof(%s_t));\n" % (ienamefirstwordlower, ietypeunderscore)) f.write("\n") f.write(" if (%s_encode_%s(&%s, &%s->%s) < 0) return -1;\n" % (fileprefix, ietypeunderscore.lower(), ienamefirstwordlower, lowerFirstCamelWord(re.sub('-', '_', key)), ienamefirstwordlower)) - f.write(" if ((ie = %s_new_ie(ProtocolIE_ID_%s,\n" % (fileprefix, re.sub('-', '_', ie[0]))) - f.write(" Criticality_%s,\n" % (ie[1])) + f.write(" if ((ie = %s_new_ie(%sProtocolIE_ID_%s,\n" % (fileprefix, prefix, re.sub('-', '_', ie[0]))) + f.write(" %sCriticality_%s,\n" % (prefix, ie[1])) f.write(" &asn_DEF_%s,\n" % (ietypeunderscore)) if ie[2] in ieofielist.keys(): f.write(" &%s)) == NULL) {\n" % (ienamefirstwordlower)) @@ -458,7 +461,7 @@ for (key, value) in iesDefs.items(): ie = value["ies"][0] ietypeunderscore = re.sub('-', '_', ie[2]) asn1cStruct = re.sub('-', '_', re.sub('IEs', '', re.sub('-IEs', '', key))) - asn1cStruct = re.sub('Item', 'List', asn1cStruct) + asn1cStruct = prefix + re.sub('Item', 'List', asn1cStruct) firstwordlower = re.sub('Item', 'List', re.sub('enb', 'eNB', lowerFirstCamelWord(asn1cStruct))) for (i, j) in ieofielist.items(): @@ -466,10 +469,10 @@ for (key, value) in iesDefs.items(): break f.write("int %s_encode_%s(\n" % (fileprefix, re.sub('-', '_', i).lower())) f.write(" %s_t *%s,\n" % (asn1cStruct, firstwordlower)) - f.write(" %sIEs_t *%sIEs) {\n\n" % (re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i)))) + f.write(" %sIEs_t *%sIEs) {\n\n" % (prefix + re.sub('-', '_', i), lowerFirstCamelWord(re.sub('-', '_', i)))) f.write(" int i;\n") - f.write(" IE_t *ie;\n\n") + f.write(" %sIE_t *ie;\n\n" % (prefix)) f.write(" for (i = 0; i < %sIEs->%s.count; i++) {\n" % (firstwordlower, re.sub('IEs', '', lowerFirstCamelWord(re.sub('-', '_', key))))) f.write(" if ((ie = %s_new_ie(ProtocolIE_ID_%s,\n" % (fileprefix, re.sub('-', '_', ie[0]))) -- cgit v1.2.3