Bill Currie
fc6fb804d7
support all but \b, \< and \> of qccx' character escapes.
2002-04-26 22:23:28 +00:00
Bill Currie
1f468e2508
fix a silly parse snafu
2002-04-26 21:49:35 +00:00
Bill Currie
aa006ecf64
qfcc now supports implicit string constant concatentation.
2002-04-26 21:42:50 +00:00
Bill Currie
4f7245d634
allow type (parm, parm, ...) to compile (the parms aren't type checked yet)
2002-04-26 21:28:06 +00:00
Bill Currie
313c82efef
use dstring_new instead of dstring_newstr to avoid allocating memory that's
...
only going to be reallocated immediatly anyway.
2002-04-15 22:24:47 +00:00
Bill Currie
03ab75704f
-p N or --strip-path N will strip up to N leading path elements for a
...
source file's path.
2002-04-10 19:52:48 +00:00
Bill Currie
c71ce480ad
fix a seg when trying to print a null type
2002-04-09 21:37:46 +00:00
Bill Currie
b29c0d70b7
more signed char indeces
2002-04-07 05:44:34 +00:00
Bill Currie
0f198f118e
%d and pid_t don't mix on solaris, so use %ld and cast to long
2002-04-07 05:40:27 +00:00
Bill Currie
655fe17e18
fix handling of pointers in function params and local vars for qc functions
2002-03-18 07:30:21 +00:00
Bill Currie
b97ac96204
fix the win32 side of pre-preocessing
2002-03-14 00:05:04 +00:00
Bill Currie
5a2538faaf
dstring.[ch]:
...
create dsprintf and dvsprintf to do formated prints to dynamic strings.
rest
Use the new functions :)
2002-03-08 23:11:42 +00:00
Bill Currie
d3870a1ec4
fix a missing dstring_adjust call (I guess I need to make a dsprintf:)
2002-03-08 20:56:22 +00:00
Bill Currie
de60a142ef
break out the preprocessing code into a function so I can later preprocess
...
the progs.src file. also use snax's new dynamic strings for the tempname.
2002-03-07 18:36:48 +00:00
Bill Currie
860e3ebb1d
make unsigned arrays/pointers more useful by allowing them to be used as
...
unbounded arrays
2002-02-24 01:11:34 +00:00
Bill Currie
80723fdec7
o don't ice when ex_name or ex_nil expressions show up in emit_expr.
...
instead, treat as useless epxression.
o mark rvalue expressions as such
o increment the users of a managed temp def when in an rvalue expr
2002-02-21 20:34:04 +00:00
Bill Currie
e38259e01f
warn when a top-level local shadows a parameter
2002-02-19 00:16:56 +00:00
Bill Currie
d1fcfd1939
Implement --traditional so qfcc can be a nicer qcc. This disables several
...
keywords (quaternion integer function for break continue switch case default
NIL struct enum typedef) and converts some errors to warnings (assignment to
constants, insufficient function arguments, return; from non-void function,
anal function `pointer' type checks)
2002-02-18 06:23:59 +00:00
Bill Currie
49ef391664
make dist fix
...
----------------------------------------------------------------------
2002-02-16 05:15:24 +00:00
Bill Currie
b4000200e3
move the getopt files from qfcc/source to libs/util, link qw-master against
...
libQFutil and enable the option parsting in qw-master for win32.
2002-02-12 17:44:41 +00:00
Bill Currie
4f6e61d68b
win32 compile fix
2002-02-05 22:56:21 +00:00
Bill Currie
16298914f0
default sourcedir to "" rather than "./" and strip leading paths from the
...
tempname when preserving temps
2002-02-05 22:08:19 +00:00
Bill Currie
cb0db8b8d1
disable debug putout and allow the cpp command line to be specified.
2002-02-05 19:35:45 +00:00
Bill Currie
f2a8f8ff28
make cpp command line selection more intelligent. This should take care of
...
the stuck cpp problem on openbsd.
2002-02-05 18:40:47 +00:00
Ragnvald Maartmann-Moe IV
a3c699a921
Fix three gitignores.
2002-01-31 07:49:29 +00:00
Bill Currie
ad6d847728
fix qfcc's incorrect allocation/initialization for pointers (eg, float [] foo)
2002-01-30 22:57:48 +00:00
Bill Currie
3d9c8a9a60
get nil conversions working fully and things like !pointer
2002-01-30 22:17:55 +00:00
Bill Currie
6a393d175e
implement typedef
2002-01-23 20:50:25 +00:00
Bill Currie
3f958ae29b
more make dist fixes
2002-01-22 18:04:03 +00:00
Bill Currie
ecd539cbd3
some make dist fixes
2002-01-22 17:17:18 +00:00
Bill Currie
c8ef2d8b55
subdirs must come /after/ their parent in the AC_OUTPUT list
2002-01-22 07:42:35 +00:00
Bill Currie
8a24b28d97
scary, but the only changes qfcc needed to build as part of quakeforge was
...
to auto-substitued the libs and headers.
o unconditionally build qfcc (for now, anyway) when building quakeforge
(needed for cs-code compilation)
o when built as part of quakeforge (qfcc should still be buildable
independently) always enable cpp
o autoconfiscate the client-side code
o build the client-side code using the built qfcc
o install the client-side code in $(datadir)/quakeforge/id1
2002-01-22 05:48:03 +00:00
Bill Currie
f1f2dd713d
generate progdefs.h only for v6only
...
generate files.dat only if -F or --files is given on the command line
2002-01-21 23:30:54 +00:00
Bill Currie
7775dab7bb
remove debug
2002-01-21 19:19:07 +00:00
Bill Currie
f2d097c013
resolve the case value before checking its type
2002-01-21 19:18:41 +00:00
Bill Currie
2ce5a91373
allow enum {...} name; but ignore name (eases C <-> QC header compat)
2002-01-21 19:09:23 +00:00
Bill Currie
64c5983742
enum support
2002-01-21 19:03:29 +00:00
Bill Currie
cef918df83
get array initialisation worrking
2002-01-18 08:26:37 +00:00
Bill Currie
d69762facd
integer() and float() casts seem to work
2002-01-17 19:32:04 +00:00
Bill Currie
08c1d57c53
fix a param scoping error
2002-01-17 16:59:00 +00:00
Bill Currie
7227ab4363
qfcc.c:
...
add -P,--progs-src so you can specify the name of the progs.src file
rest:
add/use print_type
2002-01-17 08:19:53 +00:00
Jeff Teunissen
8c2d3f65c3
Add a couple symbols to qfcc's preprocessor lines
2002-01-05 19:18:27 +00:00
Jeff Teunissen
9f6dcec9dd
--save-temps support for qfcc. It'll leave files with the same filenames
...
they're generated from, with the exception that they will have an
extension of .p. Obviously, depends on cpp support.
2002-01-05 19:13:20 +00:00
Jeff Teunissen
a0370e52d2
Manpage should be both distributed and installed now.
2002-01-05 18:46:59 +00:00
Jeff Teunissen
33b6429aa7
Makefiles for docs.
2002-01-05 18:46:05 +00:00
Bill Currie
f591b27532
set the result of the block used for self.maxs = obj.origin; type expressions
2002-01-04 18:43:55 +00:00
Bill Currie
718a64343b
more old-code cleanup. move PR_LexString into make_string
2002-01-04 18:27:01 +00:00
Bill Currie
12d2338d1b
handle dos line endings a little better
2002-01-04 17:13:13 +00:00
Forest Hale
184ff4a216
made qfcc compile again, by renaming com_token to qfcc_com_token so it does not conflict with QFutil
2002-01-04 11:12:52 +00:00
Bill Currie
9d2739598a
character constants
2002-01-04 08:45:24 +00:00
Jeff Teunissen
2185e0a92e
Update qfcc man page.
2001-12-14 05:33:00 +00:00
Bill Currie
f392c395df
fix some uninitialized warnings my gcc missed, but misty's got
2001-12-13 16:40:46 +00:00
Bill Currie
d95bf0ada8
blah
2001-12-12 22:04:34 +00:00
Bill Currie
112f74a357
make integer constant division warnings optional
2001-12-12 22:00:42 +00:00
Bill Currie
195dd1032e
clean up some dead code
2001-12-12 21:52:07 +00:00
Bill Currie
2b458dd13d
clean up line/file management
2001-12-12 21:50:11 +00:00
Bill Currie
6d65fe853d
spontaneous temp defs need to have their users incremented when an
...
assignment is part of a sub expression
2001-12-12 21:29:04 +00:00
Bill Currie
7e38a8d9a0
clean up the return def selection for emit_assign_expr
2001-12-12 20:55:55 +00:00
Bill Currie
8ddce20949
pr_*: add storep.p so pointers can be stored into entities
...
emit.c: convert & (address) to . in unary .
rewrite emit_assign_expr
expr.c: remove debug code and make unary . less agressive on address calcs
also convert & (address) to . for lvals
2001-12-12 20:35:58 +00:00
Bill Currie
b56d7f3248
emit.c:
...
fix a missing else (should convert to switch)
expr.c:
fix address_expr for binary expressions
fix unary .
2001-12-12 18:34:41 +00:00
Bill Currie
f9149a0d6c
finally get around to renaming type_name to pr_type_name
2001-12-12 17:15:09 +00:00
Bill Currie
cc34e5954f
lots of work on better array/pointer/struct handline. doesn't quite work yet
2001-12-12 08:39:47 +00:00
Bill Currie
835468bcfb
beginnings of breaking out the type code
2001-12-11 19:58:12 +00:00
Bill Currie
e976211faf
header block fixes
2001-12-08 20:40:50 +00:00
Bill Currie
00b2a45ecd
change the operator for "address" from "." to "&" so load.p can be implement.
...
this makes it so pointers in entities work.
2001-12-08 20:17:20 +00:00
Bill Currie
a184199146
get arrays of structures working
2001-12-08 17:36:58 +00:00
Bill Currie
b03a1bee42
ok, structures seem to generate correct code now
2001-12-08 08:19:48 +00:00
Bill Currie
3293c5e85f
beginnings of structure code. committed because cvs diff doesn't work on
...
new files
2001-12-08 00:09:11 +00:00
Bill Currie
1767ad435f
use the new immediate indeces to make small array indeces not use a global
2001-12-07 20:10:30 +00:00
Bill Currie
0c2f36f9a3
some dead code cleanup
2001-12-06 20:05:49 +00:00
Bill Currie
3c2c4aa9e6
indent whitespace cleanup. not perfect, but a bit more consistent now
2001-12-06 19:49:40 +00:00
Bill Currie
61786182d2
whitespace
2001-12-06 18:14:44 +00:00
Bill Currie
12a0a10d33
more alpha portability fixes
2001-11-29 19:35:25 +00:00
Bill Currie
3f7c4f146e
allocate space for field arrays and report entity size
2001-11-15 05:31:15 +00:00
Bill Currie
e45bb62f23
ok, correct code seems to be getting generated for both array access and
...
entity field access
2001-11-15 04:32:50 +00:00
Bill Currie
40d47e91cb
win32 portability fixes
2001-11-15 03:54:35 +00:00
Bill Currie
7d9266a3f0
beginnings of array support. no array initialization yet and foo[i] = bar is
...
broken.
2001-11-15 00:46:36 +00:00
Bill Currie
8aa83d04f3
oops, that's not how that works :)
2001-11-15 00:25:15 +00:00
Bill Currie
cf37275def
add -g option (shortcut for --code=debug)
2001-11-14 23:17:20 +00:00
Bill Currie
ed331517b3
more grammar re-work preparing for arrays and structs
2001-11-14 22:31:57 +00:00
Bill Currie
a2bfff5dc4
simplify the type rule
2001-11-14 07:16:58 +00:00
Bill Currie
3fe67eecd2
expr.c:
...
it helps if one understands /why/ something is done. I think this
might be it for the reference count tweeks
switch.c:
o better control over whether case ranges are built
o /always/ append the temp = test expression and use temp instead of
test for the != check
o only ever build case ranges if the switch expression is integer
2001-11-14 06:45:31 +00:00
Bill Currie
dc80f51d89
fix a missed immediate type missmatch case
2001-11-14 05:08:37 +00:00
Bill Currie
da36feff7f
oops, failed to notice that relocs on temp defs weren't being done correctly
...
memset wasn't such a good idea :P
2001-11-13 23:21:23 +00:00
Bill Currie
cfa47717c6
expr.c:
...
once again, temp def ref counts seem to be correct
pr_def.c:
reset recycled temp defs
2001-11-13 23:17:32 +00:00
Bill Currie
ad5deea582
missed this in the cleanup
2001-11-13 23:14:59 +00:00
Bill Currie
3874d78697
slightly better code, but the temp isn't getting ref-counted correctly
2001-11-13 22:11:45 +00:00
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
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
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
cb4ce6a634
remove the default label from the switch label table while fetching it.
2001-11-06 20:39:42 +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
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
09f19fd9c9
remove some redundant data
2001-10-28 04:42:44 +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
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
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
c8e1e7942a
correct type error checking for vectors vs floats
2001-10-12 03:58:22 +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
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
7407e4f1b7
and some more
2001-09-28 07:09:38 +00:00
Jeff Teunissen
cd5f322cc1
Move along, nothing to see here... :)
2001-09-26 03:39:44 +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