From 84adefa331c4159d432d22840663c38f155cd4c1 Mon Sep 17 00:00:00 2001 From: Erlang/OTP Date: Fri, 20 Nov 2009 14:54:40 +0000 Subject: The R13B03 release. --- lib/asn1/doc/erlmod/.gitignore | 0 lib/asn1/doc/html/.gitignore | 0 lib/asn1/doc/man3/.gitignore | 0 lib/asn1/doc/misc/.gitignore | 0 lib/asn1/doc/pdf/.gitignore | 0 lib/asn1/doc/src/Makefile | 223 ++++ lib/asn1/doc/src/Seq.asn | 37 + lib/asn1/doc/src/Seq.asn1config | 3 + lib/asn1/doc/src/asn1_spec.xmlsrc | 824 ++++++++++++ lib/asn1/doc/src/asn1_ug.xml | 1981 +++++++++++++++++++++++++++++ lib/asn1/doc/src/asn1ct.xml | 379 ++++++ lib/asn1/doc/src/asn1rt.xml | 208 +++ lib/asn1/doc/src/book.xml | 50 + lib/asn1/doc/src/exclusive_Win_But.gif | Bin 0 -> 1340 bytes lib/asn1/doc/src/exclusive_Win_But.ps | 465 +++++++ lib/asn1/doc/src/fascicules.xml | 18 + lib/asn1/doc/src/make.dep | 31 + lib/asn1/doc/src/note.gif | Bin 0 -> 1539 bytes lib/asn1/doc/src/notes.xml | 748 +++++++++++ lib/asn1/doc/src/notes_history.xml | 1782 ++++++++++++++++++++++++++ lib/asn1/doc/src/part.xml | 39 + lib/asn1/doc/src/part_notes.xml | 39 + lib/asn1/doc/src/ref_man.xml | 38 + lib/asn1/doc/src/selective_TypeList.gif | Bin 0 -> 4465 bytes lib/asn1/doc/src/selective_TypeList.ps | 266 ++++ lib/asn1/doc/src/selective_Window2.gif | Bin 0 -> 2920 bytes lib/asn1/doc/src/selective_Window2.ps | 515 ++++++++ lib/asn1/doc/src/warning.gif | Bin 0 -> 1498 bytes lib/asn1/doc/users_guide/Makefile | 69 + lib/asn1/doc/users_guide/users_guide.sgml | 34 + 30 files changed, 7749 insertions(+) create mode 100644 lib/asn1/doc/erlmod/.gitignore create mode 100644 lib/asn1/doc/html/.gitignore create mode 100644 lib/asn1/doc/man3/.gitignore create mode 100644 lib/asn1/doc/misc/.gitignore create mode 100644 lib/asn1/doc/pdf/.gitignore create mode 100644 lib/asn1/doc/src/Makefile create mode 100644 lib/asn1/doc/src/Seq.asn create mode 100644 lib/asn1/doc/src/Seq.asn1config create mode 100644 lib/asn1/doc/src/asn1_spec.xmlsrc create mode 100644 lib/asn1/doc/src/asn1_ug.xml create mode 100644 lib/asn1/doc/src/asn1ct.xml create mode 100644 lib/asn1/doc/src/asn1rt.xml create mode 100644 lib/asn1/doc/src/book.xml create mode 100644 lib/asn1/doc/src/exclusive_Win_But.gif create mode 100644 lib/asn1/doc/src/exclusive_Win_But.ps create mode 100644 lib/asn1/doc/src/fascicules.xml create mode 100644 lib/asn1/doc/src/make.dep create mode 100644 lib/asn1/doc/src/note.gif create mode 100644 lib/asn1/doc/src/notes.xml create mode 100644 lib/asn1/doc/src/notes_history.xml create mode 100644 lib/asn1/doc/src/part.xml create mode 100644 lib/asn1/doc/src/part_notes.xml create mode 100644 lib/asn1/doc/src/ref_man.xml create mode 100644 lib/asn1/doc/src/selective_TypeList.gif create mode 100644 lib/asn1/doc/src/selective_TypeList.ps create mode 100644 lib/asn1/doc/src/selective_Window2.gif create mode 100644 lib/asn1/doc/src/selective_Window2.ps create mode 100644 lib/asn1/doc/src/warning.gif create mode 100644 lib/asn1/doc/users_guide/Makefile create mode 100644 lib/asn1/doc/users_guide/users_guide.sgml (limited to 'lib/asn1/doc') diff --git a/lib/asn1/doc/erlmod/.gitignore b/lib/asn1/doc/erlmod/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/asn1/doc/html/.gitignore b/lib/asn1/doc/html/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/asn1/doc/man3/.gitignore b/lib/asn1/doc/man3/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/asn1/doc/misc/.gitignore b/lib/asn1/doc/misc/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/asn1/doc/pdf/.gitignore b/lib/asn1/doc/pdf/.gitignore new file mode 100644 index 0000000000..e69de29bb2 diff --git a/lib/asn1/doc/src/Makefile b/lib/asn1/doc/src/Makefile new file mode 100644 index 0000000000..be8755f0ff --- /dev/null +++ b/lib/asn1/doc/src/Makefile @@ -0,0 +1,223 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +include $(ERL_TOP)/make/target.mk +include $(ERL_TOP)/make/$(TARGET)/otp.mk + +# ---------------------------------------------------- +# Application version +# ---------------------------------------------------- +include ../../vsn.mk +VSN=$(ASN1_VSN) +APPLICATION=asn1 + + +# ---------------------------------------------------- +# Include dependency +# ---------------------------------------------------- + +ifndef DOCSUPPORT +include make.dep +endif + +# ---------------------------------------------------- +# Release directory specification +# ---------------------------------------------------- +RELSYSDIR = $(RELEASE_PATH)/lib/$(APPLICATION)-$(VSN) + +# ---------------------------------------------------- +# Target Specs +# ---------------------------------------------------- +XML_APPLICATION_FILES = ref_man.xml +XML_REF3_FILES = asn1ct.xml \ + asn1rt.xml + +GEN_XML = \ + asn1_spec.xml + +XML_PART_FILES = \ + part.xml \ + part_notes.xml + +XML_HTML_FILE = \ + notes_history.xml + +XML_CHAPTER_FILES = \ + asn1_ug.xml \ + asn1_spec.xml \ + notes.xml + +BOOK_FILES = book.xml + +XML_FILES = $(BOOK_FILES) $(XML_APPLICATION_FILES) $(XML_REF3_FILES) \ + $(GEN_XML) $(XML_PART_FILES) $(XML_CHAPTER_FILES) + +GIF_FILES = \ + exclusive_Win_But.gif \ + selective_Window2.gif \ + selective_TypeList.gif + +# ---------------------------------------------------- + +ASN1_FILES = \ + Seq.asn \ + Seq.asn1config + +INFO_FILE = ../../info +EXTRA_FILES = \ + $(DEFAULT_HTML_FILES) \ + $(ASN1_FILES) \ + $(XML_REF3_FILES:%.xml=$(HTMLDIR)/%.html) \ + $(XML_CHAPTER_FILES:%.xml=$(HTMLDIR)/%.html) + +MAN3_FILES = $(XML_REF3_FILES:%.xml=$(MAN3DIR)/%.3) + +ifdef DOCSUPPORT + +HTML_REF_MAN_FILE = $(HTMLDIR)/index.html + +TOP_PDF_FILE = $(PDFDIR)/$(APPLICATION)-$(VSN).pdf + +else + +TEX_FILES_BOOK = \ + $(BOOK_FILES:%.xml=%.tex) \ + $(BOOK_FILES:%.xml=%.sgml) part.tex +TEX_FILES_REF_MAN = $(XML_REF3_FILES:%.xml=%.tex) \ + $(XML_APPLICATION_FILES:%.xml=%.tex) +TEX_FILES_USERS_GUIDE = \ + $(XML_CHAPTER_FILES:%.xml=%.tex) + +TOP_PDF_FILE = $(APPLICATION)-$(VSN).pdf +TOP_PS_FILE = $(APPLICATION)-$(VSN).ps + +$(TOP_PDF_FILE): book.dvi ../../vsn.mk + $(DVI2PS) $(DVIPS_FLAGS) -f $< | $(DISTILL) $(DISTILL_FLAGS) > $@ + +$(TOP_PS_FILE): book.dvi ../../vsn.mk + $(DVI2PS) $(DVIPS_FLAGS) -f $< > $@ + +endif + + +# ---------------------------------------------------- +# FLAGS +# ---------------------------------------------------- +XML_FLAGS += +DVIPS_FLAGS += + +# ---------------------------------------------------- +# Targets +# ---------------------------------------------------- +$(HTMLDIR)/%.gif: %.gif + $(INSTALL_DATA) $< $@ + +ifdef DOCSUPPORT + +docs: pdf html man + +$(TOP_PDF_FILE): $(XML_FILES) + +pdf: $(TOP_PDF_FILE) + +html: gifs $(HTML_REF_MAN_FILE) + +clean clean_docs: + rm -rf $(HTMLDIR)/* + rm -f $(MAN3DIR)/* + rm -f $(TOP_PDF_FILE) $(TOP_PDF_FILE:%.pdf=%.fo) + rm -f $(GEN_XML) errs core *~ + +else + +ifeq ($(DOCTYPE),pdf) +docs: pdf +else +ifeq ($(DOCTYPE),ps) +docs: ps +else +docs: html gifs man +endif +endif + +pdf: $(TOP_PDF_FILE) + +ps: $(TOP_PS_FILE) + +html: $(HTML_FILES) + +clean clean_docs clean_tex: + rm -f $(TEX_FILES_USERS_GUIDE) $(TEX_FILES_REF_MAN) $(TEX_FILES_BOOK) + rm -f $(HTML_FILES) $(MAN3_FILES) + rm -f $(TOP_PDF_FILE) $(TOP_PS_FILE) + rm -f errs core *~ $(LATEX_CLEAN) + +endif + +man: $(MAN3_FILES) + +gifs: $(GIF_FILES:%=$(HTMLDIR)/%) + +debug opt: + +# ---------------------------------------------------- +# Release Target +# ---------------------------------------------------- +include $(ERL_TOP)/make/otp_release_targets.mk + +ifdef DOCSUPPORT + +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELSYSDIR)/doc/pdf + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(HTMLDIR)/* \ + $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3DIR)/* $(RELEASE_PATH)/man/man3 + +else + +ifeq ($(DOCTYPE),pdf) +release_docs_spec: pdf + $(INSTALL_DIR) $(RELEASE_PATH)/pdf + $(INSTALL_DATA) $(TOP_PDF_FILE) $(RELEASE_PATH)/pdf +else +ifeq ($(DOCTYPE),ps) +release_docs_spec: ps + $(INSTALL_DIR) $(RELEASE_PATH)/ps + $(INSTALL_DATA) $(TOP_PS_FILE) $(RELEASE_PATH)/ps +else +release_docs_spec: docs + $(INSTALL_DIR) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(GIF_FILES) $(EXTRA_FILES) $(HTML_FILES) \ + $(HTML_APPHISTORY) $(RELSYSDIR)/doc/html + $(INSTALL_DATA) $(INFO_FILE) $(RELSYSDIR) + $(INSTALL_DIR) $(RELEASE_PATH)/man/man3 + $(INSTALL_DATA) $(MAN3_FILES) $(RELEASE_PATH)/man/man3 +endif +endif + +endif + +release_spec: + + + diff --git a/lib/asn1/doc/src/Seq.asn b/lib/asn1/doc/src/Seq.asn new file mode 100644 index 0000000000..2f2c48cf02 --- /dev/null +++ b/lib/asn1/doc/src/Seq.asn @@ -0,0 +1,37 @@ +GUI DEFINITIONS AUTOMATIC TAGS ::= + +BEGIN + +Action ::= SEQUENCE + { + number INTEGER DEFAULT 15, + handle [0] Handle DEFAULT {number 12, on TRUE} + } + +Key ::= [11] EXPLICIT Button +Handle ::= [12] Key +Button ::= SEQUENCE + { + number INTEGER, + on BOOLEAN + } + +Window ::= CHOICE + { + vsn INTEGER, + status E + } + +Status ::= SEQUENCE + { + state INTEGER, + buttonList SEQUENCE OF Button, + enabled BOOLEAN OPTIONAL, + actions CHOICE { + possibleActions SEQUENCE OF Action, + noOfActions INTEGER + } + } + + +END diff --git a/lib/asn1/doc/src/Seq.asn1config b/lib/asn1/doc/src/Seq.asn1config new file mode 100644 index 0000000000..571cf4cd32 --- /dev/null +++ b/lib/asn1/doc/src/Seq.asn1config @@ -0,0 +1,3 @@ +{exclusive_decode,{'GUI', + [{decode_Window_exclusive,['Window',[{status,[{buttonList,parts},{actions,undecoded}]}]]}, + {decode_Button_exclusive,['Button',[{number,undecoded}]]}]}}. diff --git a/lib/asn1/doc/src/asn1_spec.xmlsrc b/lib/asn1/doc/src/asn1_spec.xmlsrc new file mode 100644 index 0000000000..8d61834da8 --- /dev/null +++ b/lib/asn1/doc/src/asn1_spec.xmlsrc @@ -0,0 +1,824 @@ + + + + +
+ + 20032009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Specialized Decodes + EAB/UAB/UKH/KD Bertil Karlsson + + 2003-04-24 + D + asn1_spec.xml +
+ +

When performance is of highest priority and one is interested in + a limited part of the ASN.1 encoded message, before one decide what + to do with the rest of it, one may want to decode only this small + part. The situation may be a server that has to decide to which + addressee it will send a message. The addressee may be interested in + the entire message, but the server may be a bottleneck that one want + to spare any unnecessary load. Instead of making two complete decodes (the normal case of decode), one in the server and one + in the addressee, it is only necessary to make one specialized decode(in the server) and another complete decode(in the + addressee). The following specialized decodes exclusive decode and selected decode support to solve this and + similar problems. +

+

So far this functionality is only provided when using the + optimized BER_BIN version, that is when compiling with the + options ber_bin and optimize. It does also work + using the driver option. We have no intent to make this + available on the default BER version, but maybe in the PER_BIN + version (per_bin). +

+ +
+ Exclusive Decode +

The basic idea with exclusive + decode is that you specify which parts of the message you want to + exclude from being decoded. These parts remain encoded and are + returned in the value structure as binaries. They may be decoded + in turn by passing them to a certain decode_part/2 + function. The performance gain is high when the message is large + and you can do an exclusive decode and later on one or several + decodes of the parts or a second complete decode instead of two or + more complete decodes. +

+ +
+ How To Make It Work +

In order to make exclusive decode work you have to do the + following: +

+ + First,decide the name of the function for the exclusive + decode. + Second, write instructions that must consist of the name + of the exclusive decode function, the name of the ASN.1 + specification and a notation that tells which parts of the + message structure will be excluded from decode. These + instructions shall be included in a configuration + file. + Third, compile with the additional option + asn1config. The compiler searches for a configuration + file with the same name as the ASN.1 spec but with the + extension .asn1config. This configuration file is not the same + as used for compilation of a set of files. See section + Writing an Exclusive Decode Instruction. + +
+ +
+ User Interface +

The run-time user interface for exclusive decode consists of + two different functions. First, the function for an exclusive + decode, whose name the user decides in the configuration + file. Second, the compiler generates a decode_part/2 + function when exclusive decode is chosen. This function decodes + the parts that were left undecoded during the exclusive + decode. Both functions are described below. +

+

If the exclusive decode function has for example got the name + decode_exclusive and an ASN.1 encoded message + Bin shall be exclusive decoded, the call is:

+
+{ok,Excl_Message} = 'MyModule':decode_exclusive(Bin)      
+ +

The result Excl_Message has the same structure as an + complete decode would have, except for the parts of the top-type + that were not decoded. The undecoded parts will be on their place + in the structure on the format {Type_Key,Undecoded_Value}. +

+

Each undecoded part that shall be decoded must be fed into the decode_part/2 function,like:

+
+{ok,Part_Message} = 'MyModule':decode_part(Type_Key,Undecoded_Value)      
+
+ +
+ + Writing an Exclusive Decode Instruction +

This instruction is written in the configuration file on the + format:

+
+
+Exclusive_Decode_Instruction = {exclusive_decode,{Module_Name,Decode_Instructions}}.
+
+Module_Name = atom()
+
+Decode_Instructions = [Decode_Instruction]+
+
+Decode_Instruction = {Exclusive_Decode_Function_Name,Type_List}
+
+Exclusive_Decode_Function_Name = atom()
+
+Type_List = [Top_Type,Element_List]
+
+Element_List = [Element]+
+
+Element = {Name,parts} |
+          {Name,undecoded} |
+          {Name,Element_List}
+
+Top_Type = atom()
+
+Name = atom()
+      
+

Observe that the instruction must be a valid Erlang term ended + by a dot. +

+

In the Type_List the "path" from the top type to each + undecoded sub-components is described. The top type of the path is + an atom, the name of it. The action on each component/type that + follows will be described by one of {Name,parts}, {Name,undecoded}, {Name,Element_List}

+

The use and effect of the actions are: +

+ + {Name,undecoded} Tells that the element will be + left undecoded during the exclusive decode. The type of Name may + be any ASN.1 type. The value of element Name will be returned as a + tuple,as mentioned above, in the value structure of the top type. + {Name,parts} The type of Name may be one of + SEQUENCE OF or SET OF. The action implies that the different + components of Name will be left undecoded. The value of Name + will be returned as a tuple, as above , where the second element is a list of + binaries. That is because the representation of a SEQUENCE OF/ + SET OF in Erlang is a list of its internal type. Any of the + elements of this list or the entire list can be decoded by the + decode_part function. + {Name,Element_List}This action is used when one or + more of the sub-types of Name will be exclusive decoded. + +

Name in the actions above may be a component name of a + SEQUENCE or a SET or a name of an alternative in a CHOICE. +

+
+ +
+ Example +

In the examples below we use the definitions from the following ASN.1 spec:

+ + +

If Button is a top type and we want to exclude + component number from decode the Type_List in the + instruction in the configuration file will be + ['Button',[{number,undecoded}]]. If we call the decode + function decode_Button_exclusive the Decode_Instruction + will be + {decode_Button_exclusive,['Button',[{number,undecoded}]]}. +

+

We also have another top type Window whose sub + component actions in type Status and the parts of component + buttonList shall be left undecoded. For this type we name + the function decode__Window_exclusive. The whole + Exclusive_Decode_Instruction configuration is as follows:

+ +

+ + Figure symbolizes the bytes of a Window:status message. The components buttonList and actions are excluded from decode. Only state and enabled are decoded when decode__Window_exclusive is called. + +

+

Compiling GUI.asn including the configuration file is done like:

+
+unix> erlc -bber_bin +optimize +asn1config GUI.asn
+
+erlang> asn1ct:compile('GUI',[ber_bin,optimize,asn1config]).      
+

The module can be used like:

