Annotation of 43BSDReno/contrib/isode-beta/pepsy/doc/wt-pep.ms, revision 1.1

1.1     ! root        1: \" Walk through of the pepsy library routines
        !             2: .NH 2
        !             3: Walk through of pepsy library routines.
        !             4: .XS
        !             5: Walk through of pepsy library routines.
        !             6: .XE
        !             7: .PP
        !             8: Here we walk through all the pepsy library routines at least briefly.
        !             9: If any new routines are added or a routine changed this documentation
        !            10: is the most likely part that will need changing.
        !            11: First we give some theory as to how the task have have been brocken
        !            12: into routines then describe each function in detail.
        !            13: We assume you are familiar with \fBISODE\fR's \fBPE\fR data
        !            14: structure manipulation routines.
        !            15: if not they are documented in the \fBISODE\fR manuals, Volume one, chapter 5,
        !            16: "Encoding of Data-Structures" (It actually covers decoding as well).
        !            17: .NH 3
        !            18: Overview of pepsy library
        !            19: .XS
        !            20: Overview of pepsy library
        !            21: .XE
        !            22: .PP
        !            23: Each seperate task is put into a different file.
        !            24: So all the encoding stuff is in \fIenc.c\fR, all the decoding stuff is
        !            25: in \fIdec.c\fR, printing stuff in \fIprnt.c\fR and freeing stuff in \fIfre.c\fR.
        !            26: Actually it breaks down a little in practice, some of the routines for
        !            27: moving around the tables are used in both \fIenc.c\fR and \fIdec.c\fR
        !            28: for example.
        !            29: Probably they should defined in \fIutil.c\fR so that linking one of the files
        !            30: from the library doesn't force linking any other except \fIutil.o\fR.
        !            31: .PP
        !            32: There is a common structure to each of the major files as well.
        !            33: There is a main routine which the user calls to obtain the services
        !            34: provided by that file's routines.
        !            35: As all the files revolve about processing the table entries their
        !            36: structure is based on running through the table entries.
        !            37: .PP
        !            38: We shall call each array of entries a table or an object.
        !            39: There is a routine, usually with a name ending in _obj, which is designed
        !            40: to process an object.
        !            41: For example \fBen_obj\fR is the routine called to generated an encoded
        !            42: object.
        !            43: Then there are routines to call on each compound type
        !            44: such as \fBen_seq\fR for encode a SEQUENCE.
        !            45: Finally all the primitives are handled by a one function that ends in _type.
        !            46: This lets each routine concentrate on handling the features particular to
        !            47: its type and call the appropriate routine to handle each type it finds
        !            48: with in its compound type.
        !            49: .PP
        !            50: Most of these table processing routines have just three arguements:
        !            51: which are called \fBparm\fR, \fBp\fR, \fBmod\fR.
        !            52: The \fBparm\fR is char * or char ** in the encoding and decoding routines
        !            53: respectively.
        !            54: This points to the user's \fBC\fR structure that data to be encoded
        !            55: is taken from when encoding.
        !            56: When decoding it is the address of a pointer which is made to point
        !            57: the \fBC\fR structure filled with the decode data.
        !            58: The freeing, which is based on the decoding routines, has a char **
        !            59: while the printing routines don't look at the user's data and so don't
        !            60: have such a pointer.
        !            61: The \fBp\fR points to the current table entry we are up to processing and
        !            62: the \fBmod\fR arguement points to the \fBmodtyp\fR structure for the current
        !            63: module we are processing.
        !            64: .PP
        !            65: All these processing routines return a \fBPE\fR type,
        !            66: which is defined in \fBISODE\fR's file \fIh/psap.h\fR, and to return zero
        !            67: if they have an error, but not always.
        !            68: In fact the error handling is needs some work and has not
        !            69: been tested very well.
        !            70: Generally it tries to print out the table entry where something went wrong and
        !            71: the name of the function it was in.
        !            72: It then sometimes does an exit which may not be very pleasent for the
        !            73: user.
        !            74: .NH 3
        !            75: The encoding routines - enc.c
        !            76: .XS
        !            77: The encoding routines - enc.c
        !            78: .XE
        !            79: .IP enc_f
        !            80: This is the the routine made available to the user for the encoding routines.
        !            81: It is fairly simple as it leaves all the hard things up to other routines.
        !            82: All it does is use the type number and \fBmodtyp\fR pointer to get
        !            83: a pointer to the table for encoding that type.
        !            84: Then it calls the table or object encoding routine, \fBen_obj\fR,
        !            85: on that object.
        !            86: It first does a consistency check of making sure the first entry in the table 
        !            87: is a \fBPE_start\fR.
        !            88: Note that it returns an integer (OK or NOTOK) instead of a \fBPE\fR pointer.
        !            89: This is to be consitent with \fBISODE\fR functions.
        !            90: .IP en_obj
        !            91: We loop through the entries until we come to the end of the table and then we
        !            92: return the \fBPE\fR we have built up from the user's data which is pointed
        !            93: to by \fBparm\fR.
        !            94: In looping through each entry we call the appropriate routine to encode its
        !            95: data.
        !            96: The default case is handled by calling \fBen_type\fR which takes care of
        !            97: all the primitive types.
        !            98: .PP
        !            99: The macro \fBNEXT_TPE\fR sets its arguement to point to the next type
        !           100: in the table, counting compound types as one type.
        !           101: Thus if \fBNEXT_TPE\fR is called on a \fBSET_START\fR it will skip all the
        !           102: entries up to and including the matching \fBPE_END\fR.
        !           103: As many objects consist of one compound type and its components the main
        !           104: loop will only be run through once.
        !           105: Even when the object is not based on a compound type it will then consist of
        !           106: one simple type which is processed by \fBen_type\fR, again probably
        !           107: going through the loop only once.
        !           108: In fact the only way it can go through the loop more than once
        !           109: is to process entries that subsidary to the main type, e.g. \fBETAG\fB entries
        !           110: and things like that.
        !           111: To double check this is the case there is some code that looks for
        !           112: the processing of more than one data generating entry.
        !           113: .PP
        !           114: Much of that testing could probably be eliminated with no loss.
        !           115: Similarly prehaps the \fBIMP_OBJ\fR and \fBETAG\fR could be handled by the
        !           116: default action of calling \fBen_type\fR.
        !           117: As these routines have evolved after many changes there are things like
        !           118: that which really need to be looked at closely before trying.
        !           119: The comment /*SUPRESS 288*/ means suppress warning 288 to saber C debugging
        !           120: tool that we use.
        !           121: .IP en_type
        !           122: This is one of the longest functions as it has so many cases to handle.
        !           123: It again is structure as a loop over the types until \fBPE_END\fR but it
        !           124: actually returns as soon as it has encoded the next type.
        !           125: We can now look at the encoding of the primative \fBASN.1\fR types in detail.
        !           126: .IP DFLT_F
        !           127: Because we have arranged that for encoding tables, that we precede
        !           128: the entry with a \fBDFLT_F\fR entry we can neatly handle all the default
        !           129: cases.
        !           130: All we do is check if the parameter passed in the user data, in \fBparm\fR,
        !           131: is the same as the default value specified in the \fBDFLT_F\fR entry.
        !           132: The function \fBsame\fR performs this check.
        !           133: If it is the same don't encode anything just return, otherwise continue on
        !           134: and encode it.
        !           135: .IP ETAG
        !           136: To handle explicit tags we merely allocate a \fBPE\fR with the right tag
        !           137: and call \fBen_etype\fR to encode its contents, which are in the following
        !           138: entries.
        !           139: The switch on the \fBpe_ucode\fR field use to make a difference
        !           140: but now it is meaningless and should be cleaned up.
        !           141: .IP "SEQ_START, SEQOF_START, SET_START, SETOF_START"
        !           142: We merely call the appropriate function handle them.
        !           143: Note one \fIimportant\fR difference in the way they are called here from that
        !           144: in \fBenc_obj\fR, the parm arguement is used as a base to index off and
        !           145: fetch a new pointer to pass the next function.
        !           146: This seemly bizarre action is quite straight forward when seen written as
        !           147: it is normally in \fBC\fR, "\fBparm->offset\fR".
        !           148: Where the field \fBoffset\fR is a pointer which has an offset from the start
        !           149: of the structure of \fBp->pe_ucode\fR bytes.
        !           150: .PP
        !           151: This is the magic of how we access all the different fields
        !           152: of the \fBC\fR data structures with the one piece of code.
        !           153: It is also prehaps the most critical dependency of the whole system
        !           154: on the implementation of the \fBC\fR language.
        !           155: As the \BGNU\fR \fBC\fR compiler supports this feature then it is
        !           156: compilerable on most machines.
        !           157: But any porters should pay attention to this to ensure that thier compiler
        !           158: is happy generating these offsets and compiling these casts properly.
        !           159: .PP
        !           160: The reason why this is different from the calls in \fBen_obj\fR is that
        !           161: this is not the first compound type in the table.
        !           162: The first and only the first does not have an offset and does not need to be
        !           163: indirected through any pointers.
        !           164: All the compound types inside this type will have
        !           165: as their field a pointer which points to a structure.
        !           166: From here on we shall say \fIindirection\fR  to mean this
        !           167: adding the \fBpe_ucode\fR field
        !           168: to the pointer to the structure and using it to reference a pointer.
        !           169: Whether to use \fIindirection\fR or not is very important matter
        !           170: that really needs to be understood to understand how the routines are
        !           171: structured.
        !           172: .IP IMP_OBJ
        !           173: Here we have to handle the case where we can encode the object then have to
        !           174: change its tag and class after encoding.
        !           175: At the end of this entry this is done very simply by assigning the
        !           176: right values to the appropriate fields after the object has been built.
        !           177: This means that if the intermeadiate form is altered this piece of code
        !           178: may have to be altered as well.
        !           179: There seems to be no better way of handling this.
        !           180: .PP
        !           181: The complication in handling this field is the handling of all the possible
        !           182: types of object.
        !           183: If it is an external object we have to perform a call to \fBenc_f\fR with
        !           184: all the right arguements
        !           185: where a normal OBJECT, the last else branch, requires a normal call
        !           186: to \fBen_obj\fR.
        !           187: Note the case of \fBSOBJECT\fR is the same
        !           188: as \fBOBJECT\fR \fIexcept there is no indirection\fR.
        !           189: .IP "SOBJECT and OBJECT"
        !           190: Here is the code that handles the two cases sperately.
        !           191: It is exactly as in the \fBIMP_OBJ\fR case except seperated out.
        !           192: Note the only difference between the two cases is lack of indirection in
        !           193: the \fBSOBJECT\fR case.
        !           194: .IP CHOICE_START
        !           195: This is exactly as all other compound types,
        !           196: like \fBSEQ_START\fR and \fBOBJECT\fR, we call the appropriate routine with
        !           197: indirection.
        !           198: From reading the \fBISODE\fR manuals that the \fBASN.1\fR CHOICE type
        !           199: is handled by a structure of its own like the other compund types.
        !           200: .IP "EXTOBJ and SEXTOBJ"
        !           201: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.