diff options
-rw-r--r-- | doc/hackersguide/README | 13 | ||||
-rw-r--r-- | doc/hackersguide/hackersguide.sgml | 87 |
2 files changed, 95 insertions, 5 deletions
diff --git a/doc/hackersguide/README b/doc/hackersguide/README index 6e99bc535..a9fb6d443 100644 --- a/doc/hackersguide/README +++ b/doc/hackersguide/README @@ -24,6 +24,17 @@ If you want to generate TeX output (needed for postscript or pdf generation) you will also need jadetex (backend for TeX) and an installed TeX system (for example teTeX). +sgmltools-lite examples: +------------------------ + +to generate html + +$ sgmltools -b onehtml hackersguide.sgml + +to generate pdf + +$ sgmltools -b pdf hackersguide.sgml + --- version of this file: - $Id: README,v 1.1 2001/10/09 18:20:23 heikos Exp $ + $Id: README,v 1.2 2002/02/07 22:47:22 guenter Exp $ diff --git a/doc/hackersguide/hackersguide.sgml b/doc/hackersguide/hackersguide.sgml index b600b7c65..a506a7676 100644 --- a/doc/hackersguide/hackersguide.sgml +++ b/doc/hackersguide/hackersguide.sgml @@ -187,6 +187,86 @@ </para> </sect1> <sect1> + <title>Object oriented programming in c</title> + <para> + xine uses a lot of design principles normally found in + object oriented designs. As xine is written in c, a few + basic principles shall be explained here on how xine + is object oriented anyway. + </para> + <para> + classes are structs containing (ideally only) object pointers in xine. + Example: + <programlisting> + typedef struct my_stack_s my_class_t; + + struct my_stack_s { + /* method "push" with one parameter and no return value*/ + void (*push) (my_stack_t *this, int i); + + /* method "add" with no parameters and no return value */ + void (*add) (my_stack_t *this); + + /* method "pop" with no parameters (except "this") and a return value */ + int (*pop) (my_stack_t *this); + } ; + + /* constructor */ + my_class_t *new_my_stack (...); + </programlisting> + + to implement such a "class", frequently "private" member variables + can be added: + + <programlisting> + typedef struct { + my_stack_t stack; /* public part */ + + /* private part follows here */ + int values[MAX_STACK_SIZE]; + int stack_size; + } intstack_t; + </programlisting> + + each method is implemented as a static method (static to prevent + namespace pollution). The "this" pointer needs to be cast to the + private pointer type to gain access to the private member variables. + + Implementation of the "push" method follows: + <programlisting> + static void push (my_stack_t *this_gen, int i) { + intstack_t *this = (intstack_t *) this_gen; + } + </programlisting> + + Finally the contructor mallocs() the data structs (private variant) + and fills in function pointers and default values. Usually the + constructor is the only public (i.e. non-static) function in the module: + + <programlisting> + my_stack_t *new_my_stack (...) { + intstack_t *this; + + /* alloc memory */ + this = malloc (sizeof (intstack_t)); + + /* fill in methods */ + this->push = push; + this->add = add; + this->pop = pop; + + /* init data fields */ + this->stack_size = 0; + + /* cast & return */ + + return (my_stack_t *) this; + } + </programlisting> + + </para> + </sect1> + <sect1> <title>Library interfaces</title> <para></para> </sect1> @@ -244,9 +324,6 @@ xine-engine/video_out.h,...). </para> <para> - The public - </para> - <para> Most plugins will need some additional "private" data fields. These should be simply added at the end of the plugin struct, e.g. a demuxer plugin called "foo" with two private @@ -419,7 +496,9 @@ struct demux_plugin_s </listitem> <listitem> <para> - use expressive variable and function names on all public interfaces. + use expressive variable and function identifiers on all public interfaces. + use underscores to seperate words in identifiers, not uppercase + letters (my_function_name is ok, myFunctionName is not ok). </para> </listitem> <listitem> |