+
+
+1> Button_Msg = {'Button',123,true}.
+{'Button',123,true}
+2> {ok,Button_Bytes} = 'GUI':encode('Button',Button_Msg).
+{ok,[<<48>>,
+     [6],
+     [<<128>>,
+      [1],
+      123],
+     [<<129>>,
+      [1],
+      255]]}
+3> {ok,Exclusive_Msg_Button} = 'GUI':decode_Button_exclusive(list_to_binary(Button_Bytes)).
+{ok,{'Button',{'Button_number',<<28,1,123>>},
+         true}}
+4> 'GUI':decode_part('Button_number',<<128,1,123>>).
+{ok,123}
+5> Window_Msg = 
+{'Window',{status,{'Status',35,
+              [{'Button',3,true},
+               {'Button',4,false},
+               {'Button',5,true},
+               {'Button',6,true},
+               {'Button',7,false},
+               {'Button',8,true},
+               {'Button',9,true},
+               {'Button',10,false},
+               {'Button',11,true},
+               {'Button',12,true},
+               {'Button',13,false},
+               {'Button',14,true}],
+              false,
+              {possibleActions,[{'Action',16,{'Button',17,true}}]}}}}. 
+{'Window',{status,{'Status',35,
+              [{'Button',3,true},
+               {'Button',4,false},
+               {'Button',5,true},
+               {'Button',6,true},
+               {'Button',7,false},
+               {'Button',8,true},
+               {'Button',9,true},
+               {'Button',10,false},
+               {'Button',11,true},
+               {'Button',12,true},
+               {'Button',13,false},
+               {'Button',14,true}],
+              false,
+              {possibleActions,[{'Action',16,{'Button',17,true}}]}}}}
+6> {ok,Window_Bytes}='GUI':encode('Window',Window_Msg).
+{ok,[<<161>>,
+     [127],
+     [<<128>>, ...
+
+
+8> {ok,{status,{'Status',Int,{Type_Key_SeqOf,Val_SEQOF},
+BoolOpt,{Type_Key_Choice,Val_Choice}}}}=
+'GUI':decode_Window_status_exclusive(list_to_binary(Window_Bytes)).
+{ok,{status,{'Status',35,
+        {'Status_buttonList',[<<48,6,128,1,3,129,1,255>>,
+                              <<48,6,128,1,4,129,1,0>>,
+                              <<48,6,128,1,5,129,1,255>>,
+                              <<48,6,128,1,6,129,1,255>>,
+                              <<48,6,128,1,7,129,1,0>>,
+                              <<48,6,128,1,8,129,1,255>>,
+                              <<48,6,128,1,9,129,1,255>>,
+                              <<48,6,128,1,10,129,1,0>>,
+                              <<48,6,128,1,11,129,1,255>>,
+                              <<48,6,128,1,12,129,1,255>>,
+                              <<48,6,128,1,13,129,1,0>>,
+                              <<48,6,128,1,14,129,1,255>>]},
+        false,
+        {'Status_actions',
+<<163,21,160,19,48,17,2,1,16,160,12,172,10,171,8,48,6,128,1,...>>}}}}
+10> 'GUI':decode_part(Type_Key_SeqOf,Val_SEQOF).
+{ok,[{'Button',3,true},
+     {'Button',4,false},
+     {'Button',5,true},
+     {'Button',6,true},
+     {'Button',7,false},
+     {'Button',8,true},
+     {'Button',9,true},
+     {'Button',10,false},
+     {'Button',11,true},
+     {'Button',12,true},
+     {'Button',13,false},
+     {'Button',14,true}]}
+11> 'GUI':decode_part(Type_Key_SeqOf,hd(Val_SEQOF)).
+{ok,{'Button',3,true}}
+12> 'GUI':decode_part(Type_Key_Choice,Val_Choice).  
+{ok,{possibleActions,[{'Action',16,{'Button',17,true}}]}}
+      
+
+
+ +
+ Selective Decode +

This specialized decode decodes one single subtype of a + constructed value. It is the fastest method to extract one sub + value. The typical use of this decode is when one want to + inspect, for instance a version number,to be able to decide what + to do with the entire value. The result is returned as + {ok,Value} or {error,Reason}. +

+ +
+ How To Make It Work +

The following steps are necessary: +

+ + Write instructions in the configuration + file. Including the name of a user function, the name of the ASN.1 + specification and a notation that tells which part of the type + will be decoded. + Compile with the additional option + asn1config. The compiler searches for a configuration file + with the same name as the ASN.1 spec but with the extension + .asn1config. In the same file you can provide configuration specs + for exclusive decode as well. The generated Erlang module has the + usual functionality for encode/decode preserved and the + specialized decode functionality added. + +
+ +
+ User Interface +

The only new user interface function is the one provided by the + user in the configuration file. You can invoke that function by + the ModuleName:FunctionName notation. +

+

So, if you have the following spec + {selective_decode,{'ModuleName',[{selected_decode_Window,TypeList}]}} + in the con-fig file, you do the selective decode by + {ok,Result}='ModuleName':selected_decode_Window(EncodedBinary).

+
+ +
+ + Writing a Selective Decode Instruction +

It is possible to describe one or many selective decode + functions in a configuration file, you have to use the following + notation:

+
+Selective_Decode_Instruction = {selective_decode,{Module_Name,Decode_Instructions}}.
+
+Module_Name = atom()
+
+Decode_Instructions = [Decode_Instruction]+
+
+Decode_Instruction = {Selective_Decode_Function_Name,Type_List}
+
+Selective_Decode_Function_Name = atom()
+
+Type_List = [Top_Type|Element_List]
+
+Element_List = Name|List_Selector
+
+Name = atom()
+
+List_Selector = [integer()]      
+

Observe that the instruction must be a valid Erlang term ended + by a dot. +

+

The Module_Name is the same as the name of the ASN.1 + spec, but without the extension. A Decode_Instruction is + a tuple with your chosen function name and the components from + the top type that leads to the single type you want to + decode. Notice that you have to choose a name of your function + that will not be the same as any of the generated functions. The + first element of the Type_List is the top type of the + encoded message. In the Element_List it is followed by + each of the component names that leads to selected type. Each of + the names in the Element_List must be constructed types + except the last name, which can be any type. +

+

The List_Selector makes it possible to choose one of the + encoded components in a SEQUENCE OF/ SET OF. It is also possible + to go further in that component and pick a sub type of that to + decode. So in the Type_List: ['Window',status,buttonList,[1],number] the + component buttonList has to be a SEQUENCE OF or SET OF type. In + this example component number of the first of the encoded + elements in the SEQUENCE OF buttonList is selected. This apply on + the ASN.1 spec above. +

+
+ +
+ Another Example +

In this example we use the same ASN.1 spec as above. A valid selective decode + instruction is:

+
+{selective_decode,
+    {'GUI',
+        [{selected_decode_Window1,
+            ['Window',status,buttonList, 
+             [1],
+             number]},
+ {selected_decode_Action,
+     ['Action',handle,number]},
+ {selected_decode_Window2,
+     ['Window',
+      status,
+      actions,
+      possibleActions,
+      [1],
+      handle,number]}]}}.
+      
+

The first Decode_Instruction, + {selected_decode_Window1,['Window',status,buttonList,[1],number]} + is commented in the previous section. The instruction + {selected_decode_Action,['Action',handle,number]} picks + the component number in the handle component of the type + Action. If we have the value ValAction = {'Action',17,{'Button',4711,false}} the internal value 4711 + should be picked by selected_decode_Action. In an Erlang + terminal it looks like:

+
+ValAction = {'Action',17,{'Button',4711,false}}.
+{'Action',17,{'Button',4711,false}}
+7> {ok,Bytes}='GUI':encode('Action',ValAction).
+...
+8> BinBytes = list_to_binary(Bytes).
+<<48,18,2,1,17,160,13,172,11,171,9,48,7,128,2,18,103,129,1,0>>
+9> 'GUI':selected_decode_Action(BinBytes).
+{ok,4711}
+10>       
+

The third instruction, + ['Window',status,actions,possibleActions,[1],handle,number], + which is a little more complicated,

+ + starts with type Window. + Picks component status of Window that is + of type Status. + Then takes component actions of type + Status. + Then possibleActions of the internal defined + CHOICE type. + Thereafter it goes into the first component of the + SEQUENCE OF by [1]. That component is of type + Action. + The instruction next picks component + handle. + And finally component number of the type + Button. + +

The following figures shows which components are in the + TypeList + ['Window',status,actions,possibleActions,[1],handle,number]. And + which part of a message that will be decoded by + selected_decode_Window2. +

+

+ + The elements specified in the config file for selective decode of a sub-value in a Window message + +

+ + Figure symbolizes the bytes of a Window:status message. Only the marked element is decoded when selected_decode_Window2 is called. + +

With the following example you can examine that both + selected_decode_Window2 and + selected_decode_Window1 decodes the intended sub-value + of the value Val

+
+1> Val = {'Window',{status,{'Status',12,
+                    [{'Button',13,true},
+                     {'Button',14,false},
+                     {'Button',15,true},
+                     {'Button',16,false}],
+                    true,
+                    {possibleActions,[{'Action',17,{'Button',18,false}},
+                                      {'Action',19,{'Button',20,true}},
+                                      {'Action',21,{'Button',22,false}}]}}}}
+2> {ok,Bytes}='GUI':encode('Window',Val).
+...
+3> Bin = list_to_binary(Bytes).
+<<161,101,128,1,12,161,32,48,6,128,1,13,129,1,255,48,6,128,1,14,129,1,0,48,6,128,1,15,129,...>>
+4> 'GUI':selected_decode_Window1(Bin).
+{ok,13}
+5> 'GUI':selected_decode_Window2(Bin).
+{ok,18}      
+

Observe that the value feed into the selective decode + functions must be a binary. +

+
+
+ +
+ Performance +

To give an indication on the possible performance gain using + the specialized decodes, some measures have been performed. The + relative figures in the outcome between selective, exclusive and + complete decode (the normal case) depends on the structure of + the type, the size of the message and on what level the + selective and exclusive decodes are specified. +

+ +
+ ASN.1 Specifications, Messages and Configuration +

The specs GUI and + MEDIA-GATEWAY-CONTROL + was used in the test. +

+

For the GUI spec the configuration looked like:

+
+{selective_decode,
+  {'GUI',
+    [{selected_decode_Window1,
+         ['Window',
+          status,buttonList,
+          [1],
+          number]},
+     {selected_decode_Window2,
+         ['Window',
+          status,
+          actions,
+          possibleActions,
+          [1],
+          handle,number]}]}}.
+     {exclusive_decode,
+         {'GUI',
+            [{decode_Window_status_exclusive,
+                ['Window',
+                 [{status,
+                     [{buttonList,parts},
+                      {actions,undecoded}]}]]}]}}.
+      
+

The MEDIA-GATEWAY-CONTROL configuration was:

+
+{exclusive_decode,
+  {'MEDIA-GATEWAY-CONTROL',
+    [{decode_MegacoMessage_exclusive,
+        ['MegacoMessage',
+         [{authHeader,undecoded},
+          {mess,
+             [{mId,undecoded},
+              {messageBody,undecoded}]}]]}]}}.
+{selective_decode,
+  {'MEDIA-GATEWAY-CONTROL',
+    [{decode_MegacoMessage_selective,
+         ['MegacoMessage',mess,version]}]}}.
+      
+

The corresponding values were:

+
+{'Window',{status,{'Status',12,
+              [{'Button',13,true},
+               {'Button',14,false},
+               {'Button',15,true},
+               {'Button',16,false},
+               {'Button',13,true},
+               {'Button',14,false},
+               {'Button',15,true},
+               {'Button',16,false},
+               {'Button',13,true},
+               {'Button',14,false},
+               {'Button',15,true},
+               {'Button',16,false}],
+              true,
+              {possibleActions,
+                 [{'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}},
+                  {'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}},
+                  {'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}},
+                  {'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}},
+                  {'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}},
+                  {'Action',17,{'Button',18,false}},
+                  {'Action',19,{'Button',20,true}},
+                  {'Action',21,{'Button',22,false}}]}}}}
+
+
+{'MegacoMessage',asn1_NOVALUE,
+  {'Message',1,
+    {ip4Address,
+      {'IP4Address',[125,125,125,111],55555}},
+  {transactions,
+    [{transactionReply,
+      {'TransactionReply',50007,asn1_NOVALUE,
+       {actionReplies,
+        [{'ActionReply',0,asn1_NOVALUE,asn1_NOVALUE,
+          [{auditValueReply,{auditResult,{'AuditResult',
+            {'TerminationID',[],[255,255,255]},
+             [{mediaDescriptor,
+               {'MediaDescriptor',asn1_NOVALUE,
+                {multiStream,
+                 [{'StreamDescriptor',1,
+                   {'StreamParms',
+                    {'LocalControlDescriptor',
+                     sendRecv,
+                     asn1_NOVALUE,
+                     asn1_NOVALUE,
+                     [{'PropertyParm',
+                       [0,11,0,7],
+                       [[52,48]],
+                       asn1_NOVALUE}]},
+                    {'LocalRemoteDescriptor',
+                     [[{'PropertyParm',
+                        [0,0,176,1],
+                        [[48]],
+                        asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,8],
+                         [[73,78,32,73,80,52,32,49,50,53,46,49,
+                           50,53,46,49,50,53,46,49,49,49]],
+                         asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,15],
+                         [[97,117,100,105,111,32,49,49,49,49,32,
+                           82,84,80,47,65,86,80,32,32,52]],
+                         asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,12],
+                         [[112,116,105,109,101,58,51,48]],
+                         asn1_NOVALUE}]]},
+                    {'LocalRemoteDescriptor',
+                     [[{'PropertyParm',
+                         [0,0,176,1],
+                         [[48]],
+                         asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,8],
+                         [[73,78,32,73,80,52,32,49,50,52,46,49,50,
+                           52,46,49,50,52,46,50,50,50]],
+                         asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,15],
+                         [[97,117,100,105,111,32,50,50,50,50,32,82,
+                           84,80,47,65,86,80,32,32,52]],
+                         asn1_NOVALUE},
+                       {'PropertyParm',
+                         [0,0,176,12],
+                         [[112,116,105,109,101,58,51,48]],
+                         asn1_NOVALUE}]]}}}]}}},
+              {packagesDescriptor,
+               [{'PackagesItem',[0,11],1},
+                {'PackagesItem',[0,11],1}]},
+              {statisticsDescriptor,
+               [{'StatisticsParameter',[0,12,0,4],[[49,50,48,48]]},
+                {'StatisticsParameter',[0,11,0,2],[[54,50,51,48,48]]},
+                {'StatisticsParameter',[0,12,0,5],[[55,48,48]]},
+                {'StatisticsParameter',[0,11,0,3],[[52,53,49,48,48]]},
+                {'StatisticsParameter',[0,12,0,6],[[48,46,50]]},
+                {'StatisticsParameter',[0,12,0,7],[[50,48]]},
+                {'StatisticsParameter',[0,12,0,8],[[52,48]]}]}]}}}]}]}}}]}}}      
+      
+

The size of the encoded values was 458 bytes for GUI and 464 + bytes for MEDIA-GATEWAY-CONTROL. +

+
+ +
+ Results +

The ASN.1 specs in the test are compiled with the options + ber_bin, optimize, driver and asn1config. If the + driver option had been omitted there should have been + higher values for decode and decode_part. +

+

The test program runs 10000 decodes on the value, resulting + in a printout with the elapsed time in microseconds for the + total number of decodes. +

+ + + Function + Time(microseconds) + Kind of Decode + ASN.1 spec + % of time vs. complete decode + + + decode_MegacoMessage_selective/1 + 374045 + selective + MEDIA-GATEWAY-CONTROL + 8.3 + + + decode_MegacoMessage_exclusive/1 + 621107 + exclusive + MEDIA-GATEWAY-CONTROL + 13.8 + + + decode/2 + 4507457 + complete + MEDIA-GATEWAY-CONTROL + 100 + + + selected_decode_Window1/1 + 449585 + selective + GUI + 7.6 + + + selected_decode_Window2/1 + 890666 + selective + GUI + 15.1 + + + decode_Window_status_exclusive/1 + 1251878 + exclusive + GUI + 21.3 + + + decode/2 + 5889197 + complete + GUI + 100 + + Results of complete, exclusive and selective decode +
+

Another interesting question is what the relation is between + a complete decode, an exclusive decode followed by + decode_part of the excluded parts and a selective decode + followed by a complete decode. Some situations may be compared to + this simulation, e.g. inspect a sub-value and later on look at + the entire value. The following table shows figures from this + test. The number of loops and time unit is the same as in the + previous test. +

+ + + Actions + Function     + Time(microseconds) + ASN.1 spec + % of time vs. complete decode + + + complete + decode/2 + 4507457 + MEDIA-GATEWAY-CONTROL + 100 + + + selective and complete + decode_­MegacoMessage_­selective/1 + 4881502 + MEDIA-GATEWAY-CONTROL + 108.3 + + + exclusive and decode_part + decode_­MegacoMessage_­exclusive/1 + 5481034 + MEDIA-GATEWAY-CONTROL + 112.3 + + + complete + decode/2 + 5889197 + GUI + 100 + + + selective and complete + selected_­decode_­Window1/1 + 6337636 + GUI + 107.6 + + + selective and complete + selected_­decode_­Window2/1 + 6795319 + GUI + 115.4 + + + exclusive and decode_part + decode_­Window_­status_­exclusive/1 + 6249200 + GUI + 106.1 + + Results of complete, exclusive + decode_part and selective + complete decodes +
+

Other ASN.1 types and values can differ much from these + figures. Therefore it is important that you, in every case where + you intend to use either of these decodes, perform some tests + that shows if you will benefit your purpose. +

+
+ +
+ Comments +

Generally speaking the gain of selective and exclusive decode + in advance of complete decode is greater the bigger value and the + less deep in the structure you have to decode. One should also + prefer selective decode instead of exclusive decode if you are + interested in just one single sub-value.

+

Another observation is that the exclusive decode followed by + decode_part decodes is very attractive if the parts will be sent + to different servers for decoding or if one in some cases not is + interested in all parts.

+

The fastest selective decode are when the decoded type is a + primitive type and not so deep in the structure of the top + type. The selected_decode_Window2 decodes a big constructed + value, which explains why this operation is relatively slow.

+

It may vary from case to case which combination of + selective/complete decode or exclusive/part decode is the fastest.

+
+
+
+ diff --git a/lib/asn1/doc/src/asn1_ug.xml b/lib/asn1/doc/src/asn1_ug.xml new file mode 100644 index 0000000000..f2cd073ec8 --- /dev/null +++ b/lib/asn1/doc/src/asn1_ug.xml @@ -0,0 +1,1981 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Asn1 + ETX/DN/SP Kenneth. Lundin + + 1999-03-25 + D + asn1_ug.xml +
+ +
+ Introduction + +
+ Features +

The Asn1 application provides: +

+ + An ASN.1 compiler for Erlang, which generates encode and + decode functions to be used by Erlang programs sending and + receiving ASN.1 specified data. + Run-time functions used by the generated code. + Encoding rules supported are BER, the + specialized BER version DER and the basic form of + aligned and unaligned variants of PER. + +
+ +
+ Overview +

ASN.1 (Abstract Syntax Notation 1) defines the abstract + syntax of information. The purpose of ASN.1 is to have + a platform independent language to express types using a + standardized set of rules for the transformation of values of + a defined type, into a stream of bytes. This stream of bytes + can then be sent on a communication channel set up by the + lower layers in the stack of communication protocols e.g. + TCP/IP or encapsulated within UDP packets. This way, two + different applications written in two completely different + programming languages running on different computers with + different internal representation of data can exchange + instances of structured data types (instead of exchanging + bytes or bits). This makes programming faster and easier since no code + has to be written to process the transport format of the + data. +

+

To write a network application which processes ASN.1 encoded + messages, it is prudent and sometimes essential to have a set + of off-line development tools such as an ASN.1 compiler which + can generate the encode and decode logic for the specific ASN.1 + data types. It is also necessary to combine this with some + general language-specific runtime support for ASN.1 encoding and + decoding. +

+

The ASN.1 compiler must be directed towards a target language + or a set of closely related languages. This manual describes a + compiler which is directed towards the functional language + Erlang. In order to use this compiler, familiarity with the + language Erlang is essential. Therefore, the runtime support for ASN.1 is + also closely related to the language Erlang and + consist of a number of functions, which the + compiler uses. The types in ASN.1 and how to represent + values of those types in Erlang are described in this manual. +

+

The following document is structured so that the first part describes + how to use ASN.1 compiler, and then there are descriptions of all + the primitive and constructed ASN.1 types and their representation + in Erlang, +

+
+ +
+ Prerequisites +

It is assumed that the reader is familiar with the ASN.1 notation + as documented in the standard definition [] which is + the primary text. It may also be helpful, but not necessary, + to read the standard definitions + [] [] [] + [] [].

+

A very good book explaining those reference texts is + [], free to download at + http://www.oss.com/asn1/dubuisson.html . +

+

Knowledge of Erlang programming is also essential and reading the book + Concurrent Programming in ERLANG, + [], is recommended. Part 1 of this is available on the web in + PDF format. +

+
+ +
+ Capability +

This application covers all features of ASN.1 up to the 1997 + edition of the specification. In the 2002 edition some new + extensions came up of which there are support only for some of + them. ECN (Cncoding Control Notation) and XML notation are still + unsupported. Though, the other features of 2002 edition are + fully or partly supported as shown below:

+ + +

Decimal notation (e.g., "1.5e3") for REAL values. The + NR1, NR2 and NR3 formats as explained in ISO6093 are + supported.

+
+ +

The RELATIVE-OID type for relative object identifiers are + fully supported.

+
+ +

The subtype constraint (CONTAINING/ENCODED BY) to + constrain the content of an octet string or a bit string is + parsed when compiling, but no further action is taken. This + constraint is not a PER-visible constraint.

+
+ +

The subtype constraint by regular expressions (PATTERN) for character string types is parsed when compiling, but no further action is taken. This constraint is not a PER-visible constraint.

+
+ +

Multiple-line comments as in C, /* ... */, are + supported.

+
+
+

It should also be added here that the encoding formats + supported are BER, DER, PER aligned + basic variant and PER unaligned basic variant.

+
+ +
+ +
+ Getting Started with Asn1 + +
+ A First Example +

The following example demonstrates the basic functionality used to run + the Erlang ASN.1 compiler.

+

First, create a file called People.asn containing the following:

+
+People DEFINITIONS IMPLICIT TAGS ::=
+
+BEGIN
+EXPORTS Person;
+
+Person ::= [PRIVATE 19] SEQUENCE {
+        name PrintableString,
+        location INTEGER {home(0),field(1),roving(2)},
+        age INTEGER OPTIONAL }
+END      
+

This file (people.asn) must be compiled before it can be + used. + The ASN.1 compiler checks that the syntax is correct and that the + text represents proper ASN.1 code before generating an abstract + syntax tree. The code-generator then uses the abstract syntax + tree in order to generate code. +

+

The generated Erlang files will be placed in the current directory or + in the directory specified with the {outdir,Dir} option. + The following shows how the compiler + can be called from the Erlang shell:

+
+1>asn1ct:compile("People",[ber_bin]).
+Erlang ASN.1 compiling "People.asn" 
+--{generated,"People.asn1db"}--
+--{generated,"People.hrl"}--
+--{generated,"People.erl"}--
+ok
+2>      
+

The ASN.1 module People is now accepted and the abstract syntax tree + is saved in the People.asn1db file, the + generated Erlang code is compiled using the Erlang compiler and + loaded into the Erlang runtime system. Now there is a user interface + of encode/2 and decode/2 in the module People, which is invoked by: +

+,),]]>

+ + or

+,),]]>

+ + Alternatively one can use the ,,)]]> and ,,)]]> calls. + However, they are not as efficient as the previous methods since they + result in an additional apply/3 call.

+

Assume there is a network + application which receives instances of the ASN.1 defined + type Person, modifies and sends them back again:

+ +receive + {Port,{data,Bytes}} -> + case 'People':decode('Person',Bytes) of + {ok,P} -> + {ok,Answer} = 'People':encode('Person',mk_answer(P)), + Port ! {self(),{command,Answer}}; + {error,Reason} -> + exit({error,Reason}) + end + end, +

In the example above, a series of bytes is received from an + external source and the bytes are then decoded into a valid + Erlang term. This was achieved with the call + 'People':decode('Person',Bytes) which returned + an Erlang value of the ASN.1 type Person. Then an answer was + constructed and encoded using + 'People':encode('Person',Answer) which takes an + instance of a defined ASN.1 type and transforms it to a + (possibly) nested list of bytes according to the BER or PER + encoding-rules. +

+The encoder and the decoder can also be run from + the shell. The following dialogue with the shell illustrates + how the functions + asn1rt:encode/3 and asn1rt:decode/3 are used.

+
+2> Rockstar = {'Person',"Some Name",roving,50}.
+{'Person',"Some Name",roving,50}
+3> {ok,Bytes} = asn1rt:encode('People','Person',Rockstar).
+{ok,[<<243>>,
+     [17],
+     [19,9,"Some Name"],
+     [2,1,[2]],
+     [2,1,"2"]]}
+4> Bin = list_to_binary(Bytes).
+<<243,17,19,9,83,111,109,101,32,78,97,109,101,2,1,2,2,1,50>>
+5> {ok,Person} = asn1rt:decode('People','Person',Bin).
+{ok,{'Person',"Some Name",roving,50}}
+6>      
+

Notice that the result from encode is a nested list which + must be turned into a binary before the call to decode. A + binary is necessary as input to decode since the module was compiled + with the ber_bin option + The reason for returning a nested list is that it is faster to produce + and the list_to_binary operation is + performed automatically when the list is sent via the Erlang port mechanism.

+
+ +
+ Module dependencies +

It is common that asn1 modules import defined types, values and + other entities from another asn1 module.

+

Earlier versions of the asn1 compiler required that modules that + were imported from had to be compiled before the module that + imported. This caused problems when asn1 modules had circular + dependencies.

+

Now are referenced modules parsed when the compiler finds an + entity that is imported. There will not be any code generated for + the referenced module. However, the compiled module rely on + that the referenced modules also will be compiled.

+
+
+ +
+ The Asn1 Application User Interface +

The Asn1 application provides two separate user interfaces:

+ + +

The module asn1ct which provides the compile-time functions + (including the compiler).

+
+ +

The module asn1rt which provides the run-time functions. + However, it is preferable to use the generated encode/2 and + decode/2 functions in each module, ie. + Module:encode(Type,Value), in favor of the asn1rt + interface.

+
+
+

The reason for the division of the interface into compile-time + and run-time + is that only run-time modules (asn1rt*) need to be loaded in + an embedded system. +

+ +
+ Compile-time Functions +

The ASN.1 compiler can be invoked directly from the command-line + by means of the erlc program. This is convenient when compiling + many ASN.1 files from the command-line or when using Makefiles. + Here are some examples of how the erlc command can be used to invoke the + ASN.1 compiler:

+
+erlc Person.asn
+erlc -bper_bin Person.asn
+erlc -bber_bin +optimize ../Example.asn
+erlc -o ../asnfiles -I ../asnfiles -I /usr/local/standards/asn1 Person.asn      
+

The useful options for the ASN.1 compiler are:

+ + -b[ber | per | ber_bin | per_bin | uper_bin] + +

Choice of encoding rules, if omitted ber is the + default. The ber_bin and per_bin options + allows for optimizations and are therefore recommended + instaed of the ber and per options.

+
+ -o OutDirectory + +

Where to put the generated files, default is the current + directory.

+
+ -I IncludeDir + +

Where to search for .asn1db files and asn1 + source specs in order to resolve references to other + modules. This option can be repeated many times if there + are several places to search in. The compiler will always + search the current directory first.

+
+ +compact_bit_string + +

Gives the user the option to use a compact format of the BIT + STRING type to save memory space, typing space and + increase encode/decode performance, for details see + BIT STRING type section.

+
+ +der + +

DER encoding rule. Only when using -ber or + -ber_bin option.

+
+ +optimize + +

This flag has effect only when used together with one of + per_bin or ber_bin flags. It gives time optimized + code in the generated modules and it uses another runtime module. + In the per_bin case a linked-in driver is used. The + result from an encode is a binary.

+

When this flag is used you cannot use the old format{TypeName,Value} when you encode values. Since it is + an unnecessary construct it has been removed in favor of + performance. It + is neither admitted to construct SEQUENCE or SET component values + with the format {ComponentName,Value} since it also is + unnecessary. The only case were it is necessary is in a CHOICE, + were you have to pass values to the right component by specifying + {ComponentName,Value}. See also about + {Typename,Value} below + and in the sections for each type.

+
+ +driver + +

Together with the flags ber_bin and optimize + you choose to use a linked in driver for considerable faster + decode.

+
+ +asn1config + +

This functionality works together with the flags + ber_bin and optimize. You enables the + specialized decodes, see the Specialized Decode chapter. +

+
+ +undec_rest + +

A buffer that holds a message, being decoded may + also have some following bytes. Now it is possible to get + those following bytes returned together with the decoded + value. If an asn1 spec is compiled with this option a tuple + {ok,Value,Rest} is returned. Rest may be a + list or a binary. Earlier versions of the compiler ignored + those following bytes.

+
+ {inline,OutputName} + +

Compiling with this option gives one output module + containing all asn1 run-time functionality. The asn1 specs + are provided in a target module Module.set.asn as + described in the reference manual. The name of the resulting module + containing generated encode/decode functions and inlined + run-time functions will be OutputName.erl. The + merging/inlining of code is done by the igor module + of syntax_tools. By default the functions generated + from the first asn1 spec in the .set.asn are + exported, unless a {export,[atom()]} or + {export_all,true} option are provided. The list of + atoms are names of choosen asn1 specs from the + .set.asn file. See further examples of usage below

+
+ +'Any Erlc Option' + +

You may add any option to the Erlang compiler when + compiling the generated Erlang files. Any option + unrecognised by the asn1 compiler will be passed to the + Erlang compiler.

+
+
+

For a complete description of erlc see Erts Reference Manual.

+

For preferred option use see Preferred Option Use section.

+

The compiler and other compile-time functions can also be invoked from + the Erlang shell. Below follows a brief + description of the primary functions, for a + complete description of each function see + the Asn1 Reference Manual, the + asn1ct module.

+

The compiler is invoked by using asn1ct:compile/1 with + default options, or asn1ct:compile/2 if explicit options + are given. + Example:

+
+asn1ct:compile("H323-MESSAGES.asn1").      
+

which equals:

+
+asn1ct:compile("H323-MESSAGES.asn1",[ber]).      
+

If one wants PER encoding with optimizations:

+
+asn1ct:compile("H323-MESSAGES.asn1",[per_bin,optimize]).      
+

The generic encode and decode functions can be invoked like this:

+
+asn1ct:encode('H323-MESSAGES','SomeChoiceType',{call,"octetstring"}).
+asn1ct:decode('H323-MESSAGES','SomeChoiceType',Bytes).      
+

Or, preferable like:

+
+'H323-MESSAGES':encode('SomeChoiceType',{call,"octetstring"}).
+'H323-MESSAGES':decode('SomeChoiceType',Bytes).      
+
+ +
+ + Preferred Option Use +

+ It may not be obvious which compile options best fit a + situation. This section describes the format of the result of + encode and decode. It also gives some performance statistics + when using certain options. Finally there is a recommendation + which option combinations should be used. +

+

+ The default option is ber. It is the same backend as + ber_bin except that the result of encode is transformed + to a flat list. Below is a table that gives the different + formats of input and output of encode and decode using the + allowed combinations of coding and optimization + options: (EAVF stands for how ASN1 values are represented in + Erlang which is described in the ASN1 Types chapter) +

+ + + Encoding Rule + Compile options, allowed combinations + encode input + encode output + decode input + decode output + + + BER + [ber] (default) + EAVF + flat list + flat list / binary + EAVF + + + BER + [ber_bin] + EAVF + iolist + binary + EAVF + + + BER + [ber_bin, optimize] + EAVF + iolist + binary + EAVF + + + BER + [ber_bin, optimize, driver] + EAVF + iolist + iolist / binary + EAVF + + + PER aligned variant + [per] + EAVF + flat list + flat list + EAVF + + + PER aligned variant + [per_bin] + EAVF + iolist / binary + binary + EAVF + + + PER aligned variant + [per_bin, optimize] + EAVF + binary + binary + EAVF + + + PER unaligned variant + [uper_bin] + EAVF + binary + binary + EAVF + + + + DER + [(ber), der] + EAVF + flat list + flat list / binary + EAVF + + + DER + [ber_bin, der] + EAVF + iolist + binary + EAVF + + + DER + [ber_bin, optimize, der] + EAVF + iolist + binary + EAVF + + + DER + [ber_bin, optimize, driver, der] + EAVF + iolist + binary + EAVF + + + + The output / input formats for different combinations of compile options. +
+

+ Encode / decode speed comparison in one user case for the above + alternatives (except DER) is showed in the table below. The + DER alternatives are slower than their corresponding + BER alternative. +

+ + + + compile options + encode time + decode time + + + [ber] + 120 + 162 + + + [ber_bin] + 124 + 154 + + + [ber_bin, optimize] + 50 + 78 + + + [ber_bin, optimize, driver] + 50 + 62 + + + [per] + 141 + 133 + + + [per_bin] + 125 + 123 + + + [per_bin, optimize] + 77 + 72 + + + [uper_bin] + 97 + 104 + + + One example of difference in speed for the compile option alternatives. + +
+ +

+ The sole compile options ber, ber_bin and per + are kept for backwards compatibility and should not be used in + new code. +

+

+ You are strongly recommended to use the appropriate alternative + of the bold typed options. The optimize and + driver options does not affect the encode or decode + result, just the time spent in run-time. When ber_bin and + driver or per_bin, optimize and driver is + combined the C-code driver is used in choosen parts of encode / + decode procedure. +

+ + + Compile options, allowed combinations + use of linked-in driver + + + [ber] + no + + + [ber_bin] + no + + + [ber_bin, optimize] + no + + + [ber_bin, optimize, driver] + yes + + + [per] + no + + + [per_bin] + no + + + [per_bin, optimize] + yes + + + [uper_bin] + no + + + + [(ber), der] + no + + + [ber_bin, der] + no + + + [ber_bin, optimize, der] + no + + + [ber_bin, optimize, driver, der] + yes + + + + When the ASN1 linked-in driver is used. +
+ +
+
+ Run-time Functions +

A brief description of the major functions is given here. For a + complete description of each function see + the Asn1 Reference Manual, the asn1rt module.

