Commit graph

488 commits

Author SHA1 Message Date
Bill Currie
68fb0a1147 clean out a bunch of unneeded code. this should take care of static linking 2001-11-13 20:34:21 +00:00
Bill Currie
645c400802 rearrange default jump for slightly better code generation 2001-11-13 20:27:05 +00:00
Bill Currie
4291f9c711 create new_bind_expr and more tweeks to temp def ref counting 2001-11-13 18:49:27 +00:00
Bill Currie
f2f8e096f3 qfcc.h:
o	add a "freed" marker to def_t to prevent double freeing of
		temp def offsets
emit.c:
	o	break out the bind code into emit_bind_expr (doesn't /really/
		emit code, but still:)
	o	make bind work with disparate types (forces def_t->freed 1)
pr_def.c:
	o	mark array pointers as initialized and constant.
	o	don't free the offset for already freed temp defs
pr_imm.c
	o	fix a bug in uinteger support
	o	support disparate types for immediates
switch:
	o	fix a bug where gt.i was being used instead of gt.ui
	o	remove some debug code
2001-11-13 18:11:19 +00:00
Bill Currie
3d5447c71f seems gcc3 drops the missed enum in switch warning :/ 2001-11-13 16:08:50 +00:00
Bill Currie
07b59d2f07 pr_comp.h:
o	add OP_JUMPB
	o	OP_JUMPB renumberd some opcodes, so up PROG_VERSION
pr_edict.c:
	o	make the version error reporting more informative
pr_exec.c:
	o	implement OP_JUMPB (goto *(ptr + index))
pr_opcode.c: (libs/gamecode/engine)
	o	add OP_JUMPB to the table
expr.h:
	o	ex_uinteger support
	o	some const correctness
	o	prototype new_label_expr
qfcc.h:
	o	uinteger ussport
	o	add pointers for op_jump and op_jumpb
	o	prototype PR_GetArray
emit.c:
	o	general uinteger support
	o	new reference/reloc type 3: absolute statement address
	o	jumpb support (binary goto)
expr.c:
	o	uinteger support
	o	break the label name creation out of new_label_expr into
		new_label_name
	o	some const correctness
pr_def.c:
	o	add PR_GetArray to allocate an array in global space
	o	factor out some code common to PR_GetDef and PR_GetArray that would
		otherwise be duplicated
pr_imm.c:
	o	some const correctness
	o	uinteger support
pr_lex.c:
	o	uinteger support
pr_opcode.c: (tools/qfcc/source)
	o	support jump and jumpb
switch.c:
	o	rewrite the binary search code to support ranges.
2001-11-13 08:58:54 +00:00
Bill Currie
d27cd9cc21 s/type_size/pr_type_size/
remove the redundant type_size from qfcc
2001-11-12 23:56:46 +00:00
Timothy C. McGrath
eb7d41b95c Fix for configure to give it a zlib check, just like qfcc. qfdefs now compiles
again statically.

Tim McGrath
(Misty-chan)
2001-11-12 23:52:14 +00:00
Timothy C. McGrath
0a18c1256a Fix configure for zlib and static compiling. static compiling is still broken
But I'm sure taniwha is going to fix that shortly anyway :)

Tim McGrath
(Misty-chan)
2001-11-12 23:49:08 +00:00
Bill Currie
dcfea9796e strings now work in switch statements 2001-11-12 21:13:55 +00:00
Bill Currie
d168a3daee this should remove the requirement for gmake on bsd systems 2001-11-12 16:23:41 +00:00
Jeff Teunissen
9f1f89f8f1 Forge: New -- a preferences panel. Doesn't do anything yet, but that's
only because I haven't created the main prefs view class yet. Trust me,
it's going to work. I think. :)

Anyway, what code there is works, and is linked into the menu -- just
hit Info -> Preferences... to see it.
2001-11-12 14:15:20 +00:00
Jeff Teunissen
150128f158 Localization for Forge. 2001-11-11 20:56:27 +00:00
Jeff Teunissen
316004e793 Forge updates. Preferences seems to be debugged now. 2001-11-11 20:54:59 +00:00
Bill Currie
928d343295 pr_comp.h:
o	add ev_uniteger to the types enum
	o	add opcodes for ifbe, ifb, ifae, ifa, jump, lt.ui, gt.ui, le.ui, ge.ui
