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.
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 getopt
 import getpass
 
-version = "0.5"
+version = "0.5osmo1"
 
 lines = ""
 iesDefs = {}
@@ -75,10 +75,11 @@
     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 @@
         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 @@
         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 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 @@
             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 @@
         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 @@
         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 @@
     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 @@
     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 @@
         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 @@
 
     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 @@
     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 @@
     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 @@
 
     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 @@
 
     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 @@
                 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 @@
             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 @@
     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 @@
             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])))