+

The generic run-time encode and decode functions can be invoked as below:

+
+asn1rt:encode('H323-MESSAGES','SomeChoiceType',{call,"octetstring"}).
+asn1rt:decode('H323-MESSAGES','SomeChoiceType',Bytes).      
+

Or, preferable like:

+
+'H323-MESSAGES':encode('SomeChoiceType',{call,"octetstring"}).
+'H323-MESSAGES':decode('SomeChoiceType',Bytes).      
+

The asn1 linked-in driver is enabled in two occasions: encoding of + asn1 values when the asn1 spec is compiled with per_bin and + optimize or decode of encoded asn1 values when the asn1 spec is + compiled with ber_bin, optimize and driver. In + those cases the driver will be loaded automatically at the first call + to encode/decode. If one doesn't want the performance + overhead of the driver being loaded at the first call it is possible + to load the driver separately by asn1rt:load_driver().

+

By invoking the function info/0 in a generated module, one + gets information about which compiler options were used.

+
+ +
+ Errors +

Errors detected at + compile time appear on the screen together with + a line number indicating where in the source file the error + was detected. If no errors are found, an Erlang ASN.1 module will + be created as default.

+

The run-time encoders and decoders (in the asn1rt module) do + execute within a catch and returns {ok, Data} or + {error, {asn1, Description}} where + Description is + an Erlang term describing the error.

+
+
+ +
+ + Multi File Compilation +

There are various reasons for using a multi file compilation:

+ + You want to choose name for the generated module by + any reason. Maybe you need to compile the same specs for + different encoding/decoding standards. + You want only one resulting module. + If it is crucial to have a minimal system. Using + {inline,OutputModule} includes all necessary run-time + functions of the asn1 application, but skips those modules not + used. + Upgrading issues: Even if you upgrade your Erlang system + you may want to continue running the old asn1 run-time + functionality. + Performance issues: If you have an asn1 system with a lot + of cross references you may gain in performance. Meassurements + must be done for each case. + +

You may choose either the plain multi file compilation that just + merges the choosen asn1 specs or the {inline,OutputModule} + that also includes the used asn1 run-time functionality.

+

For both cases you need to specify which asn1 specs you will + compile in a module that must have the extension + .set.asn. You chose name of the module and provide the + names of the asn1 specs. For instance, if you have the specs + File1.asn, File2.asn and File3.asn your + module MyModule.set.asn will look like:

+
+File1.asn
+File2.asn
+File3.asn    
+

If you compile with:

+ +~> erlc MyModule.set.asn +

the result will be one merged module MyModule.erl with + the generated code from the three asn1 specs. But if you compile + with:

+ +~> erlc +"{inline,'OutputModule'}" MyModule.set.asn +

the result will be a module OutputModule.erl that + contains all encode/decode functions for the three asn1 specs and + all used functions from the asn1 run-time modules, in this case + asn1rt_ber_bin. In the former case all encode/decode + functions are exported but in the latter only the encode/decode + functions of the first spec in the .set.asn, i.e. those + from File1.asn. +

+
+ +
+ + The ASN.1 Types +

This section describes the ASN.1 types including their + functionality, purpose and how values are assigned in Erlang. +

+

ASN.1 has both primitive and constructed types:

+

+ + + Primitive types + Constructed types + + + BOOLEAN + SEQUENCE + + + INTEGER + SET + + + REAL + CHOICE + + + NULL + SET OF and SEQUENCE OF + + + ENUMERATED + ANY + + + BIT STRING + ANY DEFINED BY + + + OCTET STRING + EXTERNAL + + + Character Strings + EMBEDDED PDV + + + OBJECT IDENTIFIER + CHARACTER STRING + + + Object Descriptor + + + + The TIME types + + + The supported ASN.1 types +
+ + +

Values of each ASN.1 type has its own representation in Erlang + described in the following subsections. Users shall provide + these values for encoding according to the representation, as + in the example below.

+
+
+Operational ::= BOOLEAN --ASN.1 definition    
+

In Erlang code it may look like:

+
+Val = true,
+{ok,Bytes}=asn1rt:encode(MyModule,'Operational',Val),    
+

For historical reasons it is also possible to assign ASN.1 values + in Erlang using a tuple notation + with type and value as this

+
+Val = {'Operational',true}    
+ + +

The tuple notation, {Typename, Value} is only kept + because of backward compatibility and may be withdrawn in a + future release. If the notation is used the Typename + element must be spelled correctly, otherwise a run-time error + will occur. +

+

If the ASN.1 module is compiled with the flags + per_bin or ber_bin and optimize it is not + allowed to use the tuple notation. That possibility has been + removed due to performance reasons. Neither is it allowed to + use the {ComponentName,Value} notation in case of a + SEQUENCE or SET type.

+
+

Below follows a description of how + values of each type can be represented in Erlang. +

+ +
+ + BOOLEAN +

Booleans in ASN.1 express values that can be either + TRUE or FALSE. + The meanings assigned to TRUE or FALSE is beyond the scope + of this text.

+ + In ASN.1 it is possible to have:

+
+Operational ::= BOOLEAN
+      
+

Assigning a value to the type Operational in Erlang is possible by + using the following Erlang code:

+ +Myvar1 = true, + +

Thus, in Erlang the atoms true and false are used + to encode a boolean value.

+
+ +
+ + INTEGER +

ASN.1 itself specifies indefinitely large integers, and the Erlang + systems with versions 4.3 and higher, support very large + integers, in practice indefinitely large integers.

+

The concept of sub-typing can be applied to integers as well + as to other ASN.1 types. The details of sub-typing are not + explained here, for further info see []. A variety + of syntaxes are allowed when defining a type as an integer:

+
+T1 ::= INTEGER
+T2 ::= INTEGER (-2..7)
+T3 ::= INTEGER (0..MAX)
+T4 ::= INTEGER (0<..MAX)
+T5 ::= INTEGER (MIN<..-99)
+T6 ::= INTEGER {red(0),blue(1),white(2)}
+      
+

The Erlang representation of an ASN.1 INTEGER is an integer or + an atom if a so called \011Named NumberList (see T6 above) + is specified.

+

Below is an example of Erlang code which assigns values for the + above types:

+
+T1value = 0,
+T2value = 6,
+T6value1 = blue,
+T6value2 = 0,
+T6value3 = white
+      
+

The Erlang variables above are now bound to valid instances of + ASN.1 defined types. This style of value can be passed directly + to the encoder for transformation into a series of bytes.

+

The decoder will return an atom if the value corresponds to a + symbol in the Named NumberList.

+
+ +
+ + REAL +

In this version reals are not implemented. When they are, + the following + ASN.1 type is used:

+
+R1 ::= REAL
+      
+

Can be assigned a value in Erlang as:

+
+R1value1 = 2.14,
+R1value2 = {256,10,-2},
+      
+

In the last line note that the tuple {256,10,-2} is the real number + 2.56 in a special notation, which will encode faster than simply + stating the number as 2.56. The arity three tuple is + {Mantissa,Base,Exponent} i.e. Mantissa * Base^Exponent.

+
+ +
+ + NULL +

Null is suitable in cases where supply and recognition of a value + is important but the actual value is not.

+
+Notype ::= NULL
+      
+

The NULL type can be assigned in Erlang:

+
+N1 = 'NULL',
+      
+

The actual value is the quoted atom 'NULL'.

+
+ +
+ + ENUMERATED +

The enumerated type can be used, when the value we wish to + describe, may only take one of a set of predefined values.

+
+DaysOfTheWeek ::= ENUMERATED { sunday(1),monday(2),tuesday(3),
+\011wednesday(4),thursday(5),friday(6),saturday(7) }
+      
+

For example to assign a weekday value in Erlang use the same atom + as in the Enumerations of the type definition:

+
+Day1 = saturday,
+      
+

The enumerated type is very similar to an integer type, when + defined with a set of predefined values. An enumerated type + differs from an integer in that it may only have specified + values, whereas an integer can also have any other value.

+
+ +
+ + BIT STRING +

The BIT STRING type can be used to model information which + is made up of arbitrary length series of bits. It is intended + to be used for a selection of flags, not for binary files.

+ + In ASN.1 BIT STRING definitions may look like: +

+
+Bits1 ::= BIT STRING
+Bits2 ::= BIT STRING {foo(0),bar(1),gnu(2),gnome(3),punk(14)}
+      
+

There are four different notations available for representation of + BIT STRING values in Erlang and as input to the encode functions.

+ + A list of binary digits (0 or 1). + A hexadecimal number (or an integer). This format should be + avoided, since it is easy to misinterpret a BIT STRING + value in this format. This format may be withdrawn in a future + release. + A list of atoms corresponding to atoms in the NamedBitList + in the BIT STRING definition. + As {Unused,Binary} where Unused denotes how + many trailing zero-bits 0 to 7 that are unused in the least + significant byte in Binary. This notation is only + available when the ASN.1 files have been compiled with the + +compact_bit_string flag in the option list. In + this case it is possible to use all kinds of notation when + encoding. But the result when decoding is always in the + compact form. The benefit from this notation is a more + compact notation when one has large BIT STRINGs. The + encode/decode performance is also much better in the case of + large BIT STRINGs. + + +

Note that it is advised not to use the integer format of a + BIT STRING, see the second point above.

+
+
+Bits1Val1 = [0,1,0,1,1],
+Bits1Val2 = 16#1A,
+Bits1Val3 = {3,<<0:1,1:1,0:1,1:1,1:1,0:3>>}
+      
+

Note that Bits1Val1, Bits1Val2 and Bits1Val3 + denote the same value.

+
+Bits2Val1 = [gnu,punk],
+Bits2Val2 = 2#1110,
+Bits2Val3 = [bar,gnu,gnome],
+Bits2Val4 = [0,1,1,1]
+      
+

The above Bits2Val2, Bits2Val3 and Bits2Val4 + also all denote the same value.

+

Bits2Val1 is assigned symbolic values. The assignment means + that the bits corresponding to gnu and punk i.e. bits + 2 and 14 are set to 1 and the rest set to 0. The symbolic values + appear as a list of values. If a named value appears, which is not + specified in the type definition, a run-time error will occur.

+

The compact notation equivalent to the empty BIT STRING is + >}]]>, which in the other notations is [] or + 0.

+

BIT STRINGS may also be sub-typed with for example a SIZE + specification:

+
+Bits3 ::= BIT STRING (SIZE(0..31))      
+

This means that no bit higher than 31 can ever be set.

+
+ +
+ + OCTET STRING +

The OCTET STRING is the simplest of all ASN.1 types The OCTET STRING + only moves or transfers e.g. binary files or other unstructured + information complying to two rules. + Firstly, the bytes consist of octets and secondly, encoding is + not required.

+

It is possible to have the following ASN.1 type definitions:

+
+O1 ::= OCTET STRING
+O2 ::= OCTET STRING (SIZE(28))      
+

With the following example assignments in Erlang:

+
+O1Val = [17,13,19,20,0,0,255,254],
+O2Val = "must be exactly 28 chars....",      
+

Observe that O1Val is assigned a series of numbers between 0 + and 255 i.e. octets. + O2Val is assigned using the string notation. +

+
+ +
+ + Character Strings +

ASN.1 supports a wide variety of character sets. The main difference + between OCTET STRINGS and the Character strings is that OCTET + STRINGS have no imposed semantics on the bytes delivered.

+

However, when using for instance the IA5String (which closely + resembles ASCII) the byte 65 (in decimal + notation) means the character 'A'. +

+

For example, if a defined type is to be a VideotexString and + an octet is received with the unsigned integer value X, then + the octet should be interpreted as specified in the standard + ITU-T T.100,T.101. +

+

The ASN.1 to Erlang compiler + will not determine the correct interpretation of each BER + (Basic Encoding Rules) string octet value with different + Character strings. Interpretation of octets is the + responsibility of the application. Therefore, from the BER + string point of view, octets appear to be very similar to + character strings and are compiled in the same way. +

+

It should be noted that when PER (Packed Encoding Rules) is + used, there is a significant difference in the encoding scheme + between OCTET STRINGS and other strings. The constraints + specified for a type are especially important for PER, where + they affect the encoding. +

+

Please note that all the Character strings are + supported and it is possible to use the following ASN.1 type + definitions:

+
+Digs ::= NumericString (SIZE(1..3))
+TextFile ::= IA5String (SIZE(0..64000))      
+

and the following Erlang assignments:

+
+DigsVal1 = "456",
+DigsVal2 = "123",
+TextFileVal1 = "abc...xyz...",
+TextFileVal2 = [88,76,55,44,99,121 .......... a lot of characters here ....]        
+

The Erlang representation for "BMPString" and + "UniversalString" is either a list of ASCII values or a list + of quadruples. The quadruple representation associates to the + Unicode standard representation of characters. The ASCII + characters are all represented by quadruples beginning with + three zeros like {0,0,0,65} for the 'A' character. When + decoding a value for these strings the result is a list of + quadruples, or integers when the value is an ASCII character. + The following example shows how it works:

+

In a file PrimStrings.asn1 the type BMP is defined as +

+BMP ::= BMPString then using BER encoding (ber_bin + option)the input/output format will be:

+
+1> {ok,Bytes1} = asn1rt:encode('PrimStrings','BMP',[{0,0,53,53},{0,0,45,56}]).
+{ok,[30,4,"55-8"]}
+2> asn1rt:decode('PrimStrings','BMP',list_to_binary(Bytes1)).
+{ok,[{0,0,53,53},{0,0,45,56}]}
+3> {ok,Bytes2} = asn1rt:encode('PrimStrings','BMP',[{0,0,53,53},{0,0,0,65}]).
+{ok,[30,4,[53,53,0,65]]}
+4> asn1rt:decode('PrimStrings','BMP',list_to_binary(Bytes2)).
+{ok,[{0,0,53,53},65]}
+5> {ok,Bytes3} = asn1rt:encode('PrimStrings','BMP',"BMP string").
+{ok,[30,20,[0,66,0,77,0,80,0,32,0,115,0,116,0,114,0,105,0,110,0,103]]}
+6> asn1rt:decode('PrimStrings','BMP',list_to_binary(Bytes3)).
+{ok,"BMP string"}      
+

The UTF8String is represented in Erlang as a list of integers, + where each integer represents the unicode value of one + character. When a value shall be encoded one first has to + transform it to a UTF8 encoded binary, then it can be encoded by + asn1. When decoding the result is a UTF8 encoded binary, which + may be transformed to an integer list. The transformation + functions, utf8_binary_to_list and + utf8_list_to_binary, are in the asn1rt module. In + the example below we assume an asn1 definition UTF ::= UTF8String in a module UTF.asn:

