Commit Graph

1036 Commits

Author SHA1 Message Date
Alexandre Julliard fc3114ca80 widl: Don't free the input file name since it's stored in various places in the location info. 2010-12-23 12:50:52 +01:00
Alexandre Julliard e5f65edfc9 widl: Allow specifying a version for a coclass independently of its typelib version. 2010-12-22 15:51:29 +01:00
Alexandre Julliard 875c1b8739 widl: Register the PSFactoryBuffer class as factory if it's defined in the idl file. 2010-12-17 14:58:47 +01:00
Alexandre Julliard f3f5230b92 widl: Don't create the CurVer key if the ProgId is already version-independent. 2010-12-09 22:42:30 +01:00
Alexandre Julliard cb246ca7a7 widl: Support encoding the DECIMAL type in typelibs. 2010-12-09 00:05:28 +01:00
Alexandre Julliard 8c78994866 widl: Signal an error when trying to output an undefined interface into a typelib. 2010-12-08 20:32:08 +01:00
Alexandre Julliard 2dc85894a7 widl: Improve registration of coclasses contained in typelibs. 2010-12-08 16:10:44 +01:00
Alexandre Julliard 15ccabc9a8 makefiles: Add common rules for installing the main man page. 2010-12-05 16:17:58 +01:00
Alexandre Julliard 2f5c578dba widl: Output registration information also for IUnknown. 2010-12-03 19:29:49 +01:00
Alexandre Julliard 2bf6305ad6 widl: Don't force removal of progids since "CLSID" is also a progid. 2010-12-03 18:09:13 +01:00
Alexandre Julliard b3ebd5a8c5 widl: Use the class name as default description for a progid. 2010-12-03 14:28:28 +01:00
Alexandre Julliard 335282f564 widl: Generate keys for coclasses in the registration resources. 2010-12-02 13:15:14 +01:00
Alexandre Julliard 3991b05746 widl: Add progid, threading and vi_progid attributes for coclasses.
This is a Wine extension, modelled after the corresponding attributes
supported by Visual C++.
2010-12-02 13:14:50 +01:00
Alexandre Julliard ce3abe8c0c widl: Add support for generating a .rgs registration script for the defined interfaces. 2010-11-27 13:29:13 +01:00
Alexandre Julliard 233814c21e widl: Add a general -o option instead of having a different output name option for each file type. 2010-11-27 13:28:16 +01:00
Alexandre Julliard 5d3b4fb6cb widl: Use the output buffer functions to write typelibs. 2010-11-27 11:54:51 +01:00
Alexandre Julliard 00dda6f687 widl: Copy the output buffer management functions from winebuild. 2010-11-27 11:42:09 +01:00
André Hentschel d4dc2a3a4f widl: Fix for typelib generation when unaligned access to memory is not allowed. 2010-11-15 13:20:05 +01:00
Amine Khaldi c9dcef156e widl: Do not define MIDL_user_allocate and MIDL_user_free as it's already in the psdk. 2010-10-27 12:02:41 +02:00
Alexandre Julliard 3593b65935 widl: Output a format string table and server info structure for servers. 2010-10-22 20:49:45 +02:00
Alexandre Julliard 9551524308 widl: Output a format string table and server info structure for stubs. 2010-10-22 20:23:56 +02:00
Alexandre Julliard 4c41dd5fca widl: Duplicate the exception handling code between 32-bit and 64-bit. 2010-10-22 19:44:00 +02:00
Alexandre Julliard 575485c6e7 widl: Duplicate all the proxy data tables between 32-bit and 64-bit. 2010-10-22 19:41:07 +02:00
Alexandre Julliard a638c663b5 widl: Add a separate function to write the proc format string for a function. 2010-10-21 21:36:45 +02:00
Alexandre Julliard 63d5217fd6 widl: Output some comments for proc format strings. 2010-10-21 21:36:45 +02:00
Alexandre Julliard 226e963429 widl: Use get_size_procformatstring_func() for clients too instead of duplicating the code. 2010-10-21 21:35:21 +02:00
Alexandre Julliard 2debb114e3 widl: Add support for some more typelib flags based on the added attributes. 2010-10-21 21:34:33 +02:00
Alexandre Julliard 537773fbf4 widl: Add some more attribute keywords. 2010-10-21 21:23:36 +02:00
Gerald Pfeifer 17ee7300f8 widl: Avoid duplicate assignments in resolve_expression. 2010-09-21 20:16:15 +02:00
Alexandre Julliard 81b8ee863e makefiles: Add a standard header for all makefiles to replace the common variable initializations. 2010-09-19 12:36:48 +02:00
Austin English b94bc5604a widl: Fix compiler warnings on clang. 2010-09-18 13:23:29 +02:00
Alexandre Julliard d3c4106d6f widl: Fix declaration order in generated headers. 2010-09-06 17:06:59 +02:00
Jacek Caban 06f3b94584 widl: Define _WIN32 by default. 2010-09-01 14:01:04 +02:00
Alexandre Julliard c6668089a4 widl: Set the default calling convention at header generation time, not at parsing time. 2010-08-27 13:52:09 +02:00
Alexandre Julliard 7d2869457f widl: Fix parsing of function calling conventions. 2010-08-27 13:49:56 +02:00
André Hentschel 4bd8d384c4 widl: Add support for amd64-mingw32msvc platform. 2010-05-28 12:31:13 +02:00
Gerald Pfeifer 194fd8744a widl: Simplify write_struct_tfs and remove an unused variable. 2010-05-03 15:40:58 +02:00
Gerald Pfeifer ea6590af16 widl: Remove variable size which is not really used from print_phase_basetype. 2010-04-26 06:59:22 -05:00
Alexandre Julliard 1707c1c5cb widl: Alignment for complex arrays and structs is the buffer alignment, not the memory one. 2010-04-05 20:07:22 +02:00
Alexandre Julliard cb6a225481 widl: Add a type_memsize_and_alignment function to make it explicit where the alignment is truly needed. 2010-04-05 20:06:22 +02:00
Alexandre Julliard 4d55592540 widl: Move temp file management from wpp to widl. 2010-03-30 15:34:12 +02:00
Alexandre Julliard a83563aa40 widl: Long constants must be 32-bit on all platforms. 2010-03-26 11:42:28 +01:00
Rob Shearman 0d88ba9e01 widl: Check whether an expression is a constant one before assuming it is a toplevel conformance when writing conformance or variance descriptors. 2010-03-23 17:29:12 +01:00
Rob Shearman c65d16e9d5 widl: Make use of string_of_type in write_conf_or_var_desc.
This allows the code to not have to track the operator type twice.
2010-03-23 17:29:05 +01:00
Rob Shearman 5e0030b4cb widl: Remove the current_func variable.
It's only set, never read from.
2010-03-23 17:28:59 +01:00
Rob Shearman 8a8fff6415 widl: Return a pointer to the correct part of the string from the lexer for WSTRQUOTE tokens. 2010-03-23 17:28:54 +01:00
Rob Shearman b544014b8e widl: Fix the calculation of casted integer constant expressions. 2010-03-23 17:28:50 +01:00
Rob Shearman 979bdf28b6 widl: Remove func_t type.
It was just a simple indirection to get to a var_t, so just replace
all uses of it with the latter.
2010-03-23 17:28:22 +01:00
Rob Shearman a3f649f730 widl: Issue an error if an out parameter is a conformant string. 2010-03-23 17:28:14 +01:00
Rob Shearman 361a39fff3 widl: Issue an error if a context handle variable is declared outside of a function. 2010-03-23 17:28:02 +01:00
Rob Shearman 50534b87d0 widl: Fix crash when trying to declare a fixed size array with a size_is attribute.
In this case type_array_get_conformance will return NULL. The code
here is actually replacing an existing array with an EXPR_VOID
conformance with the specified conformance, so issue an error if
type_array_get_conformance returns NULL or the conformance has already
been defined.
2010-03-23 17:27:58 +01:00
Rob Shearman 096b3cd090 widl: Fix writing of MaxCount expressions for conformant strings declared using array form. 2010-03-23 17:27:33 +01:00
Rob Shearman 0ec617e01d widl: Convert assign_stub_out_args to using typegen_detect_type and fix the non-conformant array case. 2010-03-23 17:27:04 +01:00
Rob Shearman f6b53be0d9 widl: Don't pre-calculate buffer size for arrays that aren't treated as reference pointers. 2010-03-23 17:26:22 +01:00
Alexandre Julliard fbef7217b9 makefiles: Remove the no longer needed explicit dependencies for bison files. 2010-03-16 13:28:24 +01:00
Alexandre Julliard bef5645eb1 makefiles: Remove the no longer needed explicit separators for dependencies. 2010-03-16 13:28:19 +01:00
Rob Shearman eb4100e91c widl: Remove a FIXME comment in write_function_stubs.
Clean valgrind runs of tested types and comparison with MIDL-generated
code suggests that the existing code written in the finally block for
client code is sufficient.
2010-03-16 11:41:30 +01:00
Rob Shearman fd96c54641 widl: Simplify write_parameter_conf_or_var_exprs by making use of typegen_detect_type.
Remove the difficult manual walking of the alias tree and make the
code easier to read and less likely to break if a new type is added.
2010-03-16 11:41:21 +01:00
Rob Shearman 82ab9443b8 widl: Clean up array case in write_remoting_arg.
Use a switch statement instead of multiple if statements and
explicitly write out the fixed array cases.
2010-03-16 11:41:14 +01:00
Rob Shearman 0e6ad1fa85 widl: Remove some FIXME comments and replace them with comments explaining why the current behaviour is correct. 2010-03-16 11:40:20 +01:00
Rob Shearman 9aad144755 widl: Fix the writing of expressions in un-typedef'd structures by using write_type_left to write out the type, which adds the "struct ..." if necessary.
Also improve the type comparison code to not crash on unnamed
structures (although further changes need to be made to fix the output
in this case) and make it more efficient by first doing a comparison
on the values of the type pointers.
2010-03-16 11:40:10 +01:00
Rob Shearman df853f8ed2 widl: error_status_t isn't an allowed conformance type.
The FC code requires more than 4 bits to represent it and the
correlation descriptor and union formats only allow 4 bits to
represent the type referred to.
2010-03-16 11:36:41 +01:00
Rob Shearman 5b533c1845 widl: Pass current_structure into write_conf_or_var_desc in write_ip_tfs.
This allows write_conf_or_var_desc to have the context enabling it to
write out an appropriate correlation descriptor when iid_is is used
from within a structure.
2010-03-16 11:36:36 +01:00
Rob Shearman 1d1d49b6ab widl: Use typegen_detect_type to determine which types should be written for the pointer description in write_struct_tfs.
Otherwise extra pointers for user types could be written.
2010-03-16 11:36:12 +01:00
Rob Shearman 06e7eb5c98 widl: Merge write_typeformatstring_var and write_embedded_types into one function, write_type_tfs. 2010-03-16 11:36:05 +01:00
Rob Shearman 2fd6be54be widl: Don't use the return value of write_embedded_types to determine whether a type contains pointers or not.
It isn't correct in all situations, so type_has_pointer has to be used
anyway so using the return value of write_embedded_types just clutters
the code.
2010-03-16 11:35:36 +01:00
Rob Shearman 484fe1cff3 widl: Write pointers in write_typeformatstring_var using write_pointer_tfs.
Avoid duplicating the pointer writing code.
2010-03-16 11:33:12 +01:00
Rob Shearman 7a69fcabac widl: Simplify write_typeformatstring_var.
The check for whether a pointer is the last one is redundant since
typegen_detect_type does a stricter check on the ref type. Replace one
other instance of last_ptr with a more readable equivalent.
2010-03-16 11:33:04 +01:00
Rob Shearman 08126d7483 widl: Make write_pointer_tfs more readable.
Change write_pointer_tfs to rely on the detected type of the type to
determine when to write a simple pointer rather than relying on
typestring_offset not being set anywhere else.
2010-03-16 11:32:58 +01:00
Rob Shearman 5d985a8028 widl: Remove some unused functions, definitions and types. 2010-03-16 11:32:53 +01:00
Gerald Pfeifer 844e22093e widl: Avoid two warnings. 2010-03-01 14:28:49 +01:00
Alexandre Julliard 9644d1dcd7 makefiles: Generate a general catch-all dependency on .tab.h files to replace the manually maintained ones. 2010-02-08 20:58:00 +01:00
Rob Shearman 39b3a57b3d widl: Fix symbol was not declared and using plain integer as NULL pointer sparse warnings. 2010-01-22 12:17:56 +01:00
Rob Shearman d9b83e8bb2 widl: Add support for character constants in expressions. 2010-01-19 12:43:31 +01:00
Paul Vriens caaf027e55 widl: Fix size parameter for xrealloc (Coccinelle). 2010-01-11 11:34:32 -06:00
Rob Shearman 6ed98b16a1 widl: Detect interfaces that inherit from another interface as objects. 2009-11-29 16:37:07 +01:00
Alexandre Julliard 98de3950b1 widl: Use INT64 instead of __int64 in generated headers. 2009-11-21 14:31:46 +01:00
Nicolas Le Cam ca38b8b951 widl: Don't generate memset calls with zero length parameter. 2009-11-19 11:35:50 +01:00
Francois Gouget 61d0d121d0 widl: Add a trailing '\n' to an error_loc() call. 2009-11-16 12:43:06 +01:00
Rob Shearman 8e750b0ef6 widl: Include range types in constant BufferLength calculation for server function. 2009-11-12 14:18:18 +01:00
Rob Shearman 0228008bb8 widl: Allow pointers, type-qualifiers and other more complicated constructions in sizeof and cast expressions. 2009-11-09 20:42:57 +01:00
Rob Shearman 97d5f3401d widl: Add support for varargs functions. 2009-11-09 20:42:27 +01:00
Rob Shearman cdec0fe485 widl: Add support for bit-fields in non-remote structures. 2009-11-09 20:42:00 +01:00
Rob Shearman 4339f9edfb widl: Implement __int3264 keyword. 2009-11-09 20:36:19 +01:00
Rob Shearman 4383d47ef4 widl: Rename set_type to declare_var.
Make it return the var_t object rather than making the callers dig it
out, and make it take the attributes list so that callers don't have
to set it.
2009-11-09 20:35:56 +01:00
Rob Shearman 3885dd778a widl: Check for [string] attribute being applied when the elements are ranged.
The range will not be verified in and misconception could turn into a
security problem.