progs.h:
	o	add uinteger accessors
pr_exec.c:
	o	implement ifbe, ifb, ifae, ifa, jump, lt.ui, gt.ui, le.ui, ge.ui
pr_opcode.c:
	o	add opcodes for ifbe, ifb, ifae, ifa, jump, lt.ui, gt.ui, le.ui, ge.ui
expr.h:
	o	prototype inc_users
qfcc.h:
	o	add externs for op_ifbe, op_ifb, op_ifae and op_ifa
emit.c:
	o	don't bother emiting an assignment to a temp def that's only used once
		(ie, it's never read, only written to)
	o	support the new if* instructions
expr.c:
	o	support the new if* insructions
	o	dectect expression loops in append_expr
	o	support unsigned integers
	o	re-work temp def usage counting
pr_def.c
	o	debugging for temp def usage counts
pr_opcode.c:
	o	support the new if* instructions
qc-parse.y:
	o	provide defines for IFBE IFB IFAE IFA
switch.c:
	o	do binary searches for strings, floats and ints if there are more than
		8 cases in a switch. Strings need more testing.
2001-11-09 00:58:16 +00:00
Bill Currie
643aa795d6 fill the bsb and brush menus with a "dunno" filler that just, er, selects
"undo" for now. This is so Controller.m compiles on my system (using gcc 3)
2001-11-07 02:50:54 +00:00
Bill Currie
cb4ce6a634 remove the default label from the switch label table while fetching it. 2001-11-06 20:39:42 +00:00
Jeff Teunissen
5876ba1aba Forge Updates. Menus mostly filled out now, the .gorm file inits the
controller.
2001-11-06 13:20:23 +00:00
Jeff Teunissen
1b834ba52e Whoops. Fix the principal class. 2001-11-05 20:05:02 +00:00
Jeff Teunissen
5ff1de398e Okay, tiny skeleton for Forge. It will be cleaner and probably faster to
treat Forge like an entirely new program, and not as a port. I'll still
be using many of the ideas from QuakeEd (and from my old Forge work),
but there's no promise that it'll be a duplicate, or even similar.
2001-11-05 19:58:25 +00:00
Jeff Teunissen
51a17f280b Forge: more files history 2001-11-05 19:47:05 +00:00
Jeff Teunissen
2ab7a09812 Forge: More stuff gets the axe. 2001-11-05 19:45:09 +00:00
Jeff Teunissen
02dd74b2f7 Buh-bye headers. 2001-11-05 19:40:34 +00:00
Jeff Teunissen
2fbdbd5522 Forge: Committing the stuff I _was_ working on. These will all go away
in a few minutes.
2001-11-05 19:36:04 +00:00
Bill Currie
ccbb1c3f04 document all those weird opcodes :) 2001-11-05 19:32:50 +00:00
Bill Currie
13a177f217 use 'b' (bind) instead of '=' (assign) for switch's test temp def so simple
expressions (ie, just a def) don't generated wasted assignments and clean up
switch's debug info so you get the switch line rather than the line for the
closing }
2001-11-05 19:12:33 +00:00
Bill Currie
9b784e331b remove '(' (never used, don't remember what it was intended for) and add
'b' (bind), 's' (state) and 'c' (call) to get_op_string.
2001-11-05 19:11:03 +00:00
Bill Currie
c60dc54697 Makefile:
update qfcc options
main.qc:
	go back to the original intent :)