+
+1> asn1ct:compile('UTF',[ber_bin]).
+Erlang ASN.1 version "1.4.3.3" compiling "UTF.asn" 
+Compiler Options: [ber_bin]
+--{generated,"UTF.asn1db"}--
+--{generated,"UTF.erl"}--
+ok
+2> UTF8Val1 = "hello".
+"hello"
+3> {ok,UTF8bin1} = asn1rt:utf8_list_to_binary(UTF8Val1).
+{ok,<<104,101,108,108,111>>}
+4> {ok,B}='UTF':encode('UTF',UTF8bin1).
+{ok,[12,
+     5,
+     <<104,101,108,108,111>>]}
+5> Bin = list_to_binary(B).
+<<12,5,104,101,108,108,111>>
+6> {ok,UTF8bin1}='UTF':decode('UTF',Bin).
+{ok,<<104,101,108,108,111>>}
+7> asn1rt:utf8_binary_to_list(UTF8bin1).
+{ok,"hello"}           
+8> UTF8Val2 = [16#00,16#100,16#ffff,16#ffffff].
+[0,256,65535,16777215]
+9> {ok,UTF8bin2} = asn1rt:utf8_list_to_binary(UTF8Val2).
+{ok,<<0,196,128,239,191,191,248,191,191,191,191>>}
+10> {ok,B2} = 'UTF':encode('UTF',UTF8bin2).
+{ok,[12,
+     11,
+     <<0,196,128,239,191,191,248,191,191,191,191>>]}
+11> Bin2 = list_to_binary(B2).
+<<12,11,0,196,128,239,191,191,248,191,191,191,191>>
+12> {ok,UTF8bin2} = 'UTF':decode('UTF',Bin2).
+{ok,<<0,196,128,239,191,191,248,191,191,191,191>>}
+13> asn1rt:utf8_binary_to_list(UTF8bin2).
+{ok,[0,256,65535,16777215]}
+14>       
+
+ +
+ + OBJECT IDENTIFIER +

The OBJECT IDENTIFIER is used whenever a unique identity is required. + An ASN.1 module, a transfer syntax, etc. is identified with an + OBJECT IDENTIFIER. Assume the example below:

+
+Oid ::= OBJECT IDENTIFIER
+      
+

Therefore, the example below is a valid Erlang instance of the + type 'Oid'.

+
+OidVal1 = {1,2,55},
+      
+

The OBJECT IDENTIFIER value is simply a tuple with the + consecutive values which must be integers. +

+

The first value is limited to the values 0, 1 or 2 and the + second value must be in the range 0..39 when the first value + is 0 or 1. +

+

The OBJECT IDENTIFIER is a very important type and it is + widely used within different standards to uniquely identify + various objects. In [], there is an + easy-to-understand description of the usage of + OBJECT IDENTIFIER.

+

+
+ +
+ + Object Descriptor +

Values of this type can be assigned a value as an ordinary string i.e.

+ + "This is the value of an Object descriptor"

+
+ +
+ + The TIME Types +

Two different time types are defined within ASN.1, Generalized + Time and UTC (Universal Time Coordinated), both are assigned a + value as an ordinary string within double quotes i.e. + "19820102070533.8".

+

In case of DER encoding the compiler does not check the validity + of the time values. The DER requirements upon those strings is + regarded as a matter for the application to fulfill.

+
+ +
+ + SEQUENCE +

The structured types of ASN.1 are constructed from other types + in a manner similar to the concepts of array and struct in C. +

+ A SEQUENCE in ASN.1 is + comparable with a struct in C and a record in Erlang. + A SEQUENCE may be defined as:

+
+Pdu ::= SEQUENCE {
+   a INTEGER,
+   b REAL,
+   c OBJECT IDENTIFIER,
+   d NULL }      
+

This is a 4-component structure called 'Pdu'. The major format + for representation of SEQUENCE in Erlang is the record format. + For each SEQUENCE and SET in an ASN.1 module an Erlang + record declaration is generated. For Pdu above, a record + like this is defined:

+
+-record('Pdu',{a, b, c, d}).      
+

The record declarations for a module M are placed in a + separate M.hrl file.

+

Values can be assigned in Erlang as shown below:

+
+MyPdu = #'Pdu'{a=22,b=77.99,c={0,1,2,3,4},d='NULL'}.      
+

It is also possible to specify the value for each component in + a SEQUENCE or a SET as {ComponentName,Value}. It is not + recommended and is not supported if the flags per_bin or + ber_bin and optimize were used when the module was + compiled.

+

The decode functions will return a record as result when decoding + a SEQUENCE or a SET. + +

+

A SEQUENCE and a SET may contain a component with a + DEFAULT key word followed by the actual value that is the + default value. In case of BER encoding it is optional to encode the + value if it equals the default value. If the application uses the + atom asn1_DEFAULT as value or if the value is a primitive value + that equals the default value the encoding omits the bytes for + this value, which is more efficient and it results in fever + bytes to send to the receiving application.

+

For instance, if the following types exists in a file "File.asn":

+
+Seq1 ::= SEQUENCE {
+\011a  INTEGER DEFAULT 1,
+\011b  Seq2 DEFAULT {aa TRUE, bb 15}
+}
+
+Seq2 ::= SEQUENCE {
+\011aa BOOLEAN,
+\011bb INTEGER
+}
+      
+

Some values and the corresponding encoding in an Erlang terminal + is shown below:

+
+1> asn1ct:compile('File').
+Erlang ASN.1 version "1.3.2" compiling "File.asn1" 
+Compiler Options: []
+--{generated,"File.asn1db"}--
+--{generated,"File.hrl"}--
+--{generated,"File.erl"}--
+ok
+2> 'File':encode('Seq1',{'Seq1',asn1_DEFAULT,asn1_DEFAULT}).
+{ok,["0",[0],[[],[]]]}
+3> lists:flatten(["0",[0],[[],[]]]).
+[48,0]
+4> 'File':encode('Seq1',{'Seq1',1,{'Seq2',true,15}}).
+{ok,["0","\\b",[[],["\\241",[6],[[[128],[1],"\\377"],[[129],[1],[15]]]]]]}
+5> lists:flatten(["0","\\b",[[],["\\241",[6],[[[128],[1],"\\377"],[[129],[1],[15]]]]]]).
+[48,8,161,6,128,1,255,129,1,15]
+6>      
+

The result after command line 3, in the example above,shows that the + encoder omits the encoding of default values when they are specific + by asn1_DEFAULT. Line 5 shows that even primitive values that equals + the default value are detected and not encoded. But the constructed + value of component b in Seq1 is not recognized as the + default value. Checking of default values in BER is not done + in case of complex values, because it would be to expensive. + +

+

But, the DER encoding format has stronger requirements regarding + default\011values both for SET and SEQUENCE. A more elaborate and time + expensive check of default values will take place. The following is + an example with the same types and values as above but with der + encoding format.

+
+1> asn1ct:compile('File',[der]).
+Erlang ASN.1 version "1.3.2" compiling "File.asn1" 
+Compiler Options: [der]
+--{generated,"File.asn1db"}--
+--{generated,"File.hrl"}--
+--{generated,"File.erl"}--
+ok
+2> 'File':encode('Seq1',{'Seq1',asn1_DEFAULT,asn1_DEFAULT}).
+{ok,["0",[0],[[],[]]]}
+3> lists:flatten(["0",[0],[[],[]]]).
+[48,0]
+4> 'File':encode('Seq1',{'Seq1',1,{'Seq2',true,15}}).
+{ok,["0",[0],[[],[]]]}
+5> lists:flatten(["0",[0],[[],[]]]).
+[48,0]
+6> 
+      
+

Line 5 shows that even values of constructed types is checked and if + it equals the default value it will not be encoded.

+
+ +
+ + SET +

The SET type is an unusual construct and normally the SEQUENCE + type is more appropriate to use. Set is also inefficient compared with SEQUENCE, as the components can be in any order. Hence, it must be possible + to distinguish every component in 'SET', both when + encoding and decoding a value of a type defined to be a SET. + The tags of all components must be different from each other + in order to be easily recognizable.

+

A SET may be defined as:

+
+Pdu2 ::= SET {
+    a INTEGER,
+    b BOOLEAN,
+    c ENUMERATED {on(0),off(1)} }      
+

A SET is represented as an Erlang record. + For each SEQUENCE and SET in + an ASN.1 module an Erlang record declaration is generated. For + Pdu2 above a record is defined like this:

+
+-record('Pdu2',{a, b, c}).      
+

The record declarations for a module M are placed in a + separate M.hrl file.

+

Values can be assigned in Erlang as demonstrated below:

+
+V = #'Pdu2'{a=44,b=false,c=off}.      
+

The decode functions will return a record as result when decoding + a SET. +

+

The difference between SET and SEQUENCE is that the order of + the components (in the BER encoded format) is undefined for SET + and defined as the lexical order from the ASN.1 definition for + SEQUENCE. The ASN.1 compiler for Erlang will always encode a + SET in the lexical order. The decode routines can handle SET + components encoded in any order but will always return the + result as a record. Since all components of the SET must be + distinguishable both in the encoding phase as well as the + decoding phase the following type is not allowed in a module + with EXPLICIT or IMPLICIT as tag-default :

+

+
+Bad ::= SET {i INTEGER,
+             j INTEGER }      
+

The ASN.1 to Erlang compiler rejects the above type. We + shall not explain the concept of tag further here, we refer to + []. +

+

Encoding of a SET with components with DEFAULT values behaves + similar as a SEQUENCE, see above. The DER encoding format restrictions on DEFAULT + values is the same for SET as for SEQUENCE, and is supported by + the compiler, see above.

+

Moreover, in DER the elements of a SET will be sorted. If a + component is an untagged choice the sorting have to take place + in run-time. This fact emphasizes the following recommendation + if DER encoding format is used.

+

The concept of SET is an unusual + construct and one cannot think of one single application + where the set type is essential. (Imagine if someone + "invented'' the shuffled array in 'C') People tend to think + that 'SET' sounds nicer and more mathematical than 'SEQUENCE' + and hence use it when 'SEQUENCE' would have been more + appropriate. It is also most inefficient, since every correct + implementation of SET must always be prepared to accept the + components in any order. So, if possible use SEQUENCE instead + of SET.

+
+ +
+ Notes about Extendability for SEQUENCE and SET +

When a SEQUENCE or SET contains an extension marker and + extension components like this:

+
+SExt ::= SEQUENCE {
+           a INTEGER,
+           ...,
+           b BOOLEAN }
+      
+

It means that the type may get more components in newer + versions of the ASN.1 spec. In this case it has got a new + component b. Thus, incoming messages that will be decoded + may have more or fever components than this one. +

+

The component b will be treated as + an original component when encoding a message. In this case, as + it is not an optional element, it must be encoded. +

+

During decoding the b field of the record will get the decoded + value of the b + component if present and otherwise the value asn1_NOVALUE.

+
+ +
+ + CHOICE +

The CHOICE type is a space saver and is similar to the concept of a + 'union' in the C-language. As with the previous SET-type, the + tags of all components of a CHOICE need to be distinct. If + AUTOMATIC TAGS are defined for the module (which is + preferable) the tags can be omitted completely in the ASN.1 + specification of a CHOICE. +

+

Assume:

+
+T ::= CHOICE {
+        x [0] REAL,
+        y [1] INTEGER,
+        z [2] OBJECT IDENTIFIER }
+      
+

It is then possible to assign values:

+
+TVal1 = {y,17},
+TVal2 = {z,{0,1,2}},
+      
+

A CHOICE value is always represented as the tuple + {ChoiceAlternative, Val} where ChoiceAlternative + is an atom denoting the selected choice + alternative. +

+

It is also allowed to have a CHOICE type tagged as follow:

+

+
+C ::= [PRIVATE 111] CHOICE {
+        C1,
+        C2 }
+
+C1 ::= CHOICE { 
+         a [0] INTEGER,
+         b [1] BOOLEAN }
+
+C2 ::= CHOICE {
+         c [2] INTEGER,
+         d [3] OCTET STRING }      
+

In this case, the top type C appears to have no tags at all in + its components, however, both C1 and C2 are also defined as + CHOICE types and they have distinct tags among themselves. + Hence, the above type C is both legal and allowed. +

+ +
+ Extendable CHOICE +

When a CHOICE contains an extension marker and the decoder detects + an unknown alternative of the CHIOCE the value is represented as:

+
+\011  {asn1_ExtAlt, BytesForOpenType}
+        
+

Where BytesForOpenType is a list of bytes constituting the + encoding of the "unknown" CHOICE alternative.

+
+
+ +
+ + SET OF and SEQUENCE OF +

The SET OF and SEQUENCE OF types correspond to the concept of an array + found in several programming languages. The Erlang syntax for + both of these types is straight forward. For example:

+
+Arr1 ::= SET SIZE (5) OF INTEGER (4..9) 
+Arr2 ::= SEQUENCE OF OCTET STRING      
+

We may have the following in Erlang:

+
+Arr1Val = [4,5,6,7,8],
+Arr2Val = ["abc",[14,34,54],"Octets"],      
+

Please note that the definition of the SET OF type implies that + the order of the components is undefined, but in practice there is + no difference between SET OF and SEQUENCE OF. The ASN.1 compiler + for Erlang does not randomize the order of the SET OF components + before encoding.

+

However, in case of a value of the type SET OF, the DER + encoding format requires the elements to be sent in ascending + order of their encoding, which implies an expensive sorting + procedure in run-time. Therefore it is strongly recommended to + use SEQUENCE OF instead of SET OF if it is possible.

+
+ +
+ + ANY and ANY DEFINED BY +

The types ANY and ANY DEFINED BY have been removed + from the standard since 1994. It is recommended not to use + these types any more. They may, however, exist in some old ASN.1 + modules. + The idea with this type was to leave a "hole" in a definition where + one could put unspecified data of any kind, even non ASN.1 data.

+

A value of this type is encoded as an open type.

+

Instead of ANY/ANY DEFINED BY one should use + information object class, table constraints and + parameterization. In particular the construct + TYPE-IDENTIFIER.@Type accomplish the same as the + deprecated ANY.

+

See also Information object

+
+ +
+ + EXTERNAL, EMBEDDED PDV and CHARACTER STRING +

These types are used in presentation layer negotiation. They are + encoded according to their associated type, see [].

+

The EXTERNAL type had a slightly different associated type + before 1994. [] states that encoding shall follow + the older associate type. Therefore does generated encode/decode + functions convert values of the newer format to the older format + before encoding. This implies that it is allowed to use + EXTERNAL type values of either format for encoding. Decoded + values are always returned on the newer format.

+
+ +
+ Embedded Named Types +

The structured types previously described may very well have other named types + as their components. The general syntax to assign a value to the component C + of a named ASN.1 type T in Erlang is the record syntax + #'T'{'C'=Value}. + Where Value may be a value of yet another type T2.

+

For example:

+
+B ::= SEQUENCE {
+        a Arr1,
+        b [0] T }
+
+Arr1 ::= SET SIZE (5) OF INTEGER (4..9) 
+
+T ::= CHOICE {
+        x [0] REAL,
+        y [1] INTEGER,
+        z [2] OBJECT IDENTIFIER }      
+

The above example can be assigned like this in Erlang:

+
+V2 = #'B'{a=[4,5,6,7,8], b={x,7.77}}.
+      
+
+
+ +
+ Naming of Records in .hrl Files +

When an asn1 specification is compiled all defined types of + type SET or SEQUENCE will result in a corresponding record in the + generated hrl file. This is because the values for SET/SEQUENCE + as mentioned in sections above are represented as records.

+

Though there are some special cases of this functionality that + are presented below.

+ +
+ Embedded Structured Types +

It is also possible in ASN.1 to have components that are themselves + structured types. + For example, it is possible to have:

+
+Emb ::= SEQUENCE {
+    a SEQUENCE OF OCTET STRING,
+    b SET {
+       a [0] INTEGER,
+       b [1] INTEGER DEFAULT 66},
+    c CHOICE {
+       a INTEGER,
+       b FooType } }
+
+FooType ::= [3] VisibleString      
+

The following records are generated because of the type Emb:

+
+-record('Emb,{a, b, c}).
+-record('Emb_b',{a, b = asn1_DEFAULT}). % the embedded SET type
+      
+

Values of the Emb type can be assigned like this:

+ +V = #'Emb'{a=["qqqq",[1,2,255]], + b = #'Emb_b'{a=99}, + c ={b,"Can you see this"}}. + +

For an embedded type of type SEQUENCE/SET in a SEQUENCE/SET + the record name is extended with an underscore and the component + name. If the embedded structure is deeper with SEQUENCE, SET or + CHOICE types in the line, each component-/alternative-name will + be added to the recordname.

+

For example:

+
+Seq ::= SEQUENCE{
+    a\011CHOICE{
+\011b SEQUENCE {
+\011   c  INTEGER
+\011   }
+\011}
+}      
+

will result in the following record:

+
+-record('Seq_a_b',{c}).      
+

If the structured type has a component with an embedded + SEQUENCE OF/SET OF which embedded type in turn is a + SEQUENCE/SET it will give a record with the SEQOF/SETOF + addition as in the following example:

+
+Seq ::= SEQUENCE {
+    a SEQUENCE OF SEQUENCE {
+\011       b
+               }
+    c SET OF SEQUENCE {
+\011       d
+               }
+}      
+

This results in the records:

+
+-record('Seq_a_SEQOF'{b}).
+-record('Seq_c_SETOF'{d}).      
+

A parameterized type should be considered as an embedded + type. Each time a such type is referenced an instance of it is + defined. Thus in the following example a record with name + 'Seq_b' is generated in the .hrl file and used to hold + values.

+
+Seq ::= SEQUENCE {
+    b PType{INTEGER}
+}
+
+PType{T} ::= SEQUENCE{
+    id T
+}      
+
+ +
+ Recursive Types +

Types may refer to themselves. Suppose:

+
+Rec ::= CHOICE {
+     nothing [0] NULL,
+     something SEQUENCE {
+          a INTEGER,
+          b OCTET STRING,
+          c Rec }}      
+

This type is recursive; that is, it refers to itself. This is allowed + in ASN.1 and the ASN.1-to-Erlang compiler supports this recursive + type. A value for this type is assigned in Erlang as shown below:

+
+V = {something,#'Rec_something'{a = 77, 
+                                b = "some octets here", 
+                                c = {nothing,'NULL'}}}.      
+
+
+ +
+ ASN.1 Values +

Values can be assigned to ASN.1 type within the ASN.1 code + itself, as opposed to the actions taken in the previous chapter where + a value was assigned to an ASN.1 type in Erlang. The full value + syntax of ASN.1 is supported and [X.680] describes in detail how + to assign values in ASN.1. Below is a short example:

+
+TT ::= SEQUENCE {
+   a INTEGER,
+   b SET OF OCTET STRING }
+
+tt TT ::= {a 77,b {"kalle","kula"}}    
+

The value defined here could be used in several ways. + Firstly, it could be used as the value in some DEFAULT component:

+
+SS ::= SET {
+    s [0] OBJECT IDENTIFIER,
+    val TT DEFAULT tt }    
+

It could also be used from inside an Erlang program. If the above ASN.1 + code was defined in ASN.1 module Values, then the ASN.1 value + tt can be reached from Erlang as + a function call to 'Values':tt() as in the example below.

+
+1> Val = 'Values':tt().
+{'TT',77,["kalle","kula"]}
+2> {ok,Bytes} = 'Values':encode('TT',Val).
+{ok,["0",
+     [18],
+     [[[128],[1],"M"],["\\241","\\r",[[[4],[5],"kalle"],[[4],[4],"kula"]]]]]}
+3> FlatBytes = lists:flatten(Bytes).
+[48,18,128,1,77,161,13,4,5,107,97,108,108,101,4,4,107,117,108,97]
+4> 'Values':decode('TT',FlatBytes).
+{ok,{'TT',77,["kalle","kula"]}}
+5>
+    
+

The above example shows that a function is generated by the compiler + that returns a valid Erlang representation of the value, even though + the value is of a complex type.

+

Furthermore, there is a macro generated for each value in the .hrl + file. So, the defined value tt can also be extracted by + ?tt in application code.

+
+ +
+ Macros +

MACRO is not supported as the the type is no longer part of the + ASN.1 standard.

+
+ +
+ + ASN.1 Information Objects (X.681) +

Information Object Classes, Information Objects and Information + Object Sets, (in the following called classes, objects and + object sets respectively), are defined in the standard + definition []. In the following only a brief + explanation is given.

+

These constructs makes it possible to define open types, + i.e. values of that type can be of any ASN.1 type. It is also + possible to define relationships between different types and + values, since classes can hold types, values, objects, object + sets and other classes in its fields. + An Information Object Class may be defined in ASN.1 as:

+
+GENERAL-PROCEDURE ::= CLASS {
+      &Message,
+      &Reply               OPTIONAL,
+      &Error               OPTIONAL,
+      &id          PrintableString UNIQUE
+}
+WITH SYNTAX {
+      NEW MESSAGE     &Message
+      [REPLY           &Reply]
+      [ERROR           &Error]
+      ADDRESS          &id
+}    
+

An object is an instance of a class and an object set is a set + containing objects of one specified class. A definition may look like + below.

+

The object object1 is an instance of the CLASS + GENERAL-PROCEDURE and has one type field and one fixed type value + field. The object object2 also has an OPTIONAL field ERROR, + which is a type field.

+
+object1 GENERAL-PROCEDURE ::= {
+    NEW MESSAGE      PrintableString
+    ADDRESS          "home"
+}
+
+object2 GENERAL-PROCEDURE ::= {
+    NEW MESSAGE INTEGER
+    ERROR INTEGER
+    ADDRESS "remote"
+}    
+

The field ADDRESS is a UNIQUE field. Objects in an object set must + have unique values in their UNIQUE field, as in GENERAL-PROCEDURES:

+
+GENERAL-PROCEDURES GENERAL-PROCEDURE ::= {
+    object1 | object2}    
+

One can not encode a class, object or object set, only referring to + it when defining other ASN.1 entities. Typically one refers to a + class and to object sets by table constraints and component + relation constraints [] in ASN.1 types, as in:

+
+StartMessage  ::= SEQUENCE {
+    msgId  GENERAL-PROCEDURE.&id  ({GENERAL-PROCEDURES}),
+    content GENERAL-PROCEDURE.&Message\011({GENERAL-PROCEDURES}{@msgId}),
+    }    
+

In the type StartMessage the constraint following the + content field tells that in a value of type + StartMessage the value in the content field must + come from the same object that is choosen by the msgId + field.

+

So, the value #'StartMessage'{msgId="home",content="Any Printable String"} is legal to encode as a StartMessage + value, while the value #'StartMessage'{msgId="remote", content="Some String"} is illegal since the constraint + in StartMessage tells that when you have choosen a value from a + specific object in the object set GENERAL-PROCEDURES in the + msgId field you have to choose a value from that same object in + the content field too. In this second case it should have been + any INTEGER value.

+

StartMessage can in the content field be + encoded with a value of any type that an object in the + GENERAL-PROCEDURES object set has in its NEW MESSAGE field. This field refers to a type field + in the class. The msgId field is always + encoded as a PrintableString, since the field refers to a fixed type + in the class.

+
+ +
+ Parameterization (X.683) +

Parameterization, which is defined in the standard [], can be used when defining types, values, value + sets, information object classes, information objects or + information object sets. + A part of a definition can be supplied as a parameter. For + instance, if a Type is used in a definition with certain + purpose, one want the typename to express the intention. This + can be done with parameterization.

+

When many types (or an other ASN.1 entity) only differs in some + minor cases, but the structure of the types are similar, only + one general type can be defined and the differences may be supplied + through parameters.

+

One example of use of parameterization is:

+
+General{Type} ::= SEQUENCE
+{
+     number     INTEGER,
+     string     Type
+}
+      
+T1 ::= General{PrintableString}
+
+T2 ::= General{BIT STRING}
+    
+

An example of a value that can be encoded as type T1 is {12,"hello"}.

+

Observe that the compiler not generates encode/decode functions for + parameterized types, only for the instances of the parameterized + types. So, if a file contains the types General{}, T1 and T2 above, + encode/decode functions will only be generated for T1 and T2. +

+
+ +
+ Tags +

Every built-in ASN.1 type, except CHOICE and ANY have a universal tag. + This is a unique number that clearly identifies the type.

+ + It is essential for all users of ASN.1 to + understand all the details about tags.

+

Tags are implicitly encoded in the BER encoding as shown below, but + are hardly not accounted for in the PER encoding. In PER tags are + used for instance to sort the components of a SET.

+

There are four different types of tags.

+ + universal + +

For types whose meaning is the same in all + applications. Such as integers, sequences and so on; that is, all the built in + types.

+
+ application + +

For application specific types for example, the types in + X.400 Message handling service have this sort of tag.

+
+ private + +

For your own private types.

+
+ context + +

This is used to distinguish otherwise indistinguishable + types in a specific context. For example, if we have two + components of a + CHOICE type that are both INTEGER values, there is no + way for the decoder to + decipher which component was actually chosen, since both + components will be + tagged as INTEGER. When this or similar situations occur, + one or both of the components should be given a context specific + to resolve the ambiguity.

+
+
+

The tag in the case of the 'Apdu' type [PRIVATE 1] is encoded to a + sequence of bytes making it possible for a + decoder to look at the (initial) bytes that arrive and determine + whether the rest of the bytes must be of the type associated + with that particular sequence of bytes. This means that each + tag must be uniquely associated with only one ASN.1 + type. +

+

Immediately following the tag is a sequence of bytes + informing the decoder of the length of the instance. This is + sometimes referred to as TLV (Tag length value) encoding. + Hence, the structure of a BER encoded series of bytes is as shown in the table below.

+

+ + + Tag + Len + Value + + Structure of a BER encoded series of bytes +
+
+ +
+ Encoding Rules +

When the first recommendation on ASN.1 was released 1988 it was + accompanied with the Basic Encoding Rules, BER, as the only + alternative for encoding. + BER is a somewhat verbose protocol. It adopts a so-called TLV (type, + length, value) approach to encoding in which every element of the + encoding carries some type information, some length information and + then the value of that element. Where the element is itself + structured, then the Value part of the element is itself a series of + embedded TLV components, to whatever depth is necessary. In summary, + BER is not a compact encoding but is relatively fast and easy to + produce.

+

The DER (Distinguished Encoding Rule) encoding format was included in + the standard in 1994. It is a specialized form of BER, which gives + the encoder the option to encode some entities differently. For + instance, is the value for TRUE any octet with any bit set to one. But, + DER does not leave any such choices. The value for TRUE in the DER + case is encoded as the octet 11111111. So, the same value + encoded by two different DER encoders must result in the same bit + stream.

+

A more compact encoding is achieved with the Packed Encoding + Rules PER which was introduced together with the revised + recommendation in 1994. PER takes a rather different approach from + that taken by BER. The first difference is that the tag part in + the TLV is omitted from the encodings, and any tags in the + notation are not encoded. The potential ambiguities are resolved + as follows:

+ + +

A CHOICE is encoded by first encoding a choice index which + identifies the chosen + alternative by its position in the notation.

+
+ +

The elements of a SEQUENCE are transmitted in textual + order. OPTIONAL or DEFAULT elements are preceded by a bit map + to identify which elements are present. After sorting the + elements of a SET in the "canonical tag order" as defined in + X.680 8.6 they are treated as a SEQUENCE regarding OPTIONAL + and DEFAULT elements. A SET is transferred in the sorted + order.

+
+
+

A second difference is that PER takes full account of the sub-typing + information in that the encoded bytes are affected by the constraints. + The BER encoded bytes are unaffected by the constraints. + PER uses the sub-typing information to for example omit length fields + whenever possible.

+

The run-time functions, sometimes take the constraints into account + both for BER and PER. For instance are SIZE constrained strings checked.

+

There are two variants of PER, aligned and unaligned. + In summary, PER results in compact encodings which require much more + computation to produce than BER. +

+
+
+ diff --git a/lib/asn1/doc/src/asn1ct.xml b/lib/asn1/doc/src/asn1ct.xml new file mode 100644 index 0000000000..9c04956e86 --- /dev/null +++ b/lib/asn1/doc/src/asn1ct.xml @@ -0,0 +1,379 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + asn1ct + Kenneth Lundin + Kenneth Lundin + 1 + Kenneth Lundin + + 97-10-14 + A + asn1.sgml +
+ asn1ct + ASN.1 compiler and compile-time support functions + +

The ASN.1 compiler takes an ASN.1 module as input and generates a + corresponding Erlang module which can encode and decode the data-types + specified. Alternatively the compiler takes a specification module + (se below) specifying all input modules and generates one module with + encode/decode functions. There are also some generic functions which + can be used in during development of applications which handles ASN.1 + data (encoded as BER or PER).

+
+ + + compile(Asn1module) -> ok | {error,Reason} + compile(Asn1module , Options) -> ok | {error,Reason} + Compile an ASN.1 module and generate encode/decode functions according to the encoding rules BER or PER. + + Asn1module = atom() | string() + Options = [Option| OldOption] + Option = ber_bin | per_bin | uper_bin | der | compact_bit_string | + noobj | {n2n,EnumTypeName} |{outdir,Dir} | {i,IncludeDir} | optimize | + driver | asn1config | undec_rest | {inline,OutputName} | inline + OldOption = ber | per + Reason = term() + + +

Compiles the ASN.1 module Asn1module and generates an + Erlang module Asn1module.erl with encode and decode + functions for the types defined in Asn1module. For each + ASN.1 value defined in the module an Erlang function which + returns the value in Erlang representation is generated.

+

If Asn1module is a filename without extension first + ".asn1" is assumed, then ".asn" and finally + ".py" (to be compatible with the old ASN.1 compiler). + Of course Asn1module can be a full pathname (relative or + absolute) including filename with (or without) extension. + +

+

If one wishes to compile a set of Asn1 modules into one + Erlang file with encode/decode functions one has to list all + involved files in a configuration file. This configuration + file must have a double extension ".set.asn", (".asn" can + alternatively be ".asn1" or ".py"). The input files' names + must be listed, within quotation marks (""), one at each row + in the file. If the input files are File1.asn, + File2.asn and File3.asn the configuration file + shall look like:

+
+File1.asn
+File2.asn
+File3.asn        
+

The output files will in this case get their names from the + configuration file. If the configuration file has the name + SetOfFiles.set.asn the name of the output files will be + SetOfFiles.hrl, SetOfFiles.erl and SetOfFiles.asn1db.

+

Sometimes in a system of ASN.1 modules there are different + default tag modes, e.g. AUTOMATIC, IMPLICIT or EXPLICIT. The + multi file compilation resolves the default tagging as if + the modules were compiled separately.

+

Another unwanted effect that may occur in multi file compilation + is name collisions. The compiler solves this problem in two + ways: If the definitions are identical then the output module + keeps only one definition with the original name. But if + definitions only have same name and differs in the definition, + then they will be renamed. The new names will be the definition + name and the original module name concatenated.

+

If any name collision have occurred the compiler reports a + "NOTICE: ..." message that tells if a definition was renamed, + and the new name that must be used to encode/decode data.

+ +

+ Options is a list with options specific for the asn1 + compiler and options that are applied to the Erlang compiler. + The latter are those that not is recognized as asn1 specific. + For preferred option use see Preferred Option Use + section in users guide. Available options are: +

+ + ber | ber_bin | per | per_bin | uper_bin + +

+ The encoding rule to be used. The supported encoding rules + are BER (Basic Encoding Rules), + PER aligned (Packed Encoding Rules) and PER unaligned. + If the encoding rule option is omitted ber + is the default. + The per_bin option means the aligned + variant. To use the unaligned variant the uper_bin + option has to be used. +

+

+ The generated Erlang module always gets the same name + as the ASN.1 module and as a consequence of this only one + encoding rule per ASN.1 module can be used at runtime. +

+

+ The ber_bin and per_bin options are + equivalent with the OldOptions ber and per + with the difference that the generated encoding/decoding + functions take advantage of the bit syntax, which in most + cases increases the performance considerably. The result + from encoding is a binary or an iolist. +

+
+ der + +

+ By this option the Distinguished Encoding Rules (DER) is chosen. + DER is regarded as a specialized variant of the BER encoding + rule, therefore the der option only makes sense together + with the ber or ber_bin option. + This option + sometimes adds sorting and value checks when encoding, which + implies a slower encoding. The decoding routines are the same + as for ber. +

+
+ compact_bit_string + +

+ Makes it possible to use a compact notation for values + of the BIT STRING type in Erlang. The notation: +

+
+BitString = {Unused,Binary},
+Unused = integer(),
+Binary = binary()            
+	    
+

+ Unused must be a number in the range 0 to 7. It + tells how many bits in the least significant byte in + Binary that is unused. + For details see + + BIT STRING type section in users guide + . +

+
+ {n2n,EnumTypeName} + +

+ Tells the compiler to generate functions for conversion between + names (as atoms) and numbers and vice versa for the EnumTypeName specified. There can be multiple occurrences of this option in order to specify several type names. The type names must be declared as ENUMERATIONS in the ASN.1 spec. + If the EnumTypeName does not exist in the ASN.1 spec the + compilation will stop with an error code. + The generated conversion functions are named + name2num_EnumTypeName/1 and + num2name_EnumTypeName/1. +

+
+ noobj + +

Do not compile (i.e do not produce object code) the generated + .erl file. If this option is omitted the generated Erlang module + will be compiled.

+
+ {i,IncludeDir} + +

Adds IncludeDir to the search-path for + .asn1db and asn1 source files. The compiler tries + to open a .asn1db file when a module imports + definitions from another ASN.1 module. If no + .asn1db file is found the asn1 source file is + parsed. Several {i,IncludeDir} can be given. +

+
+ {outdir,Dir} + +

Specifies the directory Dir where all generated files + shall be placed. If omitted the files are placed in the + current directory.

+
+ optimize + +

This option is only valid together with one of the + per_bin + or ber_bin option. It gives time optimized code + generated and it uses another runtime module and + in the per_bin case a linked-in driver. The result + in the per_bin case from an encode when compiled + with this option will be a binary.

+
+ driver + +

Option valid together with ber_bin and optimize + options. It enables the use of a linked-in driver that gives + considerable faster decode. In ber_bin the driver is + enabled only by explicit use of the option driver.

+
+ asn1config + +

When one of the specialized decodes, exclusive or + selective decode, is wanted one has to give instructions in + a configuration file. The option asn1config enables + specialized decodes and takes the configuration file, which + has the same name as the ASN.1 spec but with extension + .asn1config, in concern. +

+

The instructions for exclusive decode must follow the + instruction and grammar in the User's Guide. +

+

You can also find the instructions for selective decode + in the + User's Guide. +

+
+ undec_rest + +

A buffer that holds a message, being decoded may + also have some following bytes. Now it is possible to get + those following bytes returned together with the decoded + value. If an asn1 spec is compiled with this option a tuple + {ok,Value,Rest} is returned. Rest may be a + list or a binary. Earlier versions of the compiler ignored + those following bytes.

+
+ {inline,OutputName} + +

Compiling with this option gives one output module + containing all asn1 run-time functionality. The asn1 specs + are provided in a target module Module.set.asn as described + above. The name of the + resulting module containing generated encode/decode functions + and in-lined run-time functions will be + OutputName.erl. The merging/in-lining of code is done + by the igor module of syntax_tools. By default + the functions generated from the first asn1 spec in the + .set.asn are exported, unless a + {export,[atom()]} or {export_all,true} option + are provided. The list of atoms are names of chosen asn1 + specs from the .set.asn file.

+
+ inline + +

It is also possible to use the sole argument inline. + It is as {inline,OutputName}, but the output file gets the + default name of the source .set.asn file.

+
+
+

Any additional option that is applied will be passed to + the final step when the generated .erl file is compiled. +

+

The compiler generates the following files:

+ + +

Asn1module.hrl (if any SET or SEQUENCE is defined)

+
+ +

Asn1module.erl the Erlang module with encode, decode and value functions.

+
+ +

Asn1module.asn1db intermediate format used by the compiler when modules IMPORTS + definitions from each other.

+
+
+
+
+ + encode(Module,Type,Value)-> {ok,Bytes} | {error,Reason} + Encode an ASN.1 value. + + Module = Type = atom() + Value = term() + Bytes = [Int] when integer(Int), Int >= 0, Int =< 255 + Reason = term() + + +

Encodes Value of Type defined in the ASN.1 module + Module. Returns a list of bytes if successful. To get as fast execution as + possible the + encode function only performs rudimentary tests that the input + Value + is a correct instance of Type. The length of strings is for example + not always checked. Returns {ok,Bytes} if successful or + {error,Reason} if an error occurred. +

+
+
+ + decode(Module,Type,Bytes) -> {ok,Value}|{error,Reason} + Decode from Bytes into an ASN.1 value. + + Module = Type = atom() + Value = Reason = term() + Bytes = [Int] when integer(Int), Int >= 0, Int =< 255 + + +

Decodes Type from Module from the list of bytes + Bytes. Returns {ok,Value} if successful.

+
+
+ + validate(Module,Type,Value) -> ok | {error,Reason} + Validate an ASN.1 value. + + Module = Type = atom() + Value = term() + + +

Validates that Value conforms to Type + from Module. Not implemented in this version of the ASN.1 application.

+
+
+ + value(Module ,Type) -> {ok,Value} | {error,Reason} + Create an ASN.1 value for test purposes. + + Module = Type = atom() + Value = term() + Reason = term() + + +

Returns an Erlang term which is an example of a valid Erlang + representation of a value of the ASN.1 type Type. The value + is a random value and subsequent calls to this function will for most + types return different values.

+
+
+ + test(Module) -> ok | {error,Reason} + test(Module,Type) -> ok | {error,Reason} + test(Module,Type,Value) -> ok | {error,Reason} + Perform a test of encode and decode for types in an ASN.1 module. + +

Performs a test of encode and decode of all types in Module. + The generated functions are called by this function. + This function is useful during test to secure that the generated + encode and decode functions and the general runtime support work + as expected.

+test/1 iterates over all types in Module.

+test/2 tests type Type with a random value.

+Type]]> with Value.

+ + Schematically the following happens for each type in the module.

+

+ +{ok,Value} = asn1ct:value(Module,Type), +{ok,Bytes} = asn1ct:encode(Module,Type,Value), +{ok,Value} = asn1ct:decode(Module,Type,Bytes). +
+
+
+ +
+ diff --git a/lib/asn1/doc/src/asn1rt.xml b/lib/asn1/doc/src/asn1rt.xml new file mode 100644 index 0000000000..1217a07e9b --- /dev/null +++ b/lib/asn1/doc/src/asn1rt.xml @@ -0,0 +1,208 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + asn1rt + Kenneth Lundin + Kenneth Lundin + 1 + Kenneth Lundin + + 97-10-04 + A + asn1.sgml +
+ asn1rt + ASN.1 runtime support functions + +

