0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20 /*.** Copyright
0010: 28 63 29 20 32 30 30 36 20 44 2e 20 52 69 63 68 (c) 2006 D. Rich
0020: 61 72 64 20 48 69 70 70 0a 2a 2a 0a 2a 2a 20 54 ard Hipp.**.** T
0030: 68 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 66 his program is f
0040: 72 65 65 20 73 6f 66 74 77 61 72 65 3b 20 79 6f ree software; yo
0050: 75 20 63 61 6e 20 72 65 64 69 73 74 72 69 62 75 u can redistribu
0060: 74 65 20 69 74 20 61 6e 64 2f 6f 72 0a 2a 2a 20 te it and/or.**
0070: 6d 6f 64 69 66 79 20 69 74 20 75 6e 64 65 72 20 modify it under
0080: 74 68 65 20 74 65 72 6d 73 20 6f 66 20 74 68 65 the terms of the
0090: 20 53 69 6d 70 6c 69 66 69 65 64 20 42 53 44 20 Simplified BSD
00a0: 4c 69 63 65 6e 73 65 20 28 61 6c 73 6f 0a 2a 2a License (also.**
00b0: 20 6b 6e 6f 77 6e 20 61 73 20 74 68 65 20 22 32 known as the "2
00c0: 2d 43 6c 61 75 73 65 20 4c 69 63 65 6e 73 65 22 -Clause License"
00d0: 20 6f 72 20 22 46 72 65 65 42 53 44 20 4c 69 63 or "FreeBSD Lic
00e0: 65 6e 73 65 22 2e 29 0a 0a 2a 2a 20 54 68 69 73 ense".)..** This
00f0: 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 73 74 program is dist
0100: 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 20 68 ributed in the h
0110: 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 6c 6c ope that it will
0120: 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a 20 62 be useful,.** b
0130: 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 20 77 ut without any w
0140: 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f 75 74 arranty; without
0150: 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c 69 65 even the implie
0160: 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a 2a 2a d warranty of.**
0170: 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 74 79 merchantability
0180: 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f 72 20 or fitness for
0190: 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 75 72 a particular pur
01a0: 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 74 68 pose..**.** Auth
01b0: 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 6f 72 or contact infor
01c0: 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 72 68 mation:.** drh
01d0: 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 20 20 @hwaci.com.**
01e0: 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 63 69 http://www.hwaci
01f0: 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a .com/drh/.**.***
0200: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0210: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0220: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0230: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a ****************
0240: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a ************.**.
0250: 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63 6f 6e ** This file con
0260: 74 61 69 6e 73 20 69 6d 70 6c 65 6d 65 6e 74 69 tains implementi
0270: 6f 6e 73 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 ons of routines
0280: 66 6f 72 20 66 6f 72 6d 61 74 74 69 6e 67 20 6f for formatting o
0290: 75 74 70 75 74 0a 2a 2a 20 28 65 78 3a 20 6d 70 utput.** (ex: mp
02a0: 72 69 6e 74 66 28 29 29 20 61 6e 64 20 66 6f 72 rintf()) and for
02b0: 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65 20 63 output to the c
02c0: 6f 6e 73 6f 6c 65 2e 0a 2a 2f 0a 23 69 6e 63 6c onsole..*/.#incl
02d0: 75 64 65 20 22 63 6f 6e 66 69 67 2e 68 22 0a 23 ude "config.h".#
02e0: 69 6e 63 6c 75 64 65 20 22 70 72 69 6e 74 66 2e include "printf.
02f0: 68 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f h".#if defined(_
0300: 57 49 4e 33 32 29 0a 23 20 20 20 69 6e 63 6c 75 WIN32).# inclu
0310: 64 65 20 3c 69 6f 2e 68 3e 0a 23 20 20 20 69 6e de <io.h>.# in
0320: 63 6c 75 64 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a clude <fcntl.h>.
0330: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 #endif.#include
0340: 3c 74 69 6d 65 2e 68 3e 0a 0a 2f 2a 20 54 77 6f <time.h>../* Two
0350: 20 63 75 73 74 6f 6d 20 63 6f 6e 76 65 72 73 69 custom conversi
0360: 6f 6e 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 ons are used to
0370: 73 68 6f 77 20 61 20 70 72 65 66 69 78 20 6f 66 show a prefix of
0380: 20 61 72 74 69 66 61 63 74 20 68 61 73 68 65 73 artifact hashes
0390: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 25 21 53 :.**.** %!S
03a0: 20 20 20 20 20 20 20 50 72 65 66 69 78 20 6f 66 Prefix of
03b0: 20 61 20 6c 65 6e 67 74 68 20 61 70 70 72 6f 70 a length approp
03c0: 72 69 61 74 65 20 66 6f 72 20 55 52 4c 73 0a 2a riate for URLs.*
03d0: 2a 20 20 20 20 20 20 25 53 20 20 20 20 20 20 20 * %S
03e0: 20 50 72 65 66 69 78 20 6f 66 20 61 20 6c 65 6e Prefix of a len
03f0: 67 74 68 20 61 70 70 72 6f 70 72 69 61 74 65 20 gth appropriate
0400: 66 6f 72 20 68 75 6d 61 6e 20 64 69 73 70 6c 61 for human displa
0410: 79 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c y.**.** The foll
0420: 6f 77 69 6e 67 20 6d 61 63 72 6f 73 20 68 65 6c owing macros hel
0430: 70 20 64 65 74 65 72 6d 69 6e 65 20 74 68 6f 73 p determine thos
0440: 65 20 6c 65 6e 67 74 68 73 2e 20 20 46 4f 53 53 e lengths. FOSS
0450: 49 4c 5f 48 41 53 48 5f 44 49 47 49 54 53 0a 2a IL_HASH_DIGITS.*
0460: 2a 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 * is the default
0470: 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 67 69 74 number of digit
0480: 73 20 74 6f 20 64 69 73 70 6c 61 79 20 74 6f 20 s to display to
0490: 68 75 6d 61 6e 73 2e 20 20 54 68 69 73 20 76 61 humans. This va
04a0: 6c 75 65 20 63 61 6e 0a 2a 2a 20 62 65 20 6f 76 lue can.** be ov
04b0: 65 72 72 69 64 64 65 6e 20 75 73 69 6e 67 20 74 erridden using t
04c0: 68 65 20 68 61 73 68 2d 64 69 67 69 74 73 20 73 he hash-digits s
04d0: 65 74 74 69 6e 67 2e 20 20 46 4f 53 53 49 4c 5f etting. FOSSIL_
04e0: 48 41 53 48 5f 44 49 47 49 54 53 5f 55 52 4c 0a HASH_DIGITS_URL.
04f0: 2a 2a 20 69 73 20 74 68 65 20 6d 69 6e 69 6d 75 ** is the minimu
0500: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 67 69 m number of digi
0510: 74 73 20 74 6f 20 62 65 20 75 73 65 64 20 69 6e ts to be used in
0520: 20 55 52 4c 73 2e 20 20 54 68 65 20 6e 75 6d 62 URLs. The numb
0530: 65 72 20 75 73 65 64 0a 2a 2a 20 77 69 6c 6c 20 er used.** will
0540: 61 6c 77 61 79 73 20 62 65 20 61 74 20 6c 65 61 always be at lea
0550: 73 74 20 36 20 6d 6f 72 65 20 74 68 61 6e 20 74 st 6 more than t
0560: 68 65 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 he number used f
0570: 6f 72 20 68 75 6d 61 6e 20 6f 75 74 70 75 74 2c or human output,
0580: 0a 2a 2a 20 6f 72 20 34 30 20 69 66 20 74 68 65 .** or 40 if the
0590: 20 6e 75 6d 62 65 72 20 6f 66 20 64 69 67 69 74 number of digit
05a0: 73 20 69 6e 20 68 75 6d 61 6e 20 6f 75 74 70 75 s in human outpu
05b0: 74 20 69 73 20 33 34 20 6f 72 20 6d 6f 72 65 2e t is 34 or more.
05c0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 46 4f 53 53 .*/.#ifndef FOSS
05d0: 49 4c 5f 48 41 53 48 5f 44 49 47 49 54 53 0a 23 IL_HASH_DIGITS.#
05e0: 20 64 65 66 69 6e 65 20 46 4f 53 53 49 4c 5f 48 define FOSSIL_H
05f0: 41 53 48 5f 44 49 47 49 54 53 20 31 30 20 20 20 ASH_DIGITS 10
0600: 20 20 20 20 2f 2a 20 46 6f 72 20 25 53 20 28 68 /* For %S (h
0610: 75 6d 61 6e 20 64 69 73 70 6c 61 79 29 20 2a 2f uman display) */
0620: 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66 20 .#endif.#ifndef
0630: 46 4f 53 53 49 4c 5f 48 41 53 48 5f 44 49 47 49 FOSSIL_HASH_DIGI
0640: 54 53 5f 55 52 4c 0a 23 20 64 65 66 69 6e 65 20 TS_URL.# define
0650: 46 4f 53 53 49 4c 5f 48 41 53 48 5f 44 49 47 49 FOSSIL_HASH_DIGI
0660: 54 53 5f 55 52 4c 20 31 36 20 20 20 2f 2a 20 46 TS_URL 16 /* F
0670: 6f 72 20 25 21 53 20 28 65 6d 62 65 64 64 65 64 or %!S (embedded
0680: 20 69 6e 20 55 52 4c 73 29 20 2a 2f 0a 23 65 6e in URLs) */.#en
0690: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 dif../*.** Retur
06a0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 n the number of
06b0: 61 72 74 69 66 61 63 74 20 68 61 73 68 20 64 69 artifact hash di
06c0: 67 69 74 73 20 74 6f 20 64 69 73 70 6c 61 79 2e gits to display.
06d0: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 69 73 20 The number is
06e0: 66 6f 72 0a 2a 2a 20 68 75 6d 61 6e 20 6f 75 74 for.** human out
06f0: 70 75 74 20 69 66 20 74 68 65 20 62 46 6f 72 55 put if the bForU
0700: 72 6c 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20 rl is false and
0710: 69 73 20 64 65 73 74 69 6e 65 64 20 66 6f 72 20 is destined for
0720: 61 20 55 52 4c 20 69 66 0a 2a 2a 20 62 46 6f 72 a URL if.** bFor
0730: 55 72 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f Url is false..*/
0740: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 68 .static int hash
0750: 44 69 67 69 74 73 28 69 6e 74 20 62 46 6f 72 55 Digits(int bForU
0760: 72 6c 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e rl){. static in
0770: 74 20 6e 44 69 67 69 74 48 75 6d 61 6e 20 3d 20 t nDigitHuman =
0780: 30 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 0;. static int
0790: 6e 44 69 67 69 74 55 72 6c 20 3d 20 30 3b 0a 20 nDigitUrl = 0;.
07a0: 20 69 66 28 20 6e 44 69 67 69 74 48 75 6d 61 6e if( nDigitHuman
07b0: 3d 3d 30 20 29 7b 0a 20 20 20 20 6e 44 69 67 69 ==0 ){. nDigi
07c0: 74 48 75 6d 61 6e 20 3d 20 64 62 5f 67 65 74 5f tHuman = db_get_
07d0: 69 6e 74 28 22 68 61 73 68 2d 64 69 67 69 74 73 int("hash-digits
07e0: 22 2c 20 46 4f 53 53 49 4c 5f 48 41 53 48 5f 44 ", FOSSIL_HASH_D
07f0: 49 47 49 54 53 29 3b 0a 20 20 20 20 69 66 28 20 IGITS);. if(
0800: 6e 44 69 67 69 74 48 75 6d 61 6e 20 3c 20 36 20 nDigitHuman < 6
0810: 29 20 6e 44 69 67 69 74 48 75 6d 61 6e 20 3d 20 ) nDigitHuman =
0820: 36 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 67 69 6;. if( nDigi
0830: 74 48 75 6d 61 6e 20 3e 20 34 30 20 29 20 6e 44 tHuman > 40 ) nD
0840: 69 67 69 74 48 75 6d 61 6e 20 3d 20 34 30 3b 0a igitHuman = 40;.
0850: 20 20 20 20 6e 44 69 67 69 74 55 72 6c 20 3d 20 nDigitUrl =
0860: 6e 44 69 67 69 74 48 75 6d 61 6e 20 2b 20 36 3b nDigitHuman + 6;
0870: 0a 20 20 20 20 69 66 28 20 6e 44 69 67 69 74 55 . if( nDigitU
0880: 72 6c 20 3c 20 46 4f 53 53 49 4c 5f 48 41 53 48 rl < FOSSIL_HASH
0890: 5f 44 49 47 49 54 53 5f 55 52 4c 20 29 20 6e 44 _DIGITS_URL ) nD
08a0: 69 67 69 74 55 72 6c 20 3d 20 46 4f 53 53 49 4c igitUrl = FOSSIL
08b0: 5f 48 41 53 48 5f 44 49 47 49 54 53 5f 55 52 4c _HASH_DIGITS_URL
08c0: 3b 0a 20 20 20 20 69 66 28 20 6e 44 69 67 69 74 ;. if( nDigit
08d0: 55 72 6c 20 3e 20 34 30 20 29 20 6e 44 69 67 69 Url > 40 ) nDigi
08e0: 74 55 72 6c 20 3d 20 34 30 3b 0a 20 20 7d 0a 20 tUrl = 40;. }.
08f0: 20 72 65 74 75 72 6e 20 62 46 6f 72 55 72 6c 20 return bForUrl
0900: 3f 20 6e 44 69 67 69 74 55 72 6c 20 3a 20 6e 44 ? nDigitUrl : nD
0910: 69 67 69 74 48 75 6d 61 6e 3b 0a 7d 0a 0a 2f 2a igitHuman;.}../*
0920: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e .** Return the n
0930: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 umber of charact
0940: 65 72 73 20 69 6e 20 61 20 25 53 20 6f 75 74 70 ers in a %S outp
0950: 75 74 2e 0a 2a 2f 0a 69 6e 74 20 6c 65 6e 67 74 ut..*/.int lengt
0960: 68 5f 6f 66 5f 53 5f 64 69 73 70 6c 61 79 28 76 h_of_S_display(v
0970: 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20 68 oid){. return h
0980: 61 73 68 44 69 67 69 74 73 28 30 29 3b 0a 7d 0a ashDigits(0);.}.
0990: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 73 69 6f ./*.** Conversio
09a0: 6e 20 74 79 70 65 73 20 66 61 6c 6c 20 69 6e 74 n types fall int
09b0: 6f 20 76 61 72 69 6f 75 73 20 63 61 74 65 67 6f o various catego
09c0: 72 69 65 73 20 61 73 20 64 65 66 69 6e 65 64 20 ries as defined
09d0: 62 79 20 74 68 65 0a 2a 2a 20 66 6f 6c 6c 6f 77 by the.** follow
09e0: 69 6e 67 20 65 6e 75 6d 65 72 61 74 69 6f 6e 2e ing enumeration.
09f0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 52 41 .*/.#define etRA
0a00: 44 49 58 20 20 20 20 20 20 20 31 20 2f 2a 20 49 DIX 1 /* I
0a10: 6e 74 65 67 65 72 20 74 79 70 65 73 2e 20 20 25 nteger types. %
0a20: 64 2c 20 25 78 2c 20 25 6f 2c 20 61 6e 64 20 73 d, %x, %o, and s
0a30: 6f 20 66 6f 72 74 68 20 2a 2f 0a 23 64 65 66 69 o forth */.#defi
0a40: 6e 65 20 65 74 46 4c 4f 41 54 20 20 20 20 20 20 ne etFLOAT
0a50: 20 32 20 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 70 2 /* Floating p
0a60: 6f 69 6e 74 2e 20 20 25 66 20 2a 2f 0a 23 64 65 oint. %f */.#de
0a70: 66 69 6e 65 20 65 74 45 58 50 20 20 20 20 20 20 fine etEXP
0a80: 20 20 20 33 20 2f 2a 20 45 78 70 6f 6e 65 6e 74 3 /* Exponent
0a90: 69 61 6c 20 6e 6f 74 61 74 69 6f 6e 2e 20 25 65 ial notation. %e
0aa0: 20 61 6e 64 20 25 45 20 2a 2f 0a 23 64 65 66 69 and %E */.#defi
0ab0: 6e 65 20 65 74 47 45 4e 45 52 49 43 20 20 20 20 ne etGENERIC
0ac0: 20 34 20 2f 2a 20 46 6c 6f 61 74 69 6e 67 20 6f 4 /* Floating o
0ad0: 72 20 65 78 70 6f 6e 65 6e 74 69 61 6c 2c 20 64 r exponential, d
0ae0: 65 70 65 6e 64 69 6e 67 20 6f 6e 20 65 78 70 6f epending on expo
0af0: 6e 65 6e 74 2e 20 25 67 20 2a 2f 0a 23 64 65 66 nent. %g */.#def
0b00: 69 6e 65 20 65 74 53 49 5a 45 20 20 20 20 20 20 ine etSIZE
0b10: 20 20 35 20 2f 2a 20 52 65 74 75 72 6e 20 6e 75 5 /* Return nu
0b20: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 mber of characte
0b30: 72 73 20 70 72 6f 63 65 73 73 65 64 20 73 6f 20 rs processed so
0b40: 66 61 72 2e 20 25 6e 20 2a 2f 0a 23 64 65 66 69 far. %n */.#defi
0b50: 6e 65 20 65 74 53 54 52 49 4e 47 20 20 20 20 20 ne etSTRING
0b60: 20 36 20 2f 2a 20 53 74 72 69 6e 67 73 2e 20 25 6 /* Strings. %
0b70: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 44 s */.#define etD
0b80: 59 4e 53 54 52 49 4e 47 20 20 20 37 20 2f 2a 20 YNSTRING 7 /*
0b90: 44 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c 6f Dynamically allo
0ba0: 63 61 74 65 64 20 73 74 72 69 6e 67 73 2e 20 25 cated strings. %
0bb0: 7a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 50 z */.#define etP
0bc0: 45 52 43 45 4e 54 20 20 20 20 20 38 20 2f 2a 20 ERCENT 8 /*
0bd0: 50 65 72 63 65 6e 74 20 73 79 6d 62 6f 6c 2e 20 Percent symbol.
0be0: 25 25 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 %% */.#define et
0bf0: 43 48 41 52 58 20 20 20 20 20 20 20 39 20 2f 2a CHARX 9 /*
0c00: 20 43 68 61 72 61 63 74 65 72 73 2e 20 25 63 20 Characters. %c
0c10: 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 45 52 52 */.#define etERR
0c20: 4f 52 20 20 20 20 20 20 31 30 20 2f 2a 20 55 73 OR 10 /* Us
0c30: 65 64 20 74 6f 20 69 6e 64 69 63 61 74 65 20 6e ed to indicate n
0c40: 6f 20 73 75 63 68 20 63 6f 6e 76 65 72 73 69 6f o such conversio
0c50: 6e 20 74 79 70 65 20 2a 2f 0a 2f 2a 20 54 68 65 n type */./* The
0c60: 20 72 65 73 74 20 61 72 65 20 65 78 74 65 6e 73 rest are extens
0c70: 69 6f 6e 73 2c 20 6e 6f 74 20 6e 6f 72 6d 61 6c ions, not normal
0c80: 6c 79 20 66 6f 75 6e 64 20 69 6e 20 70 72 69 6e ly found in prin
0c90: 74 66 28 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 tf() */.#define
0ca0: 65 74 42 4c 4f 42 20 20 20 20 20 20 20 31 31 20 etBLOB 11
0cb0: 2f 2a 20 42 6c 6f 62 20 6f 62 6a 65 63 74 73 2e /* Blob objects.
0cc0: 20 20 25 62 20 2a 2f 0a 23 64 65 66 69 6e 65 20 %b */.#define
0cd0: 65 74 42 4c 4f 42 53 51 4c 20 20 20 20 31 32 20 etBLOBSQL 12
0ce0: 2f 2a 20 42 6c 6f 62 20 6f 62 6a 65 63 74 73 20 /* Blob objects
0cf0: 71 75 6f 74 65 64 20 66 6f 72 20 53 51 4c 2e 20 quoted for SQL.
0d00: 20 25 42 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 %B */.#define e
0d10: 74 53 51 4c 45 53 43 41 50 45 20 20 31 33 20 2f tSQLESCAPE 13 /
0d20: 2a 20 53 74 72 69 6e 67 73 20 77 69 74 68 20 27 * Strings with '
0d30: 5c 27 27 20 64 6f 75 62 6c 65 64 2e 20 20 25 71 \'' doubled. %q
0d40: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 53 51 */.#define etSQ
0d50: 4c 45 53 43 41 50 45 32 20 31 34 20 2f 2a 20 53 LESCAPE2 14 /* S
0d60: 74 72 69 6e 67 73 20 77 69 74 68 20 27 5c 27 27 trings with '\''
0d70: 20 64 6f 75 62 6c 65 64 20 61 6e 64 20 65 6e 63 doubled and enc
0d80: 6c 6f 73 65 64 20 69 6e 20 27 27 2c 0a 20 20 20 losed in '',.
0d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0da0: 20 20 20 20 20 20 20 4e 55 4c 4c 20 70 6f 69 6e NULL poin
0db0: 74 65 72 73 20 72 65 70 6c 61 63 65 64 20 62 79 ters replaced by
0dc0: 20 53 51 4c 20 4e 55 4c 4c 2e 20 20 25 51 20 2a SQL NULL. %Q *
0dd0: 2f 0a 23 64 65 66 69 6e 65 20 65 74 53 51 4c 45 /.#define etSQLE
0de0: 53 43 41 50 45 33 20 31 35 20 2f 2a 20 44 6f 75 SCAPE3 15 /* Dou
0df0: 62 6c 65 20 27 22 27 20 63 68 61 72 61 63 74 65 ble '"' characte
0e00: 72 73 20 77 69 74 68 69 6e 20 61 6e 20 69 6e 64 rs within an ind
0e10: 65 6e 74 69 66 69 65 72 2e 20 20 25 77 20 2a 2f entifier. %w */
0e20: 0a 23 64 65 66 69 6e 65 20 65 74 50 4f 49 4e 54 .#define etPOINT
0e30: 45 52 20 20 20 20 31 36 20 2f 2a 20 54 68 65 20 ER 16 /* The
0e40: 25 70 20 63 6f 6e 76 65 72 73 69 6f 6e 20 2a 2f %p conversion */
0e50: 0a 23 64 65 66 69 6e 65 20 65 74 48 54 4d 4c 49 .#define etHTMLI
0e60: 5a 45 20 20 20 20 31 37 20 2f 2a 20 4d 61 6b 65 ZE 17 /* Make
0e70: 20 74 65 78 74 20 73 61 66 65 20 66 6f 72 20 48 text safe for H
0e80: 54 4d 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 65 TML */.#define e
0e90: 74 48 54 54 50 49 5a 45 20 20 20 20 31 38 20 2f tHTTPIZE 18 /
0ea0: 2a 20 4d 61 6b 65 20 74 65 78 74 20 73 61 66 65 * Make text safe
0eb0: 20 66 6f 72 20 48 54 54 50 2e 20 20 22 2f 22 20 for HTTP. "/"
0ec0: 65 6e 63 6f 64 65 64 20 61 73 20 25 32 66 20 2a encoded as %2f *
0ed0: 2f 0a 23 64 65 66 69 6e 65 20 65 74 55 52 4c 49 /.#define etURLI
0ee0: 5a 45 20 20 20 20 20 31 39 20 2f 2a 20 4d 61 6b ZE 19 /* Mak
0ef0: 65 20 74 65 78 74 20 73 61 66 65 20 66 6f 72 20 e text safe for
0f00: 48 54 54 50 2e 20 20 22 2f 22 20 6e 6f 74 20 65 HTTP. "/" not e
0f10: 6e 63 6f 64 65 64 20 2a 2f 0a 23 64 65 66 69 6e ncoded */.#defin
0f20: 65 20 65 74 46 4f 53 53 49 4c 49 5a 45 20 20 32 e etFOSSILIZE 2
0f30: 30 20 2f 2a 20 54 68 65 20 66 6f 73 73 69 6c 20 0 /* The fossil
0f40: 68 65 61 64 65 72 20 65 6e 63 6f 64 69 6e 67 20 header encoding
0f50: 66 6f 72 6d 61 74 2e 20 2a 2f 0a 23 64 65 66 69 format. */.#defi
0f60: 6e 65 20 65 74 50 41 54 48 20 20 20 20 20 20 20 ne etPATH
0f70: 32 31 20 2f 2a 20 50 61 74 68 20 74 79 70 65 20 21 /* Path type
0f80: 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 57 49 4b */.#define etWIK
0f90: 49 53 54 52 20 20 20 20 32 32 20 2f 2a 20 54 69 ISTR 22 /* Ti
0fa0: 6d 65 6c 69 6e 65 20 63 6f 6d 6d 65 6e 74 20 74 meline comment t
0fb0: 65 78 74 20 72 65 6e 64 65 72 65 64 20 66 72 6f ext rendered fro
0fc0: 6d 20 61 20 63 68 61 72 2a 3a 20 25 57 20 2a 2f m a char*: %W */
0fd0: 0a 23 64 65 66 69 6e 65 20 65 74 53 54 52 49 4e .#define etSTRIN
0fe0: 47 49 44 20 20 20 32 33 20 2f 2a 20 53 74 72 69 GID 23 /* Stri
0ff0: 6e 67 20 77 69 74 68 20 6c 65 6e 67 74 68 20 6c ng with length l
1000: 69 6d 69 74 20 66 6f 72 20 61 20 55 55 49 44 20 imit for a UUID
1010: 70 72 65 66 69 78 3a 20 25 53 20 2a 2f 0a 23 64 prefix: %S */.#d
1020: 65 66 69 6e 65 20 65 74 52 4f 4f 54 20 20 20 20 efine etROOT
1030: 20 20 20 32 34 20 2f 2a 20 53 74 72 69 6e 67 20 24 /* String
1040: 76 61 6c 75 65 20 6f 66 20 67 2e 7a 54 6f 70 3a value of g.zTop:
1050: 20 25 52 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 41 %R */.../*.** A
1060: 6e 20 22 65 74 42 79 74 65 22 20 69 73 20 61 6e n "etByte" is an
1070: 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64 20 8-bit unsigned
1080: 76 61 6c 75 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 value..*/.typede
1090: 66 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 f unsigned char
10a0: 65 74 42 79 74 65 3b 0a 0a 2f 2a 0a 2a 2a 20 45 etByte;../*.** E
10b0: 61 63 68 20 62 75 69 6c 74 69 6e 20 63 6f 6e 76 ach builtin conv
10c0: 65 72 73 69 6f 6e 20 63 68 61 72 61 63 74 65 72 ersion character
10d0: 20 28 65 78 3a 20 74 68 65 20 27 64 27 20 69 6e (ex: the 'd' in
10e0: 20 22 25 64 22 29 20 69 73 20 64 65 73 63 72 69 "%d") is descri
10f0: 62 65 64 0a 2a 2a 20 62 79 20 61 6e 20 69 6e 73 bed.** by an ins
1100: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c tance of the fol
1110: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 lowing structure
1120: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 .*/.typedef stru
1130: 63 74 20 65 74 5f 69 6e 66 6f 20 7b 20 20 20 2f ct et_info { /
1140: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 * Information ab
1150: 6f 75 74 20 65 61 63 68 20 66 6f 72 6d 61 74 20 out each format
1160: 66 69 65 6c 64 20 2a 2f 0a 20 20 63 68 61 72 20 field */. char
1170: 66 6d 74 74 79 70 65 3b 20 20 20 20 20 20 20 20 fmttype;
1180: 20 20 20 20 2f 2a 20 54 68 65 20 66 6f 72 6d 61 /* The forma
1190: 74 20 66 69 65 6c 64 20 63 6f 64 65 20 6c 65 74 t field code let
11a0: 74 65 72 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 ter */. etByte
11b0: 62 61 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 base;
11c0: 20 20 2f 2a 20 54 68 65 20 62 61 73 65 20 66 6f /* The base fo
11d0: 72 20 72 61 64 69 78 20 63 6f 6e 76 65 72 73 69 r radix conversi
11e0: 6f 6e 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 on */. etByte f
11f0: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 lags;
1200: 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 /* One or more
1210: 6f 66 20 46 4c 41 47 5f 20 63 6f 6e 73 74 61 6e of FLAG_ constan
1220: 74 73 20 62 65 6c 6f 77 20 2a 2f 0a 20 20 65 74 ts below */. et
1230: 42 79 74 65 20 74 79 70 65 3b 20 20 20 20 20 20 Byte type;
1240: 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 /* Conver
1250: 73 69 6f 6e 20 70 61 72 61 64 69 67 6d 20 2a 2f sion paradigm */
1260: 0a 20 20 65 74 42 79 74 65 20 63 68 61 72 73 65 . etByte charse
1270: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f t; /* O
1280: 66 66 73 65 74 20 69 6e 74 6f 20 61 44 69 67 69 ffset into aDigi
1290: 74 73 5b 5d 20 6f 66 20 74 68 65 20 64 69 67 69 ts[] of the digi
12a0: 74 73 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 65 ts string */. e
12b0: 74 42 79 74 65 20 70 72 65 66 69 78 3b 20 20 20 tByte prefix;
12c0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 /* Offse
12d0: 74 20 69 6e 74 6f 20 61 50 72 65 66 69 78 5b 5d t into aPrefix[]
12e0: 20 6f 66 20 74 68 65 20 70 72 65 66 69 78 20 73 of the prefix s
12f0: 74 72 69 6e 67 20 2a 2f 0a 7d 20 65 74 5f 69 6e tring */.} et_in
1300: 66 6f 3b 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 77 fo;../*.** Allow
1310: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 65 74 ed values for et
1320: 5f 69 6e 66 6f 2e 66 6c 61 67 73 0a 2a 2f 0a 23 _info.flags.*/.#
1330: 64 65 66 69 6e 65 20 46 4c 41 47 5f 53 49 47 4e define FLAG_SIGN
1340: 45 44 20 20 31 20 20 20 20 20 2f 2a 20 54 72 75 ED 1 /* Tru
1350: 65 20 69 66 20 74 68 65 20 76 61 6c 75 65 20 74 e if the value t
1360: 6f 20 63 6f 6e 76 65 72 74 20 69 73 20 73 69 67 o convert is sig
1370: 6e 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 ned */.#define F
1380: 4c 41 47 5f 49 4e 54 45 52 4e 20 20 32 20 20 20 LAG_INTERN 2
1390: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 66 6f 72 /* True if for
13a0: 20 69 6e 74 65 72 6e 61 6c 20 75 73 65 20 6f 6e internal use on
13b0: 6c 79 20 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4c ly */.#define FL
13c0: 41 47 5f 53 54 52 49 4e 47 20 20 34 20 20 20 20 AG_STRING 4
13d0: 20 2f 2a 20 41 6c 6c 6f 77 20 69 6e 66 69 6e 69 /* Allow infini
13e0: 74 79 20 70 72 65 63 69 73 69 6f 6e 20 2a 2f 0a ty precision */.
13f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c ../*.** The foll
1400: 6f 77 69 6e 67 20 74 61 62 6c 65 20 69 73 20 73 owing table is s
1410: 65 61 72 63 68 65 64 20 6c 69 6e 65 61 72 6c 79 earched linearly
1420: 2c 20 73 6f 20 69 74 20 69 73 20 67 6f 6f 64 20 , so it is good
1430: 74 6f 20 70 75 74 20 74 68 65 0a 2a 2a 20 6d 6f to put the.** mo
1440: 73 74 20 66 72 65 71 75 65 6e 74 6c 79 20 75 73 st frequently us
1450: 65 64 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 ed conversion ty
1460: 70 65 73 20 66 69 72 73 74 2e 0a 2a 2f 0a 73 74 pes first..*/.st
1470: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 atic const char
1480: 61 44 69 67 69 74 73 5b 5d 20 3d 20 22 30 31 32 aDigits[] = "012
1490: 33 34 35 36 37 38 39 41 42 43 44 45 46 30 31 32 3456789ABCDEF012
14a0: 33 34 35 36 37 38 39 61 62 63 64 65 66 22 3b 0a 3456789abcdef";.
14b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 static const cha
14c0: 72 20 61 50 72 65 66 69 78 5b 5d 20 3d 20 22 2d r aPrefix[] = "-
14d0: 78 30 5c 30 30 30 58 30 22 3b 0a 73 74 61 74 69 x0\000X0";.stati
14e0: 63 20 63 6f 6e 73 74 20 65 74 5f 69 6e 66 6f 20 c const et_info
14f0: 66 6d 74 69 6e 66 6f 5b 5d 20 3d 20 7b 0a 20 20 fmtinfo[] = {.
1500: 7b 20 20 27 64 27 2c 20 31 30 2c 20 31 2c 20 65 { 'd', 10, 1, e
1510: 74 52 41 44 49 58 2c 20 20 20 20 20 20 30 2c 20 tRADIX, 0,
1520: 20 30 20 7d 2c 0a 20 20 7b 20 20 27 73 27 2c 20 0 },. { 's',
1530: 20 30 2c 20 34 2c 20 65 74 53 54 52 49 4e 47 2c 0, 4, etSTRING,
1540: 20 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 0, 0 },.
1550: 7b 20 20 27 67 27 2c 20 20 30 2c 20 31 2c 20 65 { 'g', 0, 1, e
1560: 74 47 45 4e 45 52 49 43 2c 20 20 20 20 33 30 2c tGENERIC, 30,
1570: 20 30 20 7d 2c 0a 20 20 7b 20 20 27 7a 27 2c 20 0 },. { 'z',
1580: 20 30 2c 20 36 2c 20 65 74 44 59 4e 53 54 52 49 0, 6, etDYNSTRI
1590: 4e 47 2c 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 NG, 0, 0 },.
15a0: 7b 20 20 27 71 27 2c 20 20 30 2c 20 34 2c 20 65 { 'q', 0, 4, e
15b0: 74 53 51 4c 45 53 43 41 50 45 2c 20 20 30 2c 20 tSQLESCAPE, 0,
15c0: 20 30 20 7d 2c 0a 20 20 7b 20 20 27 51 27 2c 20 0 },. { 'Q',
15d0: 20 30 2c 20 34 2c 20 65 74 53 51 4c 45 53 43 41 0, 4, etSQLESCA
15e0: 50 45 32 2c 20 30 2c 20 20 30 20 7d 2c 0a 20 20 PE2, 0, 0 },.
15f0: 7b 20 20 27 62 27 2c 20 20 30 2c 20 32 2c 20 65 { 'b', 0, 2, e
1600: 74 42 4c 4f 42 2c 20 20 20 20 20 20 20 30 2c 20 tBLOB, 0,
1610: 20 30 20 7d 2c 0a 20 20 7b 20 20 27 42 27 2c 20 0 },. { 'B',
1620: 20 30 2c 20 32 2c 20 65 74 42 4c 4f 42 53 51 4c 0, 2, etBLOBSQL
1630: 2c 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 , 0, 0 },.
1640: 7b 20 20 27 57 27 2c 20 20 30 2c 20 32 2c 20 65 { 'W', 0, 2, e
1650: 74 57 49 4b 49 53 54 52 2c 20 20 20 20 30 2c 20 tWIKISTR, 0,
1660: 20 30 20 7d 2c 0a 20 20 7b 20 20 27 68 27 2c 20 0 },. { 'h',
1670: 20 30 2c 20 34 2c 20 65 74 48 54 4d 4c 49 5a 45 0, 4, etHTMLIZE
1680: 2c 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 20 , 0, 0 },.
1690: 7b 20 20 27 52 27 2c 20 20 30 2c 20 30 2c 20 65 { 'R', 0, 0, e
16a0: 74 52 4f 4f 54 2c 20 20 20 20 20 20 20 30 2c 20 tROOT, 0,
16b0: 20 30 20 7d 2c 0a 20 20 7b 20 20 27 74 27 2c 20 0 },. { 't',
16c0: 20 30 2c 20 34 2c 20 65 74 48 54 54 50 49 5a 45 0, 4, etHTTPIZE
16d0: 2c 20 20 20 20 30 2c 20 20 30 20 7d 2c 20 20 2f , 0, 0 }, /
16e0: 2a 20 22 2f 22 20 2d 3e 20 22 25 32 46 22 20 2a * "/" -> "%2F" *
16f0: 2f 0a 20 20 7b 20 20 27 54 27 2c 20 20 30 2c 20 /. { 'T', 0,
1700: 34 2c 20 65 74 55 52 4c 49 5a 45 2c 20 20 20 20 4, etURLIZE,
1710: 20 30 2c 20 20 30 20 7d 2c 20 20 2f 2a 20 22 2f 0, 0 }, /* "/
1720: 22 20 75 6e 63 68 61 6e 67 65 64 20 2a 2f 0a 20 " unchanged */.
1730: 20 7b 20 20 27 77 27 2c 20 20 30 2c 20 34 2c 20 { 'w', 0, 4,
1740: 65 74 53 51 4c 45 53 43 41 50 45 33 2c 20 30 2c etSQLESCAPE3, 0,
1750: 20 20 30 20 7d 2c 0a 20 20 7b 20 20 27 46 27 2c 0 },. { 'F',
1760: 20 20 30 2c 20 34 2c 20 65 74 46 4f 53 53 49 4c 0, 4, etFOSSIL
1770: 49 5a 45 2c 20 20 30 2c 20 20 30 20 7d 2c 0a 20 IZE, 0, 0 },.
1780: 20 7b 20 20 27 53 27 2c 20 20 30 2c 20 34 2c 20 { 'S', 0, 4,
1790: 65 74 53 54 52 49 4e 47 49 44 2c 20 20 20 30 2c etSTRINGID, 0,
17a0: 20 20 30 20 7d 2c 0a 20 20 7b 20 20 27 63 27 2c 0 },. { 'c',
17b0: 20 20 30 2c 20 30 2c 20 65 74 43 48 41 52 58 2c 0, 0, etCHARX,
17c0: 20 20 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 0, 0 },.
17d0: 20 7b 20 20 27 6f 27 2c 20 20 38 2c 20 30 2c 20 { 'o', 8, 0,
17e0: 65 74 52 41 44 49 58 2c 20 20 20 20 20 20 30 2c etRADIX, 0,
17f0: 20 20 32 20 7d 2c 0a 20 20 7b 20 20 27 75 27 2c 2 },. { 'u',
1800: 20 31 30 2c 20 30 2c 20 65 74 52 41 44 49 58 2c 10, 0, etRADIX,
1810: 20 20 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 0, 0 },.
1820: 20 7b 20 20 27 78 27 2c 20 31 36 2c 20 30 2c 20 { 'x', 16, 0,
1830: 65 74 52 41 44 49 58 2c 20 20 20 20 20 20 31 36 etRADIX, 16
1840: 2c 20 31 20 7d 2c 0a 20 20 7b 20 20 27 58 27 2c , 1 },. { 'X',
1850: 20 31 36 2c 20 30 2c 20 65 74 52 41 44 49 58 2c 16, 0, etRADIX,
1860: 20 20 20 20 20 20 30 2c 20 20 34 20 7d 2c 0a 20 0, 4 },.
1870: 20 7b 20 20 27 66 27 2c 20 20 30 2c 20 31 2c 20 { 'f', 0, 1,
1880: 65 74 46 4c 4f 41 54 2c 20 20 20 20 20 20 30 2c etFLOAT, 0,
1890: 20 20 30 20 7d 2c 0a 20 20 7b 20 20 27 65 27 2c 0 },. { 'e',
18a0: 20 20 30 2c 20 31 2c 20 65 74 45 58 50 2c 20 20 0, 1, etEXP,
18b0: 20 20 20 20 20 20 33 30 2c 20 30 20 7d 2c 0a 20 30, 0 },.
18c0: 20 7b 20 20 27 45 27 2c 20 20 30 2c 20 31 2c 20 { 'E', 0, 1,
18d0: 65 74 45 58 50 2c 20 20 20 20 20 20 20 20 31 34 etEXP, 14
18e0: 2c 20 30 20 7d 2c 0a 20 20 7b 20 20 27 47 27 2c , 0 },. { 'G',
18f0: 20 20 30 2c 20 31 2c 20 65 74 47 45 4e 45 52 49 0, 1, etGENERI
1900: 43 2c 20 20 20 20 31 34 2c 20 30 20 7d 2c 0a 20 C, 14, 0 },.
1910: 20 7b 20 20 27 69 27 2c 20 31 30 2c 20 31 2c 20 { 'i', 10, 1,
1920: 65 74 52 41 44 49 58 2c 20 20 20 20 20 20 30 2c etRADIX, 0,
1930: 20 20 30 20 7d 2c 0a 20 20 7b 20 20 27 6e 27 2c 0 },. { 'n',
1940: 20 20 30 2c 20 30 2c 20 65 74 53 49 5a 45 2c 20 0, 0, etSIZE,
1950: 20 20 20 20 20 20 30 2c 20 20 30 20 7d 2c 0a 20 0, 0 },.
1960: 20 7b 20 20 27 25 27 2c 20 20 30 2c 20 30 2c 20 { '%', 0, 0,
1970: 65 74 50 45 52 43 45 4e 54 2c 20 20 20 20 30 2c etPERCENT, 0,
1980: 20 20 30 20 7d 2c 0a 20 20 7b 20 20 27 70 27 2c 0 },. { 'p',
1990: 20 31 36 2c 20 30 2c 20 65 74 50 4f 49 4e 54 45 16, 0, etPOINTE
19a0: 52 2c 20 20 20 20 30 2c 20 20 31 20 7d 2c 0a 20 R, 0, 1 },.
19b0: 20 7b 20 20 27 2f 27 2c 20 20 30 2c 20 30 2c 20 { '/', 0, 0,
19c0: 65 74 50 41 54 48 2c 20 20 20 20 20 20 20 30 2c etPATH, 0,
19d0: 20 20 30 20 7d 2c 0a 7d 3b 0a 23 64 65 66 69 6e 0 },.};.#defin
19e0: 65 20 65 74 4e 49 4e 46 4f 20 63 6f 75 6e 74 28 e etNINFO count(
19f0: 66 6d 74 69 6e 66 6f 29 0a 0a 2f 2a 0a 2a 2a 20 fmtinfo)../*.**
1a00: 22 2a 76 61 6c 22 20 69 73 20 61 20 64 6f 75 62 "*val" is a doub
1a10: 6c 65 20 73 75 63 68 20 74 68 61 74 20 30 2e 31 le such that 0.1
1a20: 20 3c 3d 20 2a 76 61 6c 20 3c 20 31 30 2e 30 0a <= *val < 10.0.
1a30: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 61 73 ** Return the as
1a40: 63 69 69 20 63 6f 64 65 20 66 6f 72 20 74 68 65 cii code for the
1a50: 20 6c 65 61 64 69 6e 67 20 64 69 67 69 74 20 6f leading digit o
1a60: 66 20 2a 76 61 6c 2c 20 74 68 65 6e 0a 2a 2a 20 f *val, then.**
1a70: 6d 75 6c 74 69 70 6c 79 20 22 2a 76 61 6c 22 20 multiply "*val"
1a80: 62 79 20 31 30 2e 30 20 74 6f 20 72 65 6e 6f 72 by 10.0 to renor
1a90: 6d 61 6c 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 malize..**.** Ex
1aa0: 61 6d 70 6c 65 3a 0a 2a 2a 20 20 20 20 20 69 6e ample:.** in
1ab0: 70 75 74 3a 20 20 20 20 20 2a 76 61 6c 20 3d 20 put: *val =
1ac0: 33 2e 31 34 31 35 39 0a 2a 2a 20 20 20 20 20 6f 3.14159.** o
1ad0: 75 74 70 75 74 3a 20 20 20 20 2a 76 61 6c 20 3d utput: *val =
1ae0: 20 31 2e 34 31 35 39 20 20 20 20 66 75 6e 63 74 1.4159 funct
1af0: 69 6f 6e 20 72 65 74 75 72 6e 20 3d 20 27 33 27 ion return = '3'
1b00: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 6f 75 6e 74 .**.** The count
1b10: 65 72 20 2a 63 6e 74 20 69 73 20 69 6e 63 72 65 er *cnt is incre
1b20: 6d 65 6e 74 65 64 20 65 61 63 68 20 74 69 6d 65 mented each time
1b30: 2e 20 20 41 66 74 65 72 20 63 6f 75 6e 74 65 72 . After counter
1b40: 20 65 78 63 65 65 64 73 0a 2a 2a 20 31 36 20 28 exceeds.** 16 (
1b50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 69 the number of si
1b60: 67 6e 69 66 69 63 61 6e 74 20 64 69 67 69 74 73 gnificant digits
1b70: 20 69 6e 20 61 20 36 34 2d 62 69 74 20 66 6c 6f in a 64-bit flo
1b80: 61 74 29 20 27 30 27 20 69 73 0a 2a 2a 20 61 6c at) '0' is.** al
1b90: 77 61 79 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a ways returned..*
1ba0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 74 5f /.static int et_
1bb0: 67 65 74 64 69 67 69 74 28 6c 6f 6e 67 20 64 6f getdigit(long do
1bc0: 75 62 6c 65 20 2a 76 61 6c 2c 20 69 6e 74 20 2a uble *val, int *
1bd0: 63 6e 74 29 7b 0a 20 20 69 6e 74 20 64 69 67 69 cnt){. int digi
1be0: 74 3b 0a 20 20 6c 6f 6e 67 20 64 6f 75 62 6c 65 t;. long double
1bf0: 20 64 3b 0a 20 20 69 66 28 20 28 2a 63 6e 74 29 d;. if( (*cnt)
1c00: 2b 2b 20 3e 3d 20 31 36 20 29 20 72 65 74 75 72 ++ >= 16 ) retur
1c10: 6e 20 27 30 27 3b 0a 20 20 64 69 67 69 74 20 3d n '0';. digit =
1c20: 20 28 69 6e 74 29 2a 76 61 6c 3b 0a 20 20 64 20 (int)*val;. d
1c30: 3d 20 64 69 67 69 74 3b 0a 20 20 64 69 67 69 74 = digit;. digit
1c40: 20 2b 3d 20 27 30 27 3b 0a 20 20 2a 76 61 6c 20 += '0';. *val
1c50: 3d 20 28 2a 76 61 6c 20 2d 20 64 29 2a 31 30 2e = (*val - d)*10.
1c60: 30 3b 0a 20 20 72 65 74 75 72 6e 20 64 69 67 69 0;. return digi
1c70: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 69 7a 65 t;.}../*.** Size
1c80: 20 6f 66 20 74 65 6d 70 6f 72 61 72 79 20 63 6f of temporary co
1c90: 6e 76 65 72 73 69 6f 6e 20 62 75 66 66 65 72 2e nversion buffer.
1ca0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 65 74 42 55 .*/.#define etBU
1cb0: 46 53 49 5a 45 20 35 30 30 0a 0a 2f 2a 0a 2a 2a FSIZE 500../*.**
1cc0: 20 46 69 6e 64 20 74 68 65 20 6c 65 6e 67 74 68 Find the length
1cd0: 20 6f 66 20 61 20 73 74 72 69 6e 67 20 61 73 20 of a string as
1ce0: 6c 6f 6e 67 20 61 73 20 74 68 61 74 20 6c 65 6e long as that len
1cf0: 67 74 68 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 gth does not.**
1d00: 65 78 63 65 65 64 20 4e 20 62 79 74 65 73 2e 20 exceed N bytes.
1d10: 20 49 66 20 6e 6f 20 7a 65 72 6f 20 74 65 72 6d If no zero term
1d20: 69 6e 61 74 6f 72 20 69 73 20 73 65 65 6e 20 69 inator is seen i
1d30: 6e 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 4e n the first.** N
1d40: 20 62 79 74 65 73 20 74 68 65 6e 20 72 65 74 75 bytes then retu
1d50: 72 6e 20 4e 2e 20 20 49 66 20 4e 20 69 73 20 6e rn N. If N is n
1d60: 65 67 61 74 69 76 65 2c 20 74 68 65 6e 20 74 68 egative, then th
1d70: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 is routine.** is
1d80: 20 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 73 74 an alias for st
1d90: 72 6c 65 6e 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 rlen()..*/.stati
1da0: 63 20 69 6e 74 20 53 74 72 4e 4c 65 6e 33 32 28 c int StrNLen32(
1db0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 const char *z, i
1dc0: 6e 74 20 4e 29 7b 0a 20 20 69 6e 74 20 6e 20 3d nt N){. int n =
1dd0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 28 4e 2d 0;. while( (N-
1de0: 2d 20 21 3d 20 30 29 20 26 26 20 2a 28 7a 2b 2b - != 0) && *(z++
1df0: 29 21 3d 30 20 29 7b 20 6e 2b 2b 3b 20 7d 0a 20 )!=0 ){ n++; }.
1e00: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a return n;.}../*
1e10: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 6e 20 61 70 .** Return an ap
1e20: 70 72 6f 70 72 69 61 74 65 20 73 65 74 20 6f 66 propriate set of
1e30: 20 66 6c 61 67 73 20 66 6f 72 20 77 69 6b 69 5f flags for wiki_
1e40: 63 6f 6e 76 65 72 74 28 29 20 66 6f 72 20 64 69 convert() for di
1e50: 73 70 6c 61 79 69 6e 67 0a 2a 2a 20 63 6f 6d 6d splaying.** comm
1e60: 65 6e 74 73 20 6f 6e 20 61 20 74 69 6d 65 6c 69 ents on a timeli
1e70: 6e 65 2e 20 20 54 68 65 73 65 20 66 6c 61 67 20 ne. These flag
1e80: 73 65 74 74 69 6e 67 73 20 61 72 65 20 64 65 74 settings are det
1e90: 65 72 6d 69 6e 65 64 20 62 79 0a 2a 2a 20 63 6f ermined by.** co
1ea0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72 61 nfiguration para
1eb0: 6d 65 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 meters..**.** Th
1ec0: 65 20 61 6c 74 46 6f 72 6d 32 20 61 72 67 75 6d e altForm2 argum
1ed0: 65 6e 74 20 69 73 20 74 72 75 65 20 66 6f 72 20 ent is true for
1ee0: 22 25 21 57 22 20 28 77 69 74 68 20 74 68 65 20 "%!W" (with the
1ef0: 22 21 22 20 61 6c 74 65 72 6e 61 74 65 2d 66 6f "!" alternate-fo
1f00: 72 6d 2d 32 0a 2a 2a 20 66 6c 61 67 73 29 20 61 rm-2.** flags) a
1f10: 6e 64 20 69 73 20 66 61 6c 73 65 20 66 6f 72 20 nd is false for
1f20: 70 6c 61 69 6e 20 22 25 57 22 2e 20 20 54 68 65 plain "%W". The
1f30: 20 21 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 ! indicates tha
1f40: 74 20 74 68 65 20 74 65 78 74 20 69 73 0a 2a 2a t the text is.**
1f50: 20 74 6f 20 62 65 20 72 65 6e 64 65 72 65 64 20 to be rendered
1f60: 6f 6e 20 61 20 66 6f 72 6d 20 72 61 74 68 65 72 on a form rather
1f70: 20 74 68 61 6e 20 74 68 65 20 74 69 6d 65 6c 69 than the timeli
1f80: 6e 65 20 61 6e 64 20 74 68 61 74 20 62 6c 6f 63 ne and that bloc
1f90: 6b 20 6d 61 72 6b 75 70 0a 2a 2a 20 69 73 20 61 k markup.** is a
1fa0: 63 63 65 70 74 61 62 6c 65 20 65 76 65 6e 20 69 cceptable even i
1fb0: 66 20 74 68 65 20 22 74 69 6d 65 6c 69 6e 65 2d f the "timeline-
1fc0: 62 6c 6f 63 6b 2d 6d 61 72 6b 75 70 22 20 73 65 block-markup" se
1fd0: 74 74 69 6e 67 20 69 73 20 66 61 6c 73 65 2e 0a tting is false..
1fe0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 69 */.static int wi
1ff0: 6b 69 5f 63 6f 6e 76 65 72 74 5f 66 6c 61 67 73 ki_convert_flags
2000: 28 69 6e 74 20 61 6c 74 46 6f 72 6d 32 29 7b 0a (int altForm2){.
2010: 20 20 73 74 61 74 69 63 20 69 6e 74 20 77 69 6b static int wik
2020: 69 46 6c 61 67 73 20 3d 20 30 3b 0a 20 20 69 66 iFlags = 0;. if
2030: 28 20 77 69 6b 69 46 6c 61 67 73 3d 3d 30 20 29 ( wikiFlags==0 )
2040: 7b 0a 20 20 20 20 69 66 28 20 61 6c 74 46 6f 72 {. if( altFor
2050: 6d 32 20 7c 7c 20 64 62 5f 67 65 74 5f 62 6f 6f m2 || db_get_boo
2060: 6c 65 61 6e 28 22 74 69 6d 65 6c 69 6e 65 2d 62 lean("timeline-b
2070: 6c 6f 63 6b 2d 6d 61 72 6b 75 70 22 2c 20 30 29 lock-markup", 0)
2080: 20 29 7b 0a 20 20 20 20 20 20 77 69 6b 69 46 6c ){. wikiFl
2090: 61 67 73 20 3d 20 57 49 4b 49 5f 49 4e 4c 49 4e ags = WIKI_INLIN
20a0: 45 20 7c 20 57 49 4b 49 5f 4e 4f 42 41 44 4c 49 E | WIKI_NOBADLI
20b0: 4e 4b 53 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a NKS;. }else{.
20c0: 20 20 20 20 20 20 77 69 6b 69 46 6c 61 67 73 20 wikiFlags
20d0: 3d 20 57 49 4b 49 5f 49 4e 4c 49 4e 45 20 7c 20 = WIKI_INLINE |
20e0: 57 49 4b 49 5f 4e 4f 42 4c 4f 43 4b 20 7c 20 57 WIKI_NOBLOCK | W
20f0: 49 4b 49 5f 4e 4f 42 41 44 4c 49 4e 4b 53 3b 0a IKI_NOBADLINKS;.
2100: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62 }. if( db
2110: 5f 67 65 74 5f 62 6f 6f 6c 65 61 6e 28 22 74 69 _get_boolean("ti
2120: 6d 65 6c 69 6e 65 2d 70 6c 61 69 6e 74 65 78 74 meline-plaintext
2130: 22 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 77 ", 0) ){. w
2140: 69 6b 69 46 6c 61 67 73 20 7c 3d 20 57 49 4b 49 ikiFlags |= WIKI
2150: 5f 4c 49 4e 4b 53 4f 4e 4c 59 3b 0a 20 20 20 20 _LINKSONLY;.
2160: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 77 }. }. return w
2170: 69 6b 69 46 6c 61 67 73 3b 0a 7d 0a 0a 0a 0a 2f ikiFlags;.}..../
2180: 2a 0a 2a 2a 20 54 68 65 20 72 6f 6f 74 20 70 72 *.** The root pr
2190: 6f 67 72 61 6d 2e 20 20 41 6c 6c 20 76 61 72 69 ogram. All vari
21a0: 61 74 69 6f 6e 73 20 63 61 6c 6c 20 74 68 69 73 ations call this
21b0: 20 63 6f 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 4e 50 core..**.** INP
21c0: 55 54 53 3a 0a 2a 2a 20 20 20 70 42 6c 6f 62 20 UTS:.** pBlob
21d0: 20 54 68 69 73 20 69 73 20 74 68 65 20 62 6c 6f This is the blo
21e0: 62 20 77 68 65 72 65 20 74 68 65 20 6f 75 74 70 b where the outp
21f0: 75 74 20 77 69 6c 6c 20 62 65 20 62 75 69 6c 74 ut will be built
2200: 2e 0a 2a 2a 0a 2a 2a 20 20 20 66 6d 74 20 20 20 ..**.** fmt
2210: 20 54 68 69 73 20 69 73 20 74 68 65 20 66 6f 72 This is the for
2220: 6d 61 74 20 73 74 72 69 6e 67 2c 20 61 73 20 69 mat string, as i
2230: 6e 20 74 68 65 20 75 73 75 61 6c 20 70 72 69 6e n the usual prin
2240: 74 2e 0a 2a 2a 0a 2a 2a 20 20 20 61 70 20 20 20 t..**.** ap
2250: 20 20 54 68 69 73 20 69 73 20 61 20 70 6f 69 6e This is a poin
2260: 74 65 72 20 74 6f 20 61 20 6c 69 73 74 20 6f 66 ter to a list of
2270: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 53 61 6d arguments. Sam
2280: 65 20 61 73 20 69 6e 0a 2a 2a 20 20 20 20 20 20 e as in.**
2290: 20 20 20 20 76 66 70 72 69 6e 74 2e 0a 2a 2a 0a vfprint..**.
22a0: 2a 2a 20 4f 55 54 50 55 54 53 3a 0a 2a 2a 20 20 ** OUTPUTS:.**
22b0: 20 20 20 20 20 20 20 20 54 68 65 20 72 65 74 75 The retu
22c0: 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68 65 20 rn value is the
22d0: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 total number of
22e0: 63 68 61 72 61 63 74 65 72 73 20 73 65 6e 74 20 characters sent
22f0: 74 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 to.** t
2300: 68 65 20 66 75 6e 63 74 69 6f 6e 20 22 66 75 6e he function "fun
2310: 63 22 2e 20 20 52 65 74 75 72 6e 73 20 2d 31 20 c". Returns -1
2320: 6f 6e 20 61 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a on a error..**.*
2330: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 * Note that the
2340: 6f 72 64 65 72 20 69 6e 20 77 68 69 63 68 20 61 order in which a
2350: 75 74 6f 6d 61 74 69 63 20 76 61 72 69 61 62 6c utomatic variabl
2360: 65 73 20 61 72 65 20 64 65 63 6c 61 72 65 64 20 es are declared
2370: 62 65 6c 6f 77 0a 2a 2a 20 73 65 65 6d 73 20 74 below.** seems t
2380: 6f 20 6d 61 6b 65 20 61 20 62 69 67 20 64 69 66 o make a big dif
2390: 66 65 72 65 6e 63 65 20 69 6e 20 64 65 74 65 72 ference in deter
23a0: 6d 69 6e 69 6e 67 20 68 6f 77 20 66 61 73 74 20 mining how fast
23b0: 74 68 69 73 20 62 65 61 73 74 0a 2a 2a 20 77 69 this beast.** wi
23c0: 6c 6c 20 72 75 6e 2e 0a 2a 2f 0a 69 6e 74 20 76 ll run..*/.int v
23d0: 78 70 72 69 6e 74 66 28 0a 20 20 42 6c 6f 62 20 xprintf(. Blob
23e0: 2a 70 42 6c 6f 62 2c 20 20 20 20 20 20 20 20 20 *pBlob,
23f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a /*
2400: 20 41 70 70 65 6e 64 20 6f 75 74 70 75 74 20 74 Append output t
2410: 6f 20 74 68 69 73 20 62 6c 6f 62 20 2a 2f 0a 20 o this blob */.
2420: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 66 6d 74 const char *fmt
2430: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ,
2440: 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 73 74 /* Format st
2450: 72 69 6e 67 20 2a 2f 0a 20 20 76 61 5f 6c 69 73 ring */. va_lis
2460: 74 20 61 70 20 20 20 20 20 20 20 20 20 20 20 20 t ap
2470: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
2480: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 29 7b 0a arguments */.){.
2490: 20 20 69 6e 74 20 63 3b 20 20 20 20 20 20 20 20 int c;
24a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
24b0: 4e 65 78 74 20 63 68 61 72 61 63 74 65 72 20 69 Next character i
24c0: 6e 20 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 n the format str
24d0: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 2a 62 ing */. char *b
24e0: 75 66 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 ufpt;
24f0: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 /* Pointer t
2500: 6f 20 74 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e o the conversion
2510: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 69 6e 74 buffer */. int
2520: 20 70 72 65 63 69 73 69 6f 6e 3b 20 20 20 20 20 precision;
2530: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 63 69 /* Preci
2540: 73 69 6f 6e 20 6f 66 20 74 68 65 20 63 75 72 72 sion of the curr
2550: 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 ent field */. i
2560: 6e 74 20 6c 65 6e 67 74 68 3b 20 20 20 20 20 20 nt length;
2570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e /* Len
2580: 67 74 68 20 6f 66 20 74 68 65 20 66 69 65 6c 64 gth of the field
2590: 20 2a 2f 0a 20 20 69 6e 74 20 69 64 78 3b 20 20 */. int idx;
25a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
25b0: 20 2f 2a 20 41 20 67 65 6e 65 72 61 6c 20 70 75 /* A general pu
25c0: 72 70 6f 73 65 20 6c 6f 6f 70 20 63 6f 75 6e 74 rpose loop count
25d0: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 75 6e er */. int coun
25e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 t;
25f0: 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 /* Total numb
2600: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 er of characters
2610: 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 69 6e 74 output */. int
2620: 20 77 69 64 74 68 3b 20 20 20 20 20 20 20 20 20 width;
2630: 20 20 20 20 20 20 20 20 2f 2a 20 57 69 64 74 68 /* Width
2640: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 of the current
2650: 66 69 65 6c 64 20 2a 2f 0a 20 20 65 74 42 79 74 field */. etByt
2660: 65 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 e flag_leftjusti
2670: 66 79 3b 20 20 20 2f 2a 20 54 72 75 65 20 69 66 fy; /* True if
2680: 20 22 2d 22 20 66 6c 61 67 20 69 73 20 70 72 65 "-" flag is pre
2690: 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 sent */. etByte
26a0: 20 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 3b 20 flag_plussign;
26b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 /* True if
26c0: 22 2b 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 "+" flag is pres
26d0: 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 ent */. etByte
26e0: 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 3b 20 flag_blanksign;
26f0: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 /* True if "
2700: 20 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 " flag is prese
2710: 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 nt */. etByte f
2720: 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 lag_alternatefor
2730: 6d 3b 20 2f 2a 20 54 72 75 65 20 69 66 20 22 23 m; /* True if "#
2740: 22 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e " flag is presen
2750: 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c t */. etByte fl
2760: 61 67 5f 61 6c 74 66 6f 72 6d 32 3b 20 20 20 20 ag_altform2;
2770: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 21 22 /* True if "!"
2780: 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e 74 flag is present
2790: 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c 61 */. etByte fla
27a0: 67 5f 7a 65 72 6f 70 61 64 3b 20 20 20 20 20 20 g_zeropad;
27b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 66 69 65 6c /* True if fiel
27c0: 64 20 77 69 64 74 68 20 63 6f 6e 73 74 61 6e 74 d width constant
27d0: 20 73 74 61 72 74 73 20 77 69 74 68 20 7a 65 72 starts with zer
27e0: 6f 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c o */. etByte fl
27f0: 61 67 5f 6c 6f 6e 67 3b 20 20 20 20 20 20 20 20 ag_long;
2800: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 22 6c 22 /* True if "l"
2810: 20 66 6c 61 67 20 69 73 20 70 72 65 73 65 6e 74 flag is present
2820: 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c 61 */. etByte fla
2830: 67 5f 6c 6f 6e 67 6c 6f 6e 67 3b 20 20 20 20 20 g_longlong;
2840: 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 /* True if the
2850: 22 6c 6c 22 20 66 6c 61 67 20 69 73 20 70 72 65 "ll" flag is pre
2860: 73 65 6e 74 20 2a 2f 0a 20 20 65 74 42 79 74 65 sent */. etByte
2870: 20 64 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 20 done;
2880: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 65 72 /* Loop ter
2890: 6d 69 6e 61 74 69 6f 6e 20 66 6c 61 67 20 2a 2f mination flag */
28a0: 0a 20 20 65 74 42 79 74 65 20 63 54 68 6f 75 73 . etByte cThous
28b0: 61 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a and; /*
28c0: 20 54 68 6f 75 73 61 6e 64 73 20 73 65 70 61 72 Thousands separ
28d0: 61 74 6f 72 20 66 6f 72 20 25 64 20 61 6e 64 20 ator for %d and
28e0: 25 75 20 2a 2f 0a 20 20 75 36 34 20 6c 6f 6e 67 %u */. u64 long
28f0: 76 61 6c 75 65 3b 20 20 20 20 20 20 20 20 20 20 value;
2900: 20 20 20 2f 2a 20 56 61 6c 75 65 20 66 6f 72 20 /* Value for
2910: 69 6e 74 65 67 65 72 20 74 79 70 65 73 20 2a 2f integer types */
2920: 0a 20 20 6c 6f 6e 67 20 64 6f 75 62 6c 65 20 72 . long double r
2930: 65 61 6c 76 61 6c 75 65 3b 20 20 20 20 20 2f 2a ealvalue; /*
2940: 20 56 61 6c 75 65 20 66 6f 72 20 72 65 61 6c 20 Value for real
2950: 74 79 70 65 73 20 2a 2f 0a 20 20 63 6f 6e 73 74 types */. const
2960: 20 65 74 5f 69 6e 66 6f 20 2a 69 6e 66 6f 70 3b et_info *infop;
2970: 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 /* Pointer
2980: 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72 69 to the appropri
2990: 61 74 65 20 69 6e 66 6f 20 73 74 72 75 63 74 75 ate info structu
29a0: 72 65 20 2a 2f 0a 20 20 63 68 61 72 20 62 75 66 re */. char buf
29b0: 5b 65 74 42 55 46 53 49 5a 45 5d 3b 20 20 20 20 [etBUFSIZE];
29c0: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 73 69 6f 6e /* Conversion
29d0: 20 62 75 66 66 65 72 20 2a 2f 0a 20 20 63 68 61 buffer */. cha
29e0: 72 20 70 72 65 66 69 78 3b 20 20 20 20 20 20 20 r prefix;
29f0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 66 69 /* Prefi
2a00: 78 20 63 68 61 72 61 63 74 65 72 2e 20 20 22 2b x character. "+
2a10: 22 20 6f 72 20 22 2d 22 20 6f 72 20 22 20 22 20 " or "-" or " "
2a20: 6f 72 20 27 5c 30 27 2e 20 2a 2f 0a 20 20 65 74 or '\0'. */. et
2a30: 42 79 74 65 20 65 72 72 6f 72 66 6c 61 67 20 3d Byte errorflag =
2a40: 20 30 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 0; /* True
2a50: 20 69 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20 if an error is
2a60: 65 6e 63 6f 75 6e 74 65 72 65 64 20 2a 2f 0a 20 encountered */.
2a70: 20 65 74 42 79 74 65 20 78 74 79 70 65 3b 20 20 etByte xtype;
2a80: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 /* C
2a90: 6f 6e 76 65 72 73 69 6f 6e 20 70 61 72 61 64 69 onversion paradi
2aa0: 67 6d 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 45 gm */. char *zE
2ab0: 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20 20 xtra;
2ac0: 20 20 20 2f 2a 20 45 78 74 72 61 20 6d 65 6d 6f /* Extra memo
2ad0: 72 79 20 75 73 65 64 20 66 6f 72 20 65 74 54 43 ry used for etTC
2ae0: 4c 45 53 43 41 50 45 20 63 6f 6e 76 65 72 73 69 LESCAPE conversi
2af0: 6f 6e 73 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 ons */. static
2b00: 63 6f 6e 73 74 20 63 68 61 72 20 73 70 61 63 65 const char space
2b10: 73 5b 5d 20 3d 0a 20 20 20 22 20 20 20 20 20 20 s[] =. "
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2b60: 20 20 20 22 3b 0a 23 64 65 66 69 6e 65 20 65 74 ";.#define et
2b70: 53 50 41 43 45 53 49 5a 45 20 28 73 69 7a 65 6f SPACESIZE (sizeo
2b80: 66 28 73 70 61 63 65 73 29 2d 31 29 0a 20 20 69 f(spaces)-1). i
2b90: 6e 74 20 20 65 78 70 2c 20 65 32 3b 20 20 20 20 nt exp, e2;
2ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78 70 /* exp
2bb0: 6f 6e 65 6e 74 20 6f 66 20 72 65 61 6c 20 6e 75 onent of real nu
2bc0: 6d 62 65 72 73 20 2a 2f 0a 20 20 64 6f 75 62 6c mbers */. doubl
2bd0: 65 20 72 6f 75 6e 64 65 72 3b 20 20 20 20 20 20 e rounder;
2be0: 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 66 6f /* Used fo
2bf0: 72 20 72 6f 75 6e 64 69 6e 67 20 66 6c 6f 61 74 r rounding float
2c00: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 73 ing point values
2c10: 20 2a 2f 0a 20 20 65 74 42 79 74 65 20 66 6c 61 */. etByte fla
2c20: 67 5f 64 70 3b 20 20 20 20 20 20 20 20 20 20 20 g_dp;
2c30: 20 2f 2a 20 54 72 75 65 20 69 66 20 64 65 63 69 /* True if deci
2c40: 6d 61 6c 20 70 6f 69 6e 74 20 73 68 6f 75 6c 64 mal point should
2c50: 20 62 65 20 73 68 6f 77 6e 20 2a 2f 0a 20 20 65 be shown */. e
2c60: 74 42 79 74 65 20 66 6c 61 67 5f 72 74 7a 3b 20 tByte flag_rtz;
2c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 /* Tru
2c80: 65 20 69 66 20 74 72 61 69 6c 69 6e 67 20 7a 65 e if trailing ze
2c90: 72 6f 73 20 73 68 6f 75 6c 64 20 62 65 20 72 65 ros should be re
2ca0: 6d 6f 76 65 64 20 2a 2f 0a 20 20 65 74 42 79 74 moved */. etByt
2cb0: 65 20 66 6c 61 67 5f 65 78 70 3b 20 20 20 20 20 e flag_exp;
2cc0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f /* True to
2cd0: 20 66 6f 72 63 65 20 64 69 73 70 6c 61 79 20 6f force display o
2ce0: 66 20 74 68 65 20 65 78 70 6f 6e 65 6e 74 20 2a f the exponent *
2cf0: 2f 0a 20 20 69 6e 74 20 6e 73 64 3b 20 20 20 20 /. int nsd;
2d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f /
2d10: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 69 67 6e * Number of sign
2d20: 69 66 69 63 61 6e 74 20 64 69 67 69 74 73 20 72 ificant digits r
2d30: 65 74 75 72 6e 65 64 20 2a 2f 0a 0a 20 20 63 6f eturned */.. co
2d40: 75 6e 74 20 3d 20 6c 65 6e 67 74 68 20 3d 20 30 unt = length = 0
2d50: 3b 0a 20 20 62 75 66 70 74 20 3d 20 30 3b 0a 20 ;. bufpt = 0;.
2d60: 20 66 6f 72 28 3b 20 28 63 3d 28 2a 66 6d 74 29 for(; (c=(*fmt)
2d70: 29 21 3d 30 3b 20 2b 2b 66 6d 74 29 7b 0a 20 20 )!=0; ++fmt){.
2d80: 20 20 69 66 28 20 63 21 3d 27 25 27 20 29 7b 0a if( c!='%' ){.
2d90: 20 20 20 20 20 20 69 6e 74 20 61 6d 74 3b 0a 20 int amt;.
2da0: 20 20 20 20 20 62 75 66 70 74 20 3d 20 28 63 68 bufpt = (ch
2db0: 61 72 20 2a 29 66 6d 74 3b 0a 20 20 20 20 20 20 ar *)fmt;.
2dc0: 61 6d 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 77 amt = 1;. w
2dd0: 68 69 6c 65 28 20 28 63 3d 28 2a 2b 2b 66 6d 74 hile( (c=(*++fmt
2de0: 29 29 21 3d 27 25 27 20 26 26 20 63 21 3d 30 20 ))!='%' && c!=0
2df0: 29 20 61 6d 74 2b 2b 3b 0a 20 20 20 20 20 20 62 ) amt++;. b
2e00: 6c 6f 62 5f 61 70 70 65 6e 64 28 70 42 6c 6f 62 lob_append(pBlob
2e10: 2c 62 75 66 70 74 2c 61 6d 74 29 3b 0a 20 20 20 ,bufpt,amt);.
2e20: 20 20 20 63 6f 75 6e 74 20 2b 3d 20 61 6d 74 3b count += amt;
2e30: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 . if( c==0
2e40: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 ) break;. }.
2e50: 20 20 20 69 66 28 20 28 63 3d 28 2a 2b 2b 66 6d if( (c=(*++fm
2e60: 74 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 t))==0 ){.
2e70: 65 72 72 6f 72 66 6c 61 67 20 3d 20 31 3b 0a 20 errorflag = 1;.
2e80: 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 65 6e 64 blob_append
2e90: 28 70 42 6c 6f 62 2c 22 25 22 2c 31 29 3b 0a 20 (pBlob,"%",1);.
2ea0: 20 20 20 20 20 63 6f 75 6e 74 2b 2b 3b 0a 20 20 count++;.
2eb0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d break;. }
2ec0: 0a 20 20 20 20 2f 2a 20 46 69 6e 64 20 6f 75 74 . /* Find out
2ed0: 20 77 68 61 74 20 66 6c 61 67 73 20 61 72 65 20 what flags are
2ee0: 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 20 20 66 present */. f
2ef0: 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 lag_leftjustify
2f00: 3d 20 66 6c 61 67 5f 70 6c 75 73 73 69 67 6e 20 = flag_plussign
2f10: 3d 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e = flag_blanksign
2f20: 20 3d 20 63 54 68 6f 75 73 61 6e 64 20 3d 0a 20 = cThousand =.
2f30: 20 20 20 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 flag_alterna
2f40: 74 65 66 6f 72 6d 20 3d 20 66 6c 61 67 5f 61 6c teform = flag_al
2f50: 74 66 6f 72 6d 32 20 3d 20 66 6c 61 67 5f 7a 65 tform2 = flag_ze
2f60: 72 6f 70 61 64 20 3d 20 30 3b 0a 20 20 20 20 64 ropad = 0;. d
2f70: 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 64 6f 7b one = 0;. do{
2f80: 0a 20 20 20 20 20 20 73 77 69 74 63 68 28 20 63 . switch( c
2f90: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61 73 65 ){. case
2fa0: 20 27 2d 27 3a 20 20 20 66 6c 61 67 5f 6c 65 66 '-': flag_lef
2fb0: 74 6a 75 73 74 69 66 79 20 3d 20 31 3b 20 20 20 tjustify = 1;
2fc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 break;.
2fd0: 20 63 61 73 65 20 27 2b 27 3a 20 20 20 66 6c 61 case '+': fla
2fe0: 67 5f 70 6c 75 73 73 69 67 6e 20 3d 20 31 3b 20 g_plussign = 1;
2ff0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 break;.
3000: 20 20 20 20 20 20 63 61 73 65 20 27 20 27 3a 20 case ' ':
3010: 20 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e flag_blanksign
3020: 20 3d 20 31 3b 20 20 20 20 20 20 20 62 72 65 61 = 1; brea
3030: 6b 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 k;. case
3040: 27 23 27 3a 20 20 20 66 6c 61 67 5f 61 6c 74 65 '#': flag_alte
3050: 72 6e 61 74 65 66 6f 72 6d 20 3d 20 31 3b 20 20 rnateform = 1;
3060: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 break;.
3070: 63 61 73 65 20 27 21 27 3a 20 20 20 66 6c 61 67 case '!': flag
3080: 5f 61 6c 74 66 6f 72 6d 32 20 3d 20 31 3b 20 20 _altform2 = 1;
3090: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
30a0: 20 20 20 20 20 63 61 73 65 20 27 30 27 3a 20 20 case '0':
30b0: 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 3d 20 flag_zeropad =
30c0: 31 3b 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 1; break
30d0: 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 27 ;. case '
30e0: 2c 27 3a 20 20 20 63 54 68 6f 75 73 61 6e 64 20 ,': cThousand
30f0: 3d 20 27 2c 27 3b 20 20 20 20 20 20 20 20 20 20 = ',';
3100: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 64 break;. d
3110: 65 66 61 75 6c 74 3a 20 20 20 20 64 6f 6e 65 20 efault: done
3120: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 = 1;
3130: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
3140: 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 }. }while(
3150: 21 64 6f 6e 65 20 26 26 20 28 63 3d 28 2a 2b 2b !done && (c=(*++
3160: 66 6d 74 29 29 21 3d 30 20 29 3b 0a 20 20 20 20 fmt))!=0 );.
3170: 2f 2a 20 47 65 74 20 74 68 65 20 66 69 65 6c 64 /* Get the field
3180: 20 77 69 64 74 68 20 2a 2f 0a 20 20 20 20 77 69 width */. wi
3190: 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 dth = 0;. if(
31a0: 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 c=='*' ){.
31b0: 20 77 69 64 74 68 20 3d 20 76 61 5f 61 72 67 28 width = va_arg(
31c0: 61 70 2c 69 6e 74 29 3b 0a 20 20 20 20 20 20 69 ap,int);. i
31d0: 66 28 20 77 69 64 74 68 3c 30 20 29 7b 0a 20 20 f( width<0 ){.
31e0: 20 20 20 20 20 20 66 6c 61 67 5f 6c 65 66 74 6a flag_leftj
31f0: 75 73 74 69 66 79 20 3d 20 31 3b 0a 20 20 20 20 ustify = 1;.
3200: 20 20 20 20 77 69 64 74 68 20 3d 20 2d 77 69 64 width = -wid
3210: 74 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 th;. }.
3220: 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 3b 0a 20 20 c = *++fmt;.
3230: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 77 }else{. w
3240: 68 69 6c 65 28 20 63 3e 3d 27 30 27 20 26 26 20 hile( c>='0' &&
3250: 63 3c 3d 27 39 27 20 29 7b 0a 20 20 20 20 20 20 c<='9' ){.
3260: 20 20 77 69 64 74 68 20 3d 20 77 69 64 74 68 2a width = width*
3270: 31 30 20 2b 20 63 20 2d 20 27 30 27 3b 0a 20 20 10 + c - '0';.
3280: 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b 66 6d 74 c = *++fmt
3290: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a ;. }. }.
32a0: 20 20 20 20 69 66 28 20 77 69 64 74 68 20 3e 20 if( width >
32b0: 65 74 42 55 46 53 49 5a 45 2d 31 30 20 29 7b 0a etBUFSIZE-10 ){.
32c0: 20 20 20 20 20 20 77 69 64 74 68 20 3d 20 65 74 width = et
32d0: 42 55 46 53 49 5a 45 2d 31 30 3b 0a 20 20 20 20 BUFSIZE-10;.
32e0: 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 }. /* Get the
32f0: 20 70 72 65 63 69 73 69 6f 6e 20 2a 2f 0a 20 20 precision */.
3300: 20 20 69 66 28 20 63 3d 3d 27 2e 27 20 29 7b 0a if( c=='.' ){.
3310: 20 20 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 precision
3320: 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a = 0;. c = *
3330: 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20 69 66 28 ++fmt;. if(
3340: 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20 20 c=='*' ){.
3350: 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 76 precision = v
3360: 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 a_arg(ap,int);.
3370: 20 20 20 20 20 20 20 69 66 28 20 70 72 65 63 69 if( preci
3380: 73 69 6f 6e 3c 30 20 29 20 70 72 65 63 69 73 69 sion<0 ) precisi
3390: 6f 6e 20 3d 20 2d 70 72 65 63 69 73 69 6f 6e 3b on = -precision;
33a0: 0a 20 20 20 20 20 20 20 20 63 20 3d 20 2a 2b 2b . c = *++
33b0: 66 6d 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 fmt;. }else
33c0: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 {. while(
33d0: 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 c>='0' && c<='9
33e0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 ' ){. p
33f0: 72 65 63 69 73 69 6f 6e 20 3d 20 70 72 65 63 69 recision = preci
3400: 73 69 6f 6e 2a 31 30 20 2b 20 63 20 2d 20 27 30 sion*10 + c - '0
3410: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d ';. c =
3420: 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20 20 *++fmt;.
3430: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d }. }. }
3440: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 72 65 63 else{. prec
3450: 69 73 69 6f 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 ision = -1;.
3460: 7d 0a 20 20 20 20 2f 2a 20 47 65 74 20 74 68 65 }. /* Get the
3470: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 74 79 70 65 conversion type
3480: 20 6d 6f 64 69 66 69 65 72 20 2a 2f 0a 20 20 20 modifier */.
3490: 20 69 66 28 20 63 3d 3d 27 6c 27 20 29 7b 0a 20 if( c=='l' ){.
34a0: 20 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d flag_long =
34b0: 20 31 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 2b 1;. c = *+
34c0: 2b 66 6d 74 3b 0a 20 20 20 20 20 20 69 66 28 20 +fmt;. if(
34d0: 63 3d 3d 27 6c 27 20 29 7b 0a 20 20 20 20 20 20 c=='l' ){.
34e0: 20 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 flag_longlong
34f0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 20 3d = 1;. c =
3500: 20 2a 2b 2b 66 6d 74 3b 0a 20 20 20 20 20 20 7d *++fmt;. }
3510: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6c else{. fl
3520: 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20 30 3b ag_longlong = 0;
3530: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c . }. }el
3540: 73 65 7b 0a 20 20 20 20 20 20 66 6c 61 67 5f 6c se{. flag_l
3550: 6f 6e 67 20 3d 20 66 6c 61 67 5f 6c 6f 6e 67 6c ong = flag_longl
3560: 6f 6e 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 ong = 0;. }.
3570: 20 20 20 2f 2a 20 46 65 74 63 68 20 74 68 65 20 /* Fetch the
3580: 69 6e 66 6f 20 65 6e 74 72 79 20 66 6f 72 20 74 info entry for t
3590: 68 65 20 66 69 65 6c 64 20 2a 2f 0a 20 20 20 20 he field */.
35a0: 69 6e 66 6f 70 20 3d 20 30 3b 0a 20 20 20 20 78 infop = 0;. x
35b0: 74 79 70 65 20 3d 20 65 74 45 52 52 4f 52 3b 0a type = etERROR;.
35c0: 20 20 20 20 66 6f 72 28 69 64 78 3d 30 3b 20 69 for(idx=0; i
35d0: 64 78 3c 65 74 4e 49 4e 46 4f 3b 20 69 64 78 2b dx<etNINFO; idx+
35e0: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63 3d +){. if( c=
35f0: 3d 66 6d 74 69 6e 66 6f 5b 69 64 78 5d 2e 66 6d =fmtinfo[idx].fm
3600: 74 74 79 70 65 20 29 7b 0a 20 20 20 20 20 20 20 ttype ){.
3610: 20 69 6e 66 6f 70 20 3d 20 26 66 6d 74 69 6e 66 infop = &fmtinf
3620: 6f 5b 69 64 78 5d 3b 0a 20 20 20 20 20 20 20 20 o[idx];.
3630: 78 74 79 70 65 20 3d 20 69 6e 66 6f 70 2d 3e 74 xtype = infop->t
3640: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 ype;. bre
3650: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 ak;. }.
3660: 7d 0a 20 20 20 20 7a 45 78 74 72 61 20 3d 20 30 }. zExtra = 0
3670: 3b 0a 0a 20 20 20 20 2f 2a 20 4c 69 6d 69 74 20 ;.. /* Limit
3680: 74 68 65 20 70 72 65 63 69 73 69 6f 6e 20 74 6f the precision to
3690: 20 70 72 65 76 65 6e 74 20 6f 76 65 72 66 6c 6f prevent overflo
36a0: 77 69 6e 67 20 62 75 66 5b 5d 20 64 75 72 69 6e wing buf[] durin
36b0: 67 20 63 6f 6e 76 65 72 73 69 6f 6e 20 2a 2f 0a g conversion */.
36c0: 20 20 20 20 69 66 28 20 70 72 65 63 69 73 69 6f if( precisio
36d0: 6e 3e 65 74 42 55 46 53 49 5a 45 2d 34 30 20 26 n>etBUFSIZE-40 &
36e0: 26 20 28 69 6e 66 6f 70 2d 3e 66 6c 61 67 73 20 & (infop->flags
36f0: 26 20 46 4c 41 47 5f 53 54 52 49 4e 47 29 3d 3d & FLAG_STRING)==
3700: 30 20 29 7b 0a 20 20 20 20 20 20 70 72 65 63 69 0 ){. preci
3710: 73 69 6f 6e 20 3d 20 65 74 42 55 46 53 49 5a 45 sion = etBUFSIZE
3720: 2d 34 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 -40;. }..
3730: 2f 2a 0a 20 20 20 20 2a 2a 20 41 74 20 74 68 69 /*. ** At thi
3740: 73 20 70 6f 69 6e 74 2c 20 76 61 72 69 61 62 6c s point, variabl
3750: 65 73 20 61 72 65 20 69 6e 69 74 69 61 6c 69 7a es are initializ
3760: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 ed as follows:.
3770: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 66 **. ** f
3780: 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 lag_alternatefor
3790: 6d 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20 m TRUE
37a0: 69 66 20 61 20 27 23 27 20 69 73 20 70 72 65 73 if a '#' is pres
37b0: 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c ent.. ** fl
37c0: 61 67 5f 61 6c 74 66 6f 72 6d 32 20 20 20 20 20 ag_altform2
37d0: 20 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69 TRUE i
37e0: 66 20 61 20 27 21 27 20 69 73 20 70 72 65 73 65 f a '!' is prese
37f0: 6e 74 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 nt.. ** fla
3800: 67 5f 70 6c 75 73 73 69 67 6e 20 20 20 20 20 20 g_plussign
3810: 20 20 20 20 20 20 20 20 20 54 52 55 45 20 69 66 TRUE if
3820: 20 61 20 27 2b 27 20 69 73 20 70 72 65 73 65 6e a '+' is presen
3830: 74 2e 0a 20 20 20 20 2a 2a 20 20 20 66 6c 61 67 t.. ** flag
3840: 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 20 20 20 _leftjustify
3850: 20 20 20 20 20 20 20 20 54 52 55 45 20 69 66 20 TRUE if
3860: 61 20 27 2d 27 20 69 73 20 70 72 65 73 65 6e 74 a '-' is present
3870: 20 6f 72 20 69 66 20 74 68 65 0a 20 20 20 20 2a or if the. *
3880: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
38a0: 66 69 65 6c 64 20 77 69 64 74 68 20 77 61 73 20 field width was
38b0: 6e 65 67 61 74 69 76 65 2e 0a 20 20 20 20 2a 2a negative.. **
38c0: 20 20 20 66 6c 61 67 5f 7a 65 72 6f 70 61 64 20 flag_zeropad
38d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 T
38e0: 52 55 45 20 69 66 20 74 68 65 20 77 69 64 74 68 RUE if the width
38f0: 20 62 65 67 61 6e 20 77 69 74 68 20 30 2e 0a 20 began with 0..
3900: 20 20 20 2a 2a 20 20 20 66 6c 61 67 5f 6c 6f 6e ** flag_lon
3910: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 g
3920: 20 20 20 20 54 52 55 45 20 69 66 20 74 68 65 20 TRUE if the
3930: 6c 65 74 74 65 72 20 27 6c 27 20 28 65 6c 6c 29 letter 'l' (ell)
3940: 20 70 72 65 66 69 78 65 64 0a 20 20 20 20 2a 2a prefixed. **
3950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 t
3970: 68 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63 68 he conversion ch
3980: 61 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20 aracter.. **
3990: 20 20 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 flag_longlong
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 52 TR
39b0: 55 45 20 69 66 20 74 68 65 20 6c 65 74 74 65 72 UE if the letter
39c0: 20 27 6c 6c 27 20 28 65 6c 6c 20 65 6c 6c 29 20 'll' (ell ell)
39d0: 70 72 65 66 69 78 65 64 0a 20 20 20 20 2a 2a 20 prefixed. **
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
39f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 th
3a00: 65 20 63 6f 6e 76 65 72 73 69 6f 6e 20 63 68 61 e conversion cha
3a10: 72 61 63 74 65 72 2e 0a 20 20 20 20 2a 2a 20 20 racter.. **
3a20: 20 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 flag_blanksign
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 54 52 55 TRU
3a40: 45 20 69 66 20 61 20 27 20 27 20 69 73 20 70 72 E if a ' ' is pr
3a50: 65 73 65 6e 74 2e 0a 20 20 20 20 2a 2a 20 20 20 esent.. **
3a60: 77 69 64 74 68 20 20 20 20 20 20 20 20 20 20 20 width
3a70: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 The
3a80: 73 70 65 63 69 66 69 65 64 20 66 69 65 6c 64 20 specified field
3a90: 77 69 64 74 68 2e 20 20 54 68 69 73 20 69 73 0a width. This is.
3aa0: 20 20 20 20 2a 2a 20 20 20 20 20 20 20 20 20 20 **
3ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3ac0: 20 20 20 20 20 61 6c 77 61 79 73 20 6e 6f 6e 2d always non-
3ad0: 6e 65 67 61 74 69 76 65 2e 20 20 5a 65 72 6f 20 negative. Zero
3ae0: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e 0a is the default..
3af0: 20 20 20 20 2a 2a 20 20 20 70 72 65 63 69 73 69 ** precisi
3b00: 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20 20 on
3b10: 20 20 20 20 20 54 68 65 20 73 70 65 63 69 66 69 The specifi
3b20: 65 64 20 70 72 65 63 69 73 69 6f 6e 2e 20 20 54 ed precision. T
3b30: 68 65 20 64 65 66 61 75 6c 74 0a 20 20 20 20 2a he default. *
3b40: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 *
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3b60: 69 73 20 2d 31 2e 0a 20 20 20 20 2a 2a 20 20 20 is -1.. **
3b70: 78 74 79 70 65 20 20 20 20 20 20 20 20 20 20 20 xtype
3b80: 20 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 The
3b90: 63 6c 61 73 73 20 6f 66 20 74 68 65 20 63 6f 6e class of the con
3ba0: 76 65 72 73 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 version.. **
3bb0: 20 20 69 6e 66 6f 70 20 20 20 20 20 20 20 20 20 infop
3bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 6f Po
3bd0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 61 70 70 inter to the app
3be0: 72 6f 70 72 69 61 74 65 20 69 6e 66 6f 20 73 74 ropriate info st
3bf0: 72 75 63 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 ruct.. */.
3c00: 20 73 77 69 74 63 68 28 20 78 74 79 70 65 20 29 switch( xtype )
3c10: 7b 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 50 {. case etP
3c20: 4f 49 4e 54 45 52 3a 0a 20 20 20 20 20 20 20 20 OINTER:.
3c30: 66 6c 61 67 5f 6c 6f 6e 67 6c 6f 6e 67 20 3d 20 flag_longlong =
3c40: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3d 3d 73 sizeof(char*)==s
3c50: 69 7a 65 6f 66 28 69 36 34 29 3b 0a 20 20 20 20 izeof(i64);.
3c60: 20 20 20 20 66 6c 61 67 5f 6c 6f 6e 67 20 3d 20 flag_long =
3c70: 73 69 7a 65 6f 66 28 63 68 61 72 2a 29 3d 3d 73 sizeof(char*)==s
3c80: 69 7a 65 6f 66 28 6c 6f 6e 67 20 69 6e 74 29 3b izeof(long int);
3c90: 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c . /* Fall
3ca0: 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 74 68 through into th
3cb0: 65 20 6e 65 78 74 20 63 61 73 65 20 2a 2f 0a 20 e next case */.
3cc0: 20 20 20 20 20 63 61 73 65 20 65 74 52 41 44 49 case etRADI
3cd0: 58 3a 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 X:. if( i
3ce0: 6e 66 6f 70 2d 3e 66 6c 61 67 73 20 26 20 46 4c nfop->flags & FL
3cf0: 41 47 5f 53 49 47 4e 45 44 20 29 7b 0a 20 20 20 AG_SIGNED ){.
3d00: 20 20 20 20 20 20 20 69 36 34 20 76 3b 0a 20 20 i64 v;.
3d10: 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 if( flag
3d20: 5f 6c 6f 6e 67 6c 6f 6e 67 20 29 20 20 20 76 20 _longlong ) v
3d30: 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 36 34 29 = va_arg(ap,i64)
3d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 ;. else
3d50: 20 69 66 28 20 66 6c 61 67 5f 6c 6f 6e 67 20 29 if( flag_long )
3d60: 20 20 76 20 3d 20 76 61 5f 61 72 67 28 61 70 2c v = va_arg(ap,
3d70: 6c 6f 6e 67 20 69 6e 74 29 3b 0a 20 20 20 20 20 long int);.
3d80: 20 20 20 20 20 65 6c 73 65 20 20 20 20 20 20 20 else
3d90: 20 20 20 20 20 20 20 20 20 20 20 76 20 3d 20 76 v = v
3da0: 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 3b 0a 20 a_arg(ap,int);.
3db0: 20 20 20 20 20 20 20 20 20 69 66 28 20 76 3c 30 if( v<0
3dc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 ){.
3dd0: 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 2d 76 3b 0a longvalue = -v;.
3de0: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 65 66 pref
3df0: 69 78 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 ix = '-';.
3e00: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
3e10: 20 20 20 20 20 20 20 6c 6f 6e 67 76 61 6c 75 65 longvalue
3e20: 20 3d 20 76 3b 0a 20 20 20 20 20 20 20 20 20 20 = v;.
3e30: 20 20 69 66 28 20 66 6c 61 67 5f 70 6c 75 73 73 if( flag_pluss
3e40: 69 67 6e 20 29 20 20 20 20 20 20 20 20 70 72 65 ign ) pre
3e50: 66 69 78 20 3d 20 27 2b 27 3b 0a 20 20 20 20 20 fix = '+';.
3e60: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 else if(
3e70: 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 29 flag_blanksign )
3e80: 20 20 70 72 65 66 69 78 20 3d 20 27 20 27 3b 0a prefix = ' ';.
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 else
3ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
3eb0: 20 20 20 20 20 20 20 70 72 65 66 69 78 20 3d 20 prefix =
3ec0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 0;. }.
3ed0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 }else{.
3ee0: 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 if( flag
3ef0: 5f 6c 6f 6e 67 6c 6f 6e 67 20 29 20 20 20 6c 6f _longlong ) lo
3f00: 6e 67 76 61 6c 75 65 20 3d 20 76 61 5f 61 72 67 ngvalue = va_arg
3f10: 28 61 70 2c 75 36 34 29 3b 0a 20 20 20 20 20 20 (ap,u64);.
3f20: 20 20 20 20 65 6c 73 65 20 69 66 28 20 66 6c 61 else if( fla
3f30: 67 5f 6c 6f 6e 67 20 29 20 20 6c 6f 6e 67 76 61 g_long ) longva
3f40: 6c 75 65 20 3d 20 76 61 5f 61 72 67 28 61 70 2c lue = va_arg(ap,
3f50: 75 6e 73 69 67 6e 65 64 20 6c 6f 6e 67 20 69 6e unsigned long in
3f60: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 6c t);. el
3f70: 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 se
3f80: 20 20 20 20 6c 6f 6e 67 76 61 6c 75 65 20 3d 20 longvalue =
3f90: 76 61 5f 61 72 67 28 61 70 2c 75 6e 73 69 67 6e va_arg(ap,unsign
3fa0: 65 64 20 69 6e 74 29 3b 0a 20 20 20 20 20 20 20 ed int);.
3fb0: 20 20 20 70 72 65 66 69 78 20 3d 20 30 3b 0a 20 prefix = 0;.
3fc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
3fd0: 20 69 66 28 20 6c 6f 6e 67 76 61 6c 75 65 3d 3d if( longvalue==
3fe0: 30 20 29 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 0 ) flag_alterna
3ff0: 74 65 66 6f 72 6d 20 3d 20 30 3b 0a 20 20 20 20 teform = 0;.
4000: 20 20 20 20 69 66 28 20 66 6c 61 67 5f 7a 65 72 if( flag_zer
4010: 6f 70 61 64 20 26 26 20 70 72 65 63 69 73 69 6f opad && precisio
4020: 6e 3c 77 69 64 74 68 2d 28 70 72 65 66 69 78 21 n<width-(prefix!
4030: 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 =0) ){.
4040: 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 77 69 64 precision = wid
4050: 74 68 2d 28 70 72 65 66 69 78 21 3d 30 29 3b 0a th-(prefix!=0);.
4060: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
4070: 20 20 62 75 66 70 74 20 3d 20 26 62 75 66 5b 65 bufpt = &buf[e
4080: 74 42 55 46 53 49 5a 45 2d 31 5d 3b 0a 20 20 20 tBUFSIZE-1];.
4090: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 {.
40a0: 20 72 65 67 69 73 74 65 72 20 63 6f 6e 73 74 20 register const
40b0: 63 68 61 72 20 2a 63 73 65 74 3b 20 20 20 20 20 char *cset;
40c0: 20 2f 2a 20 55 73 65 20 72 65 67 69 73 74 65 72 /* Use register
40d0: 73 20 66 6f 72 20 73 70 65 65 64 20 2a 2f 0a 20 s for speed */.
40e0: 20 20 20 20 20 20 20 20 20 72 65 67 69 73 74 65 registe
40f0: 72 20 69 6e 74 20 62 61 73 65 3b 0a 20 20 20 20 r int base;.
4100: 20 20 20 20 20 20 63 73 65 74 20 3d 20 26 61 44 cset = &aD
4110: 69 67 69 74 73 5b 69 6e 66 6f 70 2d 3e 63 68 61 igits[infop->cha
4120: 72 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 20 rset];.
4130: 20 62 61 73 65 20 3d 20 69 6e 66 6f 70 2d 3e 62 base = infop->b
4140: 61 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 64 ase;. d
4150: 6f 7b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 o{
4160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 /*
4180: 43 6f 6e 76 65 72 74 20 74 6f 20 61 73 63 69 69 Convert to ascii
4190: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 */.
41a0: 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 63 73 65 *(--bufpt) = cse
41b0: 74 5b 6c 6f 6e 67 76 61 6c 75 65 25 62 61 73 65 t[longvalue%base
41c0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c ];. l
41d0: 6f 6e 67 76 61 6c 75 65 20 3d 20 6c 6f 6e 67 76 ongvalue = longv
41e0: 61 6c 75 65 2f 62 61 73 65 3b 0a 20 20 20 20 20 alue/base;.
41f0: 20 20 20 20 20 7d 77 68 69 6c 65 28 20 6c 6f 6e }while( lon
4200: 67 76 61 6c 75 65 3e 30 20 29 3b 0a 20 20 20 20 gvalue>0 );.
4210: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 }. le
4220: 6e 67 74 68 20 3d 20 26 62 75 66 5b 65 74 42 55 ngth = &buf[etBU
4230: 46 53 49 5a 45 2d 31 5d 2d 62 75 66 70 74 3b 0a FSIZE-1]-bufpt;.
4240: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 while( p
4250: 72 65 63 69 73 69 6f 6e 3e 6c 65 6e 67 74 68 20 recision>length
4260: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2a 28 2d ){. *(-
4270: 2d 62 75 66 70 74 29 20 3d 20 27 30 27 3b 20 20 -bufpt) = '0';
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
4290: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 /* Ze
42a0: 72 6f 20 70 61 64 20 2a 2f 0a 20 20 20 20 20 20 ro pad */.
42b0: 20 20 20 20 6c 65 6e 67 74 68 2b 2b 3b 0a 20 20 length++;.
42c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 }.
42d0: 69 66 28 20 63 54 68 6f 75 73 61 6e 64 20 29 7b if( cThousand ){
42e0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e . int n
42f0: 6e 20 3d 20 28 6c 65 6e 67 74 68 20 2d 20 31 29 n = (length - 1)
4300: 2f 33 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f /3; /* Number o
4310: 66 20 22 2c 22 20 74 6f 20 69 6e 73 65 72 74 20 f "," to insert
4320: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 */. int
4330: 20 69 78 20 3d 20 28 6c 65 6e 67 74 68 20 2d 20 ix = (length -
4340: 31 29 25 33 20 2b 20 31 3b 0a 20 20 20 20 20 20 1)%3 + 1;.
4350: 20 20 20 20 62 75 66 70 74 20 2d 3d 20 6e 6e 3b bufpt -= nn;
4360: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 . for(i
4370: 64 78 3d 30 3b 20 6e 6e 3e 30 3b 20 69 64 78 2b dx=0; nn>0; idx+
4380: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 +){.
4390: 62 75 66 70 74 5b 69 64 78 5d 20 3d 20 62 75 66 bufpt[idx] = buf
43a0: 70 74 5b 69 64 78 2b 6e 6e 5d 3b 0a 20 20 20 20 pt[idx+nn];.
43b0: 20 20 20 20 20 20 20 20 69 78 2d 2d 3b 0a 20 20 ix--;.
43c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 78 if( ix
43d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 ==0 ){.
43e0: 20 20 20 20 20 62 75 66 70 74 5b 2b 2b 69 64 78 bufpt[++idx
43f0: 5d 20 3d 20 63 54 68 6f 75 73 61 6e 64 3b 0a 20 ] = cThousand;.
4400: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 6e 2d nn-
4410: 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 -;.
4420: 20 69 78 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 ix = 3;.
4430: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 }.
4440: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
4450: 20 20 20 20 20 69 66 28 20 70 72 65 66 69 78 20 if( prefix
4460: 29 20 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 70 ) *(--bufpt) = p
4470: 72 65 66 69 78 3b 20 20 20 20 20 20 20 20 20 20 refix;
4480: 20 20 20 20 20 2f 2a 20 41 64 64 20 73 69 67 6e /* Add sign
4490: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 */. if(
44a0: 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f flag_alternatefo
44b0: 72 6d 20 26 26 20 69 6e 66 6f 70 2d 3e 70 72 65 rm && infop->pre
44c0: 66 69 78 20 29 7b 20 20 20 20 20 20 2f 2a 20 41 fix ){ /* A
44d0: 64 64 20 22 30 22 20 6f 72 20 22 30 78 22 20 2a dd "0" or "0x" *
44e0: 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 /. cons
44f0: 74 20 63 68 61 72 20 2a 70 72 65 3b 0a 20 20 20 t char *pre;.
4500: 20 20 20 20 20 20 20 63 68 61 72 20 78 3b 0a 20 char x;.
4510: 20 20 20 20 20 20 20 20 20 70 72 65 20 3d 20 26 pre = &
4520: 61 50 72 65 66 69 78 5b 69 6e 66 6f 70 2d 3e 70 aPrefix[infop->p
4530: 72 65 66 69 78 5d 3b 0a 20 20 20 20 20 20 20 20 refix];.
4540: 20 20 69 66 28 20 2a 62 75 66 70 74 21 3d 70 72 if( *bufpt!=pr
4550: 65 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 e[0] ){.
4560: 20 20 20 20 66 6f 72 28 3b 20 28 78 3d 28 2a 70 for(; (x=(*p
4570: 72 65 29 29 21 3d 30 3b 20 70 72 65 2b 2b 29 20 re))!=0; pre++)
4580: 2a 28 2d 2d 62 75 66 70 74 29 20 3d 20 78 3b 0a *(--bufpt) = x;.
4590: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 }.
45a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6c 65 }. le
45b0: 6e 67 74 68 20 3d 20 26 62 75 66 5b 65 74 42 55 ngth = &buf[etBU
45c0: 46 53 49 5a 45 2d 31 5d 2d 62 75 66 70 74 3b 0a FSIZE-1]-bufpt;.
45d0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
45e0: 20 20 20 20 20 63 61 73 65 20 65 74 46 4c 4f 41 case etFLOA
45f0: 54 3a 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 T:. case et
4600: 45 58 50 3a 0a 20 20 20 20 20 20 63 61 73 65 20 EXP:. case
4610: 65 74 47 45 4e 45 52 49 43 3a 0a 20 20 20 20 20 etGENERIC:.
4620: 20 20 20 72 65 61 6c 76 61 6c 75 65 20 3d 20 76 realvalue = v
4630: 61 5f 61 72 67 28 61 70 2c 64 6f 75 62 6c 65 29 a_arg(ap,double)
4640: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 72 ;. if( pr
4650: 65 63 69 73 69 6f 6e 3c 30 20 29 20 70 72 65 63 ecision<0 ) prec
4660: 69 73 69 6f 6e 20 3d 20 36 3b 20 20 20 20 20 20 ision = 6;
4670: 20 20 20 2f 2a 20 53 65 74 20 64 65 66 61 75 6c /* Set defaul
4680: 74 20 70 72 65 63 69 73 69 6f 6e 20 2a 2f 0a 20 t precision */.
4690: 20 20 20 20 20 20 20 69 66 28 20 70 72 65 63 69 if( preci
46a0: 73 69 6f 6e 3e 65 74 42 55 46 53 49 5a 45 2f 32 sion>etBUFSIZE/2
46b0: 2d 31 30 20 29 20 70 72 65 63 69 73 69 6f 6e 20 -10 ) precision
46c0: 3d 20 65 74 42 55 46 53 49 5a 45 2f 32 2d 31 30 = etBUFSIZE/2-10
46d0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 65 ;. if( re
46e0: 61 6c 76 61 6c 75 65 3c 30 2e 30 20 29 7b 0a 20 alvalue<0.0 ){.
46f0: 20 20 20 20 20 20 20 20 20 72 65 61 6c 76 61 6c realval
4700: 75 65 20 3d 20 2d 72 65 61 6c 76 61 6c 75 65 3b ue = -realvalue;
4710: 0a 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 . prefi
4720: 78 20 3d 20 27 2d 27 3b 0a 20 20 20 20 20 20 20 x = '-';.
4730: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
4740: 20 20 69 66 28 20 66 6c 61 67 5f 70 6c 75 73 73 if( flag_pluss
4750: 69 67 6e 20 29 20 20 20 20 20 20 20 20 20 20 70 ign ) p
4760: 72 65 66 69 78 20 3d 20 27 2b 27 3b 0a 20 20 20 refix = '+';.
4770: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 else if(
4780: 66 6c 61 67 5f 62 6c 61 6e 6b 73 69 67 6e 20 29 flag_blanksign )
4790: 20 20 20 20 70 72 65 66 69 78 20 3d 20 27 20 27 prefix = ' '
47a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 65 6c 73 65 ;. else
47b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
47c0: 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78 20 prefix
47d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 = 0;. }.
47e0: 20 20 20 20 20 20 20 69 66 28 20 78 74 79 70 65 if( xtype
47f0: 3d 3d 65 74 47 45 4e 45 52 49 43 20 26 26 20 70 ==etGENERIC && p
4800: 72 65 63 69 73 69 6f 6e 3e 30 20 29 20 70 72 65 recision>0 ) pre
4810: 63 69 73 69 6f 6e 2d 2d 3b 0a 23 69 66 20 30 0a cision--;.#if 0.
4820: 20 20 20 20 20 20 20 20 2f 2a 20 52 6f 75 6e 64 /* Round
4830: 69 6e 67 20 77 6f 72 6b 73 20 6c 69 6b 65 20 42 ing works like B
4840: 53 44 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 73 SD when the cons
4850: 74 61 6e 74 20 30 2e 34 39 39 39 20 69 73 20 75 tant 0.4999 is u
4860: 73 65 64 2e 20 20 57 69 65 72 64 21 20 2a 2f 0a sed. Wierd! */.
4870: 20 20 20 20 20 20 20 20 66 6f 72 28 69 64 78 3d for(idx=
4880: 70 72 65 63 69 73 69 6f 6e 2c 20 72 6f 75 6e 64 precision, round
4890: 65 72 3d 30 2e 34 39 39 39 3b 20 69 64 78 3e 30 er=0.4999; idx>0
48a0: 3b 20 69 64 78 2d 2d 2c 20 72 6f 75 6e 64 65 72 ; idx--, rounder
48b0: 2a 3d 30 2e 31 29 3b 0a 23 65 6c 73 65 0a 20 20 *=0.1);.#else.
48c0: 20 20 20 20 20 20 2f 2a 20 49 74 20 6d 61 6b 65 /* It make
48d0: 73 20 6d 6f 72 65 20 73 65 6e 73 65 20 74 6f 20 s more sense to
48e0: 75 73 65 20 30 2e 35 20 2a 2f 0a 20 20 20 20 20 use 0.5 */.
48f0: 20 20 20 66 6f 72 28 69 64 78 3d 70 72 65 63 69 for(idx=preci
4900: 73 69 6f 6e 2c 20 72 6f 75 6e 64 65 72 3d 30 2e sion, rounder=0.
4910: 35 3b 20 69 64 78 3e 30 3b 20 69 64 78 2d 2d 2c 5; idx>0; idx--,
4920: 20 72 6f 75 6e 64 65 72 2a 3d 30 2e 31 29 3b 0a rounder*=0.1);.
4930: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 #endif. i
4940: 66 28 20 78 74 79 70 65 3d 3d 65 74 46 4c 4f 41 f( xtype==etFLOA
4950: 54 20 29 20 72 65 61 6c 76 61 6c 75 65 20 2b 3d T ) realvalue +=
4960: 20 72 6f 75 6e 64 65 72 3b 0a 20 20 20 20 20 20 rounder;.
4970: 20 20 2f 2a 20 4e 6f 72 6d 61 6c 69 7a 65 20 72 /* Normalize r
4980: 65 61 6c 76 61 6c 75 65 20 74 6f 20 77 69 74 68 ealvalue to with
4990: 69 6e 20 31 30 2e 30 20 3e 20 72 65 61 6c 76 61 in 10.0 > realva
49a0: 6c 75 65 20 3e 3d 20 31 2e 30 20 2a 2f 0a 20 20 lue >= 1.0 */.
49b0: 20 20 20 20 20 20 65 78 70 20 3d 20 30 3b 0a 20 exp = 0;.
49c0: 20 20 20 20 20 20 20 69 66 28 20 72 65 61 6c 76 if( realv
49d0: 61 6c 75 65 3e 30 2e 30 20 29 7b 0a 20 20 20 20 alue>0.0 ){.
49e0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 while( rea
49f0: 6c 76 61 6c 75 65 3e 3d 31 65 33 32 20 26 26 20 lvalue>=1e32 &&
4a00: 65 78 70 3c 3d 33 35 30 20 29 7b 20 72 65 61 6c exp<=350 ){ real
4a10: 76 61 6c 75 65 20 2a 3d 20 31 65 2d 33 32 3b 20 value *= 1e-32;
4a20: 65 78 70 2b 3d 33 32 3b 20 7d 0a 20 20 20 20 20 exp+=32; }.
4a30: 20 20 20 20 20 77 68 69 6c 65 28 20 72 65 61 6c while( real
4a40: 76 61 6c 75 65 3e 3d 31 65 38 20 26 26 20 65 78 value>=1e8 && ex
4a50: 70 3c 3d 33 35 30 20 29 7b 20 72 65 61 6c 76 61 p<=350 ){ realva
4a60: 6c 75 65 20 2a 3d 20 31 65 2d 38 3b 20 65 78 70 lue *= 1e-8; exp
4a70: 2b 3d 38 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 +=8; }.
4a80: 20 77 68 69 6c 65 28 20 72 65 61 6c 76 61 6c 75 while( realvalu
4a90: 65 3e 3d 31 30 2e 30 20 26 26 20 65 78 70 3c 3d e>=10.0 && exp<=
4aa0: 33 35 30 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 350 ){ realvalue
4ab0: 20 2a 3d 20 30 2e 31 3b 20 65 78 70 2b 2b 3b 20 *= 0.1; exp++;
4ac0: 7d 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c }. whil
4ad0: 65 28 20 72 65 61 6c 76 61 6c 75 65 3c 31 65 2d e( realvalue<1e-
4ae0: 38 20 26 26 20 65 78 70 3e 3d 2d 33 35 30 20 29 8 && exp>=-350 )
4af0: 7b 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d 20 31 { realvalue *= 1
4b00: 65 38 3b 20 65 78 70 2d 3d 38 3b 20 7d 0a 20 20 e8; exp-=8; }.
4b10: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 while( r
4b20: 65 61 6c 76 61 6c 75 65 3c 31 2e 30 20 26 26 20 ealvalue<1.0 &&
4b30: 65 78 70 3e 3d 2d 33 35 30 20 29 7b 20 72 65 61 exp>=-350 ){ rea
4b40: 6c 76 61 6c 75 65 20 2a 3d 20 31 30 2e 30 3b 20 lvalue *= 10.0;
4b50: 65 78 70 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 20 exp--; }.
4b60: 20 20 20 69 66 28 20 65 78 70 3e 33 35 30 20 7c if( exp>350 |
4b70: 7c 20 65 78 70 3c 2d 33 35 30 20 29 7b 0a 20 20 | exp<-350 ){.
4b80: 20 20 20 20 20 20 20 20 20 20 62 75 66 70 74 20 bufpt
4b90: 3d 20 22 4e 61 4e 22 3b 0a 20 20 20 20 20 20 20 = "NaN";.
4ba0: 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 33 3b length = 3;
4bb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 . bre
4bc0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a ak;. }.
4bd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
4be0: 20 20 62 75 66 70 74 20 3d 20 62 75 66 3b 0a 20 bufpt = buf;.
4bf0: 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 /*.
4c00: 20 20 2a 2a 20 49 66 20 74 68 65 20 66 69 65 6c ** If the fiel
4c10: 64 20 74 79 70 65 20 69 73 20 65 74 47 45 4e 45 d type is etGENE
4c20: 52 49 43 2c 20 74 68 65 6e 20 63 6f 6e 76 65 72 RIC, then conver
4c30: 74 20 74 6f 20 65 69 74 68 65 72 20 65 74 45 58 t to either etEX
4c40: 50 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 20 P. ** or
4c50: 65 74 46 4c 4f 41 54 2c 20 61 73 20 61 70 70 72 etFLOAT, as appr
4c60: 6f 70 72 69 61 74 65 2e 0a 20 20 20 20 20 20 20 opriate..
4c70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6c 61 67 */. flag
4c80: 5f 65 78 70 20 3d 20 78 74 79 70 65 3d 3d 65 74 _exp = xtype==et
4c90: 45 58 50 3b 0a 20 20 20 20 20 20 20 20 69 66 28 EXP;. if(
4ca0: 20 78 74 79 70 65 21 3d 65 74 46 4c 4f 41 54 20 xtype!=etFLOAT
4cb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 61 ){. rea
4cc0: 6c 76 61 6c 75 65 20 2b 3d 20 72 6f 75 6e 64 65 lvalue += rounde
4cd0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 r;. if(
4ce0: 20 72 65 61 6c 76 61 6c 75 65 3e 3d 31 30 2e 30 realvalue>=10.0
4cf0: 20 29 7b 20 72 65 61 6c 76 61 6c 75 65 20 2a 3d ){ realvalue *=
4d00: 20 30 2e 31 3b 20 65 78 70 2b 2b 3b 20 7d 0a 20 0.1; exp++; }.
4d10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
4d20: 20 69 66 28 20 78 74 79 70 65 3d 3d 65 74 47 45 if( xtype==etGE
4d30: 4e 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 20 NERIC ){.
4d40: 20 20 20 66 6c 61 67 5f 72 74 7a 20 3d 20 21 66 flag_rtz = !f
4d50: 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 lag_alternatefor
4d60: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 m;. if(
4d70: 20 65 78 70 3c 2d 34 20 7c 7c 20 65 78 70 3e 70 exp<-4 || exp>p
4d80: 72 65 63 69 73 69 6f 6e 20 29 7b 0a 20 20 20 20 recision ){.
4d90: 20 20 20 20 20 20 20 20 78 74 79 70 65 20 3d 20 xtype =
4da0: 65 74 45 58 50 3b 0a 20 20 20 20 20 20 20 20 20 etEXP;.
4db0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
4dc0: 20 20 20 20 70 72 65 63 69 73 69 6f 6e 20 3d 20 precision =
4dd0: 70 72 65 63 69 73 69 6f 6e 20 2d 20 65 78 70 3b precision - exp;
4de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 78 74 79 . xty
4df0: 70 65 20 3d 20 65 74 46 4c 4f 41 54 3b 0a 20 20 pe = etFLOAT;.
4e00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
4e10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
4e20: 20 20 20 66 6c 61 67 5f 72 74 7a 20 3d 20 30 3b flag_rtz = 0;
4e30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
4e40: 20 20 20 69 66 28 20 78 74 79 70 65 3d 3d 65 74 if( xtype==et
4e50: 45 58 50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 EXP ){.
4e60: 20 65 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 e2 = 0;.
4e70: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 }else{.
4e80: 20 20 65 32 20 3d 20 65 78 70 3b 0a 20 20 20 20 e2 = exp;.
4e90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 73 }. ns
4ea0: 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 66 d = 0;. f
4eb0: 6c 61 67 5f 64 70 20 3d 20 28 70 72 65 63 69 73 lag_dp = (precis
4ec0: 69 6f 6e 3e 30 29 20 7c 20 66 6c 61 67 5f 61 6c ion>0) | flag_al
4ed0: 74 65 72 6e 61 74 65 66 6f 72 6d 20 7c 20 66 6c ternateform | fl
4ee0: 61 67 5f 61 6c 74 66 6f 72 6d 32 3b 0a 20 20 20 ag_altform2;.
4ef0: 20 20 20 20 20 2f 2a 20 54 68 65 20 73 69 67 6e /* The sign
4f00: 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 74 68 65 in front of the
4f10: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 20 number */.
4f20: 20 20 20 69 66 28 20 70 72 65 66 69 78 20 29 7b if( prefix ){
4f30: 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 . *(buf
4f40: 70 74 2b 2b 29 20 3d 20 70 72 65 66 69 78 3b 0a pt++) = prefix;.
4f50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
4f60: 20 20 2f 2a 20 44 69 67 69 74 73 20 70 72 69 6f /* Digits prio
4f70: 72 20 74 6f 20 74 68 65 20 64 65 63 69 6d 61 6c r to the decimal
4f80: 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 20 20 point */.
4f90: 20 20 69 66 28 20 65 32 3c 30 20 29 7b 0a 20 20 if( e2<0 ){.
4fa0: 20 20 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b *(bufpt+
4fb0: 2b 29 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 +) = '0';.
4fc0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 }else{.
4fd0: 20 20 20 66 6f 72 28 3b 20 65 32 3e 3d 30 3b 20 for(; e2>=0;
4fe0: 65 32 2d 2d 29 7b 0a 20 20 20 20 20 20 20 20 20 e2--){.
4ff0: 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 *(bufpt++) =
5000: 65 74 5f 67 65 74 64 69 67 69 74 28 26 72 65 61 et_getdigit(&rea
5010: 6c 76 61 6c 75 65 2c 26 6e 73 64 29 3b 0a 20 20 lvalue,&nsd);.
5020: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
5030: 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 }. /* T
5040: 68 65 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 he decimal point
5050: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 */. if(
5060: 66 6c 61 67 5f 64 70 20 29 7b 0a 20 20 20 20 20 flag_dp ){.
5070: 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 *(bufpt++)
5080: 3d 20 27 2e 27 3b 0a 20 20 20 20 20 20 20 20 7d = '.';. }
5090: 0a 20 20 20 20 20 20 20 20 2f 2a 20 22 30 22 20 . /* "0"
50a0: 64 69 67 69 74 73 20 61 66 74 65 72 20 74 68 65 digits after the
50b0: 20 64 65 63 69 6d 61 6c 20 70 6f 69 6e 74 20 62 decimal point b
50c0: 75 74 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 ut before the fi
50d0: 72 73 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 rst. ** s
50e0: 69 67 6e 69 66 69 63 61 6e 74 20 64 69 67 69 74 ignificant digit
50f0: 20 6f 66 20 74 68 65 20 6e 75 6d 62 65 72 20 2a of the number *
5100: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 65 32 /. for(e2
5110: 2b 2b 3b 20 65 32 3c 30 20 26 26 20 70 72 65 63 ++; e2<0 && prec
5120: 69 73 69 6f 6e 3e 30 3b 20 70 72 65 63 69 73 69 ision>0; precisi
5130: 6f 6e 2d 2d 2c 20 65 32 2b 2b 29 7b 0a 20 20 20 on--, e2++){.
5140: 20 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b *(bufpt++
5150: 29 20 3d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 ) = '0';.
5160: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 69 }. /* Si
5170: 67 6e 69 66 69 63 61 6e 74 20 64 69 67 69 74 73 gnificant digits
5180: 20 61 66 74 65 72 20 74 68 65 20 64 65 63 69 6d after the decim
5190: 61 6c 20 70 6f 69 6e 74 20 2a 2f 0a 20 20 20 20 al point */.
51a0: 20 20 20 20 77 68 69 6c 65 28 20 28 70 72 65 63 while( (prec
51b0: 69 73 69 6f 6e 2d 2d 29 3e 30 20 29 7b 0a 20 20 ision--)>0 ){.
51c0: 20 20 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b *(bufpt+
51d0: 2b 29 20 3d 20 65 74 5f 67 65 74 64 69 67 69 74 +) = et_getdigit
51e0: 28 26 72 65 61 6c 76 61 6c 75 65 2c 26 6e 73 64 (&realvalue,&nsd
51f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 );. }.
5200: 20 20 20 20 20 2f 2a 20 52 65 6d 6f 76 65 20 74 /* Remove t
5210: 72 61 69 6c 69 6e 67 20 7a 65 72 6f 73 20 61 6e railing zeros an
5220: 64 20 74 68 65 20 22 2e 22 20 69 66 20 6e 6f 20 d the "." if no
5230: 64 69 67 69 74 73 20 66 6f 6c 6c 6f 77 20 74 68 digits follow th
5240: 65 20 22 2e 22 20 2a 2f 0a 20 20 20 20 20 20 20 e "." */.
5250: 20 69 66 28 20 66 6c 61 67 5f 72 74 7a 20 26 26 if( flag_rtz &&
5260: 20 66 6c 61 67 5f 64 70 20 29 7b 0a 20 20 20 20 flag_dp ){.
5270: 20 20 20 20 20 20 77 68 69 6c 65 28 20 62 75 66 while( buf
5280: 70 74 5b 2d 31 5d 3d 3d 27 30 27 20 29 20 2a 28 pt[-1]=='0' ) *(
5290: 2d 2d 62 75 66 70 74 29 20 3d 20 30 3b 0a 20 20 --bufpt) = 0;.
52a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 assert(
52b0: 62 75 66 70 74 3e 62 75 66 20 29 3b 0a 20 20 20 bufpt>buf );.
52c0: 20 20 20 20 20 20 20 69 66 28 20 62 75 66 70 74 if( bufpt
52d0: 5b 2d 31 5d 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 [-1]=='.' ){.
52e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 66 6c 61 if( fla
52f0: 67 5f 61 6c 74 66 6f 72 6d 32 20 29 7b 0a 20 20 g_altform2 ){.
5300: 20 20 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 *(bu
5310: 66 70 74 2b 2b 29 20 3d 20 27 30 27 3b 0a 20 20 fpt++) = '0';.
5320: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b }else{
5330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2a . *
5340: 28 2d 2d 62 75 66 70 74 29 20 3d 20 30 3b 0a 20 (--bufpt) = 0;.
5350: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }.
5360: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 }.
5370: 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 64 }. /* Ad
5380: 64 20 74 68 65 20 22 65 4e 4e 4e 22 20 73 75 66 d the "eNNN" suf
5390: 66 69 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 fix */. i
53a0: 66 28 20 66 6c 61 67 5f 65 78 70 20 7c 7c 20 28 f( flag_exp || (
53b0: 78 74 79 70 65 3d 3d 65 74 45 58 50 20 26 26 20 xtype==etEXP &&
53c0: 65 78 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 exp) ){.
53d0: 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 3d 20 61 *(bufpt++) = a
53e0: 44 69 67 69 74 73 5b 69 6e 66 6f 70 2d 3e 63 68 Digits[infop->ch
53f0: 61 72 73 65 74 5d 3b 0a 20 20 20 20 20 20 20 20 arset];.
5400: 20 20 69 66 28 20 65 78 70 3c 30 20 29 7b 0a 20 if( exp<0 ){.
5410: 20 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 *(buf
5420: 70 74 2b 2b 29 20 3d 20 27 2d 27 3b 20 65 78 70 pt++) = '-'; exp
5430: 20 3d 20 2d 65 78 70 3b 0a 20 20 20 20 20 20 20 = -exp;.
5440: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 }else{.
5450: 20 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 *(bufpt++)
5460: 20 3d 20 27 2b 27 3b 0a 20 20 20 20 20 20 20 20 = '+';.
5470: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 }. if
5480: 28 20 65 78 70 3e 3d 31 30 30 20 29 7b 0a 20 20 ( exp>=100 ){.
5490: 20 20 20 20 20 20 20 20 20 20 2a 28 62 75 66 70 *(bufp
54a0: 74 2b 2b 29 20 3d 20 28 65 78 70 2f 31 30 30 29 t++) = (exp/100)
54b0: 2b 27 30 27 3b 20 20 20 20 20 20 20 20 20 20 20 +'0';
54c0: 20 20 20 20 20 2f 2a 20 31 30 30 27 73 20 64 69 /* 100's di
54d0: 67 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 git */.
54e0: 20 20 20 65 78 70 20 25 3d 20 31 30 30 3b 0a 20 exp %= 100;.
54f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 }.
5500: 20 20 20 20 20 2a 28 62 75 66 70 74 2b 2b 29 20 *(bufpt++)
5510: 3d 20 65 78 70 2f 31 30 2b 27 30 27 3b 20 20 20 = exp/10+'0';
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
5530: 20 20 2f 2a 20 31 30 27 73 20 64 69 67 69 74 20 /* 10's digit
5540: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 2a 28 62 */. *(b
5550: 75 66 70 74 2b 2b 29 20 3d 20 65 78 70 25 31 30 ufpt++) = exp%10
5560: 2b 27 30 27 3b 20 20 20 20 20 20 20 20 20 20 20 +'0';
5570: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31 27 73 /* 1's
5580: 20 64 69 67 69 74 20 2a 2f 0a 20 20 20 20 20 20 digit */.
5590: 20 20 7d 0a 20 20 20 20 20 20 20 20 2a 62 75 66 }. *buf
55a0: 70 74 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 pt = 0;..
55b0: 20 2f 2a 20 54 68 65 20 63 6f 6e 76 65 72 74 65 /* The converte
55c0: 64 20 6e 75 6d 62 65 72 20 69 73 20 69 6e 20 62 d number is in b
55d0: 75 66 5b 5d 20 61 6e 64 20 7a 65 72 6f 20 74 65 uf[] and zero te
55e0: 72 6d 69 6e 61 74 65 64 2e 20 4f 75 74 70 75 74 rminated. Output
55f0: 20 69 74 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 it.. **
5600: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 6e 75 Note that the nu
5610: 6d 62 65 72 20 69 73 20 69 6e 20 74 68 65 20 75 mber is in the u
5620: 73 75 61 6c 20 6f 72 64 65 72 2c 20 6e 6f 74 20 sual order, not
5630: 72 65 76 65 72 73 65 64 20 61 73 20 77 69 74 68 reversed as with
5640: 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 74 65 . ** inte
5650: 67 65 72 20 63 6f 6e 76 65 72 73 69 6f 6e 73 2e ger conversions.
5660: 20 2a 2f 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 */. leng
5670: 74 68 20 3d 20 62 75 66 70 74 2d 62 75 66 3b 0a th = bufpt-buf;.
5680: 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 bufpt =
5690: 62 75 66 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a buf;.. /*
56a0: 20 53 70 65 63 69 61 6c 20 63 61 73 65 3a 20 20 Special case:
56b0: 41 64 64 20 6c 65 61 64 69 6e 67 20 7a 65 72 6f Add leading zero
56c0: 73 20 69 66 20 74 68 65 20 66 6c 61 67 5f 7a 65 s if the flag_ze
56d0: 72 6f 70 61 64 20 66 6c 61 67 20 69 73 0a 20 20 ropad flag is.
56e0: 20 20 20 20 20 20 2a 2a 20 73 65 74 20 61 6e 64 ** set and
56f0: 20 77 65 20 61 72 65 20 6e 6f 74 20 6c 65 66 74 we are not left
5700: 20 6a 75 73 74 69 66 69 65 64 20 2a 2f 0a 20 20 justified */.
5710: 20 20 20 20 20 20 69 66 28 20 66 6c 61 67 5f 7a if( flag_z
5720: 65 72 6f 70 61 64 20 26 26 20 21 66 6c 61 67 5f eropad && !flag_
5730: 6c 65 66 74 6a 75 73 74 69 66 79 20 26 26 20 6c leftjustify && l
5740: 65 6e 67 74 68 20 3c 20 77 69 64 74 68 29 7b 0a ength < width){.
5750: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b int i;
5760: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6e . int n
5770: 50 61 64 20 3d 20 77 69 64 74 68 20 2d 20 6c 65 Pad = width - le
5780: 6e 67 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 ngth;.
5790: 66 6f 72 28 69 3d 77 69 64 74 68 3b 20 69 3e 3d for(i=width; i>=
57a0: 6e 50 61 64 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 nPad; i--){.
57b0: 20 20 20 20 20 20 20 20 62 75 66 70 74 5b 69 5d bufpt[i]
57c0: 20 3d 20 62 75 66 70 74 5b 69 2d 6e 50 61 64 5d = bufpt[i-nPad]
57d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 ;. }.
57e0: 20 20 20 20 20 20 20 20 69 20 3d 20 70 72 65 66 i = pref
57f0: 69 78 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 20 ix!=0;.
5800: 20 77 68 69 6c 65 28 20 6e 50 61 64 2d 2d 20 29 while( nPad-- )
5810: 20 62 75 66 70 74 5b 69 2b 2b 5d 20 3d 20 27 30 bufpt[i++] = '0
5820: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 6c 65 6e ';. len
5830: 67 74 68 20 3d 20 77 69 64 74 68 3b 0a 20 20 20 gth = width;.
5840: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 }. b
5850: 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 73 65 reak;. case
5860: 20 65 74 53 49 5a 45 3a 0a 20 20 20 20 20 20 20 etSIZE:.
5870: 20 2a 28 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 *(va_arg(ap,int
5880: 2a 29 29 20 3d 20 63 6f 75 6e 74 3b 0a 20 20 20 *)) = count;.
5890: 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 77 69 length = wi
58a0: 64 74 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 dth = 0;.
58b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 63 61 break;. ca
58c0: 73 65 20 65 74 50 45 52 43 45 4e 54 3a 0a 20 20 se etPERCENT:.
58d0: 20 20 20 20 20 20 62 75 66 5b 30 5d 20 3d 20 27 buf[0] = '
58e0: 25 27 3b 0a 20 20 20 20 20 20 20 20 62 75 66 70 %';. bufp
58f0: 74 20 3d 20 62 75 66 3b 0a 20 20 20 20 20 20 20 t = buf;.
5900: 20 6c 65 6e 67 74 68 20 3d 20 31 3b 0a 20 20 20 length = 1;.
5910: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
5920: 20 20 63 61 73 65 20 65 74 43 48 41 52 58 3a 0a case etCHARX:.
5930: 20 20 20 20 20 20 20 20 63 20 3d 20 62 75 66 5b c = buf[
5940: 30 5d 20 3d 20 76 61 5f 61 72 67 28 61 70 2c 69 0] = va_arg(ap,i
5950: 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 nt);. if(
5960: 20 70 72 65 63 69 73 69 6f 6e 3e 3d 30 20 29 7b precision>=0 ){
5970: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 . for(i
5980: 64 78 3d 31 3b 20 69 64 78 3c 70 72 65 63 69 73 dx=1; idx<precis
5990: 69 6f 6e 3b 20 69 64 78 2b 2b 29 20 62 75 66 5b ion; idx++) buf[
59a0: 69 64 78 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 idx] = c;.
59b0: 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 70 72 65 length = pre
59c0: 63 69 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 cision;.
59d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 }else{.
59e0: 20 6c 65 6e 67 74 68 20 3d 31 3b 0a 20 20 20 20 length =1;.
59f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 62 75 }. bu
5a00: 66 70 74 20 3d 20 62 75 66 3b 0a 20 20 20 20 20 fpt = buf;.
5a10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 break;.
5a20: 63 61 73 65 20 65 74 50 41 54 48 3a 20 7b 0a 20 case etPATH: {.
5a30: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 int i;.
5a40: 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 int limit
5a50: 3d 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 = flag_alternate
5a60: 66 6f 72 6d 20 3f 20 76 61 5f 61 72 67 28 61 70 form ? va_arg(ap
5a70: 2c 69 6e 74 29 20 3a 20 2d 31 3b 0a 20 20 20 20 ,int) : -1;.
5a80: 20 20 20 20 63 68 61 72 20 2a 65 20 3d 20 76 61 char *e = va
5a90: 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a _arg(ap,char*);.
5aa0: 20 20 20 20 20 20 20 20 69 66 28 20 65 3d 3d 30 if( e==0
5ab0: 20 29 7b 65 3d 22 22 3b 7d 0a 20 20 20 20 20 20 ){e="";}.
5ac0: 20 20 6c 65 6e 67 74 68 20 3d 20 53 74 72 4e 4c length = StrNL
5ad0: 65 6e 33 32 28 65 2c 20 6c 69 6d 69 74 29 3b 0a en32(e, limit);.
5ae0: 20 20 20 20 20 20 20 20 7a 45 78 74 72 61 20 3d zExtra =
5af0: 20 62 75 66 70 74 20 3d 20 66 6f 73 73 69 6c 5f bufpt = fossil_
5b00: 6d 61 6c 6c 6f 63 28 6c 65 6e 67 74 68 2b 31 29 malloc(length+1)
5b10: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 ;. for( i
5b20: 3d 30 3b 20 69 3c 6c 65 6e 67 74 68 3b 20 69 2b =0; i<length; i+
5b30: 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 + ){. i
5b40: 66 28 20 65 5b 69 5d 3d 3d 27 5c 5c 27 20 29 7b f( e[i]=='\\' ){
5b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 75 66 . buf
5b60: 70 74 5b 69 5d 3d 27 2f 27 3b 0a 20 20 20 20 20 pt[i]='/';.
5b70: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 }else{.
5b80: 20 20 20 20 20 20 20 20 62 75 66 70 74 5b 69 5d bufpt[i]
5b90: 3d 65 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 =e[i];.
5ba0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 }. }.
5bb0: 20 20 20 20 20 62 75 66 70 74 5b 6c 65 6e 67 74 bufpt[lengt
5bc0: 68 5d 3d 27 5c 30 27 3b 0a 20 20 20 20 20 20 20 h]='\0';.
5bd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a break;. }.
5be0: 20 20 20 20 20 20 63 61 73 65 20 65 74 52 4f 4f case etROO
5bf0: 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 62 75 66 T: {. buf
5c00: 70 74 20 3d 20 67 2e 7a 54 6f 70 20 3f 20 67 2e pt = g.zTop ? g.
5c10: 7a 54 6f 70 20 3a 20 22 22 3b 0a 20 20 20 20 20 zTop : "";.
5c20: 20 20 20 6c 65 6e 67 74 68 20 3d 20 28 69 6e 74 length = (int
5c30: 29 73 74 72 6c 65 6e 28 62 75 66 70 74 29 3b 0a )strlen(bufpt);.
5c40: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
5c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 }. cas
5c60: 65 20 65 74 53 54 52 49 4e 47 49 44 3a 0a 20 20 e etSTRINGID:.
5c70: 20 20 20 20 63 61 73 65 20 65 74 53 54 52 49 4e case etSTRIN
5c80: 47 3a 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 G:. case et
5c90: 44 59 4e 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 DYNSTRING: {.
5ca0: 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d int limit =
5cb0: 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 flag_alternatef
5cc0: 6f 72 6d 20 3f 20 76 61 5f 61 72 67 28 61 70 2c orm ? va_arg(ap,
5cd0: 69 6e 74 29 20 3a 20 2d 31 3b 0a 20 20 20 20 20 int) : -1;.
5ce0: 20 20 20 62 75 66 70 74 20 3d 20 76 61 5f 61 72 bufpt = va_ar
5cf0: 67 28 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 g(ap,char*);.
5d00: 20 20 20 20 20 69 66 28 20 62 75 66 70 74 3d 3d if( bufpt==
5d10: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 0 ){. b
5d20: 75 66 70 74 20 3d 20 22 22 3b 0a 20 20 20 20 20 ufpt = "";.
5d30: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 74 79 }else if( xty
5d40: 70 65 3d 3d 65 74 44 59 4e 53 54 52 49 4e 47 20 pe==etDYNSTRING
5d50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 45 78 ){. zEx
5d60: 74 72 61 20 3d 20 62 75 66 70 74 3b 0a 20 20 20 tra = bufpt;.
5d70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 78 }else if( x
5d80: 74 79 70 65 3d 3d 65 74 53 54 52 49 4e 47 49 44 type==etSTRINGID
5d90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 ){. pr
5da0: 65 63 69 73 69 6f 6e 20 3d 20 68 61 73 68 44 69 ecision = hashDi
5db0: 67 69 74 73 28 66 6c 61 67 5f 61 6c 74 66 6f 72 gits(flag_altfor
5dc0: 6d 32 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 m2);. }.
5dd0: 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d 20 length =
5de0: 53 74 72 4e 4c 65 6e 33 32 28 62 75 66 70 74 2c StrNLen32(bufpt,
5df0: 20 6c 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 20 limit);.
5e00: 20 69 66 28 20 70 72 65 63 69 73 69 6f 6e 3e 3d if( precision>=
5e10: 30 20 26 26 20 70 72 65 63 69 73 69 6f 6e 3c 6c 0 && precision<l
5e20: 65 6e 67 74 68 20 29 20 6c 65 6e 67 74 68 20 3d ength ) length =
5e30: 20 70 72 65 63 69 73 69 6f 6e 3b 0a 20 20 20 20 precision;.
5e40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 break;.
5e50: 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 65 74 }. case et
5e60: 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 BLOB: {.
5e70: 69 6e 74 20 6c 69 6d 69 74 20 3d 20 66 6c 61 67 int limit = flag
5e80: 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 3f _alternateform ?
5e90: 20 76 61 5f 61 72 67 28 61 70 2c 20 69 6e 74 29 va_arg(ap, int)
5ea0: 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 42 : -1;. B
5eb0: 6c 6f 62 20 2a 70 42 6c 6f 62 20 3d 20 76 61 5f lob *pBlob = va_
5ec0: 61 72 67 28 61 70 2c 20 42 6c 6f 62 2a 29 3b 0a arg(ap, Blob*);.
5ed0: 20 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 bufpt =
5ee0: 62 6c 6f 62 5f 62 75 66 66 65 72 28 70 42 6c 6f blob_buffer(pBlo
5ef0: 62 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 b);. leng
5f00: 74 68 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 70 th = blob_size(p
5f10: 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 69 Blob);. i
5f20: 66 28 20 6c 69 6d 69 74 3e 3d 30 20 26 26 20 6c f( limit>=0 && l
5f30: 69 6d 69 74 3c 6c 65 6e 67 74 68 20 29 20 6c 65 imit<length ) le
5f40: 6e 67 74 68 20 3d 20 6c 69 6d 69 74 3b 0a 20 20 ngth = limit;.
5f50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
5f60: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 }. case
5f70: 65 74 42 4c 4f 42 53 51 4c 3a 20 7b 0a 20 20 20 etBLOBSQL: {.
5f80: 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d int limit =
5f90: 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 flag_alternatef
5fa0: 6f 72 6d 20 3f 20 76 61 5f 61 72 67 28 61 70 2c orm ? va_arg(ap,
5fb0: 20 69 6e 74 29 20 3a 20 2d 31 3b 0a 20 20 20 20 int) : -1;.
5fc0: 20 20 20 20 42 6c 6f 62 20 2a 70 42 6c 6f 62 20 Blob *pBlob
5fd0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 20 42 6c 6f = va_arg(ap, Blo
5fe0: 62 2a 29 3b 0a 20 20 20 20 20 20 20 20 63 68 61 b*);. cha
5ff0: 72 20 2a 7a 4f 72 69 67 20 3d 20 62 6c 6f 62 5f r *zOrig = blob_
6000: 62 75 66 66 65 72 28 70 42 6c 6f 62 29 3b 0a 20 buffer(pBlob);.
6010: 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a 2c int i, j,
6020: 20 6e 2c 20 63 6e 74 3b 0a 20 20 20 20 20 20 20 n, cnt;.
6030: 20 6e 20 3d 20 62 6c 6f 62 5f 73 69 7a 65 28 70 n = blob_size(p
6040: 42 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 69 Blob);. i
6050: 66 28 20 6c 69 6d 69 74 3e 3d 30 20 26 26 20 6c f( limit>=0 && l
6060: 69 6d 69 74 3c 6e 20 29 20 6e 20 3d 20 6c 69 6d imit<n ) n = lim
6070: 69 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 it;. for(
6080: 63 6e 74 3d 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b cnt=i=0; i<n; i+
6090: 2b 29 7b 20 69 66 28 20 7a 4f 72 69 67 5b 69 5d +){ if( zOrig[i]
60a0: 3d 3d 27 5c 27 27 20 29 20 63 6e 74 2b 2b 3b 20 =='\'' ) cnt++;
60b0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 2b }. if( n+
60c0: 63 6e 74 2b 32 20 3e 20 65 74 42 55 46 53 49 5a cnt+2 > etBUFSIZ
60d0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 E ){. b
60e0: 75 66 70 74 20 3d 20 7a 45 78 74 72 61 20 3d 20 ufpt = zExtra =
60f0: 66 6f 73 73 69 6c 5f 6d 61 6c 6c 6f 63 28 20 6e fossil_malloc( n
6100: 20 2b 20 63 6e 74 20 2b 20 32 20 29 3b 0a 20 20 + cnt + 2 );.
6110: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 }else{.
6120: 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 62 bufpt = b
6130: 75 66 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 uf;. }.
6140: 20 20 20 20 20 20 62 75 66 70 74 5b 30 5d 20 3d bufpt[0] =
6150: 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 66 '\'';. f
6160: 6f 72 28 69 3d 30 2c 20 6a 3d 31 3b 20 69 3c 6e or(i=0, j=1; i<n
6170: 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20 20 20 ; i++, j++){.
6180: 20 20 20 20 20 20 20 69 66 28 20 7a 4f 72 69 67 if( zOrig
6190: 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b 20 62 75 66 [i]=='\'' ){ buf
61a0: 70 74 5b 6a 2b 2b 5d 20 3d 20 27 5c 27 27 3b 20 pt[j++] = '\'';
61b0: 7d 0a 20 20 20 20 20 20 20 20 20 20 62 75 66 70 }. bufp
61c0: 74 5b 6a 5d 20 3d 20 7a 4f 72 69 67 5b 69 5d 3b t[j] = zOrig[i];
61d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
61e0: 20 20 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 bufpt[j++] =
61f0: 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 6c 65 '\'';. le
6200: 6e 67 74 68 20 3d 20 6a 3b 0a 20 20 20 20 20 20 ngth = j;.
6210: 20 20 61 73 73 65 72 74 28 20 6c 65 6e 67 74 68 assert( length
6220: 3d 3d 6e 2b 63 6e 74 2b 32 20 29 3b 0a 20 20 20 ==n+cnt+2 );.
6230: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
6240: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 65 }. case e
6250: 74 53 51 4c 45 53 43 41 50 45 3a 0a 20 20 20 20 tSQLESCAPE:.
6260: 20 20 63 61 73 65 20 65 74 53 51 4c 45 53 43 41 case etSQLESCA
6270: 50 45 32 3a 0a 20 20 20 20 20 20 63 61 73 65 20 PE2:. case
6280: 65 74 53 51 4c 45 53 43 41 50 45 33 3a 20 7b 0a etSQLESCAPE3: {.
6290: 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 6a int i, j
62a0: 2c 20 6e 2c 20 63 68 2c 20 69 73 6e 75 6c 6c 3b , n, ch, isnull;
62b0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 65 65 . int nee
62c0: 64 51 75 6f 74 65 3b 0a 20 20 20 20 20 20 20 20 dQuote;.
62d0: 69 6e 74 20 6c 69 6d 69 74 20 3d 20 66 6c 61 67 int limit = flag
62e0: 5f 61 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 3f _alternateform ?
62f0: 20 76 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 20 va_arg(ap,int)
6300: 3a 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 63 68 : -1;. ch
6310: 61 72 20 71 20 3d 20 28 28 78 74 79 70 65 3d 3d ar q = ((xtype==
6320: 65 74 53 51 4c 45 53 43 41 50 45 33 29 3f 27 22 etSQLESCAPE3)?'"
6330: 27 3a 27 5c 27 27 29 3b 20 20 2f 2a 20 51 75 6f ':'\''); /* Quo
6340: 74 65 20 63 68 61 72 61 63 74 65 72 73 20 2a 2f te characters */
6350: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 65 . char *e
6360: 73 63 61 72 67 20 3d 20 76 61 5f 61 72 67 28 61 scarg = va_arg(a
6370: 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 p,char*);.
6380: 20 20 69 73 6e 75 6c 6c 20 3d 20 65 73 63 61 72 isnull = escar
6390: 67 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 g==0;. if
63a0: 28 20 69 73 6e 75 6c 6c 20 29 20 65 73 63 61 72 ( isnull ) escar
63b0: 67 20 3d 20 28 78 74 79 70 65 3d 3d 65 74 53 51 g = (xtype==etSQ
63c0: 4c 45 53 43 41 50 45 32 20 3f 20 22 4e 55 4c 4c LESCAPE2 ? "NULL
63d0: 22 20 3a 20 22 28 4e 55 4c 4c 29 22 29 3b 0a 20 " : "(NULL)");.
63e0: 20 20 20 20 20 20 20 69 66 28 20 6c 69 6d 69 74 if( limit
63f0: 3c 30 20 29 20 6c 69 6d 69 74 20 3d 20 73 74 72 <0 ) limit = str
6400: 6c 65 6e 28 65 73 63 61 72 67 29 3b 0a 20 20 20 len(escarg);.
6410: 20 20 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 for(i=n=0;
6420: 69 3c 6c 69 6d 69 74 3b 20 69 2b 2b 29 7b 0a 20 i<limit; i++){.
6430: 20 20 20 20 20 20 20 20 20 69 66 28 20 65 73 63 if( esc
6440: 61 72 67 5b 69 5d 3d 3d 71 20 29 20 20 6e 2b 2b arg[i]==q ) n++
6450: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
6460: 20 20 20 20 6e 65 65 64 51 75 6f 74 65 20 3d 20 needQuote =
6470: 21 69 73 6e 75 6c 6c 20 26 26 20 78 74 79 70 65 !isnull && xtype
6480: 3d 3d 65 74 53 51 4c 45 53 43 41 50 45 32 3b 0a ==etSQLESCAPE2;.
6490: 20 20 20 20 20 20 20 20 6e 20 2b 3d 20 69 20 2b n += i +
64a0: 20 31 20 2b 20 6e 65 65 64 51 75 6f 74 65 2a 32 1 + needQuote*2
64b0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 3e ;. if( n>
64c0: 65 74 42 55 46 53 49 5a 45 20 29 7b 0a 20 20 20 etBUFSIZE ){.
64d0: 20 20 20 20 20 20 20 62 75 66 70 74 20 3d 20 7a bufpt = z
64e0: 45 78 74 72 61 20 3d 20 66 6f 73 73 69 6c 5f 6d Extra = fossil_m
64f0: 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a 20 20 20 20 alloc( n );.
6500: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 }else{.
6510: 20 20 20 20 20 62 75 66 70 74 20 3d 20 62 75 66 bufpt = buf
6520: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 ;. }.
6530: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 j = 0;.
6540: 20 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 if( needQuote
6550: 20 29 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 ) bufpt[j++] =
6560: 71 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 q;. for(i
6570: 3d 30 3b 20 69 3c 6c 69 6d 69 74 3b 20 69 2b 2b =0; i<limit; i++
6580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 75 66 ){. buf
6590: 70 74 5b 6a 2b 2b 5d 20 3d 20 63 68 20 3d 20 65 pt[j++] = ch = e
65a0: 73 63 61 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 scarg[i];.
65b0: 20 20 20 20 69 66 28 20 63 68 3d 3d 71 20 29 20 if( ch==q )
65c0: 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 63 68 3b bufpt[j++] = ch;
65d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 . }.
65e0: 20 20 20 69 66 28 20 6e 65 65 64 51 75 6f 74 65 if( needQuote
65f0: 20 29 20 62 75 66 70 74 5b 6a 2b 2b 5d 20 3d 20 ) bufpt[j++] =
6600: 71 3b 0a 20 20 20 20 20 20 20 20 62 75 66 70 74 q;. bufpt
6610: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 [j] = 0;.
6620: 20 6c 65 6e 67 74 68 20 3d 20 6a 3b 0a 20 20 20 length = j;.
6630: 20 20 20 20 20 69 66 28 20 70 72 65 63 69 73 69 if( precisi
6640: 6f 6e 3e 3d 30 20 26 26 20 70 72 65 63 69 73 69 on>=0 && precisi
6650: 6f 6e 3c 6c 65 6e 67 74 68 20 29 20 6c 65 6e 67 on<length ) leng
6660: 74 68 20 3d 20 70 72 65 63 69 73 69 6f 6e 3b 0a th = precision;.
6670: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 break;.
6680: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 }. cas
6690: 65 20 65 74 48 54 4d 4c 49 5a 45 3a 20 7b 0a 20 e etHTMLIZE: {.
66a0: 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 int limit
66b0: 20 3d 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 = flag_alternat
66c0: 65 66 6f 72 6d 20 3f 20 76 61 5f 61 72 67 28 61 eform ? va_arg(a
66d0: 70 2c 69 6e 74 29 20 3a 20 2d 31 3b 0a 20 20 20 p,int) : -1;.
66e0: 20 20 20 20 20 63 68 61 72 20 2a 7a 4d 65 6d 20 char *zMem
66f0: 3d 20 76 61 5f 61 72 67 28 61 70 2c 63 68 61 72 = va_arg(ap,char
6700: 2a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 *);. if(
6710: 7a 4d 65 6d 3d 3d 30 20 29 20 7a 4d 65 6d 20 3d zMem==0 ) zMem =
6720: 20 22 22 3b 0a 20 20 20 20 20 20 20 20 7a 45 78 "";. zEx
6730: 74 72 61 20 3d 20 62 75 66 70 74 20 3d 20 68 74 tra = bufpt = ht
6740: 6d 6c 69 7a 65 28 7a 4d 65 6d 2c 20 6c 69 6d 69 mlize(zMem, limi
6750: 74 29 3b 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 t);. leng
6760: 74 68 20 3d 20 73 74 72 6c 65 6e 28 62 75 66 70 th = strlen(bufp
6770: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 t);. if(
6780: 70 72 65 63 69 73 69 6f 6e 3e 3d 30 20 26 26 20 precision>=0 &&
6790: 70 72 65 63 69 73 69 6f 6e 3c 6c 65 6e 67 74 68 precision<length
67a0: 20 29 20 6c 65 6e 67 74 68 20 3d 20 70 72 65 63 ) length = prec
67b0: 69 73 69 6f 6e 3b 0a 20 20 20 20 20 20 20 20 62 ision;. b
67c0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 reak;. }.
67d0: 20 20 20 20 63 61 73 65 20 65 74 48 54 54 50 49 case etHTTPI
67e0: 5a 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e ZE: {. in
67f0: 74 20 6c 69 6d 69 74 20 3d 20 66 6c 61 67 5f 61 t limit = flag_a
6800: 6c 74 65 72 6e 61 74 65 66 6f 72 6d 20 3f 20 76 lternateform ? v
6810: 61 5f 61 72 67 28 61 70 2c 69 6e 74 29 20 3a 20 a_arg(ap,int) :
6820: 2d 31 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 -1;. char
6830: 20 2a 7a 4d 65 6d 20 3d 20 76 61 5f 61 72 67 28 *zMem = va_arg(
6840: 61 70 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 ap,char*);.
6850: 20 20 20 69 66 28 20 7a 4d 65 6d 3d 3d 30 20 29 if( zMem==0 )
6860: 20 7a 4d 65 6d 20 3d 20 22 22 3b 0a 20 20 20 20 zMem = "";.
6870: 20 20 20 20 7a 45 78 74 72 61 20 3d 20 62 75 66 zExtra = buf
6880: 70 74 20 3d 20 68 74 74 70 69 7a 65 28 7a 4d 65 pt = httpize(zMe
6890: 6d 2c 20 6c 69 6d 69 74 29 3b 0a 20 20 20 20 20 m, limit);.
68a0: 20 20 20 6c 65 6e 67 74 68 20 3d 20 73 74 72 6c length = strl
68b0: 65 6e 28 62 75 66 70 74 29 3b 0a 20 20 20 20 20 en(bufpt);.
68c0: 20 20 20 69 66 28 20 70 72 65 63 69 73 69 6f 6e if( precision
68d0: 3e 3d 30 20 26 26 20 70 72 65 63 69 73 69 6f 6e >=0 && precision
68e0: 3c 6c 65 6e 67 74 68 20 29 20 6c 65 6e 67 74 68 <length ) length
68f0: 20 3d 20 70 72 65 63 69 73 69 6f 6e 3b 0a 20 20 = precision;.
6900: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
6910: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 }. case
6920: 65 74 55 52 4c 49 5a 45 3a 20 7b 0a 20 20 20 20 etURLIZE: {.
6930: 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d 20 int limit =
6940: 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 6f flag_alternatefo
6950: 72 6d 20 3f 20 76 61 5f 61 72 67 28 61 70 2c 69 rm ? va_arg(ap,i
6960: 6e 74 29 20 3a 20 2d 31 3b 0a 20 20 20 20 20 20 nt) : -1;.
6970: 20 20 63 68 61 72 20 2a 7a 4d 65 6d 20 3d 20 76 char *zMem = v
6980: 61 5f 61 72 67 28 61 70 2c 63 68 61 72 2a 29 3b a_arg(ap,char*);
6990: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4d 65 . if( zMe
69a0: 6d 3d 3d 30 20 29 20 7a 4d 65 6d 20 3d 20 22 22 m==0 ) zMem = ""
69b0: 3b 0a 20 20 20 20 20 20 20 20 7a 45 78 74 72 61 ;. zExtra
69c0: 20 3d 20 62 75 66 70 74 20 3d 20 75 72 6c 69 7a = bufpt = urliz
69d0: 65 28 7a 4d 65 6d 2c 20 6c 69 6d 69 74 29 3b 0a e(zMem, limit);.
69e0: 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 3d length =
69f0: 20 73 74 72 6c 65 6e 28 62 75 66 70 74 29 3b 0a strlen(bufpt);.
6a00: 20 20 20 20 20 20 20 20 69 66 28 20 70 72 65 63 if( prec
6a10: 69 73 69 6f 6e 3e 3d 30 20 26 26 20 70 72 65 63 ision>=0 && prec
6a20: 69 73 69 6f 6e 3c 6c 65 6e 67 74 68 20 29 20 6c ision<length ) l
6a30: 65 6e 67 74 68 20 3d 20 70 72 65 63 69 73 69 6f ength = precisio
6a40: 6e 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b n;. break
6a50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 ;. }.
6a60: 63 61 73 65 20 65 74 46 4f 53 53 49 4c 49 5a 45 case etFOSSILIZE
6a70: 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 : {. int
6a80: 6c 69 6d 69 74 20 3d 20 66 6c 61 67 5f 61 6c 74 limit = flag_alt
6a90: 65 72 6e 61 74 65 66 6f 72 6d 20 3f 20 76 61 5f ernateform ? va_
6aa0: 61 72 67 28 61 70 2c 69 6e 74 29 20 3a 20 2d 31 arg(ap,int) : -1
6ab0: 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a ;. char *
6ac0: 7a 4d 65 6d 20 3d 20 76 61 5f 61 72 67 28 61 70 zMem = va_arg(ap
6ad0: 2c 63 68 61 72 2a 29 3b 0a 20 20 20 20 20 20 20 ,char*);.
6ae0: 20 69 66 28 20 7a 4d 65 6d 3d 3d 30 20 29 20 7a if( zMem==0 ) z
6af0: 4d 65 6d 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 Mem = "";.
6b00: 20 20 7a 45 78 74 72 61 20 3d 20 62 75 66 70 74 zExtra = bufpt
6b10: 20 3d 20 66 6f 73 73 69 6c 69 7a 65 28 7a 4d 65 = fossilize(zMe
6b20: 6d 2c 20 6c 69 6d 69 74 29 3b 0a 20 20 20 20 20 m, limit);.
6b30: 20 20 20 6c 65 6e 67 74 68 20 3d 20 73 74 72 6c length = strl
6b40: 65 6e 28 62 75 66 70 74 29 3b 0a 20 20 20 20 20 en(bufpt);.
6b50: 20 20 20 69 66 28 20 70 72 65 63 69 73 69 6f 6e if( precision
6b60: 3e 3d 30 20 26 26 20 70 72 65 63 69 73 69 6f 6e >=0 && precision
6b70: 3c 6c 65 6e 67 74 68 20 29 20 6c 65 6e 67 74 68 <length ) length
6b80: 20 3d 20 70 72 65 63 69 73 69 6f 6e 3b 0a 20 20 = precision;.
6b90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 break;.
6ba0: 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 }. case
6bb0: 65 74 57 49 4b 49 53 54 52 3a 20 7b 0a 20 20 20 etWIKISTR: {.
6bc0: 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 20 3d int limit =
6bd0: 20 66 6c 61 67 5f 61 6c 74 65 72 6e 61 74 65 66 flag_alternatef
6be0: 6f 72 6d 20 3f 20 76 61 5f 61 72 67 28 61 70 2c orm ? va_arg(ap,
6bf0: 69 6e 74 29 20 3a 20 2d 31 3b 0a 20 20 20 20 20 int) : -1;.
6c00: 20 20 20 63 68 61 72 20 2a 7a 57 69 6b 69 20 3d char *zWiki =
6c10: 20 76 61 5f 61 72 67 28 61 70 2c 20 63 68 61 72 va_arg(ap, char
6c20: 2a 29 3b 0a 20 20 20 20 20 20 20 20 42 6c 6f 62 *);. Blob
6c30: 20 77 69 6b 69 3b 0a 20 20 20 20 20 20 20 20 62 wiki;. b
6c40: 6c 6f 62 5f 69 6e 69 74 28 26 77 69 6b 69 2c 20 lob_init(&wiki,
6c50: 7a 57 69 6b 69 2c 20 6c 69 6d 69 74 29 3b 0a 20 zWiki, limit);.
6c60: 20 20 20 20 20 20 20 77 69 6b 69 5f 63 6f 6e 76 wiki_conv
6c70: 65 72 74 28 26 77 69 6b 69 2c 20 70 42 6c 6f 62 ert(&wiki, pBlob
6c80: 2c 20 77 69 6b 69 5f 63 6f 6e 76 65 72 74 5f 66 , wiki_convert_f
6c90: 6c 61 67 73 28 66 6c 61 67 5f 61 6c 74 66 6f 72 lags(flag_altfor
6ca0: 6d 32 29 29 3b 0a 20 20 20 20 20 20 20 20 62 6c m2));. bl
6cb0: 6f 62 5f 72 65 73 65 74 28 26 77 69 6b 69 29 3b ob_reset(&wiki);
6cc0: 0a 20 20 20 20 20 20 20 20 6c 65 6e 67 74 68 20 . length
6cd0: 3d 20 77 69 64 74 68 20 3d 20 30 3b 0a 20 20 20 = width = 0;.
6ce0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 break;.
6cf0: 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65 20 65 }. case e
6d00: 74 45 52 52 4f 52 3a 0a 20 20 20 20 20 20 20 20 tERROR:.
6d10: 62 75 66 5b 30 5d 20 3d 20 27 25 27 3b 0a 20 20 buf[0] = '%';.
6d20: 20 20 20 20 20 20 62 75 66 5b 31 5d 20 3d 20 63 buf[1] = c
6d30: 3b 0a 20 20 20 20 20 20 20 20 65 72 72 6f 72 66 ;. errorf
6d40: 6c 61 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 lag = 0;.
6d50: 20 69 64 78 20 3d 20 31 2b 28 63 21 3d 30 29 3b idx = 1+(c!=0);
6d60: 0a 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 . blob_ap
6d70: 70 65 6e 64 28 70 42 6c 6f 62 2c 22 25 22 2c 69 pend(pBlob,"%",i
6d80: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 75 dx);. cou
6d90: 6e 74 20 2b 3d 20 69 64 78 3b 0a 20 20 20 20 20 nt += idx;.
6da0: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 66 6d if( c==0 ) fm
6db0: 74 2d 2d 3b 0a 20 20 20 20 20 20 20 20 62 72 65 t--;. bre
6dc0: 61 6b 3b 0a 20 20 20 20 7d 2f 2a 20 45 6e 64 20 ak;. }/* End
6dd0: 73 77 69 74 63 68 20 6f 76 65 72 20 74 68 65 20 switch over the
6de0: 66 6f 72 6d 61 74 20 74 79 70 65 20 2a 2f 0a 20 format type */.
6df0: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 54 68 65 /*. ** The
6e00: 20 74 65 78 74 20 6f 66 20 74 68 65 20 63 6f 6e text of the con
6e10: 76 65 72 73 69 6f 6e 20 69 73 20 70 6f 69 6e 74 version is point
6e20: 65 64 20 74 6f 20 62 79 20 22 62 75 66 70 74 22 ed to by "bufpt"
6e30: 20 61 6e 64 20 69 73 0a 20 20 20 20 2a 2a 20 22 and is. ** "
6e40: 6c 65 6e 67 74 68 22 20 63 68 61 72 61 63 74 65 length" characte
6e50: 72 73 20 6c 6f 6e 67 2e 20 20 54 68 65 20 66 69 rs long. The fi
6e60: 65 6c 64 20 77 69 64 74 68 20 69 73 20 22 77 69 eld width is "wi
6e70: 64 74 68 22 2e 20 20 44 6f 0a 20 20 20 20 2a 2a dth". Do. **
6e80: 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 20 20 20 the output..
6e90: 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 66 6c 61 */. if( !fla
6ea0: 67 5f 6c 65 66 74 6a 75 73 74 69 66 79 20 29 7b g_leftjustify ){
6eb0: 0a 20 20 20 20 20 20 72 65 67 69 73 74 65 72 20 . register
6ec0: 69 6e 74 20 6e 73 70 61 63 65 3b 0a 20 20 20 20 int nspace;.
6ed0: 20 20 6e 73 70 61 63 65 20 3d 20 77 69 64 74 68 nspace = width
6ee0: 2d 6c 65 6e 67 74 68 3b 0a 20 20 20 20 20 20 69 -length;. i
6ef0: 66 28 20 6e 73 70 61 63 65 3e 30 20 29 7b 0a 20 f( nspace>0 ){.
6f00: 20 20 20 20 20 20 20 63 6f 75 6e 74 20 2b 3d 20 count +=
6f10: 6e 73 70 61 63 65 3b 0a 20 20 20 20 20 20 20 20 nspace;.
6f20: 77 68 69 6c 65 28 20 6e 73 70 61 63 65 3e 3d 65 while( nspace>=e
6f30: 74 53 50 41 43 45 53 49 5a 45 20 29 7b 0a 20 20 tSPACESIZE ){.
6f40: 20 20 20 20 20 20 20 20 62 6c 6f 62 5f 61 70 70 blob_app
6f50: 65 6e 64 28 70 42 6c 6f 62 2c 73 70 61 63 65 73 end(pBlob,spaces
6f60: 2c 65 74 53 50 41 43 45 53 49 5a 45 29 3b 0a 20 ,etSPACESIZE);.
6f70: 20 20 20 20 20 20 20 20 20 6e 73 70 61 63 65 20 nspace
6f80: 2d 3d 20 65 74 53 50 41 43 45 53 49 5a 45 3b 0a -= etSPACESIZE;.
6f90: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 }.
6fa0: 20 20 69 66 28 20 6e 73 70 61 63 65 3e 30 20 29 if( nspace>0 )
6fb0: 20 62 6c 6f 62 5f 61 70 70 65 6e 64 28 70 42 6c blob_append(pBl
6fc0: 6f 62 2c 73 70 61 63 65 73 2c 6e 73 70 61 63 65 ob,spaces,nspace
6fd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d );. }. }
6fe0: 0a 20 20 20 20 69 66 28 20 6c 65 6e 67 74 68 3e . if( length>
6ff0: 30 20 29 7b 0a 20 20 20 20 20 20 62 6c 6f 62 5f 0 ){. blob_
7000: 61 70 70 65 6e 64 28 70 42 6c 6f 62 2c 62 75 66 append(pBlob,buf
7010: 70 74 2c 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20 pt,length);.
7020: 20 20 63 6f 75 6e 74 20 2b 3d 20 6c 65 6e 67 74 count += lengt
7030: 68 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 h;. }. if(
7040: 20 66 6c 61 67 5f 6c 65 66 74 6a 75 73 74 69 66 flag_leftjustif
7050: 79 20 29 7b 0a 20 20 20 20 20 20 72 65 67 69 73 y ){. regis
7060: 74 65 72 20 69 6e 74 20 6e 73 70 61 63 65 3b 0a ter int nspace;.
7070: 20 20 20 20 20 20 6e 73 70 61 63 65 20 3d 20 77 nspace = w
7080: 69 64 74 68 2d 6c 65 6e 67 74 68 3b 0a 20 20 20 idth-length;.
7090: 20 20 20 69 66 28 20 6e 73 70 61 63 65 3e 30 20 if( nspace>0
70a0: 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 75 6e 74 ){. count
70b0: 20 2b 3d 20 6e 73 70 61 63 65 3b 0a 20 20 20 20 += nspace;.
70c0: 20 20 20 20 77 68 69 6c 65 28 20 6e 73 70 61 63 while( nspac
70d0: 65 3e 3d 65 74 53 50 41 43 45 53 49 5a 45 20 29 e>=etSPACESIZE )
70e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 62 6c 6f 62 {. blob
70f0: 5f 61 70 70 65 6e 64 28 70 42 6c 6f 62 2c 73 70 _append(pBlob,sp
7100: 61 63 65 73 2c 65 74 53 50 41 43 45 53 49 5a 45 aces,etSPACESIZE
7110: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 73 70 );. nsp
7120: 61 63 65 20 2d 3d 20 65 74 53 50 41 43 45 53 49 ace -= etSPACESI
7130: 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 ZE;. }.
7140: 20 20 20 20 20 20 69 66 28 20 6e 73 70 61 63 65 if( nspace
7150: 3e 30 20 29 20 62 6c 6f 62 5f 61 70 70 65 6e 64 >0 ) blob_append
7160: 28 70 42 6c 6f 62 2c 73 70 61 63 65 73 2c 6e 73 (pBlob,spaces,ns
7170: 70 61 63 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 pace);. }.
7180: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45 78 }. if( zEx
7190: 74 72 61 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 tra ){. fos
71a0: 73 69 6c 5f 66 72 65 65 28 7a 45 78 74 72 61 29 sil_free(zExtra)
71b0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 2f 2a 20 45 6e ;. }. }/* En
71c0: 64 20 66 6f 72 20 6c 6f 6f 70 20 6f 76 65 72 20 d for loop over
71d0: 74 68 65 20 66 6f 72 6d 61 74 20 73 74 72 69 6e the format strin
71e0: 67 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 65 72 g */. return er
71f0: 72 6f 72 66 6c 61 67 20 3f 20 2d 31 20 3a 20 63 rorflag ? -1 : c
7200: 6f 75 6e 74 3b 0a 7d 20 2f 2a 20 45 6e 64 20 6f ount;.} /* End o
7210: 66 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 0a 2f f function */../
7220: 2a 0a 2a 2a 20 50 72 69 6e 74 20 69 6e 74 6f 20 *.** Print into
7230: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 memory obtained
7240: 66 72 6f 6d 20 66 6f 73 73 69 6c 5f 6d 61 6c 6c from fossil_mall
7250: 6f 63 28 29 2e 0a 2a 2f 0a 63 68 61 72 20 2a 6d oc()..*/.char *m
7260: 70 72 69 6e 74 66 28 63 6f 6e 73 74 20 63 68 61 printf(const cha
7270: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 r *zFormat, ...)
7280: 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a {. va_list ap;.
7290: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f char *z;. va_
72a0: 73 74 61 72 74 28 61 70 2c 7a 46 6f 72 6d 61 74 start(ap,zFormat
72b0: 29 3b 0a 20 20 7a 20 3d 20 76 6d 70 72 69 6e 74 );. z = vmprint
72c0: 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a f(zFormat, ap);.
72d0: 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 va_end(ap);.
72e0: 72 65 74 75 72 6e 20 7a 3b 0a 7d 0a 63 68 61 72 return z;.}.char
72f0: 20 2a 76 6d 70 72 69 6e 74 66 28 63 6f 6e 73 74 *vmprintf(const
7300: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 char *zFormat,
7310: 76 61 5f 6c 69 73 74 20 61 70 29 7b 0a 20 20 42 va_list ap){. B
7320: 6c 6f 62 20 62 6c 6f 62 20 3d 20 65 6d 70 74 79 lob blob = empty
7330: 5f 62 6c 6f 62 3b 0a 20 20 62 6c 6f 62 5f 76 61 _blob;. blob_va
7340: 70 70 65 6e 64 66 28 26 62 6c 6f 62 2c 20 7a 46 ppendf(&blob, zF
7350: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 62 6c ormat, ap);. bl
7360: 6f 62 5f 6d 61 74 65 72 69 61 6c 69 7a 65 28 26 ob_materialize(&
7370: 62 6c 6f 62 29 3b 0a 20 20 72 65 74 75 72 6e 20 blob);. return
7380: 62 6c 6f 62 2e 61 44 61 74 61 3b 0a 7d 0a 0a 2f blob.aData;.}../
7390: 2a 0a 2a 2a 20 52 65 63 6f 72 64 20 61 6e 20 65 *.** Record an e
73a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 rror message in
73b0: 74 68 65 20 67 6c 6f 62 61 6c 20 67 2e 7a 45 72 the global g.zEr
73c0: 72 4d 73 67 20 76 61 72 69 61 62 6c 65 2e 0a 2a rMsg variable..*
73d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 *.** If there is
73e0: 20 61 6c 72 65 61 64 79 20 61 6e 6f 74 68 65 72 already another
73f0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2c 20 error message,
7400: 6f 6e 6c 79 20 6f 76 65 72 77 72 69 74 65 20 69 only overwrite i
7410: 74 20 69 66 0a 2a 2a 20 74 68 65 20 63 75 72 72 t if.** the curr
7420: 65 6e 74 20 65 72 72 6f 72 20 68 61 73 20 61 20 ent error has a
7430: 68 69 67 68 65 72 20 70 72 69 6f 72 69 74 79 2e higher priority.
7440: 0a 2a 2f 0a 76 6f 69 64 20 66 6f 73 73 69 6c 5f .*/.void fossil_
7450: 65 72 72 6f 72 28 69 6e 74 20 69 50 72 69 6f 72 error(int iPrior
7460: 69 74 79 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 ity, const char
7470: 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b 0a *zFormat, ...){.
7480: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 va_list ap;.
7490: 69 66 28 20 69 50 72 69 6f 72 69 74 79 3c 3d 30 if( iPriority<=0
74a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a ){. return;.
74b0: 20 20 7d 0a 20 20 69 66 28 20 67 2e 7a 45 72 72 }. if( g.zErr
74c0: 4d 73 67 20 29 7b 0a 20 20 20 20 69 66 28 20 67 Msg ){. if( g
74d0: 2e 69 45 72 72 50 72 69 6f 72 69 74 79 3e 3d 69 .iErrPriority>=i
74e0: 50 72 69 6f 72 69 74 79 20 29 7b 0a 20 20 20 20 Priority ){.
74f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a return;. }.
7500: 20 20 20 20 66 72 65 65 28 67 2e 7a 45 72 72 4d free(g.zErrM
7510: 73 67 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 73 74 sg);. }. va_st
7520: 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 art(ap, zFormat)
7530: 3b 0a 20 20 67 2e 7a 45 72 72 4d 73 67 20 3d 20 ;. g.zErrMsg =
7540: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 vmprintf(zFormat
7550: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 , ap);. va_end(
7560: 61 70 29 3b 0a 20 20 67 2e 69 45 72 72 50 72 69 ap);. g.iErrPri
7570: 6f 72 69 74 79 20 3d 20 69 50 72 69 6f 72 69 74 ority = iPriorit
7580: 79 3b 0a 7d 0a 76 6f 69 64 20 66 6f 73 73 69 6c y;.}.void fossil
7590: 5f 65 72 72 6f 72 5f 72 65 73 65 74 28 76 6f 69 _error_reset(voi
75a0: 64 29 7b 0a 20 20 66 72 65 65 28 67 2e 7a 45 72 d){. free(g.zEr
75b0: 72 4d 73 67 29 3b 0a 20 20 67 2e 7a 45 72 72 4d rMsg);. g.zErrM
75c0: 73 67 20 3d 20 30 3b 0a 20 20 67 2e 69 45 72 72 sg = 0;. g.iErr
75d0: 50 72 69 6f 72 69 74 79 20 3d 20 30 3b 0a 7d 0a Priority = 0;.}.
75e0: 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 ./* True if the
75f0: 6c 61 73 74 20 63 68 61 72 61 63 74 65 72 20 73 last character s
7600: 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20 63 tandard output c
7610: 75 72 73 6f 72 20 69 73 20 73 65 74 74 69 6e 67 ursor is setting
7620: 20 61 74 0a 2a 2a 20 74 68 65 20 62 65 67 69 6e at.** the begin
7630: 6e 69 6e 67 20 6f 66 20 61 20 62 6c 61 6e 6b 20 ning of a blank
7640: 6c 69 6e 6b 2e 20 20 46 61 6c 73 65 20 69 66 20 link. False if
7650: 61 20 5c 72 20 68 61 73 20 62 65 65 6e 20 74 6f a \r has been to
7660: 20 6d 6f 76 65 20 74 68 65 0a 2a 2a 20 63 75 72 move the.** cur
7670: 73 6f 72 20 74 6f 20 74 68 65 20 62 65 67 69 6e sor to the begin
7680: 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c 69 6e 65 ning of the line
7690: 20 6f 72 20 69 66 20 6e 6f 74 20 61 74 20 74 68 or if not at th
76a0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 0a 2a e beginning of.*
76b0: 2a 20 61 20 6c 69 6e 65 2e 0a 2a 2a 20 77 61 73 * a line..** was
76c0: 20 61 20 5c 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 a \n.*/.static
76d0: 69 6e 74 20 73 74 64 6f 75 74 41 74 42 4f 4c 20 int stdoutAtBOL
76e0: 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 = 1;../*.** Writ
76f0: 65 20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 e to standard ou
7700: 74 70 75 74 20 6f 72 20 73 74 61 6e 64 61 72 64 tput or standard
7710: 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 4f 6e error..**.** On
7720: 20 77 69 6e 64 6f 77 73 2c 20 74 72 61 6e 73 66 windows, transf
7730: 6f 72 6d 20 74 68 65 20 6f 75 74 70 75 74 20 69 orm the output i
7740: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 nto the current
7750: 74 65 72 6d 69 6e 61 6c 20 65 6e 63 6f 64 69 6e terminal encodin
7760: 67 0a 2a 2a 20 69 66 20 74 68 65 20 6f 75 74 70 g.** if the outp
7770: 75 74 20 69 73 20 67 6f 69 6e 67 20 74 6f 20 74 ut is going to t
7780: 68 65 20 73 63 72 65 65 6e 2e 20 20 49 66 20 6f he screen. If o
7790: 75 74 70 75 74 20 69 73 20 72 65 64 69 72 65 63 utput is redirec
77a0: 74 65 64 20 69 6e 74 6f 0a 2a 2a 20 61 20 66 69 ted into.** a fi
77b0: 6c 65 2c 20 6e 6f 20 74 72 61 6e 73 6c 61 74 69 le, no translati
77c0: 6f 6e 20 6f 63 63 75 72 73 2e 20 53 77 69 74 63 on occurs. Switc
77d0: 68 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f h output mode to
77e0: 20 62 69 6e 61 72 79 20 74 6f 0a 2a 2a 20 70 72 binary to.** pr
77f0: 6f 70 65 72 6c 79 20 70 72 6f 63 65 73 73 20 6c operly process l
7800: 69 6e 65 2d 65 6e 64 69 6e 67 73 2c 20 6d 61 6b ine-endings, mak
7810: 65 20 73 75 72 65 20 74 6f 20 73 77 69 74 63 68 e sure to switch
7820: 20 74 68 65 20 6d 6f 64 65 20 62 61 63 6b 20 74 the mode back t
7830: 6f 0a 2a 2a 20 74 65 78 74 20 77 68 65 6e 20 64 o.** text when d
7840: 6f 6e 65 2e 0a 2a 2a 20 4e 6f 20 74 72 61 6e 73 one..** No trans
7850: 6c 61 74 69 6f 6e 20 65 76 65 72 20 6f 63 63 75 lation ever occu
7860: 72 73 20 6f 6e 20 75 6e 69 78 2e 0a 2a 2f 0a 76 rs on unix..*/.v
7870: 6f 69 64 20 66 6f 73 73 69 6c 5f 70 75 74 73 28 oid fossil_puts(
7880: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 const char *z, i
7890: 6e 74 20 74 6f 53 74 64 45 72 72 29 7b 0a 20 20 nt toStdErr){.
78a0: 46 49 4c 45 2a 20 6f 75 74 20 3d 20 28 74 6f 53 FILE* out = (toS
78b0: 74 64 45 72 72 20 3f 20 73 74 64 65 72 72 20 3a tdErr ? stderr :
78c0: 20 73 74 64 6f 75 74 29 3b 0a 20 20 69 6e 74 20 stdout);. int
78d0: 6e 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 n = (int)strlen(
78e0: 7a 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 30 20 29 z);. if( n==0 )
78f0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 return;. asser
7900: 74 28 20 74 6f 53 74 64 45 72 72 3d 3d 30 20 7c t( toStdErr==0 |
7910: 7c 20 74 6f 53 74 64 45 72 72 3d 3d 31 20 29 3b | toStdErr==1 );
7920: 0a 20 20 69 66 28 20 74 6f 53 74 64 45 72 72 3d . if( toStdErr=
7930: 3d 30 20 29 20 73 74 64 6f 75 74 41 74 42 4f 4c =0 ) stdoutAtBOL
7940: 20 3d 20 28 7a 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 = (z[n-1]=='\n'
7950: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f );.#if defined(_
7960: 57 49 4e 33 32 29 0a 20 20 69 66 28 20 66 6f 73 WIN32). if( fos
7970: 73 69 6c 5f 75 74 66 38 5f 74 6f 5f 63 6f 6e 73 sil_utf8_to_cons
7980: 6f 6c 65 28 7a 2c 20 6e 2c 20 74 6f 53 74 64 45 ole(z, n, toStdE
7990: 72 72 29 20 3e 3d 20 30 20 29 7b 0a 20 20 20 20 rr) >= 0 ){.
79a0: 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 66 66 return;. }. ff
79b0: 6c 75 73 68 28 6f 75 74 29 3b 0a 20 20 5f 73 65 lush(out);. _se
79c0: 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 6f 75 tmode(_fileno(ou
79d0: 74 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29 3b 0a t), _O_BINARY);.
79e0: 23 65 6e 64 69 66 0a 20 20 66 77 72 69 74 65 28 #endif. fwrite(
79f0: 7a 2c 20 31 2c 20 6e 2c 20 6f 75 74 29 3b 0a 23 z, 1, n, out);.#
7a00: 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 if defined(_WIN3
7a10: 32 29 0a 20 20 66 66 6c 75 73 68 28 6f 75 74 29 2). fflush(out)
7a20: 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66 69 ;. _setmode(_fi
7a30: 6c 65 6e 6f 28 6f 75 74 29 2c 20 5f 4f 5f 54 45 leno(out), _O_TE
7a40: 58 54 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f XT);.#endif.}../
7a50: 2a 0a 2a 2a 20 46 6f 72 63 65 20 74 68 65 20 73 *.** Force the s
7a60: 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74 20 63 tandard output c
7a70: 75 72 73 6f 72 20 74 6f 20 6d 6f 76 65 20 74 6f ursor to move to
7a80: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 0a 2a the beginning.*
7a90: 2a 20 6f 66 20 61 20 6c 69 6e 65 2c 20 69 66 20 * of a line, if
7aa0: 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 it is not there
7ab0: 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 69 6e 74 20 already..*/.int
7ac0: 66 6f 73 73 69 6c 5f 66 6f 72 63 65 5f 6e 65 77 fossil_force_new
7ad0: 6c 69 6e 65 28 76 6f 69 64 29 7b 0a 20 20 69 66 line(void){. if
7ae0: 28 20 67 2e 63 67 69 4f 75 74 70 75 74 3d 3d 30 ( g.cgiOutput==0
7af0: 20 26 26 20 73 74 64 6f 75 74 41 74 42 4f 4c 3d && stdoutAtBOL=
7b00: 3d 30 20 29 7b 0a 20 20 20 20 66 6f 73 73 69 6c =0 ){. fossil
7b10: 5f 70 75 74 73 28 22 5c 6e 22 2c 20 30 29 3b 0a _puts("\n", 0);.
7b20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 return 1;.
7b30: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a }. return 0;.}.
7b40: 0a 2f 2a 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 ./*.** Indicate
7b50: 74 68 61 74 20 74 68 65 20 63 75 72 73 6f 72 20 that the cursor
7b60: 68 61 73 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 has moved to the
7b70: 20 73 74 61 72 74 20 6f 66 20 61 20 6c 69 6e 65 start of a line
7b80: 20 62 79 20 6d 65 61 6e 73 0a 2a 2a 20 6f 74 68 by means.** oth
7b90: 65 72 20 74 68 61 6e 20 77 72 69 74 69 6e 67 20 er than writing
7ba0: 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 to standard outp
7bb0: 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 66 6f 73 73 ut..*/.void foss
7bc0: 69 6c 5f 6e 65 77 5f 6c 69 6e 65 5f 73 74 61 72 il_new_line_star
7bd0: 74 65 64 28 76 6f 69 64 29 7b 0a 20 20 73 74 64 ted(void){. std
7be0: 6f 75 74 41 74 42 4f 4c 20 3d 20 31 3b 0a 7d 0a outAtBOL = 1;.}.
7bf0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 6f 75 74 ./*.** Write out
7c00: 70 75 74 20 66 6f 72 20 75 73 65 72 20 63 6f 6e put for user con
7c10: 73 75 6d 70 74 69 6f 6e 2e 20 20 49 66 20 67 2e sumption. If g.
7c20: 63 67 69 4f 75 74 70 75 74 20 69 73 20 65 6e 61 cgiOutput is ena
7c30: 62 6c 65 64 2c 20 74 68 65 6e 0a 2a 2a 20 73 65 bled, then.** se
7c40: 6e 64 20 74 68 65 20 6f 75 74 70 75 74 20 61 73 nd the output as
7c50: 20 70 61 72 74 20 6f 66 20 74 68 65 20 43 47 49 part of the CGI
7c60: 20 72 65 70 6c 79 2e 20 20 49 66 20 67 2e 63 67 reply. If g.cg
7c70: 69 4f 75 74 70 75 74 20 69 73 20 66 61 6c 73 65 iOutput is false
7c80: 2c 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 ,.** then write
7c90: 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 on standard outp
7ca0: 75 74 2e 0a 2a 2f 0a 76 6f 69 64 20 66 6f 73 73 ut..*/.void foss
7cb0: 69 6c 5f 70 72 69 6e 74 28 63 6f 6e 73 74 20 63 il_print(const c
7cc0: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e har *zFormat, ..
7cd0: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 .){. va_list ap
7ce0: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c ;. va_start(ap,
7cf0: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 zFormat);. if(
7d00: 20 67 2e 63 67 69 4f 75 74 70 75 74 20 29 7b 0a g.cgiOutput ){.
7d10: 20 20 20 20 63 67 69 5f 76 70 72 69 6e 74 66 28 cgi_vprintf(
7d20: 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 zFormat, ap);.
7d30: 7d 65 6c 73 65 7b 0a 20 20 20 20 42 6c 6f 62 20 }else{. Blob
7d40: 62 20 3d 20 65 6d 70 74 79 5f 62 6c 6f 62 3b 0a b = empty_blob;.
7d50: 20 20 20 20 76 78 70 72 69 6e 74 66 28 26 62 2c vxprintf(&b,
7d60: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 zFormat, ap);.
7d70: 20 20 20 66 6f 73 73 69 6c 5f 70 75 74 73 28 62 fossil_puts(b
7d80: 6c 6f 62 5f 73 74 72 28 26 62 29 2c 20 30 29 3b lob_str(&b), 0);
7d90: 0a 20 20 20 20 62 6c 6f 62 5f 72 65 73 65 74 28 . blob_reset(
7da0: 26 62 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e &b);. }. va_en
7db0: 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 d(ap);.}../*.**
7dc0: 50 72 69 6e 74 20 61 20 74 72 61 63 65 20 6d 65 Print a trace me
7dd0: 73 73 61 67 65 20 6f 6e 20 73 74 61 6e 64 61 72 ssage on standar
7de0: 64 20 65 72 72 6f 72 2e 0a 2a 2f 0a 76 6f 69 64 d error..*/.void
7df0: 20 66 6f 73 73 69 6c 5f 74 72 61 63 65 28 63 6f fossil_trace(co
7e00: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 nst char *zForma
7e10: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 t, ...){. va_li
7e20: 73 74 20 61 70 3b 0a 20 20 42 6c 6f 62 20 62 3b st ap;. Blob b;
7e30: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 . va_start(ap,
7e40: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 62 20 3d 20 zFormat);. b =
7e50: 65 6d 70 74 79 5f 62 6c 6f 62 3b 0a 20 20 76 78 empty_blob;. vx
7e60: 70 72 69 6e 74 66 28 26 62 2c 20 7a 46 6f 72 6d printf(&b, zForm
7e70: 61 74 2c 20 61 70 29 3b 0a 20 20 66 6f 73 73 69 at, ap);. fossi
7e80: 6c 5f 70 75 74 73 28 62 6c 6f 62 5f 73 74 72 28 l_puts(blob_str(
7e90: 26 62 29 2c 20 31 29 3b 0a 20 20 62 6c 6f 62 5f &b), 1);. blob_
7ea0: 72 65 73 65 74 28 26 62 29 3b 0a 20 20 76 61 5f reset(&b);. va_
7eb0: 65 6e 64 28 61 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a end(ap);.}../*.*
7ec0: 2a 20 57 72 69 74 65 20 61 20 6d 65 73 73 61 67 * Write a messag
7ed0: 65 20 74 6f 20 74 68 65 20 65 72 72 6f 72 20 6c e to the error l
7ee0: 6f 67 2c 20 69 66 20 74 68 65 20 65 72 72 6f 72 og, if the error
7ef0: 20 6c 6f 67 20 66 69 6c 65 6e 61 6d 65 20 69 73 log filename is
7f00: 0a 2a 2a 20 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a .** defined..*/.
7f10: 73 74 61 74 69 63 20 76 6f 69 64 20 66 6f 73 73 static void foss
7f20: 69 6c 5f 65 72 72 6f 72 6c 6f 67 28 63 6f 6e 73 il_errorlog(cons
7f30: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c t char *zFormat,
7f40: 20 2e 2e 2e 29 7b 0a 20 20 73 74 72 75 63 74 20 ...){. struct
7f50: 74 6d 20 2a 70 4e 6f 77 3b 0a 20 20 74 69 6d 65 tm *pNow;. time
7f60: 5f 74 20 6e 6f 77 3b 0a 20 20 46 49 4c 45 20 2a _t now;. FILE *
7f70: 6f 75 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 out;. const cha
7f80: 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 r *z;. int i;.
7f90: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 73 va_list ap;. s
7fa0: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 tatic const char
7fb0: 20 2a 63 6f 6e 73 74 20 61 7a 45 6e 76 5b 5d 20 *const azEnv[]
7fc0: 3d 20 7b 20 22 48 54 54 50 5f 48 4f 53 54 22 2c = { "HTTP_HOST",
7fd0: 20 22 48 54 54 50 5f 55 53 45 52 5f 41 47 45 4e "HTTP_USER_AGEN
7fe0: 54 22 2c 0a 20 20 20 20 20 20 22 50 41 54 48 5f T",. "PATH_
7ff0: 49 4e 46 4f 22 2c 20 22 51 55 45 52 59 5f 53 54 INFO", "QUERY_ST
8000: 52 49 4e 47 22 2c 20 22 52 45 4d 4f 54 45 5f 41 RING", "REMOTE_A
8010: 44 44 52 22 2c 20 22 52 45 51 55 45 53 54 5f 4d DDR", "REQUEST_M
8020: 45 54 48 4f 44 22 2c 0a 20 20 20 20 20 20 22 52 ETHOD",. "R
8030: 45 51 55 45 53 54 5f 55 52 49 22 2c 20 22 53 43 EQUEST_URI", "SC
8040: 52 49 50 54 5f 4e 41 4d 45 22 20 7d 3b 0a 20 20 RIPT_NAME" };.
8050: 69 66 28 20 67 2e 7a 45 72 72 6c 6f 67 3d 3d 30 if( g.zErrlog==0
8060: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 75 74 ) return;. out
8070: 20 3d 20 66 6f 73 73 69 6c 5f 66 6f 70 65 6e 28 = fossil_fopen(
8080: 67 2e 7a 45 72 72 6c 6f 67 2c 20 22 61 22 29 3b g.zErrlog, "a");
8090: 0a 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 20 . if( out==0 )
80a0: 72 65 74 75 72 6e 3b 0a 20 20 6e 6f 77 20 3d 20 return;. now =
80b0: 74 69 6d 65 28 30 29 3b 0a 20 20 70 4e 6f 77 20 time(0);. pNow
80c0: 3d 20 67 6d 74 69 6d 65 28 26 6e 6f 77 29 3b 0a = gmtime(&now);.
80d0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 fprintf(out, "
80e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 25 30 ------------- %0
80f0: 34 64 2d 25 30 32 64 2d 25 30 32 64 20 25 30 32 4d-%02d-%02d %02
8100: 64 3a 25 30 32 64 3a 25 30 32 64 20 55 54 43 20 d:%02d:%02d UTC
8110: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c ------------\n",
8120: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 6f 77 2d . pNow-
8130: 3e 74 6d 5f 79 65 61 72 2b 31 39 30 30 2c 20 70 >tm_year+1900, p
8140: 4e 6f 77 2d 3e 74 6d 5f 6d 6f 6e 2b 31 2c 20 70 Now->tm_mon+1, p
8150: 4e 6f 77 2d 3e 74 6d 5f 6d 64 61 79 2b 31 2c 0a Now->tm_mday+1,.
8160: 20 20 20 20 20 20 20 20 20 20 70 4e 6f 77 2d 3e pNow->
8170: 74 6d 5f 68 6f 75 72 2c 20 70 4e 6f 77 2d 3e 74 tm_hour, pNow->t
8180: 6d 5f 6d 69 6e 2c 20 70 4e 6f 77 2d 3e 74 6d 5f m_min, pNow->tm_
8190: 73 65 63 29 3b 0a 20 20 76 61 5f 73 74 61 72 74 sec);. va_start
81a0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 (ap, zFormat);.
81b0: 20 76 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 7a vfprintf(out, z
81c0: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 66 Format, ap);. f
81d0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 6e 22 printf(out, "\n"
81e0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b );. va_end(ap);
81f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 63 6f . for(i=0; i<co
8200: 75 6e 74 28 61 7a 45 6e 76 29 3b 20 69 2b 2b 29 unt(azEnv); i++)
8210: 7b 0a 20 20 20 20 63 68 61 72 20 2a 70 3b 0a 20 {. char *p;.
8220: 20 20 20 69 66 28 20 28 70 20 3d 20 66 6f 73 73 if( (p = foss
8230: 69 6c 5f 67 65 74 65 6e 76 28 61 7a 45 6e 76 5b il_getenv(azEnv[
8240: 69 5d 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 i]))!=0 ){.
8250: 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 fprintf(out, "%
8260: 73 3d 25 73 5c 6e 22 2c 20 61 7a 45 6e 76 5b 69 s=%s\n", azEnv[i
8270: 5d 2c 20 70 29 3b 0a 20 20 20 20 20 20 66 6f 73 ], p);. fos
8280: 73 69 6c 5f 70 61 74 68 5f 66 72 65 65 28 70 29 sil_path_free(p)
8290: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 ;. }else if(
82a0: 28 7a 20 3d 20 50 28 61 7a 45 6e 76 5b 69 5d 29 (z = P(azEnv[i])
82b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 70 )!=0 ){. fp
82c0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 3d 25 rintf(out, "%s=%
82d0: 73 5c 6e 22 2c 20 61 7a 45 6e 76 5b 69 5d 2c 20 s\n", azEnv[i],
82e0: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 z);. }. }.
82f0: 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 7d 0a 0a fclose(out);.}..
8300: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 /*.** The follow
8310: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 62 65 63 ing variable bec
8320: 6f 6d 65 73 20 74 72 75 65 20 77 68 69 6c 65 20 omes true while
8330: 70 72 6f 63 65 73 73 69 6e 67 20 61 20 66 61 74 processing a fat
8340: 61 6c 20 65 72 72 6f 72 0a 2a 2a 20 6f 72 20 61 al error.** or a
8350: 20 70 61 6e 69 63 2e 20 20 49 66 20 61 64 64 69 panic. If addi
8360: 74 69 6f 6e 61 6c 20 22 72 65 63 75 72 73 69 76 tional "recursiv
8370: 65 2d 66 61 74 61 6c 22 20 65 72 72 6f 72 73 20 e-fatal" errors
8380: 6f 63 63 75 72 20 77 68 69 6c 65 0a 2a 2a 20 73 occur while.** s
8390: 68 75 74 74 69 6e 67 20 64 6f 77 6e 2c 20 74 68 hutting down, th
83a0: 65 20 72 65 63 75 72 73 69 76 65 20 65 72 72 6f e recursive erro
83b0: 72 73 20 61 72 65 20 73 69 6c 65 6e 74 6c 79 20 rs are silently
83c0: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 ignored..*/.stat
83d0: 69 63 20 69 6e 74 20 6d 61 69 6e 49 6e 46 61 74 ic int mainInFat
83e0: 61 6c 45 72 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a alError = 0;../*
83f0: 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 .** Print an err
8400: 6f 72 20 6d 65 73 73 61 67 65 2c 20 72 6f 6c 6c or message, roll
8410: 62 61 63 6b 20 61 6c 6c 20 64 61 74 61 62 61 73 back all databas
8420: 65 73 2c 20 61 6e 64 20 71 75 69 74 2e 20 20 54 es, and quit. T
8430: 68 65 73 65 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 hese.** routines
8440: 20 6e 65 76 65 72 20 72 65 74 75 72 6e 2e 0a 2a never return..*
8450: 2f 0a 4e 4f 52 45 54 55 52 4e 20 76 6f 69 64 20 /.NORETURN void
8460: 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 63 6f 6e fossil_panic(con
8470: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 st char *zFormat
8480: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 , ...){. va_lis
8490: 74 20 61 70 3b 0a 20 20 69 6e 74 20 72 63 20 3d t ap;. int rc =
84a0: 20 31 3b 0a 20 20 63 68 61 72 20 7a 5b 31 30 30 1;. char z[100
84b0: 30 5d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 0];. static int
84c0: 20 6f 6e 63 65 20 3d 20 30 3b 0a 0a 20 20 69 66 once = 0;.. if
84d0: 28 20 6f 6e 63 65 20 29 20 65 78 69 74 28 31 29 ( once ) exit(1)
84e0: 3b 0a 20 20 6f 6e 63 65 20 3d 20 31 3b 0a 20 20 ;. once = 1;.
84f0: 6d 61 69 6e 49 6e 46 61 74 61 6c 45 72 72 6f 72 mainInFatalError
8500: 20 3d 20 31 3b 0a 20 20 64 62 5f 66 6f 72 63 65 = 1;. db_force
8510: 5f 72 6f 6c 6c 62 61 63 6b 28 29 3b 0a 20 20 76 _rollback();. v
8520: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 a_start(ap, zFor
8530: 6d 61 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f mat);. sqlite3_
8540: 76 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 vsnprintf(sizeof
8550: 28 7a 29 2c 7a 2c 7a 46 6f 72 6d 61 74 2c 20 61 (z),z,zFormat, a
8560: 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 p);. va_end(ap)
8570: 3b 0a 20 20 66 6f 73 73 69 6c 5f 65 72 72 6f 72 ;. fossil_error
8580: 6c 6f 67 28 22 70 61 6e 69 63 3a 20 25 73 22 2c log("panic: %s",
8590: 20 7a 29 3b 0a 23 69 66 64 65 66 20 46 4f 53 53 z);.#ifdef FOSS
85a0: 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 0a 20 IL_ENABLE_JSON.
85b0: 20 69 66 28 20 67 2e 6a 73 6f 6e 2e 69 73 4a 73 if( g.json.isJs
85c0: 6f 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 6a 73 onMode ){. js
85d0: 6f 6e 5f 65 72 72 28 20 30 2c 20 7a 2c 20 31 20 on_err( 0, z, 1
85e0: 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 69 73 48 );. if( g.isH
85f0: 54 54 50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 TTP ){. rc
8600: 3d 20 30 20 2f 2a 20 61 76 6f 69 64 20 48 54 54 = 0 /* avoid HTT
8610: 50 20 35 30 30 20 2a 2f 3b 0a 20 20 20 20 7d 0a P 500 */;. }.
8620: 20 20 7d 0a 20 20 65 6c 73 65 0a 23 65 6e 64 69 }. else.#endi
8630: 66 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 67 2e f. {. if( g.
8640: 63 67 69 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 cgiOutput ){.
8650: 20 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c cgi_printf("<
8660: 70 20 63 6c 61 73 73 3d 5c 22 67 65 6e 65 72 61 p class=\"genera
8670: 6c 45 72 72 6f 72 5c 22 3e 25 68 3c 2f 70 3e 22 lError\">%h</p>"
8680: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 63 67 69 5f , z);. cgi_
8690: 72 65 70 6c 79 28 29 3b 0a 20 20 20 20 7d 65 6c reply();. }el
86a0: 73 65 20 69 66 28 20 21 67 2e 66 51 75 69 65 74 se if( !g.fQuiet
86b0: 20 29 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c ){. fossil
86c0: 5f 66 6f 72 63 65 5f 6e 65 77 6c 69 6e 65 28 29 _force_newline()
86d0: 3b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 70 ;. fossil_p
86e0: 75 74 73 28 22 46 6f 73 73 69 6c 20 69 6e 74 65 uts("Fossil inte
86f0: 72 6e 61 6c 20 65 72 72 6f 72 3a 20 22 2c 20 31 rnal error: ", 1
8700: 29 3b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f );. fossil_
8710: 70 75 74 73 28 7a 2c 20 31 29 3b 0a 20 20 20 20 puts(z, 1);.
8720: 20 20 66 6f 73 73 69 6c 5f 70 75 74 73 28 22 5c fossil_puts("\
8730: 6e 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 n", 1);. }.
8740: 7d 0a 20 20 65 78 69 74 28 72 63 29 3b 0a 7d 0a }. exit(rc);.}.
8750: 0a 4e 4f 52 45 54 55 52 4e 20 76 6f 69 64 20 66 .NORETURN void f
8760: 6f 73 73 69 6c 5f 66 61 74 61 6c 28 63 6f 6e 73 ossil_fatal(cons
8770: 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c t char *zFormat,
8780: 20 2e 2e 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a ...){. char *z
8790: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 31 3b 0a ;. int rc = 1;.
87a0: 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 va_list ap;.
87b0: 6d 61 69 6e 49 6e 46 61 74 61 6c 45 72 72 6f 72 mainInFatalError
87c0: 20 3d 20 31 3b 0a 20 20 76 61 5f 73 74 61 72 74 = 1;. va_start
87d0: 28 61 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 (ap, zFormat);.
87e0: 20 7a 20 3d 20 76 6d 70 72 69 6e 74 66 28 7a 46 z = vmprintf(zF
87f0: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 ormat, ap);. va
8800: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 66 6f 73 73 _end(ap);. foss
8810: 69 6c 5f 65 72 72 6f 72 6c 6f 67 28 22 66 61 74 il_errorlog("fat
8820: 61 6c 3a 20 25 73 22 2c 20 7a 29 3b 0a 23 69 66 al: %s", z);.#if
8830: 64 65 66 20 46 4f 53 53 49 4c 5f 45 4e 41 42 4c def FOSSIL_ENABL
8840: 45 5f 4a 53 4f 4e 0a 20 20 69 66 28 20 67 2e 6a E_JSON. if( g.j
8850: 73 6f 6e 2e 69 73 4a 73 6f 6e 4d 6f 64 65 20 29 son.isJsonMode )
8860: 7b 0a 20 20 20 20 6a 73 6f 6e 5f 65 72 72 28 20 {. json_err(
8870: 67 2e 6a 73 6f 6e 2e 72 65 73 75 6c 74 43 6f 64 g.json.resultCod
8880: 65 2c 20 7a 2c 20 31 20 29 3b 0a 20 20 20 20 69 e, z, 1 );. i
8890: 66 28 20 67 2e 69 73 48 54 54 50 20 29 7b 0a 20 f( g.isHTTP ){.
88a0: 20 20 20 20 20 72 63 20 3d 20 30 20 2f 2a 20 61 rc = 0 /* a
88b0: 76 6f 69 64 20 48 54 54 50 20 35 30 30 20 2a 2f void HTTP 500 */
88c0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 65 6c ;. }. }. el
88d0: 73 65 0a 23 65 6e 64 69 66 0a 20 20 7b 0a 20 20 se.#endif. {.
88e0: 20 20 69 66 28 20 67 2e 63 67 69 4f 75 74 70 75 if( g.cgiOutpu
88f0: 74 20 29 7b 0a 20 20 20 20 20 20 67 2e 63 67 69 t ){. g.cgi
8900: 4f 75 74 70 75 74 20 3d 20 30 3b 0a 20 20 20 20 Output = 0;.
8910: 20 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c 70 cgi_printf("<p
8920: 20 63 6c 61 73 73 3d 5c 22 67 65 6e 65 72 61 6c class=\"general
8930: 45 72 72 6f 72 5c 22 3e 5c 6e 25 68 5c 6e 3c 2f Error\">\n%h\n</
8940: 70 3e 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 p>\n", z);.
8950: 20 63 67 69 5f 72 65 70 6c 79 28 29 3b 0a 20 20 cgi_reply();.
8960: 20 20 7d 65 6c 73 65 20 69 66 28 20 21 67 2e 66 }else if( !g.f
8970: 51 75 69 65 74 20 29 7b 0a 20 20 20 20 20 20 66 Quiet ){. f
8980: 6f 73 73 69 6c 5f 66 6f 72 63 65 5f 6e 65 77 6c ossil_force_newl
8990: 69 6e 65 28 29 3b 0a 20 20 20 20 20 20 66 6f 73 ine();. fos
89a0: 73 69 6c 5f 74 72 61 63 65 28 22 25 73 5c 6e 22 sil_trace("%s\n"
89b0: 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a , z);. }. }.
89c0: 20 20 66 72 65 65 28 7a 29 3b 0a 20 20 64 62 5f free(z);. db_
89d0: 66 6f 72 63 65 5f 72 6f 6c 6c 62 61 63 6b 28 29 force_rollback()
89e0: 3b 0a 20 20 66 6f 73 73 69 6c 5f 65 78 69 74 28 ;. fossil_exit(
89f0: 72 63 29 3b 0a 7d 0a 0a 2f 2a 20 54 68 69 73 20 rc);.}../* This
8a00: 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 routine works li
8a10: 6b 65 20 66 6f 73 73 69 6c 5f 66 61 74 61 6c 28 ke fossil_fatal(
8a20: 29 20 65 78 63 65 70 74 20 74 68 61 74 20 69 66 ) except that if
8a30: 20 63 61 6c 6c 65 64 0a 2a 2a 20 72 65 63 75 72 called.** recur
8a40: 73 69 76 65 6c 79 2c 20 74 68 65 20 72 65 63 75 sively, the recu
8a50: 72 73 69 76 65 20 63 61 6c 6c 20 69 73 20 61 20 rsive call is a
8a60: 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 55 73 65 no-op..**.** Use
8a70: 20 74 68 69 73 20 69 6e 20 70 6c 61 63 65 73 20 this in places
8a80: 77 68 65 72 65 20 61 6e 20 65 72 72 6f 72 20 6d where an error m
8a90: 69 67 68 74 20 6f 63 63 75 72 20 77 68 69 6c 65 ight occur while
8aa0: 20 64 6f 69 6e 67 0a 2a 2a 20 66 61 74 61 6c 20 doing.** fatal
8ab0: 65 72 72 6f 72 20 73 68 75 74 64 6f 77 6e 20 70 error shutdown p
8ac0: 72 6f 63 65 73 73 69 6e 67 2e 20 20 55 6e 6c 69 rocessing. Unli
8ad0: 6b 65 20 66 6f 73 73 69 6c 5f 70 61 6e 69 63 28 ke fossil_panic(
8ae0: 29 20 61 6e 64 0a 2a 2a 20 66 6f 73 73 69 6c 5f ) and.** fossil_
8af0: 66 61 74 61 6c 28 29 20 77 68 69 63 68 20 6e 65 fatal() which ne
8b00: 76 65 72 20 72 65 74 75 72 6e 2c 20 74 68 69 73 ver return, this
8b10: 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 routine might r
8b20: 65 74 75 72 6e 20 69 66 0a 2a 2a 20 74 68 65 20 eturn if.** the
8b30: 66 61 74 61 6c 20 65 72 72 6f 72 20 68 61 6e 64 fatal error hand
8b40: 69 6e 67 20 69 73 20 61 6c 72 65 61 64 79 20 69 ing is already i
8b50: 6e 20 70 72 6f 63 65 73 73 2e 20 20 54 68 65 20 n process. The
8b60: 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 62 caller must.** b
8b70: 65 20 70 72 65 70 61 72 65 64 20 66 6f 72 20 74 e prepared for t
8b80: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 20 72 his routine to r
8b90: 65 74 75 72 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 66 eturn..*/.void f
8ba0: 6f 73 73 69 6c 5f 66 61 74 61 6c 5f 72 65 63 75 ossil_fatal_recu
8bb0: 72 73 69 76 65 28 63 6f 6e 73 74 20 63 68 61 72 rsive(const char
8bc0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b *zFormat, ...){
8bd0: 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 . char *z;. va
8be0: 5f 6c 69 73 74 20 61 70 3b 0a 20 20 69 6e 74 20 _list ap;. int
8bf0: 72 63 20 3d 20 31 3b 0a 20 20 69 66 28 20 6d 61 rc = 1;. if( ma
8c00: 69 6e 49 6e 46 61 74 61 6c 45 72 72 6f 72 20 29 inInFatalError )
8c10: 20 72 65 74 75 72 6e 3b 0a 20 20 6d 61 69 6e 49 return;. mainI
8c20: 6e 46 61 74 61 6c 45 72 72 6f 72 20 3d 20 31 3b nFatalError = 1;
8c30: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 . va_start(ap,
8c40: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 zFormat);. z =
8c50: 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 vmprintf(zFormat
8c60: 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 , ap);. va_end(
8c70: 61 70 29 3b 0a 20 20 66 6f 73 73 69 6c 5f 65 72 ap);. fossil_er
8c80: 72 6f 72 6c 6f 67 28 22 66 61 74 61 6c 3a 20 25 rorlog("fatal: %
8c90: 73 22 2c 20 7a 29 3b 0a 23 69 66 64 65 66 20 46 s", z);.#ifdef F
8ca0: 4f 53 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f OSSIL_ENABLE_JSO
8cb0: 4e 0a 20 20 69 66 28 20 67 2e 6a 73 6f 6e 2e 69 N. if( g.json.i
8cc0: 73 4a 73 6f 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 sJsonMode ){.
8cd0: 20 6a 73 6f 6e 5f 65 72 72 28 20 67 2e 6a 73 6f json_err( g.jso
8ce0: 6e 2e 72 65 73 75 6c 74 43 6f 64 65 2c 20 7a 2c n.resultCode, z,
8cf0: 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 67 2e 1 );. if( g.
8d00: 69 73 48 54 54 50 20 29 7b 0a 20 20 20 20 20 20 isHTTP ){.
8d10: 72 63 20 3d 20 30 20 2f 2a 20 61 76 6f 69 64 20 rc = 0 /* avoid
8d20: 48 54 54 50 20 35 30 30 20 2a 2f 3b 0a 20 20 20 HTTP 500 */;.
8d30: 20 7d 0a 20 20 7d 20 65 6c 73 65 0a 23 65 6e 64 }. } else.#end
8d40: 69 66 0a 20 20 7b 0a 20 20 20 20 69 66 28 20 67 if. {. if( g
8d50: 2e 63 67 69 4f 75 74 70 75 74 20 29 7b 0a 20 20 .cgiOutput ){.
8d60: 20 20 20 20 67 2e 63 67 69 4f 75 74 70 75 74 20 g.cgiOutput
8d70: 3d 20 30 3b 0a 20 20 20 20 20 20 63 67 69 5f 70 = 0;. cgi_p
8d80: 72 69 6e 74 66 28 22 3c 70 20 63 6c 61 73 73 3d rintf("<p class=
8d90: 5c 22 67 65 6e 65 72 61 6c 45 72 72 6f 72 5c 22 \"generalError\"
8da0: 3e 5c 6e 25 68 5c 6e 3c 2f 70 3e 5c 6e 22 2c 20 >\n%h\n</p>\n",
8db0: 7a 29 3b 0a 20 20 20 20 20 20 63 67 69 5f 72 65 z);. cgi_re
8dc0: 70 6c 79 28 29 3b 0a 20 20 20 20 7d 65 6c 73 65 ply();. }else
8dd0: 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 66 {. fossil_f
8de0: 6f 72 63 65 5f 6e 65 77 6c 69 6e 65 28 29 3b 0a orce_newline();.
8df0: 20 20 20 20 20 20 66 6f 73 73 69 6c 5f 74 72 61 fossil_tra
8e00: 63 65 28 22 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 ce("%s\n", z);.
8e10: 20 20 20 7d 0a 20 20 7d 0a 20 20 64 62 5f 66 6f }. }. db_fo
8e20: 72 63 65 5f 72 6f 6c 6c 62 61 63 6b 28 29 3b 0a rce_rollback();.
8e30: 20 20 66 6f 73 73 69 6c 5f 65 78 69 74 28 72 63 fossil_exit(rc
8e40: 29 3b 0a 7d 0a 0a 0a 2f 2a 20 50 72 69 6e 74 20 );.}.../* Print
8e50: 61 20 77 61 72 6e 69 6e 67 20 6d 65 73 73 61 67 a warning messag
8e60: 65 20 2a 2f 0a 76 6f 69 64 20 66 6f 73 73 69 6c e */.void fossil
8e70: 5f 77 61 72 6e 69 6e 67 28 63 6f 6e 73 74 20 63 _warning(const c
8e80: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e har *zFormat, ..
8e90: 2e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 .){. char *z;.
8ea0: 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 76 va_list ap;. v
8eb0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 a_start(ap, zFor
8ec0: 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 76 6d 70 72 mat);. z = vmpr
8ed0: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 intf(zFormat, ap
8ee0: 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b );. va_end(ap);
8ef0: 0a 20 20 66 6f 73 73 69 6c 5f 65 72 72 6f 72 6c . fossil_errorl
8f00: 6f 67 28 22 77 61 72 6e 69 6e 67 3a 20 25 73 22 og("warning: %s"
8f10: 2c 20 7a 29 3b 0a 23 69 66 64 65 66 20 46 4f 53 , z);.#ifdef FOS
8f20: 53 49 4c 5f 45 4e 41 42 4c 45 5f 4a 53 4f 4e 0a SIL_ENABLE_JSON.
8f30: 20 20 69 66 28 67 2e 6a 73 6f 6e 2e 69 73 4a 73 if(g.json.isJs
8f40: 6f 6e 4d 6f 64 65 29 7b 0a 20 20 20 20 6a 73 6f onMode){. jso
8f50: 6e 5f 77 61 72 6e 28 20 46 53 4c 5f 4a 53 4f 4e n_warn( FSL_JSON
8f60: 5f 57 5f 55 4e 4b 4e 4f 57 4e 2c 20 7a 20 29 3b _W_UNKNOWN, z );
8f70: 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a . }else.#endif.
8f80: 20 20 7b 0a 20 20 20 20 69 66 28 20 67 2e 63 67 {. if( g.cg
8f90: 69 4f 75 74 70 75 74 20 29 7b 0a 20 20 20 20 20 iOutput ){.
8fa0: 20 63 67 69 5f 70 72 69 6e 74 66 28 22 3c 70 20 cgi_printf("<p
8fb0: 63 6c 61 73 73 3d 5c 22 67 65 6e 65 72 61 6c 45 class=\"generalE
8fc0: 72 72 6f 72 5c 22 3e 5c 6e 25 68 5c 6e 3c 2f 70 rror\">\n%h\n</p
8fd0: 3e 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 65 >\n", z);. }e
8fe0: 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 73 73 69 lse{. fossi
8ff0: 6c 5f 66 6f 72 63 65 5f 6e 65 77 6c 69 6e 65 28 l_force_newline(
9000: 29 3b 0a 20 20 20 20 20 20 66 6f 73 73 69 6c 5f );. fossil_
9010: 74 72 61 63 65 28 22 25 73 5c 6e 22 2c 20 7a 29 trace("%s\n", z)
9020: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 72 ;. }. }. fr
9030: 65 65 28 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 ee(z);.}../*.**
9040: 54 75 72 6e 20 6f 66 66 20 61 6e 79 20 4c 46 20 Turn off any LF
9050: 74 6f 20 43 52 4c 46 20 74 72 61 6e 73 6c 61 74 to CRLF translat
9060: 69 6f 6e 20 6f 6e 20 74 68 65 20 73 74 72 65 61 ion on the strea
9070: 6d 20 67 69 76 65 6e 20 61 73 20 61 6e 0a 2a 2a m given as an.**
9080: 20 61 72 67 75 6d 65 6e 74 2e 20 20 54 68 69 73 argument. This
9090: 20 69 73 20 61 20 6e 6f 2d 6f 70 20 6f 6e 20 75 is a no-op on u
90a0: 6e 69 78 20 62 75 74 20 69 73 20 6e 65 63 65 73 nix but is neces
90b0: 73 61 72 79 20 6f 6e 20 77 69 6e 64 6f 77 73 2e sary on windows.
90c0: 0a 2a 2f 0a 76 6f 69 64 20 66 6f 73 73 69 6c 5f .*/.void fossil_
90d0: 62 69 6e 61 72 79 5f 6d 6f 64 65 28 46 49 4c 45 binary_mode(FILE
90e0: 20 2a 70 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 *p){.#if define
90f0: 64 28 5f 57 49 4e 33 32 29 0a 20 20 5f 73 65 74 d(_WIN32). _set
9100: 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 70 29 2c mode(_fileno(p),
9110: 20 5f 4f 5f 42 49 4e 41 52 59 29 3b 0a 23 65 6e _O_BINARY);.#en
9120: 64 69 66 0a 23 69 66 64 65 66 20 5f 5f 45 4d 58 dif.#ifdef __EMX
9130: 5f 5f 20 20 20 20 20 2f 2a 20 4f 53 2f 32 20 2a __ /* OS/2 *
9140: 2f 0a 20 20 73 65 74 6d 6f 64 65 28 66 69 6c 65 /. setmode(file
9150: 6e 6f 28 70 29 2c 20 4f 5f 42 49 4e 41 52 59 29 no(p), O_BINARY)
9160: 3b 0a 23 65 6e 64 69 66 0a 7d 0a ;.#endif.}.