2001-11-02 03:03:01 +00:00
Bill Currie
5f5060cbf0 move the users and used setting code from emit_statement to
PR_AddStatementRef. This removes essentially duplicate code and 3 ifs :)
2001-10-31 18:40:02 +00:00
Bill Currie
b499d7e1e8 I've decided that shuffling the `sections' like that doesn't really gain
anything, so I'm reverting that change.
2001-10-31 17:55:35 +00:00
Bill Currie
3b2d2a1c88 re-arrange the order of the `sections' of a .dat file to match the header
order. this also `happens' to put the strings section just before the globals
section (both at the end) which will make pointer bounds checking easier.
2001-10-30 19:41:27 +00:00
Bill Currie
85c9e0ab1e more externs cleaned up 2001-10-29 17:46:03 +00:00
Bill Currie
09f19fd9c9 remove some redundant data 2001-10-28 04:42:44 +00:00
Bill Currie
ccfe82cda4 *taniwha mops up the last drops of blood from extern 2001-10-28 04:38:24 +00:00
Bill Currie
3f45a8305c *taniwha inflicts more carnage on extern 2001-10-28 04:29:30 +00:00
Jeff Teunissen
79544d6630 qfcc: More manpage updates. 2001-10-27 02:20:39 +00:00
Jeff Teunissen
901a8ec9c5 qfcc: update man page. It's pretty useful, so I'll probably be setting
it up as part of the install for qfcc.
2001-10-26 23:55:42 +00:00
Jeff Teunissen
274ff6e59a Add getopt.h to the dist, just in case. 2001-10-26 23:54:20 +00:00
Jeff Teunissen
b07d60f6d6 add getopt.c and getopt1.c to the makefile. There is preprocessor
stuff in these files to detect when they need to be compiled, so they
don't need anything in configure.
2001-10-26 23:53:36 +00:00
Jeff Teunissen
5502558bb9 qfcc: Argument passing for cpp, shuffling the verbosity levels around a
bit.
2001-10-26 22:07:35 +00:00
Bill Currie
5eba9f155e clean up some duplicate symbols 2001-10-26 17:49:23 +00:00
Bill Currie
d8e6bf9cb6 fix the verbosity levels to what they were
--no-cpp is now cpp or no-cpp in code
add cpp to code_options_t
2001-10-26 16:04:38 +00:00
Jeff Teunissen
c5d0d45edf qfcc: Remove some debug info from taniwha's last commit -- I thought
*I*'d done that! :)
2001-10-26 08:55:24 +00:00
Jeff Teunissen
46c4174024 qfcc: forgot a newline in -V output 2001-10-26 08:17:04 +00:00
Jeff Teunissen
89c7e0df1a qfcc: getopt support. Yes, it exists, and it works, and it's fun! :) 2001-10-26 08:14:05 +00:00
Bill Currie
5cbd50d835 count the number of digits needed rather than relying on -lm (now it's not
needed:)
2001-10-26 06:53:02 +00:00
Jeff Teunissen
581411e9e2 qfcc: Preparation for getopt. 2001-10-26 06:43:56 +00:00
Timothy C. McGrath
04e4da654a Changes taniwha did to make qfcc work with statically compiled libs.
This is what was bugging me all night long with qfcc ><;;