Move [string] attribute validation from reg_typedefs to set_type.
2009-11-09 20:35:13 +01:00
Rob Shearman 2b3659f326 widl: Implement [range] attribute. 2009-11-09 20:34:17 +01:00
Rob Shearman c367624534 widl: Enhance the IDL grammar to support unnamed arguments to functions. 2009-11-09 20:34:11 +01:00
Rob Shearman d59ff2007d Revert "widl: A structure that contains an embedded interface ptr in an array is a BOGUS_STRUCT.".
This reverts commit e4e21193c0.

The IDBProperties test shows that this special case is not needed to
for these types to be marshalled correctly.
2009-11-09 20:33:12 +01:00
Huw Davies ab32b3df4d widl: Add support for parsing the annotation attribute. 2009-10-26 14:05:29 +01:00
Alexandre Julliard d527ca3382 widl: Fix the prototype of generated exception filters. 2009-10-22 13:04:09 +02:00
Alexandre Julliard c77d49b4c3 widl: Write a proper type description for pointer array elements. 2009-10-16 20:56:41 +02:00
Alexandre Julliard 8cc12dc339 widl: Arrays of pointers are always complex on 64-bit. 2009-10-16 20:56:15 +02:00
Alexandre Julliard 942ec30a4d widl: Use write_pointer_description_offsets() to output no_repeat descriptors for consistency. 2009-10-16 15:32:22 +02:00
Alexandre Julliard 916461d926 widl: Output a pointer description for arrays declared as pointers. 2009-10-16 15:32:05 +02:00
Alexandre Julliard a4e22d4928 tools: Build all the tools with -D__WINESRC__. 2009-10-05 14:55:25 +02:00
André Hentschel 1d0365da95 widl: Add ARM support. 2009-09-28 13:31:32 +02:00
Henri Verbeet a7b0a1cd4a widl: Generate proper prototypes for function declarations without arguments. 2009-09-09 12:06:51 +02:00
Huw Davies b524c55021 widl: Add separate --win32-align and --win64-align options. 2009-08-25 14:56:57 +02:00
Huw Davies a376b86dfe widl: The alignment written for USER_MARSHAL types is the wire-type alignment. 2009-08-21 15:08:49 +02:00
Huw Davies e4e21193c0 widl: A structure that contains an embedded interface ptr in an array is a BOGUS_STRUCT. 2009-08-21 14:27:59 +02:00
Huw Davies bbb3a85c51 widl: Add a structure packing command line option. 2009-08-17 16:48:10 +02:00
Huw Davies 69091ef569 widl: Store the pointer description in the type rather than base type so that it gets re-written when the type is re-written. 2009-08-04 13:50:07 +02:00
Alexandre Julliard f21eab1101 widl: Take into account the alignment of conformant arrays to pad a structure. 2009-07-13 09:23:06 +02:00
Alexandre Julliard d375d25d65 widl: An ENUM16 is 32-bit wide in memory. 2009-07-03 13:06:14 +02:00
Alexandre Julliard f6d2b49145 widl: Take into account structure field alignment when computing offsets. 2009-07-03 13:05:52 +02:00
Alexandre Julliard 064775c9a0 widl: Struct alignment should be the largest alignment of all the struct members. 2009-07-03 13:05:52 +02:00
Alexandre Julliard fc7681a8ce widl: Skip the existing correlation descriptor on unencapsulated unions when generating a different one. 2009-07-03 13:05:52 +02:00
Alexandre Julliard c152b4e7d1 include: Add a target address for unwinding for platforms that need it. 2009-06-18 15:17:26 +02:00
Huw Davies a6181cb3b2 tools/widl: Fix behaviour when both lcid and retval arguments are present. 2009-06-17 17:23:21 +02:00
Huw Davies 7857219ac1 widl: Fix typelib lcid fields to match those produced by midl. 2009-06-09 17:01:15 +02:00
Alexandre Julliard d88f9e3cd9 widl: Don't make the proxy virtual tables const if they use delegation. 2009-06-09 17:01:07 +02:00
Huw Davies 81b2c9eb85 widl: Add support for the lcid parameter attribute. 2009-06-08 15:39:14 +02:00
Marcus Meissner 6a9e096da9 widl: ifdef some not always present LANG_*. 2009-06-08 13:19:06 +02:00
Alexandre Julliard f914b57277 widl: Add support for standard target options to allow building the right typelib kind when cross-compiling. 2009-05-21 16:17:50 +02:00
Alexandre Julliard b3a0833972 widl: Add support for writing 64-bit format typelibs. 2009-05-21 16:17:50 +02:00
Rob Shearman 0a8e3c39a1 widl: Include the version number in the __WIDL__ preprocessor definition. 2009-03-26 16:10:41 +01:00
Rob Shearman d38cc9acbc widl: Initialise ref pointers to basic and enum types to 0 in generated server code.
Previously it was only done for pointers.
2009-03-23 14:23:19 +01:00
Rob Shearman 48a5db074b widl: Output correct code for freeing of conformant-sized and non-conformant strings.
_StubMsg.pfnFree should be used instead of NdrPointerFree for
conformant-sized strings since the buffer will have been allocated
using NdrAllocate.

