Bill Currie
996b2734a4
Reset current_class in the top-level error rules.
...
This fixes a weird internal error after a parse error in an ivar
declaration.
2012-12-23 05:57:13 +09:00
Bill Currie
ff4b232d92
Reset current_storage when resetting current_symtab.
...
This helps prevent an internal error caused by ealier errors.
2012-12-22 20:04:11 +09:00
Bill Currie
7d928047ae
Remove support for break as an identifier.
...
I never really liked it, but I have a better solution in the pipe-line.
2012-12-22 16:29:43 +09:00
Bill Currie
6d6f231bd2
Fix mangling of types when attaching protocols.
...
The protocol attachment test was in the wrong place, and there were some
typos in compare_protocols and procollist_find_protocol.
2012-12-20 13:12:05 +09:00
Bill Currie
3af031c33d
Move the rest of the obj specific stuff into class.c.
...
This gives better hiding of implementation details.
2012-12-20 10:10:41 +09:00
Bill Currie
f181772a76
Attach protocolrefs to class types.
...
The protocolrefs (as protocollist_t) are attached to the type as a
qualifier.
2012-12-20 10:10:41 +09:00
Bill Currie
4868a245b3
Fix the "for new syntax" FIXME.
...
Empty structs are now (correctly) invalid. The hack of using an empty
struct to represent a handle returned from a builtin has been unnecessary
since opaque structs were implemented: now a pointer to an opaque struct
can be used. This is mostly safe as handles are aways negative and thus
attempting to dereference such a pointer should result in a VM error. It
will be even safer once const is implemented and the pointers can be made
constant (eg, typedef struct handle * const handle;)
2012-12-20 10:10:41 +09:00
Bill Currie
3e94869f1e
Remove the function overloading FIXMEs.
...
It seems they were fixed a long time ago.
2012-12-20 10:10:41 +09:00
Bill Currie
c68578d15d
Rename CONST to VALUE.
...
VALUE is a much more accurate name, and this allows for "const" to be
implemented at some stage.
2012-12-20 10:10:41 +09:00
Bill Currie
cd7c53d223
Parse id <protocol> and classname <protocol>.
...
This is needed to allow compile-time protocol conformance checks, though
nothing along those lines has been implemented yet.
id has been changed from TYPE to OBJECT, required to allow id <proto> to be
parsed. OBJECT uses symbol, allowing id to be redefined once suitable work
has been done on the parser.
2012-12-20 10:10:41 +09:00
Bill Currie
d6ec944e5f
Set a builtin methods func pointer.
...
Forgetting to set the func pointer is what caused the bogus "does not
respond to" message for -error:.
2012-12-16 12:01:12 +09:00
Bill Currie
7ccfd7b9e0
Fix the wrong space for static vars.
...
Turns out there was only one place to fix (for qc, anyway: I don't have
tests for qp yet). func-static now passes :)
Hmm, how to test for static var naming... (not implemented yet)
2012-12-04 14:25:06 +09:00
Bill Currie
5725c5124c
Rename the storage_class_t enum values.
...
With the intoduction of the statement type enum came a prefix clash. As
"st" makes sense for "statement type", I decided that "storage class"
should be "sc". Although there haven't been any problems as of yet, I
decided it would be a good idea to clean up the clash now. It also helps
avoid confusion (I was a bit surprised after working with st_assign etc to
be reminded of st_extern etc).
2012-12-02 10:11:30 +09:00
Bill Currie
54289da416
Fix the line number info for else.
...
It has bugged me for a while that the goto for else would display the if's
source line.
2012-12-01 16:37:38 +09:00
Bill Currie
5cfeb7809f
Fix a missing ;
2012-11-20 17:11:39 +09:00
Bill Currie
f307c7bebc
Rework the unary_expr grammar to allow ++*foo.
...
This required throwing out the primary rules that snax did up to help me
with conflicts many years ago, but they were now getting in the way. Now
the productions from primary are merged in with unary_expr.
2012-11-09 12:32:38 +09:00
Bill Currie
f14d8060e0
Merge qfpc into qfcc.
...
Since gnu bison and flex are required anyway, no harm in using their api
prefix options. Now, qfcc can compile both QC/Ruamoko and Pascal files
(Pascal is (currently?) NOT supported in progs.src mode), selecting the
language based on the extension: .r, .qc and .c select QC/Ruamoko, .pas and
.p select Pascal, while anything else is treated as an object file (as
before).
2012-10-26 16:01:41 +09:00
Bill Currie
dbc203b625
And a few more bits of whitespace.
2012-05-23 08:21:27 +09:00
Bill Currie
bc1b483525
Nuke the rcsid stuff.
...
It's pretty useless in git.
2012-04-22 10:56:32 +09:00
Bill Currie
617e70c8e3
Clean up a bunch of bison unused warnings.
2011-06-21 19:52:47 +09:00
Bill Currie
1617f0765e
Support the default type without segfaulting.
2011-03-25 09:59:48 +09:00
Bill Currie
a7cfe3b215
Preserve the current class across protocol defs.
...
It seems that protocol defs are allowed in class implementations, so don't
let the protocol def kill the current class for the class implementation.
2011-03-24 11:55:17 +09:00
Bill Currie
71af121665
Detect missing @end tags.
...
Give a warning when @end is forgotten in class implementations.
2011-03-24 11:44:22 +09:00
Bill Currie
f1d9570dc8
Fix constant value type handling.
...
Rename immediate.[ch] to value.[ch] and clean up the mess.
Add convert_value() to convert the type of a value (only scalar types).
2011-03-22 12:24:39 +09:00
Bill Currie
6312ccba81
Fix storage class blocks.
...
@extern { defs }; etc
2011-03-07 20:51:51 +09:00
Bill Currie
4db8ebb6af
Support qcc style local function variables.
2011-03-07 20:04:05 +09:00
Bill Currie
853cc53d0f
FIx the handling of storage class.
2011-03-07 17:49:01 +09:00
Bill Currie
16103f9018
Fix param mangling for qc style functions.
2011-03-07 10:43:38 +09:00
Bill Currie
28f4de94d2
Fix switch statements so the work in the new scheme.
...
Convert case labels to be the same type as the switch expression.
Use alias expressions for the various test expressions.
2011-03-06 00:29:29 +09:00
Bill Currie
8cfa80b5d4
Implement think expressions.
2011-03-05 18:01:37 +09:00
Bill Currie
c5ecc170b6
Give labels a usage count to detect unused labels.
2011-03-03 15:28:49 +09:00
Bill Currie
76f912c7a1
Fix function typedefs.
2011-03-02 22:23:24 +09:00
Bill Currie
330e76a9ac
Set the correct storage class for struct and enum specifiers.
2011-03-02 11:29:08 +09:00
Bill Currie
b584a22d6b
Fix external function declarations.
...
Use spec.storage rather than current_storage.
2011-03-01 11:08:33 +09:00
Bill Currie
b50b392746
Fix field def allocation for function fields.
...
Assignment of nil to a field function is permitted, but trying to use one
as a builtin or as a normal function is treated as an error.
.void (float y) func; OK
.void (float y) bi = #0 ; error
.void (float y) ni = nil; OK
.void (float y) co = { }; error
2011-02-22 12:07:31 +09:00
Bill Currie
87b240f469
Use special treatment for .float ()foo; functions.
...
The parser wants to treat .float () foo; as a function returning a float
field, but qcc treats it as a field holding a function variable.
Fortuantely, field types are always "simple" (ie, at worst, just more
field type wrappers around the non-field type), so all that's needed to
obtain qcc grammar is to reach into the field type layers and do the
function type calculation based on the non-field type found there.
2011-02-22 08:54:01 +09:00
Bill Currie
d04865884f
Set the method's function pointer.
2011-02-15 22:27:13 +09:00
Bill Currie
4336fc2c73
Move method function defs into the far data space.
...
As they are never referenced directly by instructions, there's no need for
them to be in the near data space, taking precious def locations.
2011-02-15 15:33:18 +09:00
Bill Currie
bc882ddc3c
Fix the parser side of aggregate initializers.
2011-02-14 23:31:37 +09:00
Bill Currie
09af401f0c
Reset current_func at the end of each function.
2011-02-14 23:10:46 +09:00
Bill Currie
5fa349927f
Preserve the ivars inheritance chain across build_struct().
...
build_struct() unlinks the structure symbol table from its parent, but
that breaks the ivar inheritance chain.
2011-02-14 23:10:46 +09:00
Bill Currie
5707888fcf
Fix some error-recovery segfaults.
2011-02-14 23:10:46 +09:00
Bill Currie
f1fccb19dd
Allow same-type re-declarations of uninitialized variables.
...
This is especially important for declaring variables that were previously
declared external.
2011-02-14 23:10:46 +09:00
Bill Currie
acced90101
Create the symbol for the struct as early as possible.
2011-02-13 20:55:33 +09:00
Bill Currie
547f361bd3
Allow (void) qc-style functions.
2011-02-13 17:37:11 +09:00
Bill Currie
d75c35ba30
Allow qc style function params.
...
Due to ambiguities in the grammar, qc-style function params and c-style
function params had to be completely separated. This means that qc-style
functions can not use pointers and must use qc-style function declarations
for parameters, and c-style functions must use c-style param declarations.
While this rule is tedious for converting the Ruamoko library, it does
actually make for a more consistent language.
2011-02-13 17:07:14 +09:00
Bill Currie
0b5565396b
Add a class type to symbols and rework the CLASS_NAME handling.
...
This fixes the problem with [Array alloc] producing a warning about Class
not repsonding to -alloc.
2011-02-13 16:05:09 +09:00
Bill Currie
75d90d2f00
Propogate the specifiers through external_decl_list.
2011-02-11 22:29:57 +09:00
Bill Currie
e19f7e3521
Sort out the parameters for QC style functions :)
2011-02-11 22:29:57 +09:00
Bill Currie
e75295b00c
Make normal C style functions generate code.
2011-02-09 10:25:23 +09:00
Bill Currie
daa88d8f1c
Fix a type clash warning I'd failed to notice.
2011-02-08 08:23:25 +09:00
Bill Currie
35d53d0d77
Fix typedefs and class names once and for all.
...
I suspect Holub did them that way as a teaching exercise :P
2011-02-08 08:20:32 +09:00
Bill Currie
7e2173f268
Remove some old code.
2011-02-08 08:16:36 +09:00
Bill Currie
7a1a9e3f2d
Better handling of the current storage for function scopes.
2011-02-07 22:11:22 +09:00
Bill Currie
ff70177041
Fix type handling for local variables.
2011-02-07 21:38:58 +09:00
Bill Currie
a28ac636a7
Make local declarations support C syntax.
2011-02-07 21:29:04 +09:00
Bill Currie
da4ec3d47c
Allow typedefs and classes in structs.
2011-02-07 20:55:13 +09:00
Bill Currie
aefd2a27d5
Make type handling in the grammar more consistent.
2011-02-07 20:54:49 +09:00
Bill Currie
76034861c9
Implement direct ivar access in methods.
...
A warning needs to be generated for access to ivars in a class method, but
it seems to work (unable to check due to other errors).
2011-02-07 08:32:52 +09:00
Bill Currie
6b7a81f5a7
Run find_type() early on enums and structs.
2011-02-06 20:07:19 +09:00
Bill Currie
00bba1eb3a
Fix creation of uninitialized global variables.
2011-02-06 14:37:25 +09:00
Bill Currie
2f7b892452
Fix passing messages to classes.
...
Rename class_pointer_def() to class_pointer_symbol() and use it when a
class name is used as the receiver of a message.
2011-02-06 14:34:40 +09:00
Bill Currie
67957a14df
Bring back convert_name(), but siimplified.
...
It is now mainly for converting __FILE__ etc, handling expression symbols,
and checking for undefined identifiers.
2011-02-06 14:29:14 +09:00
Bill Currie
29fbc3b073
Struct and ivar declarations now seem to work.
...
However, not bit-fields.
2011-02-04 23:48:58 +09:00
Bill Currie
c542e1a453
Possibly fix normal methods.
2011-02-04 22:31:23 +09:00
Bill Currie
d9446c5eb0
Fix builtin methods.
2011-02-04 22:31:22 +09:00
Bill Currie
d0ecbb38b8
Copy the spec bits and storage class for QC functions.
2011-02-04 15:25:21 +09:00
Bill Currie
b07392b818
Allow ivars to use C syntax declarations.
2011-02-03 18:04:41 +09:00
Bill Currie
dc6296e9b1
Allow ivars to use typedefs and other classes.
2011-02-03 18:03:37 +09:00
Bill Currie
2203903bb2
Temporarily splice the class's ivar chain into the symbol table.
...
The root class's ivar symbol table needs to be connected to the global
symbol table while building the current class's ivar symbol table. This
allows access to other classes and typedefs.
2011-02-03 18:02:49 +09:00
Bill Currie
79df3d2cca
Put newly created classes into the symbol table.
2011-02-03 17:28:49 +09:00
Bill Currie
564b7b9968
Use abstract_decl instead of type wherever a generic type is needed.
2011-02-03 10:53:59 +09:00
Bill Currie
d12cdca758
Functions and enums now seem to be working properly.
...
find_type now operates recursively (depth-first) so built up typechains
work as expected.
@overload is treated as a specifier (directly as a storage class, similaar
to typedef).
2011-02-03 10:48:12 +09:00
Bill Currie
52799a4e1c
Must merge specifiers :P
2011-02-02 22:59:08 +09:00
Bill Currie
4420a7125e
Ensure structs get added to the symbol table.
2011-02-02 22:53:53 +09:00
Bill Currie
a4eaa2a89b
Allow typedefed types and classes in parameters.
2011-02-02 21:58:53 +09:00
Bill Currie
aeecdc84dc
Get typedef working.
2011-02-02 21:58:11 +09:00
Bill Currie
cca829aa6b
Remove a stray semicolon from the grammar.
2011-02-02 21:57:41 +09:00
Bill Currie
1fe031e8cb
Build C style var/func/abs decl types from the outside in.
...
QuakeC style are built from the inside out.
2011-02-02 15:15:04 +09:00
Bill Currie
ac91e9376b
The big type-system rewrite. Horribly broken :)
...
While broken, it is good enough to compile modulo.r.
This gives qfcc C's type system with QC specifics bolted on top (rather
than trying to cram C's type system into QC's). Pointers and arrays now
use C syntax and semantics (though I think there's a lot of breakage in
there at the moment). Functions themselves are still dual mode: both QC
style and C style are available.
2011-02-01 21:23:03 +09:00
Bill Currie
36c99a8da1
Get function def creation working again.
2011-01-26 14:48:22 +09:00
Bill Currie
4966120e3b
Untwist param's knickers.
2011-01-25 20:21:41 +09:00
Bill Currie
a648f043de
Give functions their own defspace.
...
The defspace is propogated through the function's sub-scopes.
2011-01-25 12:34:45 +09:00
Bill Currie
34ffce50fa
Ensure current_symtab gets set at the start of parsing.
...
current_symtab must be set even if the first thing encountered is a syntax
error.
2011-01-25 12:16:13 +09:00
Bill Currie
726f293d0d
Allocate space for defs and handle basic initializations.
...
Block initializers (arrays and structs) are still broken.
2011-01-25 12:16:13 +09:00
Bill Currie
30701980bc
Get QC cfunctions and defs working.
2011-01-25 12:16:13 +09:00
Bill Currie
0624408317
Move the diagnostic functions into their own file.
2011-01-24 21:54:57 +09:00
Bill Currie
d618e51dc8
Move save_string and make_string into strpool
...
Might not be the perfect place, but at least they're strongly related.
2011-01-24 21:32:48 +09:00
Bill Currie
4ac80c2932
Get qfcc running again.
...
It segs when it tries to link, but that's because a real object file has
not been created yet. However, I can get my tree and flow diagrams :)
2011-01-22 15:52:57 +09:00
Bill Currie
5deda9c9b9
Clean out ex_def as ex_symbol replaces it.
2011-01-19 22:25:04 +09:00
Bill Currie
e08efe036b
Move the constant expression values into their own struct.
2011-01-19 08:43:24 +09:00
Bill Currie
ea3895805b
Rewrite much to use symbols and symtabs. Gut emit.c. Massive breakage.
...
That which isn't rewritten is horribly broken. However, this does include a
nice mechanism for building QC structs for emitting data.
emit.c has been gutted in the spirit of "throw one away".
There is much work to be done to get even variables emitted, let alone
code. Things should be a little more fun from here on.
2011-01-17 22:34:41 +09:00
Bill Currie
ffea505678
Cleanup QC's constant handling based on QP.
2011-01-14 12:10:28 +09:00
Bill Currie
c69ac1f56f
Don't segfault when build_builtin_function detects an error.
2011-01-10 12:25:31 +09:00
Bill Currie
7971b0868e
Break out the begin_function code into its own function.
2011-01-10 12:25:31 +09:00
Bill Currie
fbdbcfada4
Remove deprecated @argc and @argv
2011-01-05 13:10:57 +09:00
Bill Currie
5627e43465
Use the method's selector rather than its def name in error messages.
2011-01-03 16:25:29 +09:00
Bill Currie
a1f36a9944
Make new_function take a def rather than a name.
...
Moves into new_function some code that should have been there in the first
place.
2011-01-03 16:25:29 +09:00
Bill Currie
4c69a97ac7
Allow normal declarations within a class implementation.
...
I had always been under the assumption that such was illegal in
Objective-C, but after working on Forge, I now know otherwise.
2011-01-03 16:25:29 +09:00
Bill Currie
dc5bafb8fb
Minimal error recovery.
...
No more bailing on the first syntax error. While the recovery is not
perfect (things can get right twisted), qfcc will now continue parsing
after a syntax error.
2011-01-03 16:25:29 +09:00
Bill Currie
a4635d79e8
Slightly more informative error locations.
...
Inside a class or protocol definition is not "at top level" ;)
2011-01-03 16:25:29 +09:00
Bill Currie
f738ef5dba
Remove redundant RETURN statement rule.
...
The same effect can be achieved with one rule using opt_expr.
2011-01-03 16:19:28 +09:00
Bill Currie
28740bb57f
Add unsigned integer constant support.
2010-12-23 19:32:28 +09:00
Bill Currie
4481ba9b0d
Allow explicit references to classes and categories.
...
Use "@reference ClassName;" or "@reference ClassName(CategoryName);" to
create a refence to the class or category, forcing the defining object file
to be linked into the program when the object file is part of a library.
2010-12-12 20:27:56 +09:00
Bill Currie
67beaf4487
Nil is a constant, so allow it in global initializers.
2010-11-24 17:01:18 +09:00
Bill Currie
a623fb53a7
Proper support for empty structs and unions.
...
They now have a single private, void, unnamed member, resulting in a size of
1 word. This makes empty structs useful for typed opaque handles.
2010-11-24 17:01:17 +09:00
Bill Currie
51a32f4f87
minor comment about scoping in traditional mode
2010-02-22 13:44:52 +00:00
Bill Currie
56d01ce267
found an uncontrollable warning
2010-02-20 12:01:49 +00:00
Bill Currie
8abb9a69aa
remove support for an optional = in struct/union declarations
2010-01-13 06:34:32 +00:00
Bill Currie
ae4fc3147d
allow '*pointer' expressions
2010-01-13 06:31:41 +00:00
Bill Currie
c2dcc20d2a
allow (constant) expressions in array declarators
2010-01-13 06:23:32 +00:00
Bill Currie
dcf593291d
fix for new bison (must be explicit with the type of $$ in mid-rule actions)
2009-12-21 05:53:00 +00:00
Bill Currie
9ac15436d9
More docs.
...
Enhance qfprogs qfo debugging.
Make sure functions marked as extern don't emit anything. Fixes the segfault
when building klik.
2008-08-01 13:54:24 +00:00
Bill Currie
3e50aae01f
"print" command for dumping values in the progs and add return type info to the debugging information
2007-09-15 07:47:31 +00:00
Bill Currie
a521a78adb
catch more uninitialized variables
2007-05-13 08:39:07 +00:00
Bill Currie
b356f1cbd4
remove some debug
2007-05-13 07:06:59 +00:00
Bill Currie
f4d40650f5
make initialized locals behave similarly to qcc in traditional mode (note, they're not exactly the same)
2007-05-13 06:21:54 +00:00
Bill Currie
0e78c3f6da
make STORAGEX lower priority than UNARY so casts work
2007-05-07 23:44:45 +00:00
Bill Currie
9609fe8ca4
bloody hell
2007-05-07 15:04:06 +00:00
Bill Currie
839c00b97b
back out the large packet/entity related patches. they've provent to be troublesome and it seems FTE has a better solution.
2007-05-07 14:58:53 +00:00
Bill Currie
8f365c4512
that wasn't supposed to go in
2007-05-07 12:18:54 +00:00
Bill Currie
72daa2fd2b
add some sounds to the menus (not yet finished)
2007-05-07 12:17:12 +00:00
Bill Currie
7ba41632d9
snax's fixes to clean up most of the shift/reduce conflicts
2007-04-28 08:49:07 +00:00
Bill Currie
e8e2d3a6e5
make "local" optional
2007-04-28 05:20:47 +00:00
Bill Currie
cfeb14fecf
warn when local variables are redecalred in the same scope. This won't normally cause problems, but it can save a lot of grief when converting traditional quakec code.
2007-04-12 09:39:42 +00:00
Bill Currie
30744a555e
find the other place def_func relocs get emitted. I keep forgetting about the .y file when grepping source :P
2007-04-10 07:40:03 +00:00
Bill Currie
48fdd0cb26
record the params for builtins, too.
2007-04-09 06:16:34 +00:00
Bill Currie
25bf40a71a
finish the break overloading and add some more tests (really need to get these automated)
2007-04-07 04:58:27 +00:00
Bill Currie
a6388ee680
overload "break" and allow break to be used in --traditional
2007-04-06 11:46:21 +00:00
Bill Currie
e9f49ca816
allow static local vars
2006-12-11 09:26:07 +00:00
Bill Currie
48f8bbd12e
group the struct rules together
2006-12-02 06:49:55 +00:00
Bill Currie
b6a4a520d5
silence bison's new warnings
2006-12-01 08:17:55 +00:00
Bill Currie
3fb03fc2be
hah, should have been using __attribute__((used)) all that time (rather
...
than __attribute__((unused))). fixes the missing console in -x11
2005-08-04 15:27:09 +00:00
Bill Currie
0edd694bac
fix a default action type clash in some versions of bison
2005-03-31 08:23:11 +00:00
Bill Currie
66257e3a88
run in fear, function overloading is here
...
This is an imperfect revision of history.
2004-11-13 11:50:00 +00:00
Bill Currie
64cc8c60d2
compile time protocol support seems to be complete now. fortunatly, protocols had never been written out so the corrections to the protocol related stuctures do not need a progs version bump. runtime protocol support hasn't been fully tested yet.
...
+load runtime support seems to be working.
This is an imperfect revision of history.
2004-11-11 00:34:00 +00:00
Bill Currie
a3a2dd62e3
fix type of "self"
...
This is an imperfect revision of history.
2004-11-02 07:13:00 +00:00
Bill Currie
a4dbdb4d06
whitespace
...
This is an imperfect revision of history.
2004-11-02 07:08:00 +00:00
Bill Currie
fff41d664a
detect re-declaring identifiers as different types (typedef, enum, var, etc)
...
This is an imperfect revision of history.
2004-11-02 07:02:00 +00:00
Bill Currie
332ec82495
update the scope of local defs to the parent scope when the creation scope
...
goes away (doesn't get updated to the global scope). fixes a bug where
local defs would be miscounted (and sometimes lost)
2004-04-09 03:47:41 +00:00
Bill Currie
25ac9cb07b
fix "for (;;)" etc
2004-03-30 02:31:02 +00:00
Bill Currie
865b31caac
make sure messages generated by issues within a function don't get
...
"At top level"
2004-02-13 04:57:15 +00:00
Bill Currie
69730cae8b
fix some type classes in older bison
2004-02-12 01:37:27 +00:00
Bill Currie
02d89ee7d5
allow computed functions for "think" in state expressions
2004-02-11 08:09:10 +00:00
Bill Currie
1c090c38a3
allow non-const expressions for the frame number and make sure the time
...
step is a float (for state expressions)
2004-02-11 04:00:11 +00:00
Bill Currie
0fe4c2a600
catch redefined functions
2004-02-11 01:53:17 +00:00
Bill Currie
c3f41e3e69
new opcode: state.f. same as state, but takes a 3rd float operand to
...
specify the step for calculating nextthink. accessed using
[frame, think, step] (state is [frame, think])
2004-02-11 01:43:33 +00:00
Bill Currie
1fc517f7db
C style functions can now (optionally) be used (void foo ();)
2004-02-11 00:36:34 +00:00
Bill Currie
e2602bc9d5
fix misparse of void () foo;
2004-02-10 23:49:45 +00:00
Bill Currie
7af8f8a6f6
; at the end of a function is no longer required. void () foo = {} and
...
void () foo = {}; are both valid now.
2004-02-10 23:20:44 +00:00