This module is the interface module for the ASN.1 runtime support functions. + To encode and decode ASN.1 types in runtime the functions in this module + should be used.

+
+ + + + + start() -> ok |{error,Reason} + Starts the asn1 server. + + Reason = term() + + +

Starts the asn1 server that loads the drivers.

+

The server schedules a driver that is not blocked by + another caller. The driver is used by the asn1 application if + specs are compiled with options [per_bin, optimize] or + [ber_bin, optimize, driver]. The server will be started + automatically at encode/decode if it isn't done explicitly. If + encode/decode with driver is used in test or industrial code + it is a performance gain to start it explicitly to avoid the + one time load in run-time.

+
+
+ + + stop() -> ok |{error,Reason} + Stops the asn1 server. + + Reason = term() + + +

Stops the asn1 server and unloads the drivers.

+
+
+ + + decode(Module,Type,Bytes) -> {ok,Value}|{error,Reason} + Decode from bytes into an ASN.1 value. + + Module = Type = atom() + Value = Reason = term() + Bytes = binary | [Int] when integer(Int), Int >= 0, Int =< 255 | binary + + +

Decodes Type from Module from the list of bytes or + binary Bytes. If the module is compiled with ber_bin + or per_bin option Bytes must be a binary. + Returns {ok,Value} if successful.

+
+
+ + + encode(Module,Type,Value)-> {ok,BinOrList} | {error,Reason} + Encode an ASN.1 value. + + Module = Type = atom() + Value = term() + BinOrList = Bytes | binary() + Bytes = [Int|binary|Bytes] when integer(Int), Int >= 0, Int =< 255 + Reason = term() + + +

Encodes Value of Type defined in the ASN.1 module + Module. Returns a possibly nested list of bytes and or binaries + if successful. If Module was compiled with the options per_bin and optimize the result is a binary. To get as + fast execution as possible the + encode function only performs rudimentary tests that the input + Value + is a correct instance of Type. The length of strings is for example + not always checked.

+
+
+ + + info(Module) -> {ok,Info} | {error,Reason} + Returns compiler information about the Module. + + Module = atom() + Info = list() + Reason = term() + + +

info/1 returns the version of the asn1 compiler that was + used to compile the module. It also returns the compiler options + that was used.

+
+
+ + + load_driver() -> ok | {error,Reason} + Loads the linked-in driver. + + Reason = term() + + +

This function loads the linked-in driver before the first call + to encode. If this function is not called the driver will be loaded + automatically at the first call to encode. If one doesn't want the + performance cost of a driver load when the application is running, + this function makes it possible to load the driver in an + initialization.

+

The driver is only used when encoding/decoding ASN.1 files that + were compiled with the options per_bin and optimize.

+
+
+ + + unload_driver() -> ok | {error,Reason} + Unloads the linked-in driver. + + Reason = term() + + +

This function unloads the linked-in driver. + When the driver has been loaded it remains in the environment until + it is unloaded. Normally the driver should remain loaded, it is + crucial for the performance of ASN.1 encoding.

+

The driver is only used when ASN.1 modules have been compiled + with the flags per_bin and optimize.

+
+
+ + + utf8_binary_to_list(UTF8Binary) -> {ok,UnicodeList} | {error,Reason} + Transforms an utf8 encoded binary to a unicode list. + + UTF8Binary = binary() + UnicodeList = [integer()] + Reason = term() + + +

utf8_binary_to_list/1 Transforms a UTF8 encoded binary + to a list of integers, where each integer represents one + character as its unicode value. The function fails if the binary + is not a properly encoded UTF8 string.

+
+
+ + + utf8_list_to_binary(UnicodeList) -> {ok,UTF8Binary} | {error,Reason} + Transforms an unicode list ot an utf8 binary. + + UnicodeList = [integer()] + UTF8Binary = binary() + Reason = term() + + +

utf8_list_to_binary/1 Transforms a list of integers, + where each integer represents one character as its unicode + value, to a UTF8 encoded binary.

+
+
+ + + validate(Module,Type,Value) -> ok | {error,Reason} + Validate an ASN.1 value. + + Module = Type = atom() + Value = term() + + +

Validates that Value conforms to Type + from Module. Not implemented in this version of the ASN.1 application.

+
+
+ +
+ +
+ diff --git a/lib/asn1/doc/src/book.xml b/lib/asn1/doc/src/book.xml new file mode 100644 index 0000000000..718e6e7b17 --- /dev/null +++ b/lib/asn1/doc/src/book.xml @@ -0,0 +1,50 @@ + + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + ASN.1 + Kenneth Lundin + + 1997-12-01 + 0.9 + book.sgml +
+ + + ASN.1 + + + + + + + + + + + + + + +
+ diff --git a/lib/asn1/doc/src/exclusive_Win_But.gif b/lib/asn1/doc/src/exclusive_Win_But.gif new file mode 100644 index 0000000000..86dea0547e Binary files /dev/null and b/lib/asn1/doc/src/exclusive_Win_But.gif differ diff --git a/lib/asn1/doc/src/exclusive_Win_But.ps b/lib/asn1/doc/src/exclusive_Win_But.ps new file mode 100644 index 0000000000..387b978c7f --- /dev/null +++ b/lib/asn1/doc/src/exclusive_Win_But.ps @@ -0,0 +1,465 @@ +%!PS-Adobe-2.0 +%%Title: exclusive_Win_But.ps +%%Creator: fig2dev Version 3.2 Patchlevel 1 +%%CreationDate: Tue Oct 28 13:39:26 2003 +%%For: bertil@super (Bertil Karlsson,UAB/F/P) +%%Orientation: Portrait +%%BoundingBox: 40 368 572 423 +%%Pages: 1 +%%BeginSetup +%%IncludeFeature: *PageSize Letter +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/MyAppDict 100 dict dup begin def +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +22.0 480.5 translate +1 -1 scale +.9 .9 scale % to make patterns same scale as in xfig + +% This junk string is used by the show operators +/PATsstr 1 string def +/PATawidthshow { % cx cy cchar rx ry string + % Loop over each character in the string + { % cx cy cchar rx ry char + % Show the character + dup % cx cy cchar rx ry char char + PATsstr dup 0 4 -1 roll put % cx cy cchar rx ry char (char) + false charpath % cx cy cchar rx ry char + /clip load PATdraw + % Move past the character (charpath modified the + % current point) + currentpoint % cx cy cchar rx ry char x y + newpath + moveto % cx cy cchar rx ry char + % Reposition by cx,cy if the character in the string is cchar + 3 index eq { % cx cy cchar rx ry + 4 index 4 index rmoveto + } if + % Reposition all characters by rx ry + 2 copy rmoveto % cx cy cchar rx ry + } forall + pop pop pop pop pop % - + currentpoint + newpath + moveto +} bind def +/PATcg { + 7 dict dup begin + /lw currentlinewidth def + /lc currentlinecap def + /lj currentlinejoin def + /ml currentmiterlimit def + /ds [ currentdash ] def + /cc [ currentrgbcolor ] def + /cm matrix currentmatrix def + end +} bind def +% PATdraw - calculates the boundaries of the object and +% fills it with the current pattern +/PATdraw { % proc + save exch + PATpcalc % proc nw nh px py + 5 -1 roll exec % nw nh px py + newpath + PATfill % - + restore +} bind def +% PATfill - performs the tiling for the shape +/PATfill { % nw nh px py PATfill - + PATDict /CurrentPattern get dup begin + setfont + % Set the coordinate system to Pattern Space + PatternGState PATsg + % Set the color for uncolored pattezns + PaintType 2 eq { PATDict /PColor get PATsc } if + % Create the string for showing + 3 index string % nw nh px py str + % Loop for each of the pattern sources + 0 1 Multi 1 sub { % nw nh px py str source + % Move to the starting location + 3 index 3 index % nw nh px py str source px py + moveto % nw nh px py str source + % For multiple sources, set the appropriate color + Multi 1 ne { dup PC exch get PATsc } if + % Set the appropriate string for the source + 0 1 7 index 1 sub { 2 index exch 2 index put } for pop + % Loop over the number of vertical cells + 3 index % nw nh px py str nh + { % nw nh px py str + currentpoint % nw nh px py str cx cy + 2 index show % nw nh px py str cx cy + YStep add moveto % nw nh px py str + } repeat % nw nh px py str + } for + 5 { pop } repeat + end +} bind def + +% PATkshow - kshow with the current pattezn +/PATkshow { % proc string + exch bind % string proc + 1 index 0 get % string proc char + % Loop over all but the last character in the string + 0 1 4 index length 2 sub { + % string proc char idx + % Find the n+1th character in the string + 3 index exch 1 add get % string proe char char+1 + exch 2 copy % strinq proc char+1 char char+1 char + % Now show the nth character + PATsstr dup 0 4 -1 roll put % string proc chr+1 chr chr+1 (chr) + false charpath % string proc char+1 char char+1 + /clip load PATdraw + % Move past the character (charpath modified the current point) + currentpoint newpath moveto + % Execute the user proc (should consume char and char+1) + mark 3 1 roll % string proc char+1 mark char char+1 + 4 index exec % string proc char+1 mark... + cleartomark % string proc char+1 + } for + % Now display the last character + PATsstr dup 0 4 -1 roll put % string proc (char+1) + false charpath % string proc + /clip load PATdraw + neewath + pop pop % - +} bind def +% PATmp - the makepattern equivalent +/PATmp { % patdict patmtx PATmp patinstance + exch dup length 7 add % We will add 6 new entries plus 1 FID + dict copy % Create a new dictionary + begin + % Matrix to install when painting the pattern + TilingType PATtcalc + /PatternGState PATcg def + PatternGState /cm 3 -1 roll put + % Check for multi pattern sources (Level 1 fast color patterns) + currentdict /Multi known not { /Multi 1 def } if + % Font dictionary definitions + /FontType 3 def + % Create a dummy encoding vector + /Encoding 256 array def + 3 string 0 1 255 { + Encoding exch dup 3 index cvs cvn put } for pop + /FontMatrix matrix def + /FontBBox BBox def + /BuildChar { + mark 3 1 roll % mark dict char + exch begin + Multi 1 ne {PaintData exch get}{pop} ifelse % mark [paintdata] + PaintType 2 eq Multi 1 ne or + { XStep 0 FontBBox aload pop setcachedevice } + { XStep 0 setcharwidth } ifelse + currentdict % mark [paintdata] dict + /PaintProc load % mark [paintdata] dict paintproc + end + gsave + false PATredef exec true PATredef + grestore + cleartomark % - + } bind def + currentdict + end % newdict + /foo exch % /foo newlict + definefont % newfont +} bind def +% PATpcalc - calculates the starting point and width/height +% of the tile fill for the shape +/PATpcalc { % - PATpcalc nw nh px py + PATDict /CurrentPattern get begin + gsave + % Set up the coordinate system to Pattern Space + % and lock down pattern + PatternGState /cm get setmatrix + BBox aload pop pop pop translate + % Determine the bounding box of the shape + pathbbox % llx lly urx ury + grestore + % Determine (nw, nh) the # of cells to paint width and height + PatHeight div ceiling % llx lly urx qh + 4 1 roll % qh llx lly urx + PatWidth div ceiling % qh llx lly qw + 4 1 roll % qw qh llx lly + PatHeight div floor % qw qh llx ph + 4 1 roll % ph qw qh llx + PatWidth div floor % ph qw qh pw + 4 1 roll % pw ph qw qh + 2 index sub cvi abs % pw ph qs qh-ph + exch 3 index sub cvi abs exch % pw ph nw=qw-pw nh=qh-ph + % Determine the starting point of the pattern fill + %(px, py) + 4 2 roll % nw nh pw ph + PatHeight mul % nw nh pw py + exch % nw nh py pw + PatWidth mul exch % nw nh px py + end +} bind def + +% Save the original routines so that we can use them later on +/oldfill /fill load def +/oldeofill /eofill load def +/oldstroke /stroke load def +/oldshow /show load def +/oldashow /ashow load def +/oldwidthshow /widthshow load def +/oldawidthshow /awidthshow load def +/oldkshow /kshow load def + +% These defs are necessary so that subsequent procs don't bind in +% the originals +/fill { oldfill } bind def +/eofill { oldeofill } bind def +/stroke { oldstroke } bind def +/show { oldshow } bind def +/ashow { oldashow } bind def +/widthshow { oldwidthshow } bind def +/awidthshow { oldawidthshow } bind def +/kshow { oldkshow } bind def +/PATredef { + MyAppDict begin + { + /fill { /clip load PATdraw newpath } bind def + /eofill { /eoclip load PATdraw newpath } bind def + /stroke { PATstroke } bind def + /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def + /ashow { 0 0 null 6 3 roll PATawidthshow } + bind def + /widthshow { 0 0 3 -1 roll PATawidthshow } + bind def + /awidthshow { PATawidthshow } bind def + /kshow { PATkshow } bind def + } { + /fill { oldfill } bind def + /eofill { oldeofill } bind def + /stroke { oldstroke } bind def + /show { oldshow } bind def + /ashow { oldashow } bind def + /widthshow { oldwidthshow } bind def + /awidthshow { oldawidthshow } bind def + /kshow { oldkshow } bind def + } ifelse + end +} bind def +false PATredef +% Conditionally define setcmykcolor if not available +/setcmykcolor where { pop } { + /setcmykcolor { + 1 sub 4 1 roll + 3 { + 3 index add neg dup 0 lt { pop 0 } if 3 1 roll + } repeat + setrgbcolor - pop + } bind def +} ifelse +/PATsc { % colorarray + aload length % c1 ... cn length + dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor + } ifelse } ifelse +} bind def +/PATsg { % dict + begin + lw setlinewidth + lc setlinecap + lj setlinejoin + ml setmiterlimit + ds aload pop setdash + cc aload pop setrgbcolor + cm setmatrix + end +} bind def + +/PATDict 3 dict def +/PATsp { + true PATredef + PATDict begin + /CurrentPattern exch def + % If it's an uncolored pattern, save the color + CurrentPattern /PaintType get 2 eq { + /PColor exch def + } if + /CColor [ currentrgbcolor ] def + end +} bind def +% PATstroke - stroke with the current pattern +/PATstroke { + countdictstack + save + mark + { + currentpoint strokepath moveto + PATpcalc % proc nw nh px py + clip newpath PATfill + } stopped { + (*** PATstroke Warning: Path is too complex, stroking + with gray) = + cleartomark + restore + countdictstack exch sub dup 0 gt + { { end } repeat } { pop } ifelse + gsave 0.5 setgray oldstroke grestore + } { pop restore pop } ifelse + newpath +} bind def +/PATtcalc { % modmtx tilingtype PATtcalc tilematrix + % Note: tiling types 2 and 3 are not supported + gsave + exch concat % tilingtype + matrix currentmatrix exch % cmtx tilingtype + % Tiling type 1 and 3: constant spacing + 2 ne { + % Distort the pattern so that it occupies + % an integral number of device pixels + dup 4 get exch dup 5 get exch % tx ty cmtx + XStep 0 dtransform + round exch round exch % tx ty cmtx dx.x dx.y + XStep div exch XStep div exch % tx ty cmtx a b + 0 YStep dtransform + round exch round exch % tx ty cmtx a b dy.x dy.y + YStep div exch YStep div exch % tx ty cmtx a b c d + 7 -3 roll astore % { a b c d tx ty } + } if + grestore +} bind def +/PATusp { + false PATredef + PATDict begin + CColor PATsc + end +} bind def + +% left45 +11 dict begin +/PaintType 1 def +/PatternType 1 def +/TilingType 1 def +/BBox [0 0 1 1] def +/XStep 1 def +/YStep 1 def +/PatWidth 1 def +/PatHeight 1 def +/Multi 2 def +/PaintData [ + { clippath } bind + { 32 32 true [ 32 0 0 -32 0 32 ] + {<808080804040404020202020101010100808080804040404 + 020202020101010180808080404040402020202010101010 + 080808080404040402020202010101018080808040404040 + 202020201010101008080808040404040202020201010101 + 808080804040404020202020101010100808080804040404 + 0202020201010101>} + imagemask } bind +] def +/PaintProc { + pop + exec fill +} def +currentdict +end +/P4 exch def +1.1111 1.1111 scale %restore scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 2854 m -1000 -1000 l 10152 -1000 l 10152 2854 l cp clip + 0.06000 0.06000 sc +%%Page: 1 1 +% Polyline +7.500 slw +n 325 975 m 1125 975 l 1125 1575 l 325 1575 l cp gs col-1 s gr +% Polyline +n 1125 975 m 4650 975 l 4650 1575 l 1125 1575 l cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def +15.00 15.00 sc P4 [16 0 0 -16 75.00 65.00] PATmp PATsp ef gr PATusp gs col-1 s gr +% Polyline +n 4650 975 m 5325 975 l 5325 1575 l 4650 1575 l cp gs col-1 s gr +% Polyline +n 5325 975 m 9140 975 l 9140 1575 l 5325 1575 l cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def +15.00 15.00 sc P4 [16 0 0 -16 355.00 65.00] PATmp PATsp ef gr PATusp gs col-1 s gr +/Times-Roman ff 180.00 scf sf +4725 1800 m +gs 1 -1 sc (enabled) col-1 sh gr +/Times-Roman ff 180.00 scf sf +6450 1800 m +gs 1 -1 sc (actions:possibleActions) col-1 sh gr +/Times-Roman ff 180.00 scf sf +2550 1800 m +gs 1 -1 sc (buttonList) col-1 sh gr +/Times-Roman ff 180.00 scf sf +600 1800 m +gs 1 -1 sc (state) col-1 sh gr +$F2psEnd +rs +end +showpage diff --git a/lib/asn1/doc/src/fascicules.xml b/lib/asn1/doc/src/fascicules.xml new file mode 100644 index 0000000000..2488e7b57e --- /dev/null +++ b/lib/asn1/doc/src/fascicules.xml @@ -0,0 +1,18 @@ + + + + + + User's Guide + + + Reference Manual + + + Release Notes + + + Off-Print + + + diff --git a/lib/asn1/doc/src/make.dep b/lib/asn1/doc/src/make.dep new file mode 100644 index 0000000000..eb2c0e9a98 --- /dev/null +++ b/lib/asn1/doc/src/make.dep @@ -0,0 +1,31 @@ +# ---------------------------------------------------- +# >>>> Do not edit this file <<<< +# This file was automaticly generated by +# /home/gandalf/otp/bin/docdepend +# ---------------------------------------------------- + + +# ---------------------------------------------------- +# TeX files that the DVI file depend on +# ---------------------------------------------------- + +book.dvi: asn1_spec.tex asn1_ug.tex asn1ct.tex asn1rt.tex \ + book.tex part.tex ref_man.tex + +# ---------------------------------------------------- +# Source inlined when transforming from source to LaTeX +# ---------------------------------------------------- + +asn1_spec.tex: Seq.asn Seq.asn1config + +book.tex: part.xml ref_man.xml + +asn1_ug.tex: ../../../../system/doc/definitions/cite.defs + +# ---------------------------------------------------- +# Pictures that the DVI file depend on +# ---------------------------------------------------- + +book.dvi: exclusive_Win_But.ps selective_TypeList.ps \ + selective_Window2.ps + diff --git a/lib/asn1/doc/src/note.gif b/lib/asn1/doc/src/note.gif new file mode 100644 index 0000000000..6fffe30419 Binary files /dev/null and b/lib/asn1/doc/src/note.gif differ diff --git a/lib/asn1/doc/src/notes.xml b/lib/asn1/doc/src/notes.xml new file mode 100644 index 0000000000..861de05a59 --- /dev/null +++ b/lib/asn1/doc/src/notes.xml @@ -0,0 +1,748 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + asn1 Release Notes + otp_appnotes + nil + nil + nil + notes.xml +
+

This document describes the changes made to the asn1 application.

+ + +
Asn1 1.6.12 + +
Improvements and New Features + + +

+ The documentation is now built with open source tools + (xsltproc and fop) that exists on most platforms. One + visible change is that the frames are removed.

+

+ Own Id: OTP-8256

+
+
+
+ +
+ + +
Asn1 1.6.11 + +
Improvements and New Features + + +

+ A new option {n2n,TypeName} can be used to + enable generation of conversion functions from name to number + and vice versa for selected ENUMERATION types. + The option can be repeated many times in order to specify several + types in the same file.
+ If the TypeName specified does not exists or is not an + ENUMERATION type, the compilation will be terminated with an + error code.
+ Below follows an example on how to use the option from the command line with erlc:
+ erlc -bper_bin +optimize +driver +"{n2n,'CauseMisc'}" +"{n2n,'CausePcl'}" MyModyle.asn +

+

+ Own Id: OTP-8136 Aux Id: seq11347

+
+ +

+ Range checks added for BIT STRING with fixed SIZE + constraint.

+

+ Own Id: OTP-7972 Aux Id: seq11280

+
+ +

+ Now support multiple-line comments in asn1-specs as + specified in ASN1 X.680 (07/2002), section 11.6.4

+

+ Own Id: OTP-8043

+
+ +

+ Now parses and adds abstract syntax for PATTERN subtype + constraint. No other action is taken on this type of + constraint.

+

+ Own Id: OTP-8046

+
+ +

+ The ASN1 subtype constraint CONTAINING Type, + CONTAINING Type ENCODED BY Value and ENCODED BY + Value now is parsed. Abstract syntax is added but no + further action in generated code is taken.

+

+ Own Id: OTP-8047

+
+
+
+ +
+ +
Asn1 1.6.10 + +
Fixed Bugs and Malfunctions + + +

+ A faulty receive case that catch-ed all messages in the + initialization of the driver has been removed, the + initialization has been restructured.

+

+ Own Id: OTP-7954 Aux Id: seq11220

+
+
+
+ + +
Improvements and New Features + + +

+ The anonymous part of the decode that splits the ASN1 TLV + into Tag Value tuples has been optimized.

+

+ Own Id: OTP-7953

+
+
+
+ +
+ +
Asn1 1.6.9 + +
Fixed Bugs and Malfunctions + + +

+ Error that caused crash when drivers were loaded is now + corrected. Parallel driver for asn1 now enabled.

+

+ Own Id: OTP-7904 Aux Id: seq11220

+
+
+
+ + +
Improvements and New Features + + +

+ Optimized code for ENUMERATION type in encoder/decoder.

+

+ Own Id: OTP-7909

+
+
+
+ +
+ +
Asn1 1.6.8.1 + +
Fixed Bugs and Malfunctions + + +

+ Removed parallel-driver functionality due to failure + when loading the driver.

+

+ Own Id: OTP-7900 Aux Id: seq11220

+
+
+
+ + +
Improvements and New Features + + +

+ Generated code now uses guards that is not obsolete, e.g. + is_integer/1 instead of integer/1.

+

+ Own Id: OTP-7910

+
+
+
+ +
+ + +
Asn1 1.6.8 + +
Fixed Bugs and Malfunctions + + +

+ A BIT STRING with a size constraint that has a single + value and an extension as in BIT STRING (SIZE + (16,...)) was erroneous encoded/decoded. This is now + corrected and follows X.691 Section 15.6.

+

+ Own Id: OTP-7876 Aux Id: seq11220

+
+
+
+ +
+
Asn1 1.6.7 + +
Improvements and New Features + + +

+ Now asn1 starts multiple drivers to enable simultaneous + encode/decode in different processes for the + asn1-backends using linked-in driver.

+

+ Own Id: OTP-7801

+
+
+
+ +
+ +
Asn1 1.6.6 + +
Fixed Bugs and Malfunctions + + +

+ Decode of an open_type when the value was empty tagged + type encoded with indefinite length failed. This is now + corrected.

+

+ Own Id: OTP-7759 Aux Id: seq11166

+
+ +

+ Encode of BIT STRING with size of exact length, on + compact_bit_string format in UNALIGNED PER failed when + value had the right size, i.e. no padding needed.

+

+ Own Id: OTP-7763 Aux Id: seq11182

+
+
+
+ +
+ +
Asn1 1.6.5 + +
Fixed Bugs and Malfunctions + + +

+ For a BIT STRING with SIZE constraint higher than 255 + compiled with [per_bin,optimize, + compact_bit_string] an improper io-list was created + and sent to the c-driver for complete encoding. This + error has been resolved.

+

+ Own Id: OTP-7734 Aux Id: seq11170

+
+
+
+ +
+ +
Asn1 1.6.4 + +
Fixed Bugs and Malfunctions + + +

+ A a SEQUENCE OF with a type that is a CHOICE with + ellipses occurred falsely a compile error. The error + causing that is now removed.

+

+ Own Id: OTP-7708 Aux Id: seq11136

+
+
+
+ +
+ +
Asn1 1.6.3 + +
Fixed Bugs and Malfunctions + + +

+ constrained number with a value-range greater than 512 now + has the proper interpretation of the values that causes + shift to the next number of units (bits), According to + limit condition 2^m < "range" =< 2^(m + 1) then the + number of bits are m + 1.

+

+ Own Id: OTP-7681 Aux Id: seq11114

+
+
+
+ + +
Improvements and New Features + + +

+ Can now handle default values of simple types that is + provided on its own format, i.e. not just as + asn1_DEFAULT.

+

+ Own Id: OTP-7678 Aux Id: seq11114

+
+
+
+ +
+ +
Asn1 1.6.2 + +
Fixed Bugs and Malfunctions + + +

+ comparison of two value definitions failed due to new + module name field in valuedef record. It is now + corrected.

+

+ Own Id: OTP-7608

+
+
+
+ +
+ +
Asn1 1.6.1 + +
Fixed Bugs and Malfunctions + + +

+ Bug regarding propagation of parameters of parameterized + type fixed.

+

+ Own Id: OTP-7174 Aux Id: seq10864

+
+ +

+ A bug, related to instantiation of a parameterized type + with a type definition in the parameter-list, has been + removed. The definition of the parameter type was in + another module than the instance definition causing + limited module info.

+

+ Own Id: OTP-7299 Aux Id: seq10864

+
+ +

+ Removed hard-coded name that may cause name collision.

+

+ Own Id: OTP-7322 Aux Id: seq10864

+
+ +

+ Object set of a class with id with properties UNIQUE + OPTIONAL and the id field is lacking in the object is for + now treated as a object without a unique identifier, i.e. + no table is generated for this object.

+

+ Own Id: OTP-7332 Aux Id: seq10864

+
+ +

+ Compiler crashed when failed to handle a OID as + ValueFromObject.

+

+ Own Id: OTP-7476 Aux Id: seq10999

+
+ +

+ A corrupted encoding may cause a loop when a buffer of at + least two bytes of zero matches tag and length of a SET + component. This behavior occurred only with decoder + generated with ber or ber_bin options. Now a + control breaks the loop.

+

+ Own Id: OTP-7533

+
+ +

+ Encode of BIT STRING longer than 255 bits with a + SIZE(integer()) constraint caused a crash when + spec was compiled with per_bin, optimize options.

+

+ Own Id: OTP-7602 Aux Id: seq11079

+
+
+
+ + +
Improvements and New Features + + +

+ Now supports REAL type of base 2 and 10

+

+ Own Id: OTP-7166 Aux Id: seq10864

+
+ +

+ By the asn1 compiler option {record_name_prefix + Name} a prefix is chosen to the name of the record + generated in the .hrl and used in the generated .erl + files.

+

+ Own Id: OTP-7204 Aux Id: seq10853

+
+ +

+ The TypeFromObject production now covered

+

+ Own Id: OTP-7295 Aux Id: seq10468

+
+ +

+ Extended support for ObjectSetFromObjects. Production + occurred as a part of the RootElementSetSpec of the + ObjectSetSpec. Added also support for Exclusion of + Element in ObjectSetSpec.

+

+ Own Id: OTP-7306 Aux Id: seq10864

+
+ +

+ Now implements RELATIVE-OID

+

+ Own Id: OTP-7334 Aux Id: seq10864

+
+
+
+ +
+ +
Asn1 1.6 + +
Fixed Bugs and Malfunctions + + +

+ Now is ordering, according to the canonical order, of + components in a SET added. Canonical order is described + in X.691 9.2 and X.680 8.6

+

+ Own Id: OTP-7375 Aux Id: unaligned PER

+
+ +

+ The precedence rules for extended constraints have been + misinterpreted. The rule says for instance that if there + are more than one constraint on a type that have + extension-mark, only the last of the extension-marks would + be kept. This affects the encoding of PER and is now + corrected.

+

+ Own Id: OTP-7400 Aux Id: OTP-7335

+
+ +

+ A constrained number with a single-value constraint that + is extensible was falsely encoded/decoded in + aligned/unaligned PER. This is now corrected.

+

+ Own Id: OTP-7403

+
+
+
+ + +
Improvements and New Features + + +

+ The ASN.1 compiler has got a new backend supporting PER + UNALIGNED. Previously it was only support for PER + ALIGNED.

+

+ Own Id: OTP-7335

+
+ +

+ Now the asn1-compiler handles unions and intersections of + PermittedAlphabet constraints.

+

+ Own Id: OTP-7374 Aux Id: unaligned PER

+
+ +

+ With the undocumented option no_final_padding the + whole encoded message is not padded to a border of a + byte. Thus the returned encoded message is a + bitstring.

+

+ Own Id: OTP-7407

+
+
+
+ +
+ +
Asn1 1.5.2 + +
Fixed Bugs and Malfunctions + + +

+ When duplicates of object fields were removed only one + table access function for each unique identifier value + was generated. This can occur when several object sets + are merged by use of ObjectSetFromObjects.

+

+ Own Id: OTP-7263 Aux Id: seq10864

+
+ +

+ DER: For some complex types and components with reference + to type in several steps the default value check function + was not generated. This is now fixed.

+

+ Own Id: OTP-7268 Aux Id: seq10684

+
+ +

+ Now is the tag in a tagged type as parameter propagated + to the instance.

+

+ Own Id: OTP-7273 Aux Id: seq10864

+
+
+
+ + +
Improvements and New Features + + +

+ Added type T61String that is similar to TeletexString

+

+ Own Id: OTP-7264 Aux Id: seq10864

+
+
+
+ +
+ + +
Asn1 1.5.1 + +
Fixed Bugs and Malfunctions + + +

+ A bug related to renaming of types has been fixed.This + occurred using the .set.asn functionality.

+

+ Own Id: OTP-7149 Aux Id: seq10853

+
+ +

+ syntax error in ASN1 value now correctly shown

+

+ Own Id: OTP-7154 Aux Id: seq10864

+
+ +

+ Now a COMPONENTS OF construct in a parameterized type + is expanded correctly

+

+ Own Id: OTP-7155 Aux Id: seq10864

+
+ +

+ Now the asn1-compiler also handles empty SEQUENCE DEFAULT + values as {}.

+

+ Own Id: OTP-7169 Aux Id: seq10864

+
+ +

+ Now SelectionType gets the tag of the selected type.

+

+ Own Id: OTP-7171 Aux Id: seq10864

+
+ +

+ Correction of generated code for decode of an open type + in a SEQUECNE OF/ SET OF

+

+ Own Id: OTP-7193 Aux Id: seq10875

+
+
+
+ +
Improvements and New Features + + +

+ Misc improvements and bug corrections regarding default + values.

+

+ Own Id: OTP-7199 Aux Id: seq10864

+
+
+
+ + + +
+ +
Asn1 1.5 + +
Improvements and New Features + + +

+ Now generating records in .hrl file for instances of + parameterized SEQUENCE or SET.

+

+ Own Id: OTP-6835

+
+ +

+ Optimization using bitstr in encode/decode functions. Active with + [per_bin, optimize] options.

+

+ *** POTENTIAL INCOMPATIBILITY ***

+

+ Own Id: OTP-6882

+
+
+
+ +
+ +
Asn1 1.4.6 + +
Fixed Bugs and Malfunctions + + +

+ Parsing and encoding/decoding of type constrained with + SIZE with extension is now recovered.

+

+ Own Id: OTP-6763

+
+ +

+ inline failed because trying to use a removed + module.

+

+ Own Id: OTP-6769

+
+ +

+ Fixed problem with a reference to a type from an object. + The failure was caused bye change of type name when using + inline option.

+

+ Own Id: OTP-6770

+
+ +

+ Handling of decode pattern for exclusive decode was false + in the case when an un-decoded component had more than one + following elements that should be decoded.

+

+ Own Id: OTP-6786

+
+
+
+ + +
Improvements and New Features + + +

+ Now the asn1-compiler supports two root lists in SEQUENCE + and SET according to alternative three in + ComponentTypeLists (X.680 07/2002 section 24.1), i.e. + with an extension list between two ellipses.

+

+ Own Id: OTP-5067 Aux Id: seq8452

+
+
+
+ +
+ +
+ Asn1 1.4.5 + +
+ Fixed Bugs and Malfunctions + + +

Merging modules by inline earlier disabled the + driver (used in modules generated with + [optimized]/[optimized,driver] options). Now this is + repaired.

+

Own Id: OTP-6601

+
+ +

Checking phase now aware of which module an INSTANCE OF + is declared in.

+

Own Id: OTP-6702

+
+
+
+ +
+ Improvements and New Features + + +

The compiler now handle all forms of ObjectSetSpec + according to ITU-T recommendation X.681 (ISO/IEC + 8824-2:2002).

+

Own Id: OTP-6698

+
+ +

Enhanced support of referencing object sets by + ObjectSetFromObjects.

+

Own Id: OTP-6707

+
+ +

Support for parameterized object in an object set.

+

Own Id: OTP-6717

+
+
+
+ + +
+
+ diff --git a/lib/asn1/doc/src/notes_history.xml b/lib/asn1/doc/src/notes_history.xml new file mode 100644 index 0000000000..e6c423e79e --- /dev/null +++ b/lib/asn1/doc/src/notes_history.xml @@ -0,0 +1,1782 @@ + + + + +
+ + 20062009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + ASN1 Release Notes + Bertil Karlsson + + + + + 06-04-24 + + notes_history.sgml +
+

This document describes the changes made to the asn1 system + from version to version. The intention of this document is to + list all incompatibilities as well as all enhancements and + bug-fixes for every release of the asn1 application. Each release of asn1 + thus constitutes one section in this document. The title of each + section is the version number of asn1.

+ + +
+ Asn1 1.4.4.14 + +
+ Improvements and New Features + + +

Data in info/0 in generated code is moved to attribute + asn1_info, thus vsn value remains the same if compiler + options for asn1-spec differs but the generated code is + the same.

+

Own Id: OTP-6462

+
+ +

Dialyzer warnings on asn1 are removed, i.e. dead code + removed.

+

Own Id: OTP-6506

+
+
+
+
+ +
+ Asn1 1.4.4.13 + +
+ Improvements and New Features + + +

Now it is possible to use 'asn1config' and 'inline' + options together. It is also possible to use 'inline' on + a single file like: + asn1ct:compile("MyASN1spec.asn",[inline]).

+

Own Id: OTP-6405

+
+
+
+
+ +
+ Asn1 1.4.4.12 + +
+ Improvements and New Features + + +

As a complement to the option "{inline,OutputFile}" it is + now possible to use the option "inline". Then asn1 creates + an output file with the name of the source .set file.

+

Own Id: OTP-6314

+
+
+
+
+ +
+ Asn1 1.4.4.11 + +
+ Fixed Bugs and Malfunctions + + +

When compiling an asn1 source that reference a type in + another source the compiler uses the asn1db file of the + other source to resolve the reference. It also tests + whether the other source has been updated since the + asn1db file was generated. This last test was to brutal + in that it exits compilation when no source was found, + even though a asn1db file existed. Changed behavior from + a brutal exit to a warning.

+

Own Id: OTP-6143

+
+
+
+
+ +
+ Asn1 1.4.4.10 + +
+ Fixed Bugs and Malfunctions + + +

asn1 encoding failed on BIT STRING with constraint + (SIZE (32..MAX)).

+

Own Id: OTP-5932

+
+ +

Race condition removed in server for variable names for + generated code.

+

Own Id: OTP-6111

+
+
+
+
+ +
+ Asn1 1.4.4.9 + +
+ Fixed Bugs and Malfunctions + + +

Now exists a default function clause for table lookup of + a table constraint. This causes a nice error instead of a + crash. Did also remove some obsolete funs ({Mod,Fun}) in + generated code.

+

Own Id: OTP-5783

+
+ +

ASN1-compiler failed to derive a value out of an external + reference in some certain cases, when compiling specs so + that the spec with the reference was compiled before the + spec with the defined value.

+

Own Id: OTP-5812 Aux Id: seq10133

+
+ +

The documentation of how records of embedded types are + named is extended and made clearer by examples and rules. + The section "Naming of Records in .hrl Files" in the + User's Guide is added.

+

Own Id: OTP-5831 Aux Id: seq10133

+
+ +

The compiler failed to give right name to record/function + of a parameterized type that was referenced through + another instance of a parameterized type in another + module. The fault occurred when modules were compiled in a + certain order. Now the compiler resolves the name + correctly.

+

Own Id: OTP-5832 Aux Id: seq10133

+
+
+
+
+ +
+ Asn1 1.4.4.8 + +
+ Fixed Bugs and Malfunctions + + +

The dynamic sort of SET OF values now correctly handles + values encoded in the "ber_bin, der, optimize" mode, the + value of a SET OF is a list of binaries.

+

Own Id: OTP-5687

+
+ +

Bad code was generated for an INTEGER with value-range. If + the value that was encoded had a lower bound with + negative value it caused a crash. This bug is now + removed.

+

Own Id: OTP-5688 Aux Id: seq10049

+
+ +

Compiler now handles wrong include paths by returning an + error if a referenced module is not available.

+

Own Id: OTP-5689

+
+ +

The bug causing a runtime error when encoding a type + defined by: BIT STRING {a(1),b(2)} with the value + [] in per_bin mode is now removed.

+

Own Id: OTP-5710 Aux Id: seq10066

+
+
+
+ +
+ Improvements and New Features + + +

Better handling of filename paths

+

Own Id: OTP-5701

+
+
+
+
+ +
+ Asn1 1.4.4.7 + +
+ Fixed Bugs and Malfunctions + + +

Effective constraint for per now corrected. For + instance INTEGER (0|15..269) didn't work properly.

+

Own Id: OTP-5477 Aux Id: OTP-5511

+
+ +

Adjusted compiler so that functions in generated code + only are exported once.

+

Own Id: OTP-5509

+
+ +

Fixed the compiler failure when handling a value range + constraint with an extension mark that had the Lower + bound and/or Upper bound values as an external reference + to a defined value.

+

Own Id: OTP-5511 Aux Id: OTP-5466

+
+ +

Removed sorting of elements for SEQUENCE OF. It shall + only be done in SET OF.

+

Own Id: OTP-5602

+
+ +

Corrected code that generated code causing badarith + warning.

+

Own Id: OTP-5616

+
+
+
+
+ +
+ Asn1 1.4.4.6 + +
+ Known Bugs and Problems + + +

Compiler now correctly crashes when compiling bad values. + Failed for instance on INTEGER value that was a reference + to a defined value. Also solved problem with a union + constraint on an INTEGER.

+

Own Id: OTP-5457

+
+ +

Additional coverage of object set syntax.

+

Own Id: OTP-5466

+
+
+
+
+ +
+ Asn1 1.4.4.5 + +
+ Fixed Bugs and Malfunctions + + +

A bug due to representation of open_type values is now + fixed. It could cause problem if one used the EXTERNAL + type.

+

Own Id: OTP-5302

+
+ +

Due to an internal error the same code could have been + generated more than one time. This happened for the + exclusive decode functionality.

+

Own Id: OTP-5378

+
+
+
+
+ +
+ Asn1 1.4.4.4 + +
+ Fixed Bugs and Malfunctions + + +

Empty objects caused problems. There was trouble when an + object set referenced imported objects that in turn + referenced imported types. Lacked support of + SelectionType in object. All these have been attended.

+

Own Id: OTP-5240

+
+
+
+ +
+ Improvements and New Features + + +

Now it is possible to inline asn1 run-time functionality + in the module generated by the asn1 compiler. Thus, it + will be only one module doing all encoding/decoding.

+

Own Id: OTP-5243

+
+
+
+
+ +
+ Asn1 1.4.4.3 + +
+ Fixed errors and malfunctions + + +

A class that was referenced in two steps caused a + compiler failure. It is now corrected.

+

Own Id: OTP-5103

+
+
+
+ +
+ Improvements and new features + + +

Optionally make it possible to get the un-decoded rest along with + the return value. Compile with option undec_rest.

+

Own Id: OTP-5104

+
+
+
+
+ +
+ Asn1 1.4.4.2 + +
+ Fixed errors and malfunctions + + +

An error due to unchecked referenced imported type resulted + in missing tag in some table constraint cases. This error is + now corrected. Error occurred during decode in + ber_bin optimized version.

+

Own Id: OTP-5022

+
+
+
+
+ +
+ Asn1 1.4.4.1 + +
+ Fixed errors and malfunctions + + +

When a referenced value in another module in turn referenced a + defined value the compilation crashed. This is due to the new + routines for compilation, that external references are resolved + during compilation, and not by the order in which modules are + compiled. This error is now corrected.

+

Own Id: OTP-4970

+
+
+
+
+ +
+ Asn1 1.4.4 + +
+ Fixed errors and malfunctions + + +

Functionality for parameterized class is added. Parsing failures on + WithSyntax spec is corrected.

+

Own Id: OTP-4893

+
+ +

The failure due to Parameterized Type when parameter is an object + set is corrected.

+

Own Id: OTP-4894

+

Aux Id: OTP-4893

+
+ +

Object Identifier values with two components and the first was a + value reference failed due to parsing conflicts. Now it is + corrected.

+

Own Id: OTP-4895

+
+ +

The erroneous comparison of file name and asn1 module name could + cause compilation failure. The situation for this failure is rare, + it requires that other processes modifies the compiled file during + the compilation procedure. It is now fixed.

+

Own Id: OTP-4944

+

Aux Id: seq8429

+
+ +

Selective decode was ignored when exclusive decode spec in asn1 + configfile was missing. Selective decode failed when the selected + type was the top type. These bugs are now removed.

+

Own Id: OTP-4953

+

Aux Id: seq8436

+
+ +

The test interface asn1ct:test/1,2,3 and asn1ct:value/2 failed for + open type and EXTERNAL. The bug is now removed.

+

Own Id: OTP-4955

+

Aux Id: seq8438)