Tim McGrath (Misty-chan)
2001-10-26 02:32:40 +00:00
Bill Currie
70bedc149f allow returning NIL 2001-10-25 21:15:48 +00:00
Bill Currie
bc44f950af enable passing NIL into a function 2001-10-25 20:51:56 +00:00
Bill Currie
f8a41cb1bc completely nuke the concept of "priority" from opcodes and use get_op_string
in emit_sub_expr instead of a redundant switch.
2001-10-25 17:48:35 +00:00
Bill Currie
f029687ff0 switch statement. could do with lots of improvements, but this should be a
good start.
2001-10-25 06:41:52 +00:00
Bill Currie
09405469f6 throw PR_BeginCompilation's arguments out the nearest airlock 2001-10-24 22:53:27 +00:00
Bill Currie
f36e7bb22f reorg 2001-10-24 22:52:50 +00:00
Adam Olsen
3bba5398ba - audit malloc usage. now everything checks the return value :) 2001-10-24 22:50:06 +00:00
Bill Currie
133ce647fb implement break and continue. only loops covered for now, but that's because
switch isn't implemented yet
2001-10-24 18:57:29 +00:00
Bill Currie
743bc5178b fix uninitialized variable detection for nested scopes 2001-10-24 15:21:21 +00:00
Jeff Teunissen
890efff350 Forge: Remove some files that we can't use with OpenStep. If anyone needs them for porting to
NSGraphicsContext, let me know and I'll provide them.
2001-10-24 12:41:38 +00:00
Bill Currie
6553c81a41 proper scoping for QC ala C. 2001-10-24 06:39:49 +00:00
Bill Currie
b8a9a97c75 the usual 2001-10-22 18:47:45 +00:00
Jeff Teunissen
6af08f0468 Forge: rip some useless stuff out of configure. 2001-10-20 00:48:15 +00:00
Jeff Teunissen
c38e76fce7 Forge: Gorm updates -- figuring out how connections work :) 2001-10-20 00:37:20 +00:00
Jeff Teunissen
73e53986a3 Forge: Preferences updates -- use notifications instead of globals. 2001-10-20 00:33:54 +00:00
Bill Currie
2ef8adea09 handle more conditional code and check for unitied vars in the test of if ()
etc
2001-10-19 05:16:24 +00:00
Bill Currie
16c334b6b9 uninit var detection seems to work for if and if else 2001-10-19 03:22:04 +00:00
Bill Currie
3572a6be28 change def_list from def_t ** to hashtab_t * and comment out some debug code 2001-10-19 00:45:56 +00:00
Bill Currie
237d238a65 beginnings of "if" uninitialized variable support. doesn't make any
difference yet
2001-10-18 23:06:39 +00:00
Bill Currie
5ca785e7e8 uninitialized variable detection. not perfect (lots of false negatives, but
fewer than before;) but prozac isn't giving any false positives.
2001-10-18 20:05:26 +00:00
Bill Currie
96e4e1a232 the beginning of unititialized var detection. first victim: functions.
--undefined-function-warning is now --no-undefined-function-warning and
the default is to detect called but undefined functions.
2001-10-18 17:41:22 +00:00
Bill Currie
952f029e6d rename def_t.initialized to def_t.constant 2001-10-18 17:15:05 +00:00
Bill Currie
85834ab8c3 handle a couple of missed ex_nil cases 2001-10-17 18:36:19 +00:00
Bill Currie
79ac85b54f type checking now works much better and there is now a NIL builtin constant
which can be assigned (/only/) to anything.
2001-10-17 07:45:37 +00:00
Bill Currie
2d068c0745 massive windows.h and WIN32 cleanup. 2001-10-16 21:40:45 +00:00
Bill Currie
40489cb166 Config.h.in is generated, so remove from cvs 2001-10-14 06:10:45 +00:00
Jeff Teunissen
69c558d78c Vector class for Forge. Don't know if we need it, but it helped me to
grok vectors.
2001-10-14 05:57:38 +00:00
Jeff Teunissen
f7b0227299 This is all seriously broken, but I'm committing it so that it can be
worked on by other people as well. :)
2001-10-14 05:55:21 +00:00
Bill Currie
c8e1e7942a correct type error checking for vectors vs floats 2001-10-12 03:58:22 +00:00
Jeff Teunissen
510ce73d65 A Gorm file for the Forge interface. 2001-10-10 01:49:57 +00:00
Bill Currie
356492f683 don't convert float test epxressions for --id and fix a typo in an error
message for !expr
2001-10-06 04:48:52 +00:00
Ragnvald Maartmann-Moe IV
2080ae7db6 Fix stamp ignorance. 2001-10-05 19:42:17 +00:00
Bill Currie
922895ed99 comment out unused var 2001-10-02 19:33:31 +00:00
Bill Currie
67635e9dd0 fix a d'oh in the param/return type checking 2001-10-02 19:03:28 +00:00
Bill Currie
dcb51dc586 expr.h:
get_type and extract_type prototypes and add extern for type_names
emit.c:
	use extract_type instead of get_type
expr.c:
	get_type now returns the type pointer rather than the qc type enum.
	extract_type uses get_type to return the qc type enum.
	make type_names global
	use get_type instead of ex_expr/ex_def to cover more cases
	clean up function call/return processing as a result of get_type
pr_opcode.c:
	use opcode_priority_type_table_ab when var_c is null and a minor
	cleanup in PR_Opcode_Find