Non-conformant strings do not need any freeing since they use a buffer
that is allocated on the stack.
2009-03-23 14:22:41 +01:00
Rob Shearman 12b23fa220 widl: Check the attributes applied to function declarations. 2009-03-23 14:22:23 +01:00
Michael Stefaniuc efbb4ebf3e widl: Output "LONG" instead of "long" for a 32bit integer.
long is always 32bit in IDL files but that's not true in C.
2009-03-13 11:15:21 +01:00
Rob Shearman 8cdda26897 widl: Returned pointers should default to being unique, not reference. 2009-03-11 10:29:20 +01:00
Rob Shearman 728a738a82 widl: Move type_basic_get_fc to typegen.c and rename it to get_basic_fc.
Move to using type_basic_get_type in other files where appropriate.
2009-03-09 12:14:35 +01:00
Rob Shearman 630b48941f widl: Fix a memory leak in the server/stub code when unmarshalling pointers to strings at the top level.
It is necessary for the first pointer to have an offset to a second
pointer instead of directly to the string type, since the second
pointer frees the memory for the string.
2009-03-09 12:13:53 +01:00
Rob Shearman f170f9b5d5 widl: Output server code for freeing returned types. 2009-03-09 12:12:57 +01:00
Rob Shearman 23673ca373 widl: Determine pointer fc at generation time instead of at parse time.
Avoid changing the details of a pointer once created.
Properly determine the pointer type for arrays.
2009-03-09 12:09:39 +01:00
Rob Shearman f8e36ab4ab widl: Consolidate non-simple pointer writing into one function. 2009-03-09 12:08:57 +01:00
Rob Shearman a8238dd142 widl: Pass var attrs into write_no_repeat_pointer_descriptions and use them for the string check. 2009-03-05 18:39:02 +01:00
Rob Shearman 9d878f220b widl: Add coclass and module types to the global namespace. 2009-03-05 18:39:02 +01:00
Rob Shearman 13c3967522 widl: Move type_new_enum, type_new_struct, type_new_encapsulated_union and type_new_unencapsulated_union to typetree.c. 2009-03-05 18:39:02 +01:00
Rob Shearman 7c711d0736 widl: Allow enum and union tags to be used without being defined. 2009-03-05 18:39:02 +01:00
Rob Shearman 4866026d7f widl: Move the pointer referent, array element, function return type and interface inheritance properties from type_t to details structures for the appropriate types. 2009-03-05 18:39:02 +01:00
Rob Shearman 277e0617d5 widl: Store the abstract identifier of the type in type object instead of an NDR format character. 2009-03-05 18:39:02 +01:00
Rob Shearman b7dd838136 widl: Remove the single keyword and type.
It isn't valid in MIDL or the FreeDCE IDL compiler, nor does it appear
in the DCE/RPC or C99 specs.
2009-03-05 18:39:02 +01:00
Rob Shearman 319a7a102e widl: Implement a more abstract way of representing basic types. 2009-03-05 18:38:45 +01:00
Rob Shearman 0be9d2595d widl: Fix get_explicit_generic_handle_type and is_context_handle to detect attributes set on typedefs other than the first.
Change get_explicit_handle_var to use accessors for the type structure.
2009-03-05 16:34:00 +01:00
Rob Shearman 7e08ff27c2 widl: Move declarray property to array_details.
Invert the property since an array being declared as a pointer is more
surprising than an array being declared as an array.

