00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef LIBCPP_CPPLIB_H
00025 #define LIBCPP_CPPLIB_H
00026
00027 #include <sys/types.h>
00028 #include "symtab.h"
00029 #include "line-map.h"
00030
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034
00035 typedef struct cpp_reader cpp_reader;
00036 typedef struct cpp_buffer cpp_buffer;
00037 typedef struct cpp_options cpp_options;
00038 typedef struct cpp_token cpp_token;
00039 typedef struct cpp_string cpp_string;
00040 typedef struct cpp_hashnode cpp_hashnode;
00041 typedef struct cpp_macro cpp_macro;
00042 typedef struct cpp_callbacks cpp_callbacks;
00043 typedef struct cpp_dir cpp_dir;
00044
00045 struct answer;
00046 struct _cpp_file;
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 #define TTYPE_TABLE \
00060 OP(EQ, "=") \
00061 OP(NOT, "!") \
00062 OP(GREATER, ">") \
00063 OP(LESS, "<") \
00064 OP(PLUS, "+") \
00065 OP(MINUS, "-") \
00066 OP(MULT, "*") \
00067 OP(DIV, "/") \
00068 OP(MOD, "%") \
00069 OP(AND, "&") \
00070 OP(OR, "|") \
00071 OP(XOR, "^") \
00072 OP(RSHIFT, ">>") \
00073 OP(LSHIFT, "<<") \
00074 \
00075 OP(COMPL, "~") \
00076 OP(AND_AND, "&&") \
00077 OP(OR_OR, "||") \
00078 OP(QUERY, "?") \
00079 OP(COLON, ":") \
00080 OP(COMMA, ",") \
00081 OP(OPEN_PAREN, "(") \
00082 OP(CLOSE_PAREN, ")") \
00083 TK(EOF, NONE) \
00084 OP(EQ_EQ, "==") \
00085 OP(NOT_EQ, "!=") \
00086 OP(GREATER_EQ, ">=") \
00087 OP(LESS_EQ, "<=") \
00088 \
00089 \
00090 OP(PLUS_EQ, "+=") \
00091 OP(MINUS_EQ, "-=") \
00092 \
00093 OP(MULT_EQ, "*=") \
00094 OP(DIV_EQ, "/=") \
00095 OP(MOD_EQ, "%=") \
00096 OP(AND_EQ, "&=") \
00097 OP(OR_EQ, "|=") \
00098 OP(XOR_EQ, "^=") \
00099 OP(RSHIFT_EQ, ">>=") \
00100 OP(LSHIFT_EQ, "<<=") \
00101 \
00102 OP(HASH, "#") \
00103 OP(PASTE, "##") \
00104 OP(OPEN_SQUARE, "[") \
00105 OP(CLOSE_SQUARE, "]") \
00106 OP(OPEN_BRACE, "{") \
00107 OP(CLOSE_BRACE, "}") \
00108 \
00109 OP(SEMICOLON, ";") \
00110 OP(ELLIPSIS, "...") \
00111 OP(PLUS_PLUS, "++") \
00112 OP(MINUS_MINUS, "--") \
00113 OP(DEREF, "->") \
00114 OP(DOT, ".") \
00115 OP(SCOPE, "::") \
00116 OP(DEREF_STAR, "->*") \
00117 OP(DOT_STAR, ".*") \
00118 OP(ATSIGN, "@") /* used in Objective-C */ \
\
TK(NAME, IDENT) /* word */ \
TK(AT_NAME, IDENT) /* @word - Objective-C */ \
TK(NUMBER, LITERAL) /* 34_be+ta */ \
\
TK(CHAR, LITERAL) /* 'char' */ \
TK(WCHAR, LITERAL) /* L'char' */ \
TK(OTHER, LITERAL) /* stray punctuation */ \
\
TK(STRING, LITERAL) /* "string" */ \
00119 TK(WSTRING, LITERAL) \
00120 TK(OBJC_STRING, LITERAL) \
00121 TK(HEADER_NAME, LITERAL) \
00122 \
00123 TK(COMMENT, LITERAL) \
00124 \
00125 TK(MACRO_ARG, NONE) \
00126 TK(PRAGMA, NONE) \
00127 TK(PRAGMA_EOL, NONE) \
00128 TK(PADDING, NONE)
00129
00130 #define OP(e, s) CPP_ ## e,
00131 #define TK(e, s) CPP_ ## e,
00132 enum cpp_ttype
00133 {
00134 TTYPE_TABLE
00135 N_TTYPES,
00136
00137
00138 CPP_LAST_EQ = CPP_LSHIFT,
00139 CPP_FIRST_DIGRAPH = CPP_HASH,
00140 CPP_LAST_PUNCTUATOR= CPP_ATSIGN,
00141 CPP_LAST_CPP_OP = CPP_LESS_EQ
00142 };
00143 #undef OP
00144 #undef TK
00145
00146
00147 enum c_lang {CLK_GNUC89 = 0, CLK_GNUC99, CLK_STDC89, CLK_STDC94, CLK_STDC99,
00148 CLK_GNUCXX, CLK_CXX98, CLK_ASM};
00149
00150
00151 struct cpp_string GTY(())
00152 {
00153 unsigned int len;
00154 const unsigned char *text;
00155 };
00156
00157
00158 #define PREV_WHITE (1 << 0)
00159 #define DIGRAPH (1 << 1)
00160 #define STRINGIFY_ARG (1 << 2)
00161 #define PASTE_LEFT (1 << 3)
00162 #define NAMED_OP (1 << 4)
00163 #define NO_EXPAND (1 << 5)
00164 #define BOL (1 << 6)
00165 #define PURE_ZERO (1 << 7)
00166
00167
00168
00169
00170 enum cpp_token_fld_kind {
00171 CPP_TOKEN_FLD_NODE,
00172 CPP_TOKEN_FLD_SOURCE,
00173 CPP_TOKEN_FLD_STR,
00174 CPP_TOKEN_FLD_ARG_NO,
00175 CPP_TOKEN_FLD_PRAGMA,
00176 CPP_TOKEN_FLD_NONE
00177 };
00178
00179
00180
00181 struct cpp_token GTY(())
00182 {
00183 source_location src_loc;
00184 ENUM_BITFIELD(cpp_ttype) type : CHAR_BIT;
00185 unsigned char flags;
00186
00187 union cpp_token_u
00188 {
00189
00190 cpp_hashnode *
00191 GTY ((nested_ptr (union tree_node,
00192 "%h ? CPP_HASHNODE (GCC_IDENT_TO_HT_IDENT (%h)) : NULL",
00193 "%h ? HT_IDENT_TO_GCC_IDENT (HT_NODE (%h)) : NULL"),
00194 tag ("CPP_TOKEN_FLD_NODE")))
00195 node;
00196
00197
00198 cpp_token * GTY ((tag ("CPP_TOKEN_FLD_SOURCE"))) source;
00199
00200
00201 struct cpp_string GTY ((tag ("CPP_TOKEN_FLD_STR"))) str;
00202
00203
00204 unsigned int GTY ((tag ("CPP_TOKEN_FLD_ARG_NO"))) arg_no;
00205
00206
00207 unsigned int GTY ((tag ("CPP_TOKEN_FLD_PRAGMA"))) pragma;
00208 } GTY ((desc ("cpp_token_val_index (&%1)"))) val;
00209 };
00210
00211
00212 extern enum cpp_token_fld_kind cpp_token_val_index (cpp_token *tok);
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222 #if CHAR_BIT * SIZEOF_INT >= 32
00223 # define CPPCHAR_SIGNED_T int
00224 #elif CHAR_BIT * SIZEOF_LONG >= 32
00225 # define CPPCHAR_SIGNED_T long
00226 #else
00227 # error "Cannot find a least-32-bit signed integer type"
00228 #endif
00229 typedef unsigned CPPCHAR_SIGNED_T cppchar_t;
00230 typedef CPPCHAR_SIGNED_T cppchar_signed_t;
00231
00232
00233 enum cpp_deps_style { DEPS_NONE = 0, DEPS_USER, DEPS_SYSTEM };
00234
00235
00236 enum cpp_normalize_level {
00237
00238 normalized_KC = 0,
00239
00240 normalized_C,
00241
00242
00243 normalized_identifier_C,
00244
00245 normalized_none
00246 };
00247
00248
00249
00250 struct cpp_options
00251 {
00252
00253 unsigned int tabstop;
00254
00255
00256 enum c_lang lang;
00257
00258
00259 unsigned char cplusplus;
00260
00261
00262 unsigned char cplusplus_comments;
00263
00264
00265
00266 unsigned char objc;
00267
00268
00269 unsigned char discard_comments;
00270
00271
00272
00273 unsigned char discard_comments_in_macro_exp;
00274
00275
00276 unsigned char trigraphs;
00277
00278
00279 unsigned char digraphs;
00280
00281
00282 unsigned char extended_numbers;
00283
00284
00285 unsigned char print_include_names;
00286
00287
00288 unsigned char pedantic_errors;
00289
00290
00291 unsigned char inhibit_warnings;
00292
00293
00294 unsigned char warn_deprecated;
00295
00296
00297 unsigned char warn_system_headers;
00298
00299
00300
00301 unsigned char inhibit_errors;
00302
00303
00304 unsigned char warn_comments;
00305
00306
00307
00308 unsigned char warn_missing_include_dirs;
00309
00310
00311 unsigned char warn_trigraphs;
00312
00313
00314 unsigned char warn_multichar;
00315
00316
00317
00318 unsigned char warn_traditional;
00319
00320
00321 unsigned char warn_long_long;
00322
00323
00324 unsigned char warn_endif_labels;
00325
00326
00327
00328 unsigned char warn_num_sign_change;
00329
00330
00331
00332 unsigned char warn_variadic_macros;
00333
00334
00335 unsigned char warnings_are_errors;
00336
00337
00338
00339 unsigned char remap;
00340
00341
00342 unsigned char dollars_in_ident;
00343
00344
00345 unsigned char extended_identifiers;
00346
00347
00348
00349 unsigned char warn_dollars;
00350
00351
00352 unsigned char warn_undef;
00353
00354
00355 unsigned char warn_unused_macros;
00356
00357
00358 unsigned char c99;
00359
00360
00361 unsigned char std;
00362
00363
00364 unsigned char pedantic;
00365
00366
00367
00368 unsigned char preprocessed;
00369
00370
00371 unsigned char show_column;
00372
00373
00374 unsigned char operator_names;
00375
00376
00377 unsigned char traditional;
00378
00379
00380 const char *narrow_charset;
00381
00382
00383 const char *wide_charset;
00384
00385
00386 const char *input_charset;
00387
00388
00389
00390 enum cpp_normalize_level warn_normalize;
00391
00392
00393 bool warn_invalid_pch;
00394
00395
00396 bool restore_pch_deps;
00397
00398
00399 struct
00400 {
00401
00402 enum cpp_deps_style style;
00403
00404
00405 bool missing_files;
00406
00407
00408
00409 bool phony_targets;
00410
00411
00412 bool ignore_main_file;
00413 } deps;
00414
00415
00416
00417
00418
00419 size_t precision, char_precision, int_precision, wchar_precision;
00420
00421
00422 bool unsigned_char, unsigned_wchar;
00423
00424
00425
00426 bool bytes_big_endian;
00427
00428
00429 unsigned char stdc_0_in_system_headers;
00430
00431
00432 bool client_diagnostic;
00433 };
00434
00435
00436
00437
00438
00439
00440
00441 typedef const char *(*missing_header_cb)(cpp_reader *, const char *header, cpp_dir **);
00442
00443
00444 struct cpp_callbacks
00445 {
00446
00447 void (*line_change) (cpp_reader *, const cpp_token *, int);
00448
00449
00450
00451
00452
00453 void (*file_change) (cpp_reader *, const struct line_map *);
00454
00455 void (*dir_change) (cpp_reader *, const char *);
00456 void (*include) (cpp_reader *, unsigned int, const unsigned char *,
00457 const char *, int, const cpp_token **);
00458 void (*define) (cpp_reader *, unsigned int, cpp_hashnode *);
00459 void (*undef) (cpp_reader *, unsigned int, cpp_hashnode *);
00460 void (*ident) (cpp_reader *, unsigned int, const cpp_string *);
00461 void (*def_pragma) (cpp_reader *, unsigned int);
00462 int (*valid_pch) (cpp_reader *, const char *, int);
00463 void (*read_pch) (cpp_reader *, const char *, int, const char *);
00464 missing_header_cb missing_header;
00465
00466
00467
00468 void (*error) (cpp_reader *, int, const char *, va_list *)
00469 ATTRIBUTE_FPTR_PRINTF(3,0);
00470 };
00471
00472
00473 struct cpp_dir
00474 {
00475
00476 struct cpp_dir *next;
00477
00478
00479 char *name;
00480 unsigned int len;
00481
00482
00483
00484 unsigned char sysp;
00485
00486
00487
00488 const char **name_map;
00489
00490
00491
00492
00493
00494 char *(*construct) (const char *header, cpp_dir *dir);
00495
00496
00497
00498 ino_t ino;
00499 dev_t dev;
00500
00501
00502 bool user_supplied_p;
00503 };
00504
00505
00506 extern const char *progname;
00507
00508
00509
00510
00511
00512
00513
00514
00515
00516
00517
00518
00519
00520 #define NODE_OPERATOR (1 << 0)
00521 #define NODE_POISONED (1 << 1)
00522 #define NODE_BUILTIN (1 << 2)
00523 #define NODE_DIAGNOSTIC (1 << 3)
00524 #define NODE_WARN (1 << 4)
00525 #define NODE_DISABLED (1 << 5)
00526 #define NODE_MACRO_ARG (1 << 6)
00527
00528
00529 enum node_type
00530 {
00531 NT_VOID = 0,
00532 NT_MACRO,
00533 NT_ASSERTION
00534 };
00535
00536
00537
00538 enum builtin_type
00539 {
00540 BT_SPECLINE = 0,
00541 BT_DATE,
00542 BT_FILE,
00543 BT_BASE_FILE,
00544 BT_INCLUDE_LEVEL,
00545 BT_TIME,
00546 BT_STDC,
00547 BT_PRAGMA,
00548 BT_TIMESTAMP
00549 };
00550
00551 #define CPP_HASHNODE(HNODE) ((cpp_hashnode *) (HNODE))
00552 #define HT_NODE(NODE) ((ht_identifier *) (NODE))
00553 #define NODE_LEN(NODE) HT_LEN (&(NODE)->ident)
00554 #define NODE_NAME(NODE) HT_STR (&(NODE)->ident)
00555
00556
00557
00558 enum {
00559 NTV_MACRO,
00560 NTV_ANSWER,
00561 NTV_BUILTIN,
00562 NTV_ARGUMENT,
00563 NTV_NONE
00564 };
00565
00566 #define CPP_HASHNODE_VALUE_IDX(HNODE) \
00567 ((HNODE.flags & NODE_MACRO_ARG) ? NTV_ARGUMENT \
00568 : HNODE.type == NT_MACRO ? ((HNODE.flags & NODE_BUILTIN) \
00569 ? NTV_BUILTIN : NTV_MACRO) \
00570 : HNODE.type == NT_ASSERTION ? NTV_ANSWER \
00571 : NTV_NONE)
00572
00573
00574
00575
00576
00577 union _cpp_hashnode_value GTY(())
00578 {
00579
00580 cpp_macro * GTY((tag ("NTV_MACRO"))) macro;
00581
00582 struct answer * GTY ((tag ("NTV_ANSWER"))) answers;
00583
00584 enum builtin_type GTY ((tag ("NTV_BUILTIN"))) builtin;
00585
00586 unsigned short GTY ((tag ("NTV_ARGUMENT"))) arg_index;
00587 };
00588
00589 struct cpp_hashnode GTY(())
00590 {
00591 struct ht_identifier ident;
00592 unsigned int is_directive : 1;
00593 unsigned int directive_index : 7;
00594
00595
00596 unsigned char rid_code;
00597 ENUM_BITFIELD(node_type) type : 8;
00598 unsigned char flags;
00599
00600 union _cpp_hashnode_value GTY ((desc ("CPP_HASHNODE_VALUE_IDX (%1)"))) value;
00601 };
00602
00603
00604
00605
00606
00607
00608
00609 extern cpp_reader *cpp_create_reader (enum c_lang, struct ht *,
00610 struct line_maps *);
00611
00612
00613
00614 extern void cpp_set_lang (cpp_reader *, enum c_lang);
00615
00616
00617 extern void cpp_set_include_chains (cpp_reader *, cpp_dir *, cpp_dir *, int);
00618
00619
00620
00621
00622
00623
00624 extern cpp_options *cpp_get_options (cpp_reader *);
00625 extern cpp_callbacks *cpp_get_callbacks (cpp_reader *);
00626 extern void cpp_set_callbacks (cpp_reader *, cpp_callbacks *);
00627 extern struct deps *cpp_get_deps (cpp_reader *);
00628
00629
00630
00631
00632
00633
00634 extern const char *cpp_read_main_file (cpp_reader *, const char *);
00635
00636
00637 extern void cpp_init_builtins (cpp_reader *, int);
00638
00639
00640
00641 extern void cpp_post_options (cpp_reader *);
00642
00643
00644 extern void cpp_init_iconv (cpp_reader *);
00645
00646
00647
00648
00649
00650
00651 extern int cpp_finish (cpp_reader *, FILE *deps_stream);
00652
00653
00654
00655
00656 extern void cpp_destroy (cpp_reader *);
00657
00658
00659 extern unsigned int cpp_errors (cpp_reader *);
00660
00661 extern unsigned int cpp_token_len (const cpp_token *);
00662 extern unsigned char *cpp_token_as_text (cpp_reader *, const cpp_token *);
00663 extern unsigned char *cpp_spell_token (cpp_reader *, const cpp_token *,
00664 unsigned char *, bool);
00665 extern void cpp_register_pragma (cpp_reader *, const char *, const char *,
00666 void (*) (cpp_reader *), bool);
00667 extern void cpp_register_deferred_pragma (cpp_reader *, const char *,
00668 const char *, unsigned, bool, bool);
00669 extern int cpp_avoid_paste (cpp_reader *, const cpp_token *,
00670 const cpp_token *);
00671 extern const cpp_token *cpp_get_token (cpp_reader *);
00672 extern const unsigned char *cpp_macro_definition (cpp_reader *,
00673 const cpp_hashnode *);
00674 extern void _cpp_backup_tokens (cpp_reader *, unsigned int);
00675
00676
00677 extern cppchar_t cpp_interpret_charconst (cpp_reader *, const cpp_token *,
00678 unsigned int *, int *);
00679
00680 extern bool cpp_interpret_string (cpp_reader *,
00681 const cpp_string *, size_t,
00682 cpp_string *, bool);
00683 extern bool cpp_interpret_string_notranslate (cpp_reader *,
00684 const cpp_string *, size_t,
00685 cpp_string *, bool);
00686
00687
00688 extern cppchar_t cpp_host_to_exec_charset (cpp_reader *, cppchar_t);
00689
00690
00691
00692 extern void cpp_define (cpp_reader *, const char *);
00693 extern void cpp_assert (cpp_reader *, const char *);
00694 extern void cpp_undef (cpp_reader *, const char *);
00695 extern void cpp_unassert (cpp_reader *, const char *);
00696
00697
00698 extern void cpp_undef_all (cpp_reader *);
00699
00700 extern cpp_buffer *cpp_push_buffer (cpp_reader *, const unsigned char *,
00701 size_t, int);
00702 extern int cpp_defined (cpp_reader *, const unsigned char *, int);
00703
00704
00705
00706 typedef unsigned HOST_WIDE_INT cpp_num_part;
00707 typedef struct cpp_num cpp_num;
00708 struct cpp_num
00709 {
00710 cpp_num_part high;
00711 cpp_num_part low;
00712 bool unsignedp;
00713 bool overflow;
00714 };
00715
00716
00717
00718
00719
00720
00721
00722
00723 #define CPP_N_CATEGORY 0x000F
00724 #define CPP_N_INVALID 0x0000
00725 #define CPP_N_INTEGER 0x0001
00726 #define CPP_N_FLOATING 0x0002
00727
00728 #define CPP_N_WIDTH 0x00F0
00729 #define CPP_N_SMALL 0x0010
00730 #define CPP_N_MEDIUM 0x0020
00731 #define CPP_N_LARGE 0x0040
00732
00733 #define CPP_N_RADIX 0x0F00
00734 #define CPP_N_DECIMAL 0x0100
00735 #define CPP_N_HEX 0x0200
00736 #define CPP_N_OCTAL 0x0400
00737
00738 #define CPP_N_UNSIGNED 0x1000
00739 #define CPP_N_IMAGINARY 0x2000
00740 #define CPP_N_DFLOAT 0x4000
00741
00742
00743
00744 extern unsigned cpp_classify_number (cpp_reader *, const cpp_token *);
00745
00746
00747 extern cpp_num cpp_interpret_integer (cpp_reader *, const cpp_token *,
00748 unsigned int type);
00749
00750
00751
00752 cpp_num cpp_num_sign_extend (cpp_num, size_t);
00753
00754
00755
00756
00757
00758
00759 #define CPP_DL_WARNING 0x00
00760
00761 #define CPP_DL_WARNING_SYSHDR 0x01
00762
00763 #define CPP_DL_PEDWARN 0x02
00764
00765 #define CPP_DL_ERROR 0x03
00766
00767
00768 #define CPP_DL_ICE 0x04
00769
00770 #define CPP_DL_EXTRACT(l) (l & 0xf)
00771
00772 #define CPP_DL_WARNING_P(l) (CPP_DL_EXTRACT (l) >= CPP_DL_WARNING \
00773 && CPP_DL_EXTRACT (l) <= CPP_DL_PEDWARN)
00774
00775
00776 extern void cpp_error (cpp_reader *, int, const char *msgid, ...)
00777 ATTRIBUTE_PRINTF_3;
00778
00779
00780
00781 extern void cpp_errno (cpp_reader *, int, const char *msgid);
00782
00783
00784
00785
00786 extern void cpp_error_with_line (cpp_reader *, int, source_location, unsigned,
00787 const char *msgid, ...) ATTRIBUTE_PRINTF_5;
00788
00789
00790 extern int cpp_ideq (const cpp_token *, const char *);
00791 extern void cpp_output_line (cpp_reader *, FILE *);
00792 extern void cpp_output_token (const cpp_token *, FILE *);
00793 extern const char *cpp_type2name (enum cpp_ttype);
00794
00795
00796
00797
00798
00799 extern cppchar_t cpp_parse_escape (cpp_reader *, const unsigned char ** pstr,
00800 const unsigned char *limit, int wide);
00801
00802
00803
00804
00805
00806 extern cpp_hashnode *cpp_lookup (cpp_reader *, const unsigned char *,
00807 unsigned int);
00808
00809 typedef int (*cpp_cb) (cpp_reader *, cpp_hashnode *, void *);
00810 extern void cpp_forall_identifiers (cpp_reader *, cpp_cb, void *);
00811
00812
00813 extern void cpp_scan_nooutput (cpp_reader *);
00814 extern int cpp_sys_macro_p (cpp_reader *);
00815 extern unsigned char *cpp_quote_string (unsigned char *, const unsigned char *,
00816 unsigned int);
00817
00818
00819 extern bool cpp_included (cpp_reader *, const char *);
00820 extern void cpp_make_system_header (cpp_reader *, int, int);
00821 extern bool cpp_push_include (cpp_reader *, const char *);
00822 extern void cpp_change_file (cpp_reader *, enum lc_reason, const char *);
00823 extern const char *cpp_get_path (struct _cpp_file *);
00824 extern cpp_dir *cpp_get_dir (struct _cpp_file *);
00825 extern cpp_buffer *cpp_get_buffer (cpp_reader *);
00826 extern struct _cpp_file *cpp_get_file (cpp_buffer *);
00827 extern cpp_buffer *cpp_get_prev (cpp_buffer *);
00828
00829
00830 struct save_macro_data;
00831 extern int cpp_save_state (cpp_reader *, FILE *);
00832 extern int cpp_write_pch_deps (cpp_reader *, FILE *);
00833 extern int cpp_write_pch_state (cpp_reader *, FILE *);
00834 extern int cpp_valid_state (cpp_reader *, const char *, int);
00835 extern void cpp_prepare_state (cpp_reader *, struct save_macro_data **);
00836 extern int cpp_read_state (cpp_reader *, const char *, FILE *,
00837 struct save_macro_data *);
00838
00839 #ifdef __cplusplus
00840 }
00841 #endif
00842
00843 #endif
00844