+
+ +

Two equal functions were generated for two components referencing + the same type when they were picked by the action "parts". The bug + is now fixed.

+

Own Id: OTP-4957

+

Aux Id: seq8434

+
+
+
+ +
+ Improvements and new features + + +

INTEGER with named number list and ENUMERATED can now be sub + constrained with names from the names list.

+

Own Id: OTP-4917

+
+ +

Now there is support for SelectionType (X 680 section 29)

+

Own Id: OTP-4918

+
+ +

The compiler now resolves circular dependencies. When asn1 specs + IMPORTS from each other so that there are circular dependencies.

+

Own Id: OTP-4919

+
+ +

Now is the asn1 type UTF8String supported. For user instructions + see documentation.

+

Own Id: OTP-4965

+
+
+
+
+ +
+ Asn1 1.4.3.1 + +
+ Fixed Bugs and Malfunctions + + +

The {internal_error,...,{ unrecognized_type,...}} + error occurring for a SET type when compiling with options + [ber_bin,optimize,der] is now corrected.

+

Own Id: OTP-4866

+
+ +

False encode of BIT STRING in PER (per_bin,optimize) is fixed. The error occurred when there was a type like BIT STRING (SIZE(C)) and C > 16.

+

Own Id: OTP-4869

+
+
+
+
+ +
+ Asn1 1.4.3 + +
+ Fixed errors and malfunctions + + +

Functionality to handle parameterized object sets have been added.

+

Own Id: OTP-4832

+
+ +

Bug causing duplicated function definitions using exclusive decode is removed.

+

Own Id: OTP-4833)

+
+ +

The race condition when loading asn1 driver is solved.

+

Own Id: OTP-4835

+
+
+
+ +
+ Improvements and new features + + +

A specialized decode, selective decode is now available. It decodes a chosen internal sub-type of a constructed type.

+

Own Id: OTP-4856)

+
+
+
+
+ +
+ Asn1 1.4.2.2 + +
+ Fixed errors and malfunctions + + +

Release of Asn1 1.4.2.1 on R7B, The functionality is the same, but + the layer between the driver and the asn1 erlang code is different.

+
+
+
+
+ +
+ Asn1 1.4.2.1 + +
+ Fixed errors and malfunctions + + +

ObjectDescriptor does now work as part of a sequence, set or choice.

+

Own Id: OTP-4773

+
+ +

When a SEQUENCE that have extension mark was decoded inside a + SEQUENCE OF it could cause decode error due to a failure in + restbytes2. It is now corrected.

+

Own Id: OTP-4791)

+
+ +

Now the bug is fixed that caused the compiler crash on an untagged + optional open type.

+

Own Id: OTP-4792

+
+ +

The earlier exit caused by bad in-data is now fixed so it will + return an {error,Reason} tuple.

+ return an {error,Reason} tuple.

+

Own Id: OTP-4797

+
+ +

Open type encoded with indefinite length is now correct decoded.

+

Own Id: OTP-4798

+
+ +

Now is absent optional open types handled correctly.

+

Own Id: OTP-4799

+
+ +

Now is the necessary functions available for sorting in run-time of + SET and SET OF components.

+

Own Id: OTP-4809

+
+
+
+
+ +
+ Asn1 1.4.2 + +
+ Fixed errors and malfunctions + + +

When a component in a SEQUENCE is a CHOICE (or reference to a CHOICE) + and the SEQUENCE's component and one of the alternatives in the CHOICE + have identical names, an error may occur if one doesn't use the + 'optimized' versions of the compiler. In the older versions (ber, ber_bin, per, per_bin) one could optionally apply a value of a + component as {ComponentName,Value}, and the generated code + chooses the second element of the tuple. However, a value of a CHOICE + must be applied as a tuple: {AlternativeName,Value}. Thus, + in the rare case described above and if the value to the SEQUENCE's + component is not in a tuple notation the + {AlternativeName,Value} will be peeled off in the SEQUENCE + and the value fed to the CHOICE will only be the Value + part of {AlternativeName,Value}, and the encoder crashes. + The best way to avoid this is to use the optimized version of the + compiler where the unnecessary tuple notation + {ComponentName,Value} no longer is allowed. Since it isn't + possible to solve this bug in the compiler.

+

Own Id: OTP-4693

+
+
+
+ +
+ Improvements and new features + + +

Exclusive decode is enabled by a compiler option and a configuration + file. It makes it possible to leave parts of an ASN.1 encoded message + un-decoded.

+

Own Id: OTP-4744

+
+
+
+
+ +
+ Asn1 1.4.1.1 + +
+ Fixed errors and malfunctions + + +

The documentation about how extensibility is handled is now corrected.

+

Own Id: OTP-4663

+
+ +

Function in object now calls the exported function

+

Own Id: OTP-4665

+
+ +

Now is tags for ObjectClassFieldType analyzed correctly.

+

Own Id: OTP-4666

+
+
+
+
+ +
+ Asn1 1.4.1 + +
+ Fixed errors and malfunctions + + +

Now is the Default value for an ENUMERATED returned as the name from + the NamedList when decoding.

+

Own Id: OTP-4633

+
+ +

It was an internal failure when permitted alphabet constraint existed + together with for instance a size constraint. E.g. when a + referenced type is constrained by a size constraint and the defined + type in turn is constrained by a permitted alphabet constraint.

+

Own Id: OTP-4559

+
+ +

Record is generated in hrl file for a CHOICE with extension mark + that has an internal SEQUENCE/SET definition.

+

Own Id: OTP-4560

+
+ +

Now is the length of a SEQUENCE/SET OF correctly encoded/decoded (PER).

+

Own Id: OTP-4590

+
+ +

The problem with unordered decoded terms when a component is a + ObjectClassFieldType has been solved.

+

Own Id: OTP-4591

+
+
+
+ +
+ Improvements and new features + + +

More complex definitions with TableConstraints where the SimpleTable + and ComponentRelation are on different levels is now fully + supported.

+

Own Id: OTP-4631

+
+
+
+
+ +
+ Asn1 1.4 + +
+ Fixed errors and malfunctions +
+ +
+ Improvements and new features + + +

Each generated .erl file have now a function info/0 that returns + information about the used compiler version and options.

+

Own Id: OTP-4373

+
+ +

When compiling an ASN.1 module the compiler generates an Erlang module + that is compiled by the Erlang compiler. Earlier it was not possible to + add options to the final step, the Erlang compilation. By adding any + option that is not recognized as a specific ASN.1 option it will be + passed to the final step like: erlc +debug_info Mymodule.asn or + asn1ct:compile('Mymodule',[debug_info]).

+

Own Id: OTP-4491

+
+ +

Earlier one couldn't multi file compile modules that had different + tagdefault, which now is possible. Equal Type/Value names in different + modules are resolved by renaming (concatenate type name and module + name): If two types with the same name T exist in module A and module B + they will get the new names TA and TB.

+

(Own Id: OTP-4492)

+

Aux Id: OTP-3983

+
+ +

BER: Encode/decode of data have been significantly improved. By use of + the compiler options ber_bin and optimize, + optimized code will be generated and the optimized run-time module will + be used.

+

Own Id: OTP-4493

+
+
+
+
+ +
+ Asn1 1.3.3.1 + +
+ Fixed errors and malfunctions + + +

Proper length encoding and padding implemented for a BIT STRING with + NamedNumberList and size constraint as value range. This functionality + didn't work in the rare occasion when the NamedNumberList is shorter + than the lower bound of the constraint.As in this example: + TestS ::= BIT STRING {a (0),b (1)} (SIZE (3..8))

+

(Own Id: OTP-4353)

+
+ +

Bug in compiler, when an OBJECT IDENTIFIER value consisting of + two identifiers (Defined values or Name form identifiers) was falsely + interpreted causing a compiling error is now corrected.

+

(Own Id: OTP-4354)

+
+ +

Internal error in check phase that caused crash on + ObjectClassFieldType in ber_bin is corrected.

+

(Own Id: OTP-4390)

+
+ +

Tags for open types are handled according to x.680 30.6c, i.e. + open types shall not be tagged IMPLICIT.

+

(Own Id: OTP-4395)

+

(Aux Id: OTP-4390)

+
+
+
+
+ +
+ Asn1 1.3.3 + +
+ Fixed errors and malfunctions + + +

Now gives the compiler an appropriate error report when exported + undefined types are detected.

+

(Own Id: OTP-4129)

+
+ +

The type ObjectDescriptor is now supported, previously the + implementation of encode/decode for this rarely used type was + incomplete.

+

(Own Id: OTP-4161)

+

(Aux Id: seq7165)

+
+ +

In case of per and compact_bit_string the rightmost byte were erroneous + truncated when the rightmost bits of that byte were zeros. This is now + corrected.

+

(Own Id: OTP-4200)

+
+ +

Bad match of return-value from decode_length in skipvalue/3 has now been + fixed.

+

(Own Id: OTP-4232)

+
+ +

Now is decode of ENUMERATED handled correctly, when tagged EXPLICIT.

+

(Own Id: OTP-4234)

+
+ +

The compiler now parses and handles the ValueFromObject construct.

+

(Own Id: OTP-4242)

+
+ +

Now does the compiler handle the case when the object set in simple + table and componentrelation constraints is of a CLASS without a UNIQUE + field. In this case is the octets, which is assumed to be encoded, + encoded as an open type.

+

(Own Id: OTP-4248)

+

(Aux Id: OTP-4242)

+
+ +

Compiler handles objects in AdditionalElementSetSpec in ObjectSetSpec, + i.e. the objects that are referred to after the ellipses in an object set.

+

(Own Id: OTP-4275)

+
+ +

Now are values with a component of type CHOICE encoded with indefinite + length correctly decoded.

+

(Own Id: OTP-4358)

+
+
+
+ +
+ Improvements and new features + + +

The language constructs (from the old 1988 standard) ANY + and ANY DEFINED BY are now implemented.

+

(Own Id: OTP-2741)

+

(Aux Id: seq 1188)

+
+ +

Now it is checked in run-time if a OBJECT IDENTIFIER value is invalid

+

(Own Id: OTP-4235)

+
+ +

The ASN.1 types EXTERNAL,EMBEDDED PDV and CHARACTER STRING now have full support in the compiler.

+

(Own Id: OTP-4247)

+
+ +

A driver in C does the final job (complete) of the PER encoding when + files are compiled with per_bin and optimize flags. + It gives significant faster encoding for PER.

+

(Own Id: OTP-4355)

+
+ +

Encode and decode of PER encoding has been made faster by moving + analysis done in run-time to compile-time. These optimizations are + available by compiling ASN.1 files with options per_bin and + optimize.

+

(Own Id: OTP-4381)

+

(Aux Id: OTP-4355)

+
+
+
+
+ +
+ Asn1 1.3.2 + +
+ Fixed errors and malfunctions + + +

Now does the compiler check values (including referenced values), and + formats the value so it is suitable to use as input to encoding + functions.

+

(Own Id: OTP-3277)

+

(Aux Id: OTP-4103)

+
+ +

Unnecessary external function calls in generated code are now generated + as internal function calls.

+

(Own Id: OTP-4073)

+
+
+
+ +
+ Improvements and new features + + +

Now is Information Objects supported in BER encoding.

+

(Own Id: OTP-3980)

+

(Aux Id: OTP-3979 OTP-3978)