2001-10-02 18:55:52 +00:00
Bill Currie
1a3a599ab3 ignore gas2masm 2001-09-28 07:33:46 +00:00
Bill Currie
f442e0d980 make gendefs put its rcsid into its generated files 2001-09-28 07:27:13 +00:00
Bill Currie
7407e4f1b7 and some more 2001-09-28 07:09:38 +00:00
Bill Currie
bcd54926b4 make compile with gcc 3.0 2001-09-28 03:58:51 +00:00
Bill Currie
83db5c0194 fix --with-qf 2001-09-28 03:47:22 +00:00
Jeff Teunissen
cd5f322cc1 Move along, nothing to see here... :) 2001-09-26 03:39:44 +00:00
Bill Currie
06da30ac89 mingw build fixes again (including mostly working in sid: got some link issues) 2001-09-25 06:18:30 +00:00
Bill Currie
c74fc1c0df make the unused var warning like gcc's 2001-09-24 17:51:15 +00:00
Bill Currie
2447983464 try three. this should work 2001-09-24 03:23:44 +00:00
Bill Currie
998855402c try two 2001-09-24 02:48:09 +00:00
Bill Currie
5f9a3d9617 try to make --with-qf work while configuring 2001-09-24 02:38:28 +00:00
Bill Currie
789a11d2d8 don't print the file or line number for "warnings treated as errors" 2001-09-23 04:08:28 +00:00
Bill Currie
2054ec016a fix a slew of false positives with unused var checking 2001-09-23 04:08:03 +00:00
Bill Currie
7aec6e253a unused local variable detection 2001-09-22 23:41:47 +00:00
Bill Currie
9f715ae9f8 more small old-parser cleanups 2001-09-15 20:31:17 +00:00
Bill Currie
3557d375f3 add better scoping to TODO even though I'm likely to do it soon 2001-09-13 20:34:08 +00:00
Bill Currie
d7675ada7a move the particle count multiplication out of the renderer and into the clien
(for blood and gunshot, anyway).
2001-09-06 05:41:15 +00:00
Jeff Teunissen
896d304ac9 New man page for qfcc -- doesn't match the program yet, I'm committing
it for comments.
2001-08-31 16:43:26 +00:00
Bill Currie
805c1bd242 foo (snafu, bar (baz)) no longer uses a temp for bar's return value 2001-08-24 23:22:02 +00:00
Bill Currie
f16886b7f1 missed a need to increment the users of the temp for chained functions 2001-08-24 22:29:06 +00:00
Bill Currie
cee850e499 remove debug 2001-08-24 22:03:50 +00:00
Bill Currie
8166ee7bfb fix a whitespace snafu (gee, vim can be a pain somethings) 2001-08-24 21:57:07 +00:00
Bill Currie
ea451ab02d Remove unnecessary temps from function return values. This has one
*/CRITICAL/* implication: DO NOT /EVER/ RELY ON EVALUATION ORDER. This
isn't /really/ that bad: evaluation order will be consistent for similar
expressions, but for (eg) foo() + bar()*2, bar will be called first.
2001-08-24 21:47:52 +00:00
Bill Currie
08f73bed78 better code generation for foo(bar(baz)). foo(snafu,bar(baz)) isn't optimal
yet, but the code is at least correct
2001-08-24 21:14:04 +00:00
Bill Currie
eeec89e6ba don't put function args in temps when not needed. still need to take care
of the return value, but that can possibly be taken care of in an optimiser
pass.
2001-08-24 05:40:48 +00:00
Bill Currie
0eda635483 fix temp reference counting on function call args 2001-08-22 23:21:47 +00:00
Bill Currie
4c48851096 fix a buffer overflow in new_label_expr
use reference counting for temp defs and call PR_FreeTempDefs at the end
of emit_sub_expr as well as emit_expr.
fix a (relatively harmless) bug in type processesing of foo.bar =
2001-08-22 21:55:01 +00:00
Bill Currie
a32384f16c report the name of the function using the most locals 2001-08-21 18:23:21 +00:00
Bill Currie
8d29efe552 remove a debug print 2001-08-21 17:22:55 +00:00
Bill Currie
e71cbaf5ef fix for -- 2001-08-20 22:16:07 +00:00
Bill Currie
2af74aedca fix a segfault due to type mangling for ... functions 2001-08-20 18:23:47 +00:00
Bill Currie
cf4ca286f0 implement pre and post increment operators (++ and --) 2001-08-20 06:22:28 +00:00
Bill Currie
cd59628199 move the chained funcion support out of emit_function_expr into funciton_expr 2001-08-20 04:56:00 +00:00
Bill Currie
9ee3450265 extend the hash api to more easily support general cases 2001-08-16 02:51:53 +00:00
Bill Currie
d55199bece re-arrange the types of store and storep so things make a little more sense 2001-08-13 23:00:17 +00:00
Bill Currie
c103adc17d clean up the code generated for a = b ? c : d 2001-08-12 02:38:12 +00:00
Bill Currie
f343776b5a mark some jobs done, correct a typo and sort them by done, in progress, planned 2001-08-11 22:07:03 +00:00
Bill Currie
79ce6c56ca fix assignops with entity fields by cloning e1 rather than just re-using it 2001-08-11 22:02:59 +00:00
Bill Currie
248de6858d hopefully take care of freebsd 2001-08-11 21:46:02 +00:00
Bill Currie
c2d3d8f3ab temp def expressions and ?:
seems to work :)
2001-08-11 21:15:24 +00:00
Bill Currie
a8e858f77d fix a bug where every 2nd(?) arg was being skipped when setting up a function
call
2001-08-10 21:31:48 +00:00
Bill Currie
11381ce593 the usual 2001-08-10 21:19:36 +00:00
Adam Olsen
caeb31e6ca start of the support for chained function calls. Actually, they
should work fine now, there's just some extra temp vars we want to
remove before we can consider it "done" :)
2001-08-10 20:35:42 +00:00
Bill Currie
b44fd6ab91 move a var 2001-08-10 18:42:13 +00:00
Bill Currie
4388bf0519 good bye, old parser 2001-08-10 18:35:55 +00:00
Bill Currie
9e46265046 fix a silly error causing integer constants to not be re-used 2001-08-10 17:41:08 +00:00
Bill Currie
a33c834a39 move SHL and SHR down in expr 2001-08-10 17:00:53 +00:00
Adam Olsen
6414897dae got a few new operators for qc :)
<< >> % which all act like their C counterparts
+= -= *= /= &= ^= |= <<= >>= %= which just expand into the obvious,
also like the C versions.
2001-08-10 16:17:00 +00:00
Bill Currie
27ccfa67c5 fix the efficiency of unary expressions as args to a function 2001-08-09 17:05:30 +00:00
Bill Currie
2774260898 test ^ 2001-08-09 16:39:08 +00:00
Bill Currie
081d8f3c47 ^ and ~ operators for qc (^ from Rhamphoryncus) and clean up the punctuation
line in qc-lex.l (why didn't I think to do that in the first place?!?)
2001-08-09 16:34:46 +00:00
Bill Currie
b341529fce more --id support 2001-08-07 16:50:22 +00:00
Adam Olsen
c218ede288 Add support for checkfunction, which is a builtin that searches for
another builtin by name, and returns it.

Soon I'll change all our new builtins to by allocated dynamically, as
well as changing the number checkfunction uses, and happily break
everything that uses them :D
2001-08-04 09:11:50 +00:00
Bill Currie
1e1cb06a1f disable integers for --id. probably not thorough enough yet :/ 2001-08-03 07:47:15 +00:00
Adam Olsen
ae133d0a90 Modify progs to add builtins at runtime. It should be trivial to
lookup functions by name, and make all our new QC builtins allocate
numbers automatically.
2001-08-03 06:40:28 +00:00
Bill Currie
d89cd91e4b make the expressions in for (a;b;c) optional 2001-08-01 06:29:09 +00:00
Bill Currie
f9d4351515 more jobs 2001-08-01 00:19:05 +00:00
Bill Currie
bfb8eff2f0 signed_const isn't needed any more 2001-07-27 21:01:01 +00:00
Bill Currie
89da47335b tests, tests, tests 2001-07-27 20:56:16 +00:00
Bill Currie
ecc71c4a60 local var = expr; now works (globals must still be consants) 2001-07-27 20:55:14 +00:00
Bill Currie
28b1598e7e break the emit_* functions out of expr.c into emit.c 2001-07-26 05:15:34 +00:00
Bill Currie
7718ca4c96 various little cleanups 2001-07-26 05:08:27 +00:00
Bill Currie
95ad5aa329 integer type done 2001-07-26 04:34:10 +00:00
Bill Currie
c553917c53 various tests 2001-07-25 21:48:20 +00:00
Bill Currie
d44f60f17c drasticly simplify emit_assign_expr now that I have a much better
understanding of when an explicit assigment is needed. seems to work for
everything I throw at it.
Also, fix ! unary ops (caused by the - unary op fix:/)
2001-07-25 21:47:05 +00:00
Bill Currie
0c2cd8633c fix -expr handling. generates sucky code atm, but at least it's generating
code now:P
2001-07-25 18:36:36 +00:00
Bill Currie
638cd005b0 return type testing 2001-07-25 02:28:04 +00:00