Provide an accessor, type_array_is_decl_as_ptr.
2009-03-05 16:34:00 +01:00
Rob Shearman f27261e525 widl: Only classify top-level pointers as ref pointers if they don't have any other pointer attributes. 2009-02-25 11:54:31 +01:00
Rob Shearman a93f531c21 widl: Ignore pointer attributes applied to interface pointers.
Print a warning if a pointer attribute is specified since the
generated code won't do what the developer expects.
2009-02-25 11:54:26 +01:00
Rob Shearman 2c6e611c8a widl: Add typegen_detect_type and use it.
Add typegen_detect_type for detecting types useful during
client/server/proxy code generation.
2009-02-23 15:25:57 +01:00
Rob Shearman af0800729b widl: Use type_get_type to determine the types of types during C client, server and proxy code generation. 2009-02-23 15:25:53 +01:00
Rob Shearman 28a2c06cf7 widl: Use type_get_type to determine the types of types during typelib generation. 2009-02-23 15:25:47 +01:00
Rob Shearman 0f7f7922ba widl: Use type_get_type to determine the types of types during parsing and checking. 2009-02-23 15:25:44 +01:00
Rob Shearman d854f32283 widl: Use type_get_type to determine the types of types during header writing. 2009-02-23 15:25:30 +01:00
Rob Shearman fb934347b4 widl: Use type_get_type to determine the types during statement enumeration. 2009-02-23 15:25:20 +01:00
Rob Shearman ba91ee607c widl: Don't directly access the type structure when determining the types in expressions.
Use type_get_type and friends instead.
2009-02-23 15:25:10 +01:00
Rob Shearman 944f22db80 widl: Fix typos in write_remoting_arg which caused ref pointers to unions to not result in direct calls to NonEncapsulatedUnion/EncapsulatedUnion functions. 2009-02-19 12:51:40 +01:00
Rob Shearman 04484a4013 widl: Call Pointer function for freeing non-conformant strings and for all phases for returned non-conformant strings, as is done for conformant strings.
Also call Pointer functions for any string that isn't a reference pointer.
2009-02-16 15:35:14 +01:00
Rob Shearman 8f87eddd39 widl: Only duplicate a type if absolutely necessary.
Document how much of hack duplicating a type in order to change its
pointer type is.
2009-02-16 15:35:14 +01:00
Rob Shearman e054c52cd1 widl: Call Struct and Union phase functions for reference pointers to structures and unions.
It's slightly quicker than calling pointer phase functions and does
the same job.
2009-02-16 15:35:14 +01:00