+

+
+ +

PER: A new option per_bin is now supported. When used the + generated encode/decode functions use binaries and the bit syntax to + get better performance than the old per variant which used + lists. All values input to encode and returned from decode are + compatible between per and per_bin except for + open types which are represented as binaries with per_bin and octet + lists with per. We recommend that you use per_bin instead of per from + now on, the use of binaries will be the default in coming versions and + all improvements and optimizations for PER will be concentrated to that + solution.

+

(Own Id: OTP-4094)

+

+
+ +

Support for DER implemented. Used by flag +der when compiling. Include + the full BER encoding plus: sorting of SET components, sorting of + encoded elements in SET OF, full check of default values in SET and + SEQUENCE. See new documentation on DER in user_guide sections 1.3.1; + 1.4.11; 1.4.12; 1.4.14; 1.4.16 and 1.10, in the reference manual for + asn1ct.

+

(Own Id: OTP-4103)

+

+
+
+
+
+ +
+ Asn1 1.3.1 + +
+ Fixed errors and malfunctions + + +

Do not generate record in .hrl file for SET types

+

Own Id: OTP-4025

+
+ +

Fixed internal error when using BIT STRINGs with Named Number List in combination with compact_bit_string and ber_bin options.

+

Own Id: OTP-4026

+

Aux Id: OTP-3982

+
+ +

The atom 'com' can now be used in ENUMERATED as an EnumerationItem.

+

Own Id: OTP-4037

+

Aux Id: Seq 7036

+
+ +

ber: Now it is possible (again) to encode data format "{Type,Value}" in a SEQUENCE OF RequestParameter, when RequestParameter is of type ENUMERATED. The {Type,Value} + notation is not recommended for use, it is redundant and exist only for very ancient backwards compatibility reasons. The "feature" might be removed in forthcoming versions.

+

Own Id: OTP-4057

+

Aux Id: Seq 7066

+
+ +

A bug in the parser, that caused failure on COMPONENTS OF is now removed.

+

Own Id: OTP-4058

+
+
+
+
+ +
+ Asn1 1.3 + +
+ Known problems + + +

The compiler will now check that a value referenced by name + does exist.

+

Own Id: OTP-3277

+
+ +

BER:Decode of a type T ::= SEQUENCE OF C fails if C is encoded with indefinite length. + This is know corrected.

+

Own Id: OTP-3811

+

Aux Id: seq5040

+
+
+
+ +
+ Fixed errors and malfunctions + + +

The new parser handles imports when one import ends with FROM, a modulename and a reference to a objectidentifier followed by imports from other modules.

+

Own Id: OTP-3463

+
+ +

The compiler did not check that a name mentioned as EXPORTED + actually is defined within the module. + This is now corrected.

+

Own Id: OTP-3659

+
+ +

Removed bug caused by use of nested indefinite length

+

Own Id: OTP-3994

+
+
+
+ +
+ Improvements and new features + + +

Now supporting most common use of parameterization according to X.683

+

(Own Id: OTP-3978)

+
+ +

PER: Now supporting most common use of Information Objects according to X.681. A new parser has been implemented. The error messages due to syntax errors are slightly different than previous. TableConstraint part of X.682 now also supported.

+

Own Id: OTP-3979

+
+ +

New compiler option added: ber_bin. The compiler generates code with new bit syntax. Run time functions uses bit syntax when feasible. Higher encoding/decoding performance in most cases. Se also comments for Asn1 1.2.9.3.

+

Own Id: OTP-3981

+
+ +

A more compact format of BIT STRING in Erlang is now available by use of the compiler option compact_bit_string. It is much faster when large BIT STRINGs are used.

+

Own Id: OTP-3982

+
+ +

Now possible to merge many ASN.1 input files to one Erlang file by use of a configuration file that lists the ASN.1 files.

+

Own Id: OTP-3983

+
+ +

New documentation in User's Guide in section:

+

3.1: New compile-time functions and options are described.

+

4.6: New compact format of BIT STRING is described.

+

4.8: Additional comments on character strings.

+

7: New section describing ASN.1 Information Objects.

+

8: New section describing Parameterization.

+

Reference Manual/asn1ct New compile options are described.

+

Own Id: OTP-3984

+

Aux Id: OTP-3978, OTP-3979, OTP-3981, OTP-3982, OTP-3983

+
+ +

Added the functionality to invoke ASN1Mod:encode (and decode).

+

Own Id: OTP-3985

+
+ +

Performance improvements by removing not necessary use of apply when calling asn1rt:encode. Also other general improvements.

+

Own Id: OTP-3988

+
+
+
+
+ +
+ Asn1 1.2.9.6 + +
+ Known problems + + +

The compiler does not check that an exported name actually exists in the ASN.1 module.

+

Own Id: OTP-3659

+
+ +

The compiler does not check that a value referenced by name does exist.

+

Own Id: OTP-3277

+
+ +

BER: The compiler does not take the extensions into account when checking if + the tags are unique in a SEQUENCE or SET.

+

Own Id: OTP-3304

+
+
+
+ +
+ Fixed errors and malfunctions + + +

PER: Trailing zeroes in a BIT STRING declared without named bits + should not be removed in the encodings.

+

Own Id: OTP-3830

+
+
+
+
+ +
+ Asn1 1.2.9.5 + +
+ Known problems +

Same as for 1.2.9.3.

+
+ +
+ Fixed errors and malfunctions + + +

PER: Constraints are not propagated when types are + referring to each other. Example:

+ + + TBCD-STRING ::= OCTET STRING + + LAI ::= TBCD-STRING (SIZE(3)) +

The size constraint is not passed on during encode,decode + resulting in wrong encoding for PER , it is + coded with a length determinant which should not be there + when the length is fixed. For BER this does not matter because the constraints does + not affect the encodings.

+

Own Id: OTP-3713

+
+ +

The generated code gets wrong if there are several ENUMERATED fields in a SEQUENCE or SET, this is now corrected.

+

Own Id: OTP-3796

+
+ +

BER:Decode of a type T ::= SEQUENCE OF C fails if C is encoded with indefinite length. + This is know corrected.

+

Own Id: OTP-3811

+
+
+
+
+ +
+ Asn1 1.2.9.3 + +
+ Known problems + + +

The compiler does not check that an exported name actually exists in the ASN.1 module.

+

Own Id: OTP-3659

+
+ +

The compiler does not check that a value referenced by name does exist.

+

Own Id: OTP-3277

+
+ +

BER: The compiler does not take the extensions into account when checking if + the tags are unique in a SEQUENCE or SET.

+

Own Id: OTP-3304

+
+
+
+ +
+ Fixed errors and malfunctions + + +

This version supports soft upgrade from versions 1.2.6 1.2.7.

+
+ +

In an ENUMERATED type like this:

+ +\011\011T ::= ENUMERATED { blue, green} +

The symbols was encoded/decoded with the wrong values, i.e in + reverse order. This is now corrected.

+

Own Id: OTP-3700

+
+ +

PER: OCTET STRING with Size constrained to a single value i.e fixed size + was treated wrong during encode and decode. This is now corrected.

+

Own Id: OTP-3701

+
+
+
+ +
+ Improvements and new features + + +

There is now a new compiler option ber_bin available that can be used to + generate encode/decode functions for BER that uses the new "bit-syntax" to + make the functions more efficient. The ber_bin option is used + as an alternative to the ber and per options.

+

The encode function then produces a + possibly nested list of binaries and integer lists. The decode function does + in this case require a single binary as input instead of a list. + The modules generated with this option require that you have an R7A or later + system, otherwise they will not compile and the runtime module asn1rt_ber_bin + can not be executed.

+

The ber_bin option is not officially supported in this version (will be + in a later version) but is provided for those who want to try it. + It should be significantly faster at decode and is slightly faster at encode. + Exactly how performance differs between this binary approach and the + list approach depends highly on the type of input. + Another thing worth noting is that both approaches still have a lot of + solutions in common which can be improved a lot to gain even better + performance.

+
+
+
+
+ +
+ Asn1 1.2.9.2 + +
+ Fixed errors and malfunctions + + +

BER: Encode/decode of extension components did not work properly. This is now corrected.

+

Own Id: OTP-3395

+

Aux Id:

+

PER:The encode/decode of NULL as an open type has been corrected. An open type must always have a length of at least 1 byte even if the contained + value (e.g NULL) encodes to nothing.

+

Own Id: OTP-3496

+

Aux Id:

+
+ +

BER:In the current implementation extension components of a SEQUENCE are required + to be present when they are specified as mandatory. This is an error, all extension + components are "optional" even if they are not specified to have the OPTIONAL or + DEFAULT property. This is now corrected.

+

Own Id: OTP-3278

+
+
+
+ +
+ Improvements and new features + + +

The ASN.1 language feature COMPONENTS OF is now implemented.

+

Own Id: OTP-2515

+
+ +

The encoding and decoding of ENUMERATED and + INTEGER with NamedNumbers is made more efficient and thus + faster in runtime.

+

Own Id: OTP-3464

+

Aux Id:

+
+ +

Added support for encode/decode of open type which is + constrained to a specific type. Previously the value of + an open type had to be a list of octets, but now the Erlang + representation of the specific type used in the constraint + is used both as input to encode and as output from decode.

+

Own Id: OTP-3569

+

Aux Id:

+
+ +

PER: GeneralString, GraphicalString etc. i.e all strings + that are not so called "known-multiplier character + string types" are now supported by the runtime + encode/decode functions.

+

Own Id: OTP-3573

+

Aux Id:

+
+
+
+
+ +
+ Asn1 1.2.6 + +
+ Known problems + + +

The ASN.1 language feature COMPONENTS OF is not implemented.

+

Own Id: OTP-2515

+
+ +

The compiler does not check that a value referenced by name does exist.

+

Own Id: OTP-3277

+
+ +

BER:In the current implementation extension components of a SEQUENCE are required + to be present when they are specified as mandatory. This is an error, all extension + components are "optional" even if they are not specified to have the OPTIONAL or + DEFAULT property.

+

Own Id: OTP-3278

+
+ +

BER: The compiler does not take the extensions into account when checking if + the tags are unique in a SEQUENCE or SET.

+

Own Id: OTP-3304

+
+
+
+ +
+ Fixed errors and malfunctions + + +

This version supports soft upgrade from versions 1.1.1, 1.1.5 and 1.1.6. + Two new runtime modules asn1rt_ber_v1 and + asn1rt_per_v1 are delivered together with the old ones. This makes + it possible to continue running applications with modules generated with the + previous version of the asn1 compiler while modules generated by this version + will use the new runtime modules. Note that it is only advice-able to continue + running old generates if they are working perfectly and have no need + for the corrections made in this version of the asn1 application.

+
+ +

BER: SEQUENCEs encoded with indefinite length was not correctly decoded. + This in now corrected.

+

Own Id: OTP-3352

+

Aux Id: Seq 4100

+
+
+
+
+ +
+ Asn1 1.2.4 + +
+ Fixed errors and malfunctions + + +

The compiler now detects multiple definitions of values and types and reports this as + an error. Previously this was detected when the generated Erlang module was compiled.

+

Own Id: OTP-3105

+
+ +

BER: An error regarding encoding of ENUMERATED present in asn1-1.1.1 + is corrected. The new version 1.1.2 of asn1 containing this correction is + delivered as a "patch".

+

Own Id: OTP-3169

+
+ +

BER: Decoding of SEQUENCE OF and SET OF with indefinite length is corrected. + The correction was first delivered in version 1.1.2.

+

Own Id: OTP-3170

+
+ +

BER: Encoding and decoding of ENUMERATED + with extensionmark + "..." did not work (crashed with a runtime error). This + has now been corrected. If an unknown enumerated value is + decoded (for an extensible enumerated type) + it is returned as {asn1_enum,Value} where + Value is an integer. Enumerated values in this format + are also accepted by the encoder. + ASN.1 modules containing + ENUMERATED with extensionmark should be + recompiled with the corrected + version of the compiler. The BER runtime functions are also + corrected. + Note that this correction has already been delivered as a + bugfix for R4B (OTP-2951).

+

Own Id: OTP-3202

+

Aux Id: Seq3745

+
+ +

BER: The primitive/constructed bit in the tag byte of an encoding + is not correct when it comes to user defined tags. + For example in

+ + T ::= [2] SEQUENCE { a BOOLEAN} +

the tag 2 does not get the constructed bit set which it should. + This is now corrected.

+

Own Id: OTP-3241

+
+ +

The decoder can now detect if there are unexpected bytes + remaining when all components of a sequence are decoded. + The decoder will then return {error,{asn1{unexpected,Bytes}}}

+

Own Id: OTP-3270

+
+ +

Values of type OBJECT IDENTIFIER was sometimes returned as an Erlang list + (ASN.1 constants) and sometimes as a tuple (from the decode functions). This is now + changed so that OBJECT IDENTIFIER values always are represented as an Erlang + tuple.

+

Own Id: OTP-3280

+
+ +

PER:The encode/decode functions could not handle integers with + a range greater than 16#7ffffff. This limit is now removed.

+

Own Id: OTP-3287

+
+ +

PER: The encoding/decoding of the length for a SET OF/SEQUENCE OF + was wrong if there was a size constraint. This is now corrected.

+

Own Id: OTP-3291

+
+ +

PER: Encoding of a constrained INTEGER (range > 16 k) was wrong for + the value 0. This is now corrected.

+

Own Id: OTP-3306

+
+
+
+ +
+ Improvements and new features + + +

The ASN.1 module name and the filename where the ASN.1 + specification resides must match each other (has always been the + case). This is now checked by the compiler. The check requires that + the names match in a case or case insensitive way depending on the + characteristics for the current system.

+

Own Id: OTP-1843

+
+ +

PER: Encode/decode of an extension value (i.e not within the root set) for + ENUMERATED did not work properly. This is now corrected. + If an unknown enumerated value is + decoded (for an extensible enumerated type) + it is returned as {asn1_enum,Value} where + Value is an integer. Enumerated values in this format + are also accepted by the encoder (if the value is >= the number of known + extension values).

+

Own Id: OTP-2930

+
+ +

Unnecessary printouts from the compiler are removed. + The compiler version and the compiler options are now + printed to stdout.

+

Own Id: OTP-3276

+
+ +

In order to better suite the use of ASN.1 in embedded systems only + the modules needed in runtime are now listed in the .app file.

+

Own Id: OTP-3279

+
+ +

The compiler now supports extensionmarker in constraint specifications. + Example:

+ +INTEGER (0..10, ...) +

In previous version this was reported as a syntax error.

+

Own Id: OTP-3281

+
+ +

A very limited part of ITU-T recommendation X.681 + Abstract Syntax Notation One (ASN.1): Information + object specification is now implemented. Specifically \011 + TYPE IDENTIFIER is recognized by the compiler.

+

Own Id: OTP-3325

+
+ +

Parameterization of ASN.1 specifications (ITU-T X.683) is now + supported to a limited extent.

+

Own Id: OTP-3326

+
+
+
+
+ +
+ Asn1 1.1.3.1 + +
+ Fixed errors and malfunctions + + +

BER Encoding and decoding of ENUMERATED + with extensionmark + "..." did not work (crashed with a runtime error). This + has now been corrected. If an unknown enumerated value is + decoded (for an extensible enumerated type) + it is returned as {asn1_enum,Value} where + Value is an integer. Enumerated values in this format + are also accepted by the encoder. + ASN.1 modules containing + ENUMERATED with extensionmark should be + recompiled with the corrected + version of the compiler. The BER runtime functions are also + corrected. + Note that this correction has already been delivered as a + bug-fix for R4B (OTP-2951).

+

Own Id: OTP-3202

+

Aux Id: Seq3745

+
+
+
+
+ +
+ Asn1 1.1.1 + +
+ Known problems + + +

The syntactic construct COMPONENTS OF is not + implemented.

+

Own Id: OTP-2515

+
+ +

ANY and ANY DEFINED BY are currently not + supported.

+

Own Id: OTP-2741

+

Aux Id: seq 1188

+
+ +

Multiple definitions of the same Type or Value is not detected + by the compiler. The error occurs when the generated Erlang + module is compiled.

+

Own Id: OTP-3105

+
+
+
+
+ +
+ Asn1 1.1 + +
+ Known problems + + +

The primitive/constructed bit in the tag byte of an encoding + is not correct when it comes to user defined tags. + For example in

+ + T ::= [2] SEQUENCE { a BOOLEAN} +

the tag 2 does not get the constructed bit set which it should. + This is now corrected.

+

Own Id: OTP-3241

+
+
+
+ +
+ Fixed errors and malfunctions + + +

The BER decoder failed to decode certain nested data types + where IMPLICIT tags where involved. + This is now corrected.

+

Own Id: OTP-2719

+

Aux Id: seq 1148

+
+ +

The handling of types with extension marker "..." is corrected. + Earlier each SEQUENCE and SET with an extension marker got an + extra field named asn1_EXT in the generated record. + This was a mistake and that field is now removed (concerns + both BER and BER).

+

Own Id: OTP-2724

+

Aux Id: seq 1148, OTP-2719

+
+ +

The decoder (both BER and PER) could not handle unnamed + bits of a BIT STRING if the type had any + named bits declared. This is now corrected and the unnamed + bits are returned as {bit,Pos} where Pos is the bit + position. The {bit,Pos} can be used as input to the + encoder too.

+

Own Id: OTP-2725

+

Aux Id: seq 1148,OTP-2719,OTP-2724

+
+ +

The functions asn1rt:decode and asn1ct:decode + did not always return {ok,Result} or + {error,Reason} as documented. This is now corrected.

+

Own Id: OTP-2730

+

Aux Id: seq 1158

+
+ +

The compiler did not accept CHOICE types as components + of a SEQUENCE or SET when + the modules tag default was IMPLICIT. + Example:

