Support Useful types and their values.
authorKim Grasman <kim.grasman@gmail.com>
Wed, 28 Aug 2013 14:09:30 +0000 (16:09 +0200)
committerKim Grasman <kim.grasman@gmail.com>
Wed, 28 Aug 2013 14:09:30 +0000 (16:09 +0200)
asn1ate/parser.py
asn1ate/pyasn1gen.py
asn1ate/sema.py
testdata/useful_types.asn [new file with mode: 0644]

index 70211a6..b87ae45 100644 (file)
@@ -25,7 +25,7 @@
 
 import re
 from copy import copy
-from pyparsing import Keyword, Literal, Word, OneOrMore, Combine, Regex, Forward, Optional, Group, Suppress, delimitedList, cStyleComment, nums, alphanums, empty, srange
+from pyparsing import Keyword, Literal, Word, OneOrMore, Combine, Regex, Forward, Optional, Group, Suppress, delimitedList, cStyleComment, nums, alphanums, empty, srange, dblQuotedString
 
 
 __all__ = ['parse_asn1', 'AnnotatedToken']
@@ -149,6 +149,11 @@ def _build_asn1_grammar():
     VideotexString = Keyword('VideotexString')
     VisibleString = Keyword('VisibleString')
 
+    # Useful types
+    GeneralizedTime = Keyword('GeneralizedTime')
+    UTCTime = Keyword('UTCTime')
+    ObjectDescriptor = Keyword('ObjectDescriptor')
+
     # Literals
     number = Word(nums)
     signed_number = Combine(Optional('-') + number)  # todo: consider defined values from 18.1
@@ -177,8 +182,9 @@ def _build_asn1_grammar():
     bitstring_value = bstring | hstring     # todo: consider more forms from 21.9
     integer_value = signed_number
     null_value = NULL
+    cstring_value = dblQuotedString
 
-    builtin_value = boolean_value | bitstring_value | real_value | integer_value | null_value
+    builtin_value = boolean_value | bitstring_value | real_value | integer_value | null_value | cstring_value
     defined_value = valuereference # todo: more options from 13.1
 
     # object identifier value
@@ -261,9 +267,10 @@ def _build_asn1_grammar():
                                       T61String | UniversalString | \
                                       UTF8String | VideotexString | VisibleString
     characterstring_type = restricted_characterstring_type | unrestricted_characterstring_type
+    useful_type = GeneralizedTime | UTCTime | ObjectDescriptor
 
     # todo: consider other builtins from 16.2
-    simple_type = (boolean_type | null_type | octetstring_type | characterstring_type | real_type | plain_integer_type | object_identifier_type) + Optional(constraint)
+    simple_type = (boolean_type | null_type | octetstring_type | characterstring_type | real_type | plain_integer_type | object_identifier_type | useful_type) + Optional(constraint)
     constructed_type = choice_type | sequence_type | set_type
     value_list_type = restricted_integer_type | enumerated_type
     builtin_type = value_list_type | tagged_type | simple_type | constructed_type | sequenceof_type | setof_type | bitstring_type
index 897609e..e25994f 100644 (file)
@@ -89,7 +89,7 @@ class Pyasn1Backend(object):
         }
 
     def generate_code(self):
-        self.writer.write_line('from pyasn1.type import univ, char, namedtype, namedval, tag, constraint')
+        self.writer.write_line('from pyasn1.type import univ, char, namedtype, namedval, tag, constraint, useful')
         self.writer.write_blanks(2)
 
         # TODO: Only generate _OID if sema_module
@@ -373,7 +373,14 @@ _ASN1_BUILTIN_TYPES = {
     'SET OF': 'univ.SetOf',
     'UTF8String': 'char.UTF8String',
     'GeneralString': 'char.GeneralString',
-    'OBJECT IDENTIFIER': 'univ.ObjectIdentifier'
+    'OBJECT IDENTIFIER': 'univ.ObjectIdentifier',
+    'GeneralizedTime': 'useful.GeneralizedTime',
+    'UTCTime': 'useful.UTCTime',
+
+    # BUG: This should be useful.ObjectDescriptor
+    # but it's not implemented in pyasn1 for some
+    # reason.
+    'ObjectDescriptor': 'char.GraphicString',
 }
 
 
index 766a0e0..73aff1e 100644 (file)
@@ -395,6 +395,9 @@ class UserDefinedType(object):
     def __init__(self, elements):
         self.type_name = elements[0]
 
+    def reference_name(self):
+        return self.type_name
+
     def references(self):
         return [self.type_name]
 
diff --git a/testdata/useful_types.asn b/testdata/useful_types.asn
new file mode 100644 (file)
index 0000000..636cf01
--- /dev/null
@@ -0,0 +1,14 @@
+TEST DEFINITIONS ::=
+BEGIN
+  g1 GeneralizedTime ::= "12345678901234.5"
+  u1 UTCTime ::= "1234567890Z"
+  o1 ObjectDescriptor ::= "Text"
+  GTime ::= GeneralizedTime
+  UTime ::= UTCTime
+  OD ::= ObjectDescriptor
+
+  g2 GTime ::= "19851106210627.3"
+  u2 UTime ::= "8201021200Z"
+  o2 OD ::= "A free-text description"
+END