1 /* conf.h -- 2 3 This file is part of the lzop file compressor. 4 5 Copyright (C) 1996-2017 Markus Franz Xaver Johannes Oberhumer 6 All Rights Reserved. 7 8 lzop and the LZO library are free software; you can redistribute them 9 and/or modify them under the terms of the GNU General Public License as 10 published by the Free Software Foundation; either version 2 of 11 the License, or (at your option) any later version. 12 13 This program is distributed in the hope that it will be useful, 14 but WITHOUT ANY WARRANTY; without even the implied warranty of 15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 GNU General Public License for more details. 17 18 You should have received a copy of the GNU General Public License 19 along with this program; see the file COPYING. 20 If not, write to the Free Software Foundation, Inc., 21 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 22 23 Markus F.X.J. Oberhumer 24 <markus@oberhumer.com> 25 http://www.oberhumer.com/opensource/lzop/ 26 */ 27 28 29 #ifndef __LZOP_CONF_H 30 #define __LZOP_CONF_H 1 31 32 #if defined(_WIN32) 33 /* disable silly warnings about using "deprecated" POSIX functions like fopen() */ 34 #ifndef _CRT_NONSTDC_NO_DEPRECATE 35 #define _CRT_NONSTDC_NO_DEPRECATE 1 36 #endif 37 #ifndef _CRT_NONSTDC_NO_WARNINGS 38 #define _CRT_NONSTDC_NO_WARNINGS 1 39 #endif 40 #ifndef _CRT_SECURE_NO_DEPRECATE 41 #define _CRT_SECURE_NO_DEPRECATE 1 42 #endif 43 #ifndef _CRT_SECURE_NO_WARNINGS 44 #define _CRT_SECURE_NO_WARNINGS 1 45 #endif 46 #endif 47 48 #if defined(LZOP_HAVE_CONFIG_H) 49 # include <config.h> 50 #endif 51 #if !defined(PACKAGE) 52 # define PACKAGE "lzop" 53 #endif 54 55 #define WITH_LZO 1 56 #if defined(WITH_LZO) 57 #if defined(HAVE_LZO_LZOCONF_H) && defined(HAVE_LZO_LZO1X_H) 58 # include <lzo/lzoconf.h> 59 # include <lzo/lzo1x.h> 60 #elif defined(HAVE_LZOCONF_H) && defined(HAVE_LZO1X_H) 61 # include <lzoconf.h> 62 # include <lzo1x.h> 63 #elif !defined(LZOP_HAVE_CONFIG_H) 64 # include <lzo/lzoconf.h> 65 # include <lzo/lzo1x.h> 66 #else 67 # include <lzoconf.h> 68 # include <lzo1x.h> 69 #endif 70 #if !defined(LZO_VERSION) 71 # error "you need the LZO library" 72 #elif (LZO_VERSION < 0x2080) && 0 73 # error "please upgrade your LZO package to version 2.08 or newer" 74 #endif 75 #endif 76 77 78 /************************************************************************* 79 // 80 **************************************************************************/ 81 82 #if defined(LZOP_HAVE_CONFIG_H) 83 # define ACC_CONFIG_NO_HEADER 1 84 #endif 85 #define ACC_WANT_ACC_INCD_H 1 86 #define ACC_WANT_ACC_INCE_H 1 87 #define ACC_WANT_ACC_LIB_H 1 88 #include "miniacc.h" 89 #undef ACC_WANT_ACC_INCD_H 90 #undef ACC_WANT_ACC_INCE_H 91 #undef ACC_WANT_ACC_LIB_H 92 93 /* we _always_ compile lzop with assertions on */ 94 #undef NDEBUG 95 #include <assert.h> 96 97 #if defined(acc_int64l_t) 98 # define lzop_long_t acc_int64l_t 99 # define lzop_ulong_t acc_uint64l_t 100 #else 101 # define lzop_long_t long int 102 # define lzop_ulong_t unsigned long int 103 #endif 104 105 #if (ACC_CC_MSC && (_MSC_VER >= 1400)) 106 /* avoid warnings when using "deprecated" POSIX functions */ 107 # pragma warning(disable: 4996) 108 #endif 109 110 111 /************************************************************************* 112 // 113 **************************************************************************/ 114 115 #if defined(ACC_OS_EMX) 116 # define DOSISH 1 117 # define F_OS (_osmode == 0 ? F_OS_FAT : F_OS_OS2) 118 # define F_CS (_osmode == 0 ? F_CS_DOS : F_CS_NATIVE) 119 #elif (ACC_OS_DOS16 || ACC_OS_DOS32) 120 # define DOSISH 1 121 # define F_OS F_OS_FAT 122 # define F_CS F_CS_DOS 123 #elif (ACC_OS_OS216 || ACC_OS_OS2) 124 # define DOSISH 1 125 # define F_OS F_OS_OS2 126 #elif (ACC_OS_TOS) 127 # define DOSISH 1 128 # define F_OS F_OS_ATARI 129 #elif (ACC_OS_WIN16) 130 # define DOSISH 1 131 # define F_OS F_OS_FAT 132 # define F_CS F_CS_WIN16 133 #elif (ACC_OS_WIN32 || ACC_OS_WIN64 || ACC_OS_CYGWIN) 134 # define DOSISH 1 135 # define F_OS F_OS_VFAT 136 # define F_CS F_CS_WIN32 137 #endif 138 139 140 #if defined(DOSISH) 141 # define OPT_NAME_DEFAULT 1 142 # if !defined(DIR_SEP) 143 # define DIR_SEP "/\\" 144 # endif 145 # if !defined(fn_tolower) 146 # define fn_tolower(x) tolower(((unsigned char)(x))) 147 # endif 148 #endif 149 150 #if defined(__BORLANDC__) 151 # define SIGTYPEENTRY __cdecl 152 # define MODE_T unsigned short 153 #elif defined(__DMC__) 154 # define SIGTYPEENTRY __cdecl 155 #elif defined(_MSC_VER) 156 # define SIGTYPEENTRY __cdecl 157 # define MODE_T unsigned short 158 #elif defined(__WATCOMC__) 159 # define MODE_T unsigned short 160 #endif 161 162 163 /************************************************************************* 164 // 165 **************************************************************************/ 166 167 #ifndef F_OS 168 # define F_OS F_OS_UNIX 169 #endif 170 #ifndef F_CS 171 # define F_CS F_CS_NATIVE 172 #endif 173 174 #ifndef DIR_SEP 175 # define DIR_SEP "/" 176 #endif 177 178 #ifndef fn_tolower 179 # define fn_tolower(x) (x) 180 #endif 181 182 #ifndef OPTIONS_VAR 183 # define OPTIONS_VAR "LZOP" 184 #endif 185 186 187 /************************************************************************* 188 // 189 **************************************************************************/ 190 191 #if defined(__DJGPP__) 192 # define NO_SETMODE 1 193 # if ((__DJGPP__ * 100 + __DJGPP_MINOR__) < 203) 194 # error "need djgpp 2.03 or above" 195 # endif 196 # include <crt0.h> 197 # include <dpmi.h> 198 # include <sys/exceptn.h> 199 # undef kbhit /* want to be able to call kbhit from libc */ 200 #endif 201 202 #if defined(ACC_OS_TOS) 203 # if defined(__MINT__) 204 # elif (ACC_CC_PUREC || ACC_CC_TURBOC) 205 # include <ext.h> 206 # define O_EXCL_BROKEN 1 207 # if !defined(S_IFMT) 208 # if defined(S_IFREG) && defined(S_IFDIR) && defined(S_IFCHR) 209 # define S_IFMT (S_IFREG | S_IFDIR | S_IFCHR) 210 # endif 211 # endif 212 # else 213 # error "FIXME" 214 # endif 215 #endif 216 217 #define ADLER32_INIT_VALUE 1 218 #define CRC32_INIT_VALUE 0 219 220 221 /************************************************************************* 222 // 223 **************************************************************************/ 224 225 #if !defined(PATH_MAX) 226 # define PATH_MAX 512 227 #elif (PATH_MAX < 512) 228 # undef PATH_MAX 229 # define PATH_MAX 512 230 #endif 231 232 233 #ifndef RETSIGTYPE 234 # define RETSIGTYPE void 235 #endif 236 #ifndef SIGTYPEENTRY 237 # define SIGTYPEENTRY /*empty*/ 238 #endif 239 240 #if !defined(MODE_T) 241 #if defined(SIZEOF_MODE_T) && (SIZEOF_MODE_T > 0) 242 # define MODE_T mode_t 243 #else 244 # define MODE_T int 245 #endif 246 #endif 247 248 249 #if defined(NO_MEMCMP) 250 # undef HAVE_MEMCMP 251 #endif 252 #if !defined(HAVE_MEMCMP) 253 # undef memcmp 254 # define memcmp lzo_memcmp 255 #endif 256 #if !defined(HAVE_MEMCPY) 257 # undef memcpy 258 # define memcpy lzo_memcpy 259 #endif 260 #if !defined(HAVE_MEMSET) 261 # undef memset 262 # define memset lzo_memset 263 #endif 264 265 266 #if !defined(HAVE_STRCASECMP) && defined(HAVE_STRICMP) 267 # define strcasecmp stricmp 268 #endif 269 #if !defined(HAVE_STRNCASECMP) && defined(HAVE_STRNICMP) 270 # define strncasecmp strnicmp 271 #endif 272 273 274 #ifndef STDIN_FILENO 275 # define STDIN_FILENO (fileno(stdin)) 276 #endif 277 #ifndef STDOUT_FILENO 278 # define STDOUT_FILENO (fileno(stdout)) 279 #endif 280 #ifndef STDERR_FILENO 281 # define STDERR_FILENO (fileno(stderr)) 282 #endif 283 284 #if !defined(S_IFMT) && defined(_S_IFMT) 285 # define S_IFMT _S_IFMT 286 #endif 287 #if !defined(S_IFREG) && defined(_S_IFREG) 288 # define S_IFREG _S_IFREG 289 #endif 290 #if !defined(S_IFDIR) && defined(_S_IFDIR) 291 # define S_IFDIR _S_IFDIR 292 #endif 293 #if !defined(S_IFCHR) && defined(_S_IFCHR) 294 # define S_IFCHR _S_IFCHR 295 #endif 296 297 #if !defined(S_ISREG) 298 # if defined(S_IFMT) && defined(S_IFREG) 299 # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) 300 # else 301 # error "S_ISREG" 302 # endif 303 #endif 304 #if !defined(S_ISDIR) 305 # if defined(S_IFMT) && defined(S_IFDIR) 306 # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) 307 # else 308 # error "S_ISDIR" 309 # endif 310 #endif 311 #if !defined(S_ISCHR) 312 # if defined(S_IFMT) && defined(S_IFCHR) 313 # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) 314 # endif 315 #endif 316 317 318 /************************************************************************* 319 // 320 **************************************************************************/ 321 322 #ifndef SUFFIX_MAX 323 #define SUFFIX_MAX 32 324 #endif 325 326 #define STDIN_NAME "<stdin>" 327 #define STDOUT_NAME "<stdout>" 328 #define STDERR_NAME "<stderr>" 329 #define UNKNOWN_NAME "<unknown>" 330 331 332 #define ALIGN_DOWN(a,b) (((a) / (b)) * (b)) 333 #define ALIGN_UP(a,b) ALIGN_DOWN((a) + ((b) - 1), b) 334 335 #undef UNUSED 336 #define UNUSED(var) ACC_UNUSED(var) 337 338 339 /************************************************************************* 340 // 341 **************************************************************************/ 342 343 /* exit codes of this program: 0 ok, 1 error, 2 warning */ 344 #define EXIT_OK 0 345 #define EXIT_ERROR 1 346 #define EXIT_WARN 2 347 348 #define EXIT_USAGE 1 349 #define EXIT_FILE_READ 1 350 #define EXIT_FILE_WRITE 1 351 #define EXIT_MEMORY 1 352 #define EXIT_CHECKSUM 1 353 #define EXIT_LZO_ERROR 1 354 #define EXIT_LZO_INIT 1 355 #define EXIT_INTERNAL 1 356 357 358 /************************************************************************* 359 // options 360 **************************************************************************/ 361 362 enum { 363 CMD_NONE, 364 CMD_COMPRESS, 365 CMD_DECOMPRESS, CMD_TEST, CMD_LIST, CMD_LS, CMD_INFO, 366 CMD_SYSINFO, CMD_LICENSE, CMD_HELP, CMD_INTRO, CMD_VERSION 367 }; 368 369 370 enum { 371 M_LZO1X_1 = 1, 372 M_LZO1X_1_15 = 2, 373 M_LZO1X_999 = 3, 374 M_NRV1A = 0x1a, 375 M_NRV1B = 0x1b, 376 M_NRV2A = 0x2a, 377 M_NRV2B = 0x2b, 378 M_NRV2D = 0x2d, 379 M_ZLIB = 128, 380 381 M_UNUSED 382 }; 383 384 extern int opt_cmd; 385 extern int opt_method; 386 extern int opt_level; 387 388 extern int opt_checksum; 389 extern int opt_console; 390 extern int opt_crc32; 391 extern lzo_bool opt_decompress_safe; 392 extern int opt_force; 393 extern int opt_name; 394 #define MAX_NUM_THREADS 64 395 extern int opt_num_threads; 396 extern const char *opt_output_name; 397 extern lzo_bool opt_optimize; 398 extern lzo_bool opt_path; 399 extern lzo_bool opt_shortname; 400 extern int opt_stdin; 401 extern lzo_bool opt_stdout; 402 extern char opt_suffix[1+SUFFIX_MAX+1]; 403 extern lzo_bool opt_unlink; 404 extern int opt_verbose; 405 406 #define OPT_STDIN_GUESSED 1 407 #define OPT_STDIN_REQUESTED 2 408 409 410 /************************************************************************* 411 // input and output files 412 **************************************************************************/ 413 414 typedef struct 415 { 416 int fd; 417 #if defined(USE_FOPEN) 418 FILE *file; 419 #endif 420 int open_flags; 421 struct stat st; 422 #if defined(HAVE_LSTAT) 423 struct stat lst; 424 #endif 425 lzo_uint32 f_adler32; 426 lzo_uint32 f_crc32; 427 428 int opt_name; 429 unsigned long part; 430 lzop_ulong_t bytes_read; 431 lzop_ulong_t bytes_written; 432 lzo_bool warn_multipart; 433 lzo_bool warn_unknown_suffix; 434 435 lzop_ulong_t bytes_processed; 436 437 #define FILE_T_NAME_LEN ( 2*((PATH_MAX)+1) + SUFFIX_MAX + 1 ) 438 char name[ FILE_T_NAME_LEN ]; 439 } 440 file_t; 441 442 443 /************************************************************************* 444 // lzop file header 445 **************************************************************************/ 446 447 /* header flags */ 448 #define F_ADLER32_D 0x00000001L 449 #define F_ADLER32_C 0x00000002L 450 #define F_STDIN 0x00000004L 451 #define F_STDOUT 0x00000008L 452 #define F_NAME_DEFAULT 0x00000010L 453 #define F_DOSISH 0x00000020L 454 #define F_H_EXTRA_FIELD 0x00000040L 455 #define F_H_GMTDIFF 0x00000080L 456 #define F_CRC32_D 0x00000100L 457 #define F_CRC32_C 0x00000200L 458 #define F_MULTIPART 0x00000400L 459 #define F_H_FILTER 0x00000800L 460 #define F_H_CRC32 0x00001000L 461 #define F_H_PATH 0x00002000L 462 #define F_MASK 0x00003FFFL 463 464 /* operating system & file system that created the file [mostly unused] */ 465 #define F_OS_FAT 0x00000000L /* DOS, OS2, Win95 */ 466 #define F_OS_AMIGA 0x01000000L 467 #define F_OS_VMS 0x02000000L 468 #define F_OS_UNIX 0x03000000L 469 #define F_OS_VM_CMS 0x04000000L 470 #define F_OS_ATARI 0x05000000L 471 #define F_OS_OS2 0x06000000L /* OS2 */ 472 #define F_OS_MAC9 0x07000000L 473 #define F_OS_Z_SYSTEM 0x08000000L 474 #define F_OS_CPM 0x09000000L 475 #define F_OS_TOPS20 0x0a000000L 476 #define F_OS_NTFS 0x0b000000L /* Win NT/2000/XP */ 477 #define F_OS_QDOS 0x0c000000L 478 #define F_OS_ACORN 0x0d000000L 479 #define F_OS_VFAT 0x0e000000L /* Win32 */ 480 #define F_OS_MFS 0x0f000000L 481 #define F_OS_BEOS 0x10000000L 482 #define F_OS_TANDEM 0x11000000L 483 #define F_OS_SHIFT 24 484 #define F_OS_MASK 0xff000000L 485 486 /* character set for file name encoding [mostly unused] */ 487 #define F_CS_NATIVE 0x00000000L 488 #define F_CS_LATIN1 0x00100000L 489 #define F_CS_DOS 0x00200000L 490 #define F_CS_WIN32 0x00300000L 491 #define F_CS_WIN16 0x00400000L 492 #define F_CS_UTF8 0x00500000L /* filename is UTF-8 encoded */ 493 #define F_CS_SHIFT 20 494 #define F_CS_MASK 0x00f00000L 495 496 /* these bits must be zero */ 497 #define F_RESERVED ((F_MASK | F_OS_MASK | F_CS_MASK) ^ 0xffffffffL) 498 499 typedef struct 500 { 501 unsigned version; 502 unsigned lib_version; 503 unsigned version_needed_to_extract; 504 unsigned char method; 505 unsigned char level; 506 lzo_uint32 flags; 507 lzo_uint32 filter; 508 lzo_uint32 mode; 509 lzo_uint32 mtime_low; 510 lzo_uint32 mtime_high; 511 lzo_uint32 header_checksum; 512 513 lzo_uint32 extra_field_len; 514 lzo_uint32 extra_field_checksum; 515 516 /* info */ 517 const char *method_name; 518 519 char name[255+1]; 520 } 521 header_t; 522 523 524 /************************************************************************* 525 // lzop.c 526 **************************************************************************/ 527 528 void set_err_nl(lzo_bool x); 529 void warn(file_t *ft, const char *m); 530 void error(file_t *ft, const char *m); 531 void fatal(file_t *ft, const char *m); 532 void read_error(file_t *ft); 533 void write_error(file_t *ft); 534 void e_memory(void); 535 536 lzo_int read_buf(file_t *ft, lzo_voidp buffer, lzo_int cnt); 537 void write_buf(file_t *ft, const lzo_voidp buffer, lzo_int cnt); 538 void read32(file_t *ft, lzo_uint32 *v); 539 void write32(file_t *ft, lzo_uint32 v); 540 541 void init_compress_header(header_t *h, const file_t *fip, const file_t *fop); 542 void write_header(file_t *ft, const header_t *h); 543 544 void do_test(const header_t *h, lzop_ulong_t d_len, lzop_ulong_t c_len); 545 void do_test_total(void); 546 void do_info(const header_t *h, lzop_ulong_t d_len, lzop_ulong_t c_len); 547 void do_ls(const header_t *h, lzop_ulong_t d_len, lzop_ulong_t c_len); 548 void do_list(const header_t *h, lzop_ulong_t d_len, lzop_ulong_t c_len); 549 void do_list_total(void); 550 551 552 /************************************************************************* 553 // compress.c 554 **************************************************************************/ 555 556 lzo_bool x_enter(const header_t *h); 557 void x_leave(const header_t *h); 558 559 lzo_bool x_compress(file_t *fip, file_t *fop, header_t *h); 560 lzo_bool x_decompress(file_t *fip, file_t *fop, const header_t *h, lzo_bool skip); 561 562 int x_get_method(header_t *h); 563 int x_set_method(int m, int l); 564 565 void x_filter(lzo_bytep p, lzo_uint l, const header_t *h); 566 567 568 /************************************************************************* 569 // p_lzo.c 570 **************************************************************************/ 571 572 #if defined(WITH_LZO) 573 574 lzo_bool lzo_enter(const header_t *h); 575 void lzo_leave(const header_t *h); 576 577 lzo_bool lzo_compress(file_t *fip, file_t *fop, const header_t *h); 578 lzo_bool lzo_decompress(file_t *fip, file_t *fop, const header_t *h, lzo_bool skip); 579 580 int lzo_get_method(header_t *h); 581 int lzo_set_method(int m, int l); 582 void lzo_init_compress_header(header_t *h); 583 584 #endif 585 586 587 /************************************************************************* 588 // p_lzo_mt.c 589 **************************************************************************/ 590 591 #if defined(WITH_LZO) && defined(WITH_THREADS) 592 593 lzo_bool lzo_threaded_enter(const header_t *h); 594 void lzo_threaded_leave(const header_t *h); 595 596 lzo_bool lzo_threaded_compress(file_t *fip, file_t *fop, const header_t *h); 597 lzo_bool lzo_threaded_decompress(file_t *fip, file_t *fop, const header_t *h, lzo_bool skip); 598 599 #endif 600 601 602 /************************************************************************* 603 // filter.c 604 **************************************************************************/ 605 606 void t_sub1(lzo_bytep p, lzo_uint l); 607 void t_add1(lzo_bytep p, lzo_uint l); 608 609 void t_sub(lzo_bytep p, lzo_uint l, int n); 610 void t_add(lzo_bytep p, lzo_uint l, int n); 611 612 void t_mtf(lzo_bytep p, lzo_uint l); 613 void t_unmtf(lzo_bytep p, lzo_uint l); 614 615 616 /************************************************************************* 617 // mblock.c 618 **************************************************************************/ 619 620 typedef struct 621 { 622 /* public */ 623 lzo_bytep mb_mem; 624 lzo_uint32 mb_size; 625 /* private */ 626 lzo_bytep mb_mem_alloc; 627 lzo_uint32 mb_size_alloc; 628 lzo_uint32 mb_align; 629 } 630 mblock_t; 631 #define mblock_p mblock_t * 632 633 lzo_bool mb_alloc(mblock_p m, lzo_uint32 size, lzo_uint32 align); 634 void mb_free(mblock_p m); 635 636 637 /************************************************************************* 638 // util.c 639 **************************************************************************/ 640 641 enum { 642 SUFF_NONE, 643 SUFF_LZO, 644 SUFF_LZOP, 645 SUFF_NRV, 646 SUFF_TAR, 647 SUFF_TNV, 648 SUFF_TZO, 649 SUFF_USER 650 }; 651 652 unsigned fn_baseindex(const char *name); 653 const char *fn_basename(const char *name); 654 void fn_addslash(char *n, lzo_bool slash); 655 char *fn_strlwr(char *n); 656 int fn_strcmp(const char *n1, const char *n2); 657 lzo_bool fn_is_same_file(const char *n1, const char *n2); 658 int fn_has_suffix(const char *name); 659 int fn_cleanpath(const char *name, char *newname, size_t size, int flags); 660 661 time_t fix_time(time_t t); 662 time_t get_mtime(const header_t *h); 663 #if defined(HAVE_LOCALTIME) 664 void tm2str(char *s, size_t size, const struct tm *tmp); 665 #endif 666 void time2str(char *s, size_t size, const time_t *t); 667 void time2ls(char *s, size_t size, const time_t *t); 668 669 lzo_bool file_exists(const char *name); 670 671 lzo_uint32 fix_mode_for_header(lzo_uint32 mode); 672 MODE_T fix_mode_for_chmod(lzo_uint32 mode); 673 MODE_T fix_mode_for_ls(lzo_uint32 mode); 674 MODE_T fix_mode_for_open(MODE_T mode); 675 676 void mode_string(MODE_T mode, char *str); 677 char *maybe_rename_file(const char *original_name); 678 679 680 /************************************************************************* 681 // other globals 682 **************************************************************************/ 683 684 extern const char lzop_rcsid[]; 685 extern const char *progname; 686 extern MODE_T u_mask; 687 extern time_t current_time; 688 689 void sysinfo(void); 690 void license(void); 691 void head(void); 692 void help(void); 693 void usage(void); 694 void version(void); 695 696 void sysinfo_djgpp(void); 697 698 699 /************************************************************************* 700 // LZO section 701 **************************************************************************/ 702 703 #if defined(WITH_LZO) 704 705 #define USE_LZO1X_1 1 706 #if 1 707 # define USE_LZO1X_999 1 708 #endif 709 #if !defined(ACC_OS_DOS16) 710 # define USE_LZO1X_1_15 1 711 #endif 712 713 #endif /* WITH_LZO */ 714 715 716 /************************************************************************* 717 // 718 **************************************************************************/ 719 720 #include "console.h" 721 722 723 #endif /* already included */ 724 725 726 /* vim:set ts=4 sw=4 et: */ 727