+ +C ::= CHOICE { ......} +A ::= SEQUENCE { +a [1] C, -- This was not accepted +..... +

This was an error + caused by a misinterpretation of the ASN.1 standard. This + is now corrected.

+

Own Id: OTP-2731

+

Aux Id: seq 1163

+
+ +

When decoding a SEQUENCE A which contains an OPTIONAL component + b which is a SEQUENCE with mandatory components, the decoder + does not detect as an error that a mandatory component of b + is missing. The same error could occur also in other cases + with nested types and optional components of SEQUENCE or SET. + This is now corrected.

+

Own Id: OTP-2738

+

Aux Id: seq 1183

+
+ +

BER Encoding and decoding of ENUMERATED + with extensionmark + "..." did not work (crashed with a runtime error). This + has now been corrected. If an unknown enumerated value is + decoded (for an extensible enumerated type) + it is returned as {asn1_enum,Value} where + Value is an integer. Enumerated values in this format + are also accepted by the encoder. + ASN.1 modules containing + ENUMERATED with extensionmark should be + recompiled with the corrected + version of the compiler. The BER runtime functions are also + corrected.

+

Own Id: OTP-2951

+

Aux Id: Seq 1446 OTP-2929

+
+ +

The compiler does now accept all valid value notations + for the OBJECT IDENTIFIER type. The generated code for + those values is also corrected.

+

Own Id: OTP-3059

+
+
+
+ +
+ Improvements and new features + + +

The code generated for BER is significantly enhanced resulting + in less code and around 300% better performance in runtime + for the encoding of complex ASN.1 values. The performance of + decoding is unchanged.

+

Own Id: OTP-2806

+
+
+
+
+ +
+ Asn1 1.0.3 + +
+ Fixed errors and malfunctions + + +

The asn1.app file is corrected.

+

Own Id: OTP-2640

+
+ +

The encoding of integers in BER did not comply with the + standard for all values. The values was not encoded + in the minimum number of octets as required. This is + now corrected in the runtime module asn1rt_ber.

+

Own Id: OTP-2666

+
+
+
+ +
+ Improvements and new features + + +

The compiler now generates explicit exports directives for + all generated + functions that should be exported (instead of -compile(export_all)). + This eliminates the warnings from the Erlang compiler when + compiling the + generated file.

+

Own Id: OTP-1845

+
+
+
+
+ +
+ R3B02 (Asn1 1.0.2) + +
+ Fixed errors and malfunctions + + +

The decoding of a BER encoded SEQUENCE with optional component + of type SEQUENCE (also with optional components) could result + in an error or wrong result if the tags are equal.

+

Own Id: OTP-2226

+
+ +

The encoding of (PER) SEQUENCE with extensionmark was wrong. + This is now corrected.

+

Own Id: OTP-2349

+
+
+
+
+ +
+ R3A (Asn1 0.9) + +
+ Fixed errors and malfunctions + + +

The asn1 compiler now detects the use of an implicit tag before CHOICE as an error (in accordance with the standard)

+

Own Id: OTP-1844

+
+ +

An OPTIONAL CHOICE embedded in SEQUENCE when BER coding + caused an error when generating decode code. This is now + corrected.

+

Own Id: OTP-1857

+

Aux Id: OTP-1848

+
+
+
+
+ +
+ 1 ASN1 0.8.1 +

This is the first release of the ASN1 application. This version is + released for beta-testing. Some functionality will be added until the + 1.0 version is released. See the release notes for the latest version + for the exact details about new features. A list of missing features + and restrictions can be found in the chapter below.

+ +
+ 1.1 Missing features and other restrictions +

+ + +

The encoding rules BER and PER (aligned) is supported. PER (unaligned) IS NOT SUPPORTED.

+
+ +

NOT SUPPORTED types ANY and ANY DEFINED BY + (is not in the standard any more).

+
+ +

NOT SUPPORTED types EXTERNAL and EMBEDDED-PDV.

+
+ +

NOT SUPPORTED type REAL (planned to be implemented).

+
+ +

The code generation support for value definitions in the ASN.1 notation is very limited + (planned to be enhanced).

+
+ +

The support for constraints is limited to:

+
+
+ + +

SizeConstraint SIZE(X)

+
+ +

SingleValue (1)

+
+ +

ValueRange (X..Y)

+
+ +

PermittedAlpabet FROM (but not for BMPString and UniversalString when generating PER).

+
+ +

Complex expressions in constraints is not supported (planned to be extended).

+
+ +

The current version of the compiler has very limited error checking:

+
+ +

Stops at first syntax error.

+
+ +

Does not stop when a reference to an undefined type is found , + but prints an error message. Compilation of the generated + Erlang module will then fail.

+
+ +

A whole number of other semantical controls is currently + missing. This means that the compiler will give little + or bad help to detect what's wrong with an ASN.1 + specification, but will mostly work very well when the + ASN.1 specification is correct.

+
+
+ + +

The maximum INTEGER supported in this version is a + signed 64 bit integer. This limitation is probably quite + reasonable. (Planned to be extended).

+
+ +

Only AUTOMATIC TAGS supported for PER.

+
+ +

Only EXPLICIT and IMPLICIT TAGS supported for BER.

+
+ +

The compiler supports decoding of BER-data with indefinite + length but it is not possible to produce data with indefinite + length with the encoder.

+
+
+
+
+
+ diff --git a/lib/asn1/doc/src/part.xml b/lib/asn1/doc/src/part.xml new file mode 100644 index 0000000000..19ee64b4a0 --- /dev/null +++ b/lib/asn1/doc/src/part.xml @@ -0,0 +1,39 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Asn1 User's Guide + Kenneth Lundin + + 1999-02-12 + 0.9 + part.sgml +
+ +

The Asn1 application + contains modules with compile-time and run-time support for ASN.1. +

+
+ + +
+ diff --git a/lib/asn1/doc/src/part_notes.xml b/lib/asn1/doc/src/part_notes.xml new file mode 100644 index 0000000000..b0a6887aa5 --- /dev/null +++ b/lib/asn1/doc/src/part_notes.xml @@ -0,0 +1,39 @@ + + + + +
+ + 20042009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Asn1 Release Notes + Ingela Anderton Andin + + >2004-09-07 + + part_notes.sgml +
+ +

The Asn1 application + contains modules with compile-time and run-time support for ASN.1.

+

There are also release notes for + older versions.

+
+ +
+ diff --git a/lib/asn1/doc/src/ref_man.xml b/lib/asn1/doc/src/ref_man.xml new file mode 100644 index 0000000000..a0af1f5be3 --- /dev/null +++ b/lib/asn1/doc/src/ref_man.xml @@ -0,0 +1,38 @@ + + + + +
+ + 19972009 + Ericsson AB. All Rights Reserved. + + + The contents of this file are subject to the Erlang Public License, + Version 1.1, (the "License"); you may not use this file except in + compliance with the License. You should have received a copy of the + Erlang Public License along with this software. If not, it can be + retrieved online at http://www.erlang.org/. + + Software distributed under the License is distributed on an "AS IS" + basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See + the License for the specific language governing rights and limitations + under the License. + + + + Asn1 Reference Manual + OTP Team + + 1997-10-04 + 1.3.1 + application.sgml +
+ +

The Asn1 application + contains modules with compile-time and run-time support for ASN.1.

+
+ + +
+ diff --git a/lib/asn1/doc/src/selective_TypeList.gif b/lib/asn1/doc/src/selective_TypeList.gif new file mode 100644 index 0000000000..b1bf0a4f5b Binary files /dev/null and b/lib/asn1/doc/src/selective_TypeList.gif differ diff --git a/lib/asn1/doc/src/selective_TypeList.ps b/lib/asn1/doc/src/selective_TypeList.ps new file mode 100644 index 0000000000..0d1f301240 --- /dev/null +++ b/lib/asn1/doc/src/selective_TypeList.ps @@ -0,0 +1,266 @@ +%!PS-Adobe-2.0 +%%Title: selective_TypeList.ps +%%Creator: fig2dev Version 3.2 Patchlevel 1 +%%CreationDate: Tue Oct 28 15:52:00 2003 +%%For: bertil@super (Bertil Karlsson,UAB/F/P) +%%Orientation: Portrait +%%BoundingBox: 158 178 453 614 +%%Pages: 1 +%%BeginSetup +%%IncludeFeature: *PageSize Letter +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +55.5 677.0 translate +1 -1 scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 9310 m -1000 -1000 l 7626 -1000 l 7626 9310 l cp clip + 0.06000 0.06000 sc +%%Page: 1 1 +% Arc +7.500 slw +gs clippath +2363 5348 m 2475 5400 l 2352 5407 l 2484 5432 l 2495 5373 l cp +clip +n 2470.1 5021.7 378.3 -100.7 89.3 arcn +gs col0 s gr + gr + +% arrowhead +n 2363 5348 m 2475 5400 l 2352 5407 l 2357 5378 l 2363 5348 l cp gs 0.00 setgray ef gr col0 s +% Arc +gs clippath +2384 7192 m 2475 7275 l 2355 7245 l 2474 7309 l 2502 7256 l cp +clip +n 2896.9 6337.5 1028.0 -114.2 114.2 arcn +gs col0 s gr + gr + +% arrowhead +n 2384 7192 m 2475 7275 l 2355 7245 l 2369 7218 l 2384 7192 l cp gs 0.00 setgray ef gr col0 s +% Arc +gs clippath +2448 7504 m 2550 7575 l 2427 7561 l 2553 7608 l 2575 7552 l cp +clip +n 2512.5 7462.5 118.6 -108.4 71.6 arcn +gs col0 s gr + gr + +% arrowhead +n 2448 7504 m 2550 7575 l 2427 7561 l 2438 7533 l 2448 7504 l cp gs 0.00 setgray ef gr col0 s +% Arc +gs clippath +2869 2255 m 2775 2175 l 2896 2202 l 2775 2141 l 2748 2195 l cp +clip +n 1347.8 5222.4 3365.1 42.6 -64.9 arcn +gs col0 s gr + gr + +% arrowhead +n 2869 2255 m 2775 2175 l 2896 2202 l 2882 2229 l 2869 2255 l cp gs 0.00 setgray ef gr col0 s +% Arc +gs clippath +5199 1837 m 5250 1950 l 5152 1874 l 5236 1980 l 5283 1943 l cp +clip +n 4021.7 2817.4 1503.7 -141.2 -35.2 arc +gs col0 s gr + gr + +% arrowhead +n 5199 1837 m 5250 1950 l 5152 1874 l 5176 1856 l 5199 1837 l cp gs 0.00 setgray ef gr col0 s +/Times-Roman ff 180.00 scf sf +2400 1350 m +gs 1 -1 sc (Action ::= SEQUENCE ) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 1590 m +gs 1 -1 sc ( { ) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 1830 m +gs 1 -1 sc ( number INTEGER DEFAULT 15,) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 2310 m +gs 1 -1 sc ( }) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 2790 m +gs 1 -1 sc (Key ::= [11] EXPLICIT Button) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 3030 m +gs 1 -1 sc (Handle ::= [12] Key) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 3270 m +gs 1 -1 sc (Button ::= SEQUENCE ) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 3510 m +gs 1 -1 sc ( {) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 3750 m +gs 1 -1 sc ( number INTEGER,) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 3990 m +gs 1 -1 sc ( on BOOLEAN) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 4230 m +gs 1 -1 sc ( }) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 4950 m +gs 1 -1 sc ( {) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 5190 m +gs 1 -1 sc ( vsn INTEGER,) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 5670 m +gs 1 -1 sc ( }) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 6150 m +gs 1 -1 sc (Status ::= SEQUENCE ) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 6390 m +gs 1 -1 sc ( {) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 6630 m +gs 1 -1 sc ( state INTEGER,) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 6870 m +gs 1 -1 sc ( buttonList SEQUENCE OF Button,) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 7110 m +gs 1 -1 sc ( enabled BOOLEAN OPTIONAL,) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 7830 m +gs 1 -1 sc ( noOfActions INTEGER) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 8070 m +gs 1 -1 sc ( }) col0 sh gr +/Times-Roman ff 180.00 scf sf +2400 8310 m +gs 1 -1 sc ( }) col0 sh gr +/Times-Roman ff 180.00 scf sf +3150 4725 m +gs 1 -1 sc (::= CHOICE) col0 sh gr +/Times-Bold ff 195.00 scf sf +2400 4710 m +gs 1 -1 sc (Window) col0 sh gr +/Times-Bold ff 195.00 scf sf +2400 5430 m +gs 1 -1 sc ( status) col0 sh gr +/Times-Roman ff 180.00 scf sf +3225 5475 m +gs 1 -1 sc (E) col0 sh gr +/Times-Roman ff 180.00 scf sf +3150 7350 m +gs 1 -1 sc (CHOICE {) col0 sh gr +/Times-Bold ff 195.00 scf sf +2400 7350 m +gs 1 -1 sc ( actions) col0 sh gr +/Times-Roman ff 180.00 scf sf +3975 7575 m +gs 1 -1 sc (SEQUENCE OF Action) col0 sh gr +/Times-Bold ff 195.00 scf sf +2400 7590 m +gs 1 -1 sc ( possibleActions) col0 sh gr +/Times-Roman ff 180.00 scf sf +5550 2100 m +gs 1 -1 sc (12, on TRUE}) col0 sh gr +/Times-Bold ff 195.00 scf sf +2400 2070 m +gs 1 -1 sc ( handle) col0 sh gr +/Times-Bold ff 195.00 scf sf +4950 2100 m +gs 1 -1 sc (number ) col0 sh gr +/Times-Roman ff 225.00 scf sf +1950 5100 m +gs 1 -1 sc (1) col0 sh gr +/Times-Roman ff 225.00 scf sf +1725 6450 m +gs 1 -1 sc (2) col0 sh gr +/Times-Roman ff 225.00 scf sf +2250 7575 m +gs 1 -1 sc (3) col0 sh gr +/Times-Roman ff 225.00 scf sf +4800 4950 m +gs 1 -1 sc (4) col0 sh gr +/Times-Roman ff 225.00 scf sf +4200 1200 m +gs 1 -1 sc (5) col0 sh gr +/Times-Roman ff 180.00 scf sf +3150 2100 m +gs 1 -1 sc ([0] Handle DEFAULT {) col0 sh gr +$F2psEnd +rs +showpage diff --git a/lib/asn1/doc/src/selective_Window2.gif b/lib/asn1/doc/src/selective_Window2.gif new file mode 100644 index 0000000000..9ee2b0710e Binary files /dev/null and b/lib/asn1/doc/src/selective_Window2.gif differ diff --git a/lib/asn1/doc/src/selective_Window2.ps b/lib/asn1/doc/src/selective_Window2.ps new file mode 100644 index 0000000000..d5a95ca591 --- /dev/null +++ b/lib/asn1/doc/src/selective_Window2.ps @@ -0,0 +1,515 @@ +%!PS-Adobe-2.0 +%%Title: selective_Window2.ps +%%Creator: fig2dev Version 3.2 Patchlevel 1 +%%CreationDate: Tue Oct 28 16:55:06 2003 +%%For: bertil@super (Bertil Karlsson,UAB/F/P) +%%Orientation: Landscape +%%BoundingBox: 134 128 460 713 +%%Pages: 1 +%%BeginSetup +%%IncludeFeature: *PageSize A4 +%%EndSetup +%%Magnification: 1.0000 +%%EndComments +/MyAppDict 100 dict dup begin def +/$F2psDict 200 dict def +$F2psDict begin +$F2psDict /mtrx matrix put +/col-1 {0 setgray} bind def +/col0 {0.000 0.000 0.000 srgb} bind def +/col1 {0.000 0.000 1.000 srgb} bind def +/col2 {0.000 1.000 0.000 srgb} bind def +/col3 {0.000 1.000 1.000 srgb} bind def +/col4 {1.000 0.000 0.000 srgb} bind def +/col5 {1.000 0.000 1.000 srgb} bind def +/col6 {1.000 1.000 0.000 srgb} bind def +/col7 {1.000 1.000 1.000 srgb} bind def +/col8 {0.000 0.000 0.560 srgb} bind def +/col9 {0.000 0.000 0.690 srgb} bind def +/col10 {0.000 0.000 0.820 srgb} bind def +/col11 {0.530 0.810 1.000 srgb} bind def +/col12 {0.000 0.560 0.000 srgb} bind def +/col13 {0.000 0.690 0.000 srgb} bind def +/col14 {0.000 0.820 0.000 srgb} bind def +/col15 {0.000 0.560 0.560 srgb} bind def +/col16 {0.000 0.690 0.690 srgb} bind def +/col17 {0.000 0.820 0.820 srgb} bind def +/col18 {0.560 0.000 0.000 srgb} bind def +/col19 {0.690 0.000 0.000 srgb} bind def +/col20 {0.820 0.000 0.000 srgb} bind def +/col21 {0.560 0.000 0.560 srgb} bind def +/col22 {0.690 0.000 0.690 srgb} bind def +/col23 {0.820 0.000 0.820 srgb} bind def +/col24 {0.500 0.190 0.000 srgb} bind def +/col25 {0.630 0.250 0.000 srgb} bind def +/col26 {0.750 0.380 0.000 srgb} bind def +/col27 {1.000 0.500 0.500 srgb} bind def +/col28 {1.000 0.630 0.630 srgb} bind def +/col29 {1.000 0.750 0.750 srgb} bind def +/col30 {1.000 0.880 0.880 srgb} bind def +/col31 {1.000 0.840 0.000 srgb} bind def + +end +save +77.5 92.5 translate + 90 rotate +1 -1 scale +.9 .9 scale % to make patterns same scale as in xfig + +% This junk string is used by the show operators +/PATsstr 1 string def +/PATawidthshow { % cx cy cchar rx ry string + % Loop over each character in the string + { % cx cy cchar rx ry char + % Show the character + dup % cx cy cchar rx ry char char + PATsstr dup 0 4 -1 roll put % cx cy cchar rx ry char (char) + false charpath % cx cy cchar rx ry char + /clip load PATdraw + % Move past the character (charpath modified the + % current point) + currentpoint % cx cy cchar rx ry char x y + newpath + moveto % cx cy cchar rx ry char + % Reposition by cx,cy if the character in the string is cchar + 3 index eq { % cx cy cchar rx ry + 4 index 4 index rmoveto + } if + % Reposition all characters by rx ry + 2 copy rmoveto % cx cy cchar rx ry + } forall + pop pop pop pop pop % - + currentpoint + newpath + moveto +} bind def +/PATcg { + 7 dict dup begin + /lw currentlinewidth def + /lc currentlinecap def + /lj currentlinejoin def + /ml currentmiterlimit def + /ds [ currentdash ] def + /cc [ currentrgbcolor ] def + /cm matrix currentmatrix def + end +} bind def +% PATdraw - calculates the boundaries of the object and +% fills it with the current pattern +/PATdraw { % proc + save exch + PATpcalc % proc nw nh px py + 5 -1 roll exec % nw nh px py + newpath + PATfill % - + restore +} bind def +% PATfill - performs the tiling for the shape +/PATfill { % nw nh px py PATfill - + PATDict /CurrentPattern get dup begin + setfont + % Set the coordinate system to Pattern Space + PatternGState PATsg + % Set the color for uncolored pattezns + PaintType 2 eq { PATDict /PColor get PATsc } if + % Create the string for showing + 3 index string % nw nh px py str + % Loop for each of the pattern sources + 0 1 Multi 1 sub { % nw nh px py str source + % Move to the starting location + 3 index 3 index % nw nh px py str source px py + moveto % nw nh px py str source + % For multiple sources, set the appropriate color + Multi 1 ne { dup PC exch get PATsc } if + % Set the appropriate string for the source + 0 1 7 index 1 sub { 2 index exch 2 index put } for pop + % Loop over the number of vertical cells + 3 index % nw nh px py str nh + { % nw nh px py str + currentpoint % nw nh px py str cx cy + 2 index show % nw nh px py str cx cy + YStep add moveto % nw nh px py str + } repeat % nw nh px py str + } for + 5 { pop } repeat + end +} bind def + +% PATkshow - kshow with the current pattezn +/PATkshow { % proc string + exch bind % string proc + 1 index 0 get % string proc char + % Loop over all but the last character in the string + 0 1 4 index length 2 sub { + % string proc char idx + % Find the n+1th character in the string + 3 index exch 1 add get % string proe char char+1 + exch 2 copy % strinq proc char+1 char char+1 char + % Now show the nth character + PATsstr dup 0 4 -1 roll put % string proc chr+1 chr chr+1 (chr) + false charpath % string proc char+1 char char+1 + /clip load PATdraw + % Move past the character (charpath modified the current point) + currentpoint newpath moveto + % Execute the user proc (should consume char and char+1) + mark 3 1 roll % string proc char+1 mark char char+1 + 4 index exec % string proc char+1 mark... + cleartomark % string proc char+1 + } for + % Now display the last character + PATsstr dup 0 4 -1 roll put % string proc (char+1) + false charpath % string proc + /clip load PATdraw + neewath + pop pop % - +} bind def +% PATmp - the makepattern equivalent +/PATmp { % patdict patmtx PATmp patinstance + exch dup length 7 add % We will add 6 new entries plus 1 FID + dict copy % Create a new dictionary + begin + % Matrix to install when painting the pattern + TilingType PATtcalc + /PatternGState PATcg def + PatternGState /cm 3 -1 roll put + % Check for multi pattern sources (Level 1 fast color patterns) + currentdict /Multi known not { /Multi 1 def } if + % Font dictionary definitions + /FontType 3 def + % Create a dummy encoding vector + /Encoding 256 array def + 3 string 0 1 255 { + Encoding exch dup 3 index cvs cvn put } for pop + /FontMatrix matrix def + /FontBBox BBox def + /BuildChar { + mark 3 1 roll % mark dict char + exch begin + Multi 1 ne {PaintData exch get}{pop} ifelse % mark [paintdata] + PaintType 2 eq Multi 1 ne or + { XStep 0 FontBBox aload pop setcachedevice } + { XStep 0 setcharwidth } ifelse + currentdict % mark [paintdata] dict + /PaintProc load % mark [paintdata] dict paintproc + end + gsave + false PATredef exec true PATredef + grestore + cleartomark % - + } bind def + currentdict + end % newdict + /foo exch % /foo newlict + definefont % newfont +} bind def +% PATpcalc - calculates the starting point and width/height +% of the tile fill for the shape +/PATpcalc { % - PATpcalc nw nh px py + PATDict /CurrentPattern get begin + gsave + % Set up the coordinate system to Pattern Space + % and lock down pattern + PatternGState /cm get setmatrix + BBox aload pop pop pop translate + % Determine the bounding box of the shape + pathbbox % llx lly urx ury + grestore + % Determine (nw, nh) the # of cells to paint width and height + PatHeight div ceiling % llx lly urx qh + 4 1 roll % qh llx lly urx + PatWidth div ceiling % qh llx lly qw + 4 1 roll % qw qh llx lly + PatHeight div floor % qw qh llx ph + 4 1 roll % ph qw qh llx + PatWidth div floor % ph qw qh pw + 4 1 roll % pw ph qw qh + 2 index sub cvi abs % pw ph qs qh-ph + exch 3 index sub cvi abs exch % pw ph nw=qw-pw nh=qh-ph + % Determine the starting point of the pattern fill + %(px, py) + 4 2 roll % nw nh pw ph + PatHeight mul % nw nh pw py + exch % nw nh py pw + PatWidth mul exch % nw nh px py + end +} bind def + +% Save the original routines so that we can use them later on +/oldfill /fill load def +/oldeofill /eofill load def +/oldstroke /stroke load def +/oldshow /show load def +/oldashow /ashow load def +/oldwidthshow /widthshow load def +/oldawidthshow /awidthshow load def +/oldkshow /kshow load def + +% These defs are necessary so that subsequent procs don't bind in +% the originals +/fill { oldfill } bind def +/eofill { oldeofill } bind def +/stroke { oldstroke } bind def +/show { oldshow } bind def +/ashow { oldashow } bind def +/widthshow { oldwidthshow } bind def +/awidthshow { oldawidthshow } bind def +/kshow { oldkshow } bind def +/PATredef { + MyAppDict begin + { + /fill { /clip load PATdraw newpath } bind def + /eofill { /eoclip load PATdraw newpath } bind def + /stroke { PATstroke } bind def + /show { 0 0 null 0 0 6 -1 roll PATawidthshow } bind def + /ashow { 0 0 null 6 3 roll PATawidthshow } + bind def + /widthshow { 0 0 3 -1 roll PATawidthshow } + bind def + /awidthshow { PATawidthshow } bind def + /kshow { PATkshow } bind def + } { + /fill { oldfill } bind def + /eofill { oldeofill } bind def + /stroke { oldstroke } bind def + /show { oldshow } bind def + /ashow { oldashow } bind def + /widthshow { oldwidthshow } bind def + /awidthshow { oldawidthshow } bind def + /kshow { oldkshow } bind def + } ifelse + end +} bind def +false PATredef +% Conditionally define setcmykcolor if not available +/setcmykcolor where { pop } { + /setcmykcolor { + 1 sub 4 1 roll + 3 { + 3 index add neg dup 0 lt { pop 0 } if 3 1 roll + } repeat + setrgbcolor - pop + } bind def +} ifelse +/PATsc { % colorarray + aload length % c1 ... cn length + dup 1 eq { pop setgray } { 3 eq { setrgbcolor } { setcmykcolor + } ifelse } ifelse +} bind def +/PATsg { % dict + begin + lw setlinewidth + lc setlinecap + lj setlinejoin + ml setmiterlimit + ds aload pop setdash + cc aload pop setrgbcolor + cm setmatrix + end +} bind def + +/PATDict 3 dict def +/PATsp { + true PATredef + PATDict begin + /CurrentPattern exch def + % If it's an uncolored pattern, save the color + CurrentPattern /PaintType get 2 eq { + /PColor exch def + } if + /CColor [ currentrgbcolor ] def + end +} bind def +% PATstroke - stroke with the current pattern +/PATstroke { + countdictstack + save + mark + { + currentpoint strokepath moveto + PATpcalc % proc nw nh px py + clip newpath PATfill + } stopped { + (*** PATstroke Warning: Path is too complex, stroking + with gray) = + cleartomark + restore + countdictstack exch sub dup 0 gt + { { end } repeat } { pop } ifelse + gsave 0.5 setgray oldstroke grestore + } { pop restore pop } ifelse + newpath +} bind def +/PATtcalc { % modmtx tilingtype PATtcalc tilematrix + % Note: tiling types 2 and 3 are not supported + gsave + exch concat % tilingtype + matrix currentmatrix exch % cmtx tilingtype + % Tiling type 1 and 3: constant spacing + 2 ne { + % Distort the pattern so that it occupies + % an integral number of device pixels + dup 4 get exch dup 5 get exch % tx ty cmtx + XStep 0 dtransform + round exch round exch % tx ty cmtx dx.x dx.y + XStep div exch XStep div exch % tx ty cmtx a b + 0 YStep dtransform + round exch round exch % tx ty cmtx a b dy.x dy.y + YStep div exch YStep div exch % tx ty cmtx a b c d + 7 -3 roll astore % { a b c d tx ty } + } if + grestore +} bind def +/PATusp { + false PATredef + PATDict begin + CColor PATsc + end +} bind def + +% crosshatch45 +11 dict begin +/PaintType 1 def +/PatternType 1 def +/TilingType 1 def +/BBox [0 0 1 1] def +/XStep 1 def +/YStep 1 def +/PatWidth 1 def +/PatHeight 1 def +/Multi 2 def +/PaintData [ + { clippath } bind + { 32 32 true [ 32 0 0 -32 0 32 ] + {<828282824444444428282828101010102828282844444444 + 828282820101010182828282444444442828282810101010 + 282828284444444482828282010101018282828244444444 + 282828281010101028282828444444448282828201010101 + 828282824444444428282828101010102828282844444444 + 8282828201010101>} + imagemask } bind +] def +/PaintProc { + pop + exec fill +} def +currentdict +end +/P6 exch def +1.1111 1.1111 scale %restore scale + +/cp {closepath} bind def +/ef {eofill} bind def +/gr {grestore} bind def +/gs {gsave} bind def +/sa {save} bind def +/rs {restore} bind def +/l {lineto} bind def +/m {moveto} bind def +/rm {rmoveto} bind def +/n {newpath} bind def +/s {stroke} bind def +/sh {show} bind def +/slc {setlinecap} bind def +/slj {setlinejoin} bind def +/slw {setlinewidth} bind def +/srgb {setrgbcolor} bind def +/rot {rotate} bind def +/sc {scale} bind def +/sd {setdash} bind def +/ff {findfont} bind def +/sf {setfont} bind def +/scf {scalefont} bind def +/sw {stringwidth} bind def +/tr {translate} bind def +/tnt {dup dup currentrgbcolor + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add + 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb} + bind def +/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul + 4 -2 roll mul srgb} bind def +/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def +/$F2psEnd {$F2psEnteredState restore end} def +%%EndProlog + +$F2psBegin +10 setmiterlimit +n -1000 7375 m -1000 -1000 l 11348 -1000 l 11348 7375 l cp clip + 0.06000 0.06000 sc +%%Page: 1 1 +% Polyline +7.500 slw +n 3150 975 m 3150 1500 l gs col0 s gr +% Polyline +n 4800 3600 m 9975 3600 l 9975 4125 l 4800 4125 l cp gs col0 s gr +% Polyline +n 5925 3600 m 5925 4125 l gs col0 s gr +% Polyline +n 7800 4200 m 7500 5325 l gs col0 s gr +% Polyline +n 5400 5550 m 7200 5550 l 7200 6075 l 5400 6075 l cp gs /PC [[1.00 1.00 1.00] [0.00 0.00 0.00]] def +15.00 15.00 sc P6 [16 0 0 -16 360.00 370.00] PATmp PATsp ef gr PATusp gs col0 s gr +% Polyline +n 7200 5550 m 9300 5550 l 9300 6075 l 7200 6075 l cp gs col0 s gr +% Polyline +n 2400 975 m 9700 975 l 9700 1500 l 2400 1500 l cp gs col0 s gr +% Polyline +n 6150 975 m 6150 1500 l gs col0 s gr +% Polyline +n 6825 975 m 6825 1500 l gs col0 s gr +% Polyline + [60] 0 sd +n 7800 975 m 7800 1500 l gs col0 s gr [] 0 sd +% Polyline + [60] 0 sd +n 8775 975 m 8775 1500 l gs col0 s gr [] 0 sd +% Polyline +gs clippath +6667 1636 m 6775 1575 l 6709 1679 l 6807 1586 l 6765 1543 l cp +clip +n 6775 1575 m 4800 3450 l gs col0 s gr gr + +% arrowhead +n 6667 1636 m 6775 1575 l 6709 1679 l col0 s +% Polyline +n 7850 1575 m 9975 3450 l gs col0 s gr +/Times-Roman ff 180.00 scf sf +600 1275 m +gs 1 -1 sc (Window:status message) col0 sh gr +/Times-Roman ff 180.00 scf sf +2550 1800 m +gs 1 -1 sc (state) col0 sh gr +/Times-Roman ff 180.00 scf sf +4275 1800 m +gs 1 -1 sc (buttonList) col0 sh gr +/Times-Roman ff 180.00 scf sf +8625 1875 m +gs 1 -1 sc (actions:possibleActions) col0 sh gr +/Times-Roman ff 180.00 scf sf +5025 4350 m +gs 1 -1 sc (number) col0 sh gr +/Times-Roman ff 180.00 scf sf +7275 4425 m +gs 1 -1 sc (handle) col0 sh gr +/Times-Roman ff 180.00 scf sf +5850 6375 m +gs 1 -1 sc (number) col0 sh gr +/Times-Roman ff 180.00 scf sf +8100 6375 m +gs 1 -1 sc (on) col0 sh gr +/Times-Roman ff 180.00 scf sf +6225 1800 m +gs 1 -1 sc (enabled) col0 sh gr +/Times-Roman ff 180.00 scf sf +7275 1350 m +gs 1 -1 sc ([1]) col0 sh gr +/Times-Roman ff 180.00 scf sf +8175 1350 m +gs 1 -1 sc ([2]) col0 sh gr +/Times-Roman ff 180.00 scf sf +9150 1350 m +gs 1 -1 sc ([3]) col0 sh gr +$F2psEnd +rs +end +showpage diff --git a/lib/asn1/doc/src/warning.gif b/lib/asn1/doc/src/warning.gif new file mode 100644 index 0000000000..96af52360e Binary files /dev/null and b/lib/asn1/doc/src/warning.gif differ diff --git a/lib/asn1/doc/users_guide/Makefile b/lib/asn1/doc/users_guide/Makefile new file mode 100644 index 0000000000..996b2582af --- /dev/null +++ b/lib/asn1/doc/users_guide/Makefile @@ -0,0 +1,69 @@ +# +# %CopyrightBegin% +# +# Copyright Ericsson AB 1997-2009. All Rights Reserved. +# +# The contents of this file are subject to the Erlang Public License, +# Version 1.1, (the "License"); you may not use this file except in +# compliance with the License. You should have received a copy of the +# Erlang Public License along with this software. If not, it can be +# retrieved online at http://www.erlang.org/. +# +# Software distributed under the License is distributed on an "AS IS" +# basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See +# the License for the specific language governing rights and limitations +# under the License. +# +# %CopyrightEnd% +# +# +OTP_MAKE_ROOT=/home/super/otp/otp_make +include $(OTP_MAKE_ROOT)/otp.mk + +# +# Release Macros +# + +# +# Common macros +# + +SGML_FILES= asn1.sgml + +FIG_FILES = + +GIF_FILES= + +PSFIG_FILES= + +USERS_GUIDE = users_guide.sgml + +EXTRA_GEN_FILES= $(SGML_FILES:.sgml=.html) \ + users_guide_frame.html users_guide_first.html \ + min_head.gif + +HTML_FILES= $(USERS_GUIDE:.sgml=.html) + +TEX_FILES= $(SGML_FILES:.sgml=.tex) $(USERS_GUIDE:.sgml=.tex) +DVI_FILES= $(USERS_GUIDE:.sgml=.dvi) +PS_FILES= $(USERS_GUIDE:.sgml=.ps) + + +# +# Make Rules +# +all $(DEFAULT_OPT_TARGETS) $(DEFAULT_DEBUG_TARGETS): $(HTML_FILES) $(TEX_FILES) $(DVI_FILES) $(PS_FILES) + +clean: + @rm -f *.toc *.log *.aux *.tex sgmls_output sgmls_errs $(HTML_FILES) $(EXTRA_GEN_FILES) $(TEX_FILES) $(DVI_FILES) $(PS_FILES) + +# +# Release Targets +# +include $(OTP_MAKE_ROOT)/otp_release_targets.mk + +release_variant: opt.$(TARGET) + $(MKPATH.$(TARGET)) $(RELEASE_PATH)/$(TARGET)/lib/asn1/doc/users_guide + $(INSTALLFILES.$(TARGET)) $(HTML_FILES) $(EXTRA_GEN_FILES) $(GIF_FILES) $(PS_FILES) $(RELEASE_PATH)/$(TARGET)/lib/asn1/doc/users_guide + + diff --git a/lib/asn1/doc/users_guide/users_guide.sgml b/lib/asn1/doc/users_guide/users_guide.sgml new file mode 100644 index 0000000000..9387e6b9ab --- /dev/null +++ b/lib/asn1/doc/users_guide/users_guide.sgml @@ -0,0 +1,34 @@ + + + +
+ ASN.1 User's Guide</> + <prepared>Kenneth Lundin</> + <responsible></> + <docno></> + <approved></> + <checked></> + <date>1997-01-09</> + <rev>1.0</> + <file>users_guide.sgml</> + </header> + <include file="asn1"> + +</userguide> -- cgit v1.2.3