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 31 34 20 44 2e 20 52 69 63 68 (c) 2014 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 2a 2a 0a 2a 2a 20 54 68 ense".).**.** Th
00f0: 69 73 20 70 72 6f 67 72 61 6d 20 69 73 20 64 69 is program is di
0100: 73 74 72 69 62 75 74 65 64 20 69 6e 20 74 68 65 stributed in the
0110: 20 68 6f 70 65 20 74 68 61 74 20 69 74 20 77 69 hope that it wi
0120: 6c 6c 20 62 65 20 75 73 65 66 75 6c 2c 0a 2a 2a ll be useful,.**
0130: 20 62 75 74 20 77 69 74 68 6f 75 74 20 61 6e 79 but without any
0140: 20 77 61 72 72 61 6e 74 79 3b 20 77 69 74 68 6f warranty; witho
0150: 75 74 20 65 76 65 6e 20 74 68 65 20 69 6d 70 6c ut even the impl
0160: 69 65 64 20 77 61 72 72 61 6e 74 79 20 6f 66 0a ied warranty of.
0170: 2a 2a 20 6d 65 72 63 68 61 6e 74 61 62 69 6c 69 ** merchantabili
0180: 74 79 20 6f 72 20 66 69 74 6e 65 73 73 20 66 6f ty or fitness fo
0190: 72 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 70 r a particular p
01a0: 75 72 70 6f 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 75 urpose..**.** Au
01b0: 74 68 6f 72 20 63 6f 6e 74 61 63 74 20 69 6e 66 thor contact inf
01c0: 6f 72 6d 61 74 69 6f 6e 3a 0a 2a 2a 20 20 20 64 ormation:.** d
01d0: 72 68 40 68 77 61 63 69 2e 63 6f 6d 0a 2a 2a 20 rh@hwaci.com.**
01e0: 20 20 68 74 74 70 3a 2f 2f 77 77 77 2e 68 77 61 http://www.hwa
01f0: 63 69 2e 63 6f 6d 2f 64 72 68 2f 0a 2a 2a 0a 2a ci.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 2a 2a 0a 2a **************.*
0250: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 73 *.** This is a s
0260: 74 61 6e 64 2d 61 6c 6f 6e 65 20 75 74 69 6c 69 tand-alone utili
0270: 74 79 20 70 72 6f 67 72 61 6d 20 74 68 61 74 20 ty program that
0280: 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 46 is part of the F
0290: 6f 73 73 69 6c 20 62 75 69 6c 64 0a 2a 2a 20 70 ossil build.** p
02a0: 72 6f 63 65 73 73 2e 20 20 54 68 69 73 20 70 72 rocess. This pr
02b0: 6f 67 72 61 6d 20 72 65 61 64 73 20 66 69 6c 65 ogram reads file
02c0: 73 20 6e 61 6d 65 64 20 6f 6e 20 74 68 65 20 63 s named on the c
02d0: 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 61 6e 64 20 ommand line and
02e0: 63 6f 6e 76 65 72 74 73 0a 2a 2a 20 74 68 65 6d converts.** them
02f0: 20 69 6e 74 6f 20 41 4e 53 49 2d 43 20 73 74 61 into ANSI-C sta
0300: 74 69 63 20 63 68 61 72 20 61 72 72 61 79 20 76 tic char array v
0310: 61 72 69 61 62 6c 65 73 2e 20 20 4f 75 74 70 75 ariables. Outpu
0320: 74 20 69 73 20 77 72 69 74 74 65 6e 20 6f 6e 74 t is written ont
0330: 6f 0a 2a 2a 20 73 74 61 6e 64 61 72 64 20 6f 75 o.** standard ou
0340: 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 41 64 64 69 tput..**.** Addi
0350: 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 69 6e tionally, the in
0360: 70 75 74 20 66 69 6c 65 73 20 6d 61 79 20 62 65 put files may be
0370: 20 6c 69 73 74 65 64 20 69 6e 20 61 20 73 65 70 listed in a sep
0380: 61 72 61 74 65 20 6c 69 73 74 20 66 69 6c 65 20 arate list file
0390: 28 6f 6e 65 0a 2a 2a 20 72 65 73 6f 75 72 63 65 (one.** resource
03a0: 20 6e 61 6d 65 20 70 65 72 20 6c 69 6e 65 2c 20 name per line,
03b0: 6f 70 74 69 6f 6e 61 6c 6c 79 20 65 6e 63 6c 6f optionally enclo
03c0: 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 20 71 75 sed in double qu
03d0: 6f 74 65 73 29 2e 20 50 61 73 73 20 74 68 65 20 otes). Pass the
03e0: 6c 69 73 74 0a 2a 2a 20 76 69 61 20 27 2d 2d 72 list.** via '--r
03f0: 65 73 6c 69 73 74 20 3c 74 68 65 2d 6c 69 73 74 eslist <the-list
0400: 2d 66 69 6c 65 3e 27 20 6f 70 74 69 6f 6e 2e 20 -file>' option.
0410: 42 6f 74 68 20 6c 69 73 74 73 2c 20 66 72 6f 6d Both lists, from
0420: 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e the command lin
0430: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 6c 69 73 e and.** the lis
0440: 74 20 66 69 6c 65 2c 20 61 72 65 20 6d 65 72 67 t file, are merg
0450: 65 64 3b 20 64 75 70 6c 69 63 61 74 65 20 66 69 ed; duplicate fi
0460: 6c 65 20 6e 61 6d 65 73 20 73 6b 69 70 70 65 64 le names skipped
0470: 20 66 72 6f 6d 20 70 72 6f 63 65 73 73 69 6e 67 from processing
0480: 2e 0a 2a 2a 20 54 68 69 73 20 6f 70 74 69 6f 6e ..** This option
0490: 20 69 73 20 75 73 65 66 75 6c 20 74 6f 20 67 65 is useful to ge
04a0: 74 20 61 72 6f 75 6e 64 20 74 68 65 20 63 6f 6d t around the com
04b0: 6d 61 6e 64 20 6c 69 6e 65 20 6c 65 6e 67 74 68 mand line length
04c0: 20 6c 69 6d 69 74 61 74 69 6f 6e 73 0a 2a 2a 20 limitations.**
04d0: 75 6e 64 65 72 20 73 6f 6d 65 20 4f 53 2c 20 6c under some OS, l
04e0: 69 6b 65 20 57 69 6e 64 6f 77 73 2e 0a 2a 2a 0a ike Windows..**.
04f0: 2a 2a 20 54 68 65 20 6d 61 6b 65 66 69 6c 65 73 ** The makefiles
0500: 20 75 73 65 20 74 68 69 73 20 75 74 69 6c 69 74 use this utilit
0510: 79 20 74 6f 20 70 61 63 6b 61 67 65 20 76 61 72 y to package var
0520: 69 6f 75 73 20 72 65 73 6f 75 72 63 65 73 20 28 ious resources (
0530: 6c 61 72 67 65 20 73 63 72 69 70 74 73 2c 0a 2a large scripts,.*
0540: 2a 20 47 49 46 20 69 6d 61 67 65 73 2c 20 65 74 * GIF images, et
0550: 63 29 20 74 68 61 74 20 61 72 65 20 73 65 70 61 c) that are sepa
0560: 72 61 74 65 20 66 69 6c 65 73 20 69 6e 20 74 68 rate files in th
0570: 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 61 73 e source code as
0580: 20 62 79 74 65 0a 2a 2a 20 61 72 72 61 79 73 20 byte.** arrays
0590: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 in the resulting
05a0: 20 65 78 65 63 75 74 61 62 6c 65 2e 0a 2a 2f 0a executable..*/.
05b0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e #include <stdio.
05c0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 h>.#include <std
05d0: 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 lib.h>.#include
05e0: 3c 73 74 72 69 6e 67 2e 68 3e 0a 23 69 6e 63 6c <string.h>.#incl
05f0: 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 0a 2f ude <ctype.h>../
0600: 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 65 6e *.** Read the en
0610: 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 tire content of
0620: 74 68 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 7a the file named z
0630: 46 69 6c 65 6e 61 6d 65 20 69 6e 74 6f 20 6d 65 Filename into me
0640: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a mory obtained.**
0650: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 from malloc() a
0660: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e nd return a poin
0670: 74 65 72 20 74 6f 20 74 68 61 74 20 6d 65 6d 6f ter to that memo
0680: 72 79 2e 20 20 57 72 69 74 65 20 74 68 65 20 73 ry. Write the s
0690: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 ize of the.** fi
06a0: 6c 65 20 69 6e 74 6f 20 2a 70 6e 42 79 74 65 2e le into *pnByte.
06b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 .*/.static unsig
06c0: 6e 65 64 20 63 68 61 72 20 2a 72 65 61 64 5f 66 ned char *read_f
06d0: 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a ile(const char *
06e0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 69 6e 74 20 2a zFilename, int *
06f0: 70 6e 42 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 pnByte){. FILE
0700: 2a 69 6e 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 *in;. unsigned
0710: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e char *z;. int n
0720: 42 79 74 65 3b 0a 20 20 69 6e 74 20 67 6f 74 3b Byte;. int got;
0730: 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 46 . in = fopen(zF
0740: 69 6c 65 6e 61 6d 65 2c 20 22 72 62 22 29 3b 0a ilename, "rb");.
0750: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 7b 0a 20 if( in==0 ){.
0760: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d return 0;. }
0770: 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 . fseek(in, 0,
0780: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 2a 70 6e SEEK_END);. *pn
0790: 42 79 74 65 20 3d 20 6e 42 79 74 65 20 3d 20 66 Byte = nByte = f
07a0: 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 66 73 65 65 tell(in);. fsee
07b0: 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 53 45 k(in, 0, SEEK_SE
07c0: 54 29 3b 0a 20 20 7a 20 3d 20 6d 61 6c 6c 6f 63 T);. z = malloc
07d0: 28 20 6e 42 79 74 65 2b 31 20 29 3b 0a 20 20 69 ( nByte+1 );. i
07e0: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 66 f( z==0 ){. f
07f0: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 printf(stderr, "
0800: 66 61 69 6c 65 64 20 74 6f 20 61 6c 6c 6f 63 61 failed to alloca
0810: 74 65 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 te %d bytes\n",
0820: 6e 42 79 74 65 2b 31 29 3b 0a 20 20 20 20 65 78 nByte+1);. ex
0830: 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 67 6f 74 it(1);. }. got
0840: 20 3d 20 66 72 65 61 64 28 7a 2c 20 31 2c 20 6e = fread(z, 1, n
0850: 42 79 74 65 2c 20 69 6e 29 3b 0a 20 20 66 63 6c Byte, in);. fcl
0860: 6f 73 65 28 69 6e 29 3b 0a 20 20 7a 5b 67 6f 74 ose(in);. z[got
0870: 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 ] = 0;. return
0880: 7a 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 46 4f z;.}..#ifndef FO
0890: 53 53 49 4c 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a SSIL_DEBUG./*.**
08a0: 20 54 72 79 20 74 6f 20 63 6f 6d 70 72 65 73 73 Try to compress
08b0: 20 61 20 6a 61 76 61 73 63 72 69 70 74 20 66 69 a javascript fi
08c0: 6c 65 20 62 79 20 72 65 6d 6f 76 69 6e 67 20 75 le by removing u
08d0: 6e 6e 65 63 65 73 73 61 72 79 20 77 68 69 74 65 nnecessary white
08e0: 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 61 72 space..**.** War
08f0: 6e 69 6e 67 3a 20 20 54 68 69 73 20 63 6f 6d 70 ning: This comp
0900: 72 65 73 73 69 6f 6e 20 72 6f 75 74 69 6e 65 20 ression routine
0910: 64 6f 65 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 does not necessa
0920: 72 69 6c 79 20 77 6f 72 6b 20 66 6f 72 20 61 6e rily work for an
0930: 79 0a 2a 2a 20 61 72 62 69 74 72 61 72 79 20 4a y.** arbitrary J
0940: 61 76 61 73 63 72 69 70 74 20 73 6f 75 72 63 65 avascript source
0950: 20 66 69 6c 65 2e 20 20 42 75 74 20 69 74 20 73 file. But it s
0960: 68 6f 75 6c 64 20 77 6f 72 6b 20 6f 6b 20 66 6f hould work ok fo
0970: 72 20 74 68 65 0a 2a 2a 20 77 65 6c 6c 2d 62 65 r the.** well-be
0980: 68 61 76 65 64 20 73 6f 75 72 63 65 20 66 69 6c haved source fil
0990: 65 73 20 69 6e 20 74 68 69 73 20 70 72 6f 6a 65 es in this proje
09a0: 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f ct..*/.static vo
09b0: 69 64 20 63 6f 6d 70 72 65 73 73 4a 61 76 61 73 id compressJavas
09c0: 63 72 69 70 74 28 75 6e 73 69 67 6e 65 64 20 63 cript(unsigned c
09d0: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 2a 70 6e 29 har *z, int *pn)
09e0: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 2a 70 6e 3b {. int n = *pn;
09f0: 0a 20 20 69 6e 74 20 69 2c 20 6a 2c 20 6b 3b 0a . int i, j, k;.
0a00: 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 69 3c 6e for(i=j=0; i<n
0a10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 75 6e 73 69 ; i++){. unsi
0a20: 67 6e 65 64 20 63 68 61 72 20 63 20 3d 20 7a 5b gned char c = z[
0a30: 69 5d 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 i];. if( c=='
0a40: 2f 27 20 26 26 20 28 69 3d 3d 30 20 7c 7c 20 7a /' && (i==0 || z
0a50: 5b 69 2d 31 5d 21 3d 27 3a 27 29 29 7b 0a 20 20 [i-1]!=':')){.
0a60: 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3d 3d if( z[i+1]==
0a70: 27 2a 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77 '*' ){. w
0a80: 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 28 7a 5b hile( j>0 && (z[
0a90: 6a 2d 31 5d 3d 3d 27 20 27 20 7c 7c 20 7a 5b 6a j-1]==' ' || z[j
0aa0: 2d 31 5d 3d 3d 27 5c 74 27 29 20 29 7b 20 6a 2d -1]=='\t') ){ j-
0ab0: 2d 3b 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 -; }. for
0ac0: 28 6b 3d 69 2b 33 3b 20 6b 3c 6e 20 26 26 20 28 (k=i+3; k<n && (
0ad0: 7a 5b 6b 5d 21 3d 27 2f 27 20 7c 7c 20 7a 5b 6b z[k]!='/' || z[k
0ae0: 2d 31 5d 21 3d 27 2a 27 29 3b 20 6b 2b 2b 29 7b -1]!='*'); k++){
0af0: 7d 0a 20 20 20 20 20 20 20 20 69 20 3d 20 6b 3b }. i = k;
0b00: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 . continu
0b10: 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 e;. }else i
0b20: 66 28 20 7a 5b 69 2b 31 5d 3d 3d 27 2f 27 20 29 f( z[i+1]=='/' )
0b30: 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 {. while(
0b40: 20 6a 3e 30 20 26 26 20 28 7a 5b 6a 2d 31 5d 3d j>0 && (z[j-1]=
0b50: 3d 27 20 27 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d =' ' || z[j-1]==
0b60: 27 5c 74 27 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a '\t') ){ j--; }.
0b70: 20 20 20 20 20 20 20 20 66 6f 72 28 6b 3d 69 2b for(k=i+
0b80: 32 3b 20 6b 3c 6e 20 26 26 20 7a 5b 6b 5d 21 3d 2; k<n && z[k]!=
0b90: 27 5c 6e 27 3b 20 6b 2b 2b 29 7b 7d 0a 20 20 20 '\n'; k++){}.
0ba0: 20 20 20 20 20 69 20 3d 20 6b 2d 31 3b 0a 20 20 i = k-1;.
0bb0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a continue;.
0bc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 }. }.
0bd0: 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b if( c=='\n' ){
0be0: 0a 20 20 20 20 20 20 69 66 28 20 6a 3d 3d 30 20 . if( j==0
0bf0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 ) continue;.
0c00: 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20 while( j>0 &&
0c10: 69 73 73 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 isspace(z[j-1])
0c20: 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6a ) j--;. z[j
0c30: 2b 2b 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 ++] = '\n';.
0c40: 20 20 77 68 69 6c 65 28 20 69 2b 31 3c 6e 20 26 while( i+1<n &
0c50: 26 20 69 73 73 70 61 63 65 28 7a 5b 69 2b 31 5d & isspace(z[i+1]
0c60: 29 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 63 ) ) i++;. c
0c70: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 ontinue;. }.
0c80: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 z[j++] = c;.
0c90: 20 7d 0a 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 }. z[j] = 0;.
0ca0: 20 2a 70 6e 20 3d 20 6a 3b 0a 7d 0a 23 65 6e 64 *pn = j;.}.#end
0cb0: 69 66 20 2f 2a 20 46 4f 53 53 49 4c 5f 44 45 42 if /* FOSSIL_DEB
0cc0: 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 UG */../*.** The
0cd0: 72 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 re is an instanc
0ce0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 e of the followi
0cf0: 6e 67 20 66 6f 72 20 65 61 63 68 20 66 69 6c 65 ng for each file
0d00: 20 74 72 61 6e 73 6c 61 74 65 64 2e 0a 2a 2f 0a translated..*/.
0d10: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 typedef struct R
0d20: 65 73 6f 75 72 63 65 20 52 65 73 6f 75 72 63 65 esource Resource
0d30: 3b 0a 73 74 72 75 63 74 20 52 65 73 6f 75 72 63 ;.struct Resourc
0d40: 65 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d e {. char *zNam
0d50: 65 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a e;. int nByte;.
0d60: 20 20 69 6e 74 20 69 64 78 3b 0a 7d 3b 0a 0a 74 int idx;.};..t
0d70: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 52 65 ypedef struct Re
0d80: 73 6f 75 72 63 65 4c 69 73 74 20 52 65 73 6f 75 sourceList Resou
0d90: 72 63 65 4c 69 73 74 3b 0a 73 74 72 75 63 74 20 rceList;.struct
0da0: 52 65 73 6f 75 72 63 65 4c 69 73 74 20 7b 0a 20 ResourceList {.
0db0: 20 20 20 52 65 73 6f 75 72 63 65 20 2a 61 52 65 Resource *aRe
0dc0: 73 3b 0a 20 20 20 20 69 6e 74 20 6e 52 65 73 3b s;. int nRes;
0dd0: 0a 20 20 20 20 63 68 61 72 20 2a 62 75 66 3b 0a . char *buf;.
0de0: 20 20 20 20 6c 6f 6e 67 20 62 75 66 73 69 7a 65 long bufsize
0df0: 3b 0a 7d 3b 0a 0a 0a 52 65 73 6f 75 72 63 65 20 ;.};...Resource
0e00: 2a 72 65 61 64 5f 72 65 73 6c 69 73 74 28 63 68 *read_reslist(ch
0e10: 61 72 20 2a 6e 61 6d 65 2c 20 52 65 73 6f 75 72 ar *name, Resour
0e20: 63 65 4c 69 73 74 20 2a 6c 69 73 74 29 7b 0a 23 ceList *list){.#
0e30: 64 65 66 69 6e 65 20 52 45 53 4c 49 53 54 5f 42 define RESLIST_B
0e40: 55 46 5f 4d 41 58 42 59 54 45 53 20 28 31 4c 3c UF_MAXBYTES (1L<
0e50: 3c 32 30 29 20 20 2f 2a 20 31 20 4d 42 20 6f 66 <20) /* 1 MB of
0e60: 20 74 65 78 74 20 2a 2f 0a 20 20 46 49 4c 45 20 text */. FILE
0e70: 2a 69 6e 3b 0a 20 20 6c 6f 6e 67 20 66 69 6c 65 *in;. long file
0e80: 73 69 7a 65 20 3d 20 30 4c 3b 0a 20 20 6c 6f 6e size = 0L;. lon
0e90: 67 20 6c 69 6e 65 63 6f 75 6e 74 20 3d 20 30 4c g linecount = 0L
0ea0: 3b 0a 20 20 63 68 61 72 20 2a 70 20 3d 20 30 3b ;. char *p = 0;
0eb0: 0a 20 20 63 68 61 72 20 2a 70 62 20 3d 20 30 3b . char *pb = 0;
0ec0: 0a 0a 20 20 6d 65 6d 73 65 74 28 6c 69 73 74 2c .. memset(list,
0ed0: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 69 73 74 0, sizeof(*list
0ee0: 29 29 3b 0a 0a 20 20 69 66 28 20 28 69 6e 20 3d ));.. if( (in =
0ef0: 20 66 6f 70 65 6e 28 6e 61 6d 65 2c 20 22 72 62 fopen(name, "rb
0f00: 22 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 "))==0 ){. re
0f10: 74 75 72 6e 20 6c 69 73 74 2d 3e 61 52 65 73 3b turn list->aRes;
0f20: 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 69 6e 2c . }. fseek(in,
0f30: 20 30 4c 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 0L, SEEK_END);.
0f40: 20 20 66 69 6c 65 73 69 7a 65 20 3d 20 66 74 65 filesize = fte
0f50: 6c 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 ll(in);. rewind
0f60: 28 69 6e 29 3b 0a 0a 20 20 69 66 28 20 66 69 6c (in);.. if( fil
0f70: 65 73 69 7a 65 20 3e 20 52 45 53 4c 49 53 54 5f esize > RESLIST_
0f80: 42 55 46 5f 4d 41 58 42 59 54 45 53 20 29 7b 0a BUF_MAXBYTES ){.
0f90: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 fprintf(stde
0fa0: 72 72 2c 20 22 4c 69 73 74 20 66 69 6c 65 20 5b rr, "List file [
0fb0: 25 73 5d 20 6d 75 73 74 20 62 65 20 73 6d 61 6c %s] must be smal
0fc0: 6c 65 72 20 74 68 61 6e 20 25 6c 64 20 62 79 74 ler than %ld byt
0fd0: 65 73 5c 6e 22 2c 20 6e 61 6d 65 2c 0a 20 20 20 es\n", name,.
0fe0: 20 20 20 20 20 20 20 20 20 52 45 53 4c 49 53 54 RESLIST
0ff0: 5f 42 55 46 5f 4d 41 58 42 59 54 45 53 29 3b 0a _BUF_MAXBYTES);.
1000: 20 20 20 20 72 65 74 75 72 6e 20 6c 69 73 74 2d return list-
1010: 3e 61 52 65 73 3b 0a 20 20 7d 0a 20 20 6c 69 73 >aRes;. }. lis
1020: 74 2d 3e 62 75 66 73 69 7a 65 20 3d 20 66 69 6c t->bufsize = fil
1030: 65 73 69 7a 65 3b 0a 20 20 6c 69 73 74 2d 3e 62 esize;. list->b
1040: 75 66 20 3d 20 28 63 68 61 72 20 2a 29 63 61 6c uf = (char *)cal
1050: 6c 6f 63 28 28 6c 69 73 74 2d 3e 62 75 66 73 69 loc((list->bufsi
1060: 7a 65 20 2b 20 32 29 2c 20 73 69 7a 65 6f 66 28 ze + 2), sizeof(
1070: 6c 69 73 74 2d 3e 62 75 66 5b 30 5d 29 29 3b 0a list->buf[0]));.
1080: 20 20 69 66 28 20 6c 69 73 74 2d 3e 62 75 66 3d if( list->buf=
1090: 3d 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 =0 ){. fprint
10a0: 66 28 73 74 64 65 72 72 2c 20 22 66 61 69 6c 65 f(stderr, "faile
10b0: 64 20 74 6f 20 61 6c 6c 6f 63 61 74 65 64 20 25 d to allocated %
10c0: 6c 64 20 62 79 74 65 73 5c 6e 22 2c 20 6c 69 73 ld bytes\n", lis
10d0: 74 2d 3e 62 75 66 73 69 7a 65 20 2b 20 31 29 3b t->bufsize + 1);
10e0: 0a 20 20 20 20 6c 69 73 74 2d 3e 62 75 66 73 69 . list->bufsi
10f0: 7a 65 20 3d 20 30 4c 3b 0a 20 20 20 20 72 65 74 ze = 0L;. ret
1100: 75 72 6e 20 6c 69 73 74 2d 3e 61 52 65 73 3b 0a urn list->aRes;.
1110: 20 20 7d 0a 20 20 66 69 6c 65 73 69 7a 65 20 3d }. filesize =
1120: 20 66 72 65 61 64 28 6c 69 73 74 2d 3e 62 75 66 fread(list->buf
1130: 2c 20 73 69 7a 65 6f 66 28 6c 69 73 74 2d 3e 62 , sizeof(list->b
1140: 75 66 5b 30 5d 29 2c 6c 69 73 74 2d 3e 62 75 66 uf[0]),list->buf
1150: 73 69 7a 65 2c 20 69 6e 29 3b 0a 20 20 69 66 20 size, in);. if
1160: 28 20 66 69 6c 65 73 69 7a 65 21 3d 6c 69 73 74 ( filesize!=list
1170: 2d 3e 62 75 66 73 69 7a 65 20 29 7b 0a 20 20 20 ->bufsize ){.
1180: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c fprintf(stderr,
1190: 20 22 66 61 69 6c 65 64 20 74 6f 20 72 65 61 64 "failed to read
11a0: 20 5b 25 73 5d 5c 6e 22 2c 20 6e 61 6d 65 29 3b [%s]\n", name);
11b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 69 73 74 . return list
11c0: 2d 3e 61 52 65 73 3b 0a 20 20 7d 0a 20 20 66 63 ->aRes;. }. fc
11d0: 6c 6f 73 65 28 69 6e 29 3b 0a 0a 20 20 2f 2a 0a lose(in);.. /*.
11e0: 20 20 2a 2a 20 61 70 70 65 6e 64 20 61 6e 20 65 ** append an e
11f0: 78 74 72 61 20 6e 65 77 6c 69 6e 65 20 28 69 66 xtra newline (if
1200: 20 6d 69 73 73 69 6e 67 29 20 66 6f 72 20 61 20 missing) for a
1210: 63 6f 72 72 65 63 74 20 6c 69 6e 65 20 63 6f 75 correct line cou
1220: 6e 74 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6c 69 nt. */. if( li
1230: 73 74 2d 3e 62 75 66 5b 6c 69 73 74 2d 3e 62 75 st->buf[list->bu
1240: 66 73 69 7a 65 2d 31 5d 21 3d 27 5c 6e 27 20 29 fsize-1]!='\n' )
1250: 20 6c 69 73 74 2d 3e 62 75 66 5b 6c 69 73 74 2d list->buf[list-
1260: 3e 62 75 66 73 69 7a 65 5d 3d 27 5c 6e 27 3b 0a >bufsize]='\n';.
1270: 0a 20 20 6c 69 6e 65 63 6f 75 6e 74 20 3d 20 30 . linecount = 0
1280: 4c 3b 0a 20 20 66 6f 72 28 20 70 20 3d 20 73 74 L;. for( p = st
1290: 72 63 68 72 28 6c 69 73 74 2d 3e 62 75 66 2c 20 rchr(list->buf,
12a0: 27 5c 6e 27 29 3b 0a 20 20 20 20 20 20 20 70 20 '\n');. p
12b0: 26 26 20 70 20 3c 3d 20 26 6c 69 73 74 2d 3e 62 && p <= &list->b
12c0: 75 66 5b 6c 69 73 74 2d 3e 62 75 66 73 69 7a 65 uf[list->bufsize
12d0: 2d 31 5d 3b 0a 20 20 20 20 20 20 20 70 20 3d 20 -1];. p =
12e0: 73 74 72 63 68 72 28 2b 2b 70 2c 20 27 5c 6e 27 strchr(++p, '\n'
12f0: 29 20 29 7b 0a 20 20 20 20 2b 2b 6c 69 6e 65 63 ) ){. ++linec
1300: 6f 75 6e 74 3b 0a 20 20 7d 0a 0a 20 20 6c 69 73 ount;. }.. lis
1310: 74 2d 3e 61 52 65 73 20 3d 20 28 52 65 73 6f 75 t->aRes = (Resou
1320: 72 63 65 20 2a 29 63 61 6c 6c 6f 63 28 6c 69 6e rce *)calloc(lin
1330: 65 63 6f 75 6e 74 2b 31 2c 20 73 69 7a 65 6f 66 ecount+1, sizeof
1340: 28 6c 69 73 74 2d 3e 61 52 65 73 5b 30 5d 29 29 (list->aRes[0]))
1350: 3b 0a 20 20 66 6f 72 28 20 70 62 20 3d 20 6c 69 ;. for( pb = li
1360: 73 74 2d 3e 62 75 66 2c 20 70 20 3d 20 73 74 72 st->buf, p = str
1370: 63 68 72 28 70 62 2c 20 27 5c 6e 27 29 3b 0a 20 chr(pb, '\n');.
1380: 20 20 20 20 20 20 70 20 26 26 20 70 20 3c 3d 20 p && p <=
1390: 26 6c 69 73 74 2d 3e 62 75 66 5b 6c 69 73 74 2d &list->buf[list-
13a0: 3e 62 75 66 73 69 7a 65 2d 31 5d 3b 0a 20 20 20 >bufsize-1];.
13b0: 20 20 20 20 70 62 20 3d 20 2b 2b 70 2c 20 70 20 pb = ++p, p
13c0: 3d 20 73 74 72 63 68 72 28 70 62 2c 20 27 5c 6e = strchr(pb, '\n
13d0: 27 29 20 29 7b 0a 0a 20 20 20 20 63 68 61 72 20 ') ){.. char
13e0: 2a 70 61 74 68 20 3d 20 70 62 3b 0a 20 20 20 20 *path = pb;.
13f0: 63 68 61 72 20 2a 70 65 20 3d 20 70 20 2d 20 31 char *pe = p - 1
1400: 3b 0a 0a 20 20 20 20 2f 2a 20 73 74 72 69 70 20 ;.. /* strip
1410: 6c 65 61 64 69 6e 67 20 61 6e 64 20 74 72 61 69 leading and trai
1420: 6c 69 6e 67 20 77 68 69 74 65 73 70 61 63 65 20 ling whitespace
1430: 2a 2f 0a 20 20 20 20 77 68 69 6c 65 28 20 70 61 */. while( pa
1440: 74 68 20 3c 20 70 20 26 26 20 69 73 73 70 61 63 th < p && isspac
1450: 65 28 2a 70 61 74 68 29 20 29 20 2b 2b 70 61 74 e(*path) ) ++pat
1460: 68 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 65 h;. while( pe
1470: 20 3e 20 70 61 74 68 20 26 26 20 69 73 73 70 61 > path && isspa
1480: 63 65 28 2a 70 65 29 20 29 7b 0a 20 20 20 20 20 ce(*pe) ){.
1490: 20 2a 70 65 20 3d 20 27 5c 30 27 3b 0a 20 20 20 *pe = '\0';.
14a0: 20 20 20 2d 2d 70 65 3b 0a 20 20 20 20 7d 0a 0a --pe;. }..
14b0: 20 20 20 20 2f 2a 20 73 74 72 69 70 20 6f 75 74 /* strip out
14c0: 65 72 20 71 75 6f 74 65 73 20 2a 2f 0a 20 20 20 er quotes */.
14d0: 20 77 68 69 6c 65 28 20 70 61 74 68 20 3c 20 70 while( path < p
14e0: 20 26 26 20 2a 70 61 74 68 3d 3d 27 5c 22 27 29 && *path=='\"')
14f0: 20 2b 2b 70 61 74 68 3b 0a 20 20 20 20 77 68 69 ++path;. whi
1500: 6c 65 28 20 70 65 20 3e 20 70 61 74 68 20 26 26 le( pe > path &&
1510: 20 2a 70 65 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 *pe=='\"' ){.
1520: 20 20 20 20 2a 70 65 20 3d 20 27 5c 30 27 3b 0a *pe = '\0';.
1530: 20 20 20 20 20 20 2d 2d 70 65 3b 0a 20 20 20 20 --pe;.
1540: 7d 0a 20 20 20 20 2a 70 20 3d 20 27 5c 30 27 3b }. *p = '\0';
1550: 0a 0a 20 20 20 20 2f 2a 20 73 6b 69 70 20 65 6d .. /* skip em
1560: 70 74 79 20 70 61 74 68 20 2a 2f 0a 20 20 20 20 pty path */.
1570: 69 66 28 20 2a 70 61 74 68 20 29 7b 0a 20 20 20 if( *path ){.
1580: 20 20 20 6c 69 73 74 2d 3e 61 52 65 73 5b 6c 69 list->aRes[li
1590: 73 74 2d 3e 6e 52 65 73 5d 2e 7a 4e 61 6d 65 20 st->nRes].zName
15a0: 3d 20 70 61 74 68 3b 0a 20 20 20 20 20 20 2b 2b = path;. ++
15b0: 28 6c 69 73 74 2d 3e 6e 52 65 73 29 3b 0a 20 20 (list->nRes);.
15c0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e }. }. return
15d0: 20 6c 69 73 74 2d 3e 61 52 65 73 3b 0a 7d 0a 0a list->aRes;.}..
15e0: 76 6f 69 64 20 66 72 65 65 5f 72 65 73 6c 69 73 void free_reslis
15f0: 74 28 52 65 73 6f 75 72 63 65 4c 69 73 74 20 2a t(ResourceList *
1600: 6c 69 73 74 29 7b 0a 20 20 69 66 28 20 6c 69 73 list){. if( lis
1610: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 6c 69 73 t ){. if( lis
1620: 74 2d 3e 62 75 66 20 29 20 66 72 65 65 28 6c 69 t->buf ) free(li
1630: 73 74 2d 3e 62 75 66 29 3b 0a 20 20 20 20 69 66 st->buf);. if
1640: 28 20 6c 69 73 74 2d 3e 61 52 65 73 29 20 66 72 ( list->aRes) fr
1650: 65 65 28 6c 69 73 74 2d 3e 61 52 65 73 29 3b 0a ee(list->aRes);.
1660: 20 20 20 20 6d 65 6d 73 65 74 28 6c 69 73 74 2c memset(list,
1670: 20 30 2c 20 73 69 7a 65 6f 66 28 2a 6c 69 73 74 0, sizeof(*list
1680: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a ));. }.}../*.**
1690: 20 43 6f 6d 70 61 72 65 20 74 77 6f 20 52 65 73 Compare two Res
16a0: 6f 75 72 63 65 20 6f 62 6a 65 63 74 73 20 66 6f ource objects fo
16b0: 72 20 73 6f 72 74 69 6e 67 20 70 75 72 70 6f 73 r sorting purpos
16c0: 65 73 2e 20 20 54 68 65 79 20 73 6f 72 74 0a 2a es. They sort.*
16d0: 2a 20 69 6e 20 7a 4e 61 6d 65 20 6f 72 64 65 72 * in zName order
16e0: 20 73 6f 20 74 68 61 74 20 46 6f 73 73 69 6c 20 so that Fossil
16f0: 63 61 6e 20 73 65 61 72 63 68 20 66 6f 72 20 72 can search for r
1700: 65 73 6f 75 72 63 65 73 20 75 73 69 6e 67 0a 2a esources using.*
1710: 2a 20 61 20 62 69 6e 61 72 79 20 73 65 61 72 63 * a binary searc
1720: 68 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 69 6e h..*/.typedef in
1730: 74 20 28 2a 51 73 6f 72 74 43 6f 6d 70 61 72 65 t (*QsortCompare
1740: 46 75 6e 63 29 28 63 6f 6e 73 74 20 76 6f 69 64 Func)(const void
1750: 20 2a 2c 20 63 6f 6e 73 74 20 76 6f 69 64 2a 29 *, const void*)
1760: 3b 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f ;..static int co
1770: 6d 70 61 72 65 52 65 73 6f 75 72 63 65 28 63 6f mpareResource(co
1780: 6e 73 74 20 52 65 73 6f 75 72 63 65 20 2a 61 2c nst Resource *a,
1790: 20 63 6f 6e 73 74 20 52 65 73 6f 75 72 63 65 20 const Resource
17a0: 2a 62 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 74 *b){. return st
17b0: 72 63 6d 70 28 61 2d 3e 7a 4e 61 6d 65 2c 20 62 rcmp(a->zName, b
17c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 7d 0a 0a 69 6e 74 ->zName);.}..int
17d0: 20 72 65 6d 6f 76 65 5f 64 75 70 6c 69 63 61 74 remove_duplicat
17e0: 65 73 28 52 65 73 6f 75 72 63 65 4c 69 73 74 20 es(ResourceList
17f0: 2a 6c 69 73 74 29 7b 0a 20 20 63 68 61 72 20 64 *list){. char d
1800: 75 70 4e 61 6d 65 41 73 63 5b 36 34 5d 20 3d 20 upNameAsc[64] =
1810: 22 5c 32 35 35 22 3b 0a 20 20 63 68 61 72 20 64 "\255";. char d
1820: 75 70 4e 61 6d 65 44 65 73 63 5b 36 34 5d 20 3d upNameDesc[64] =
1830: 20 22 22 3b 0a 20 20 52 65 73 6f 75 72 63 65 20 "";. Resource
1840: 64 75 70 52 65 73 41 73 63 3b 0a 20 20 52 65 73 dupResAsc;. Res
1850: 6f 75 72 63 65 20 64 75 70 52 65 73 44 65 73 63 ource dupResDesc
1860: 3b 0a 20 20 52 65 73 6f 75 72 63 65 20 2a 70 44 ;. Resource *pD
1870: 75 70 52 65 73 3b 0a 20 20 69 6e 74 20 64 75 70 upRes;. int dup
1880: 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 69 6e 74 count = 0;. int
1890: 20 69 3b 0a 0a 20 20 69 66 28 20 6c 69 73 74 2d i;.. if( list-
18a0: 3e 6e 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 >nRes==0 ){.
18b0: 72 65 74 75 72 6e 20 6c 69 73 74 2d 3e 6e 52 65 return list->nRe
18c0: 73 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a s;. }.. /*. *
18d0: 2a 20 73 63 61 6e 20 66 6f 72 20 64 75 70 6c 69 * scan for dupli
18e0: 63 61 74 65 73 20 61 6e 64 20 61 73 73 69 67 6e cates and assign
18f0: 20 74 68 65 69 72 20 6e 61 6d 65 73 20 74 6f 20 their names to
1900: 61 20 73 74 72 69 6e 67 20 74 68 61 74 20 77 6f a string that wo
1910: 75 6c 64 20 73 6f 72 74 20 74 6f 0a 20 20 2a 2a uld sort to. **
1920: 20 74 68 65 20 62 6f 74 74 6f 6d 2c 20 74 68 65 the bottom, the
1930: 6e 20 72 65 2d 73 6f 72 74 20 61 6e 64 20 74 72 n re-sort and tr
1940: 75 6e 63 61 74 65 20 74 68 65 20 64 75 70 6c 69 uncate the dupli
1950: 63 61 74 65 73 0a 20 20 2a 2f 0a 20 20 6d 65 6d cates. */. mem
1960: 73 65 74 28 64 75 70 4e 61 6d 65 41 73 63 2c 20 set(dupNameAsc,
1970: 64 75 70 4e 61 6d 65 41 73 63 5b 30 5d 2c 20 73 dupNameAsc[0], s
1980: 69 7a 65 6f 66 28 64 75 70 4e 61 6d 65 41 73 63 izeof(dupNameAsc
1990: 29 2d 32 29 3b 0a 20 20 6d 65 6d 73 65 74 28 64 )-2);. memset(d
19a0: 75 70 4e 61 6d 65 44 65 73 63 2c 20 64 75 70 4e upNameDesc, dupN
19b0: 61 6d 65 44 65 73 63 5b 30 5d 2c 20 73 69 7a 65 ameDesc[0], size
19c0: 6f 66 28 64 75 70 4e 61 6d 65 44 65 73 63 29 2d of(dupNameDesc)-
19d0: 32 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 64 75 2);. memset(&du
19e0: 70 52 65 73 41 73 63 2c 20 30 2c 20 73 69 7a 65 pResAsc, 0, size
19f0: 6f 66 28 64 75 70 52 65 73 41 73 63 29 29 3b 0a of(dupResAsc));.
1a00: 20 20 64 75 70 52 65 73 41 73 63 2e 7a 4e 61 6d dupResAsc.zNam
1a10: 65 20 3d 20 64 75 70 4e 61 6d 65 41 73 63 3b 0a e = dupNameAsc;.
1a20: 20 20 6d 65 6d 73 65 74 28 26 64 75 70 52 65 73 memset(&dupRes
1a30: 44 65 73 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28 Desc, 0, sizeof(
1a40: 64 75 70 52 65 73 44 65 73 63 29 29 3b 0a 20 20 dupResDesc));.
1a50: 64 75 70 52 65 73 44 65 73 63 2e 7a 4e 61 6d 65 dupResDesc.zName
1a60: 20 3d 20 64 75 70 4e 61 6d 65 44 65 73 63 3b 0a = dupNameDesc;.
1a70: 20 20 70 44 75 70 52 65 73 20 3d 20 28 63 6f 6d pDupRes = (com
1a80: 70 61 72 65 52 65 73 6f 75 72 63 65 28 26 64 75 pareResource(&du
1a90: 70 52 65 73 41 73 63 2c 20 26 64 75 70 52 65 73 pResAsc, &dupRes
1aa0: 44 65 73 63 29 20 3e 20 30 0a 20 20 20 20 20 20 Desc) > 0.
1ab0: 20 20 20 20 20 20 20 3f 20 26 64 75 70 52 65 73 ? &dupRes
1ac0: 41 73 63 20 3a 20 26 64 75 70 52 65 73 44 65 73 Asc : &dupResDes
1ad0: 63 29 3b 0a 0a 20 20 71 73 6f 72 74 28 6c 69 73 c);.. qsort(lis
1ae0: 74 2d 3e 61 52 65 73 2c 20 6c 69 73 74 2d 3e 6e t->aRes, list->n
1af0: 52 65 73 2c 20 73 69 7a 65 6f 66 28 6c 69 73 74 Res, sizeof(list
1b00: 2d 3e 61 52 65 73 5b 30 5d 29 2c 0a 20 20 20 20 ->aRes[0]),.
1b10: 20 20 20 28 51 73 6f 72 74 43 6f 6d 70 61 72 65 (QsortCompare
1b20: 46 75 6e 63 29 63 6f 6d 70 61 72 65 52 65 73 6f Func)compareReso
1b30: 75 72 63 65 29 3b 0a 20 20 66 6f 72 28 20 69 3d urce);. for( i=
1b40: 30 3b 20 69 3c 6c 69 73 74 2d 3e 6e 52 65 73 2d 0; i<list->nRes-
1b50: 31 20 3b 20 2b 2b 69 29 7b 0a 20 20 20 20 52 65 1 ; ++i){. Re
1b60: 73 6f 75 72 63 65 20 2a 72 65 73 20 3d 20 26 6c source *res = &l
1b70: 69 73 74 2d 3e 61 52 65 73 5b 69 5d 3b 0a 0a 20 ist->aRes[i];..
1b80: 20 20 20 77 68 69 6c 65 28 20 69 3c 6c 69 73 74 while( i<list
1b90: 2d 3e 6e 52 65 73 2d 31 0a 20 20 20 20 20 20 20 ->nRes-1.
1ba0: 20 20 20 20 26 26 20 63 6f 6d 70 61 72 65 52 65 && compareRe
1bb0: 73 6f 75 72 63 65 28 72 65 73 2c 20 26 6c 69 73 source(res, &lis
1bc0: 74 2d 3e 61 52 65 73 5b 69 2b 31 5d 29 3d 3d 30 t->aRes[i+1])==0
1bd0: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 ){. fprint
1be0: 66 28 73 74 64 65 72 72 2c 20 22 53 6b 69 70 70 f(stderr, "Skipp
1bf0: 65 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 66 ed a duplicate f
1c00: 69 6c 65 20 5b 25 73 5d 5c 6e 22 2c 20 6c 69 73 ile [%s]\n", lis
1c10: 74 2d 3e 61 52 65 73 5b 69 2b 31 5d 2e 7a 4e 61 t->aRes[i+1].zNa
1c20: 6d 65 29 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 me);. memcp
1c30: 79 28 26 6c 69 73 74 2d 3e 61 52 65 73 5b 69 2b y(&list->aRes[i+
1c40: 31 5d 2c 20 70 44 75 70 52 65 73 2c 20 73 69 7a 1], pDupRes, siz
1c50: 65 6f 66 28 6c 69 73 74 2d 3e 61 52 65 73 5b 30 eof(list->aRes[0
1c60: 5d 29 29 3b 0a 20 20 20 20 20 20 2b 2b 64 75 70 ]));. ++dup
1c70: 63 6f 75 6e 74 3b 0a 0a 20 20 20 20 20 20 2b 2b count;.. ++
1c80: 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 i;. }. }. i
1c90: 66 28 20 64 75 70 63 6f 75 6e 74 20 3d 3d 20 30 f( dupcount == 0
1ca0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 6c 69 ){. return li
1cb0: 73 74 2d 3e 6e 52 65 73 3b 0a 20 20 7d 0a 20 20 st->nRes;. }.
1cc0: 71 73 6f 72 74 28 6c 69 73 74 2d 3e 61 52 65 73 qsort(list->aRes
1cd0: 2c 20 6c 69 73 74 2d 3e 6e 52 65 73 2c 20 73 69 , list->nRes, si
1ce0: 7a 65 6f 66 28 6c 69 73 74 2d 3e 61 52 65 73 5b zeof(list->aRes[
1cf0: 30 5d 29 2c 0a 20 20 20 20 20 20 20 28 51 73 6f 0]),. (Qso
1d00: 72 74 43 6f 6d 70 61 72 65 46 75 6e 63 29 63 6f rtCompareFunc)co
1d10: 6d 70 61 72 65 52 65 73 6f 75 72 63 65 29 3b 0a mpareResource);.
1d20: 20 20 6c 69 73 74 2d 3e 6e 52 65 73 20 2d 3d 20 list->nRes -=
1d30: 64 75 70 63 6f 75 6e 74 3b 0a 20 20 6d 65 6d 73 dupcount;. mems
1d40: 65 74 28 26 6c 69 73 74 2d 3e 61 52 65 73 5b 6c et(&list->aRes[l
1d50: 69 73 74 2d 3e 6e 52 65 73 5d 2c 20 30 2c 20 73 ist->nRes], 0, s
1d60: 69 7a 65 6f 66 28 6c 69 73 74 2d 3e 61 52 65 73 izeof(list->aRes
1d70: 5b 30 5d 29 29 3b 0a 0a 20 20 72 65 74 75 72 6e [0]));.. return
1d80: 20 6c 69 73 74 2d 3e 6e 52 65 73 3b 0a 7d 0a 0a list->nRes;.}..
1d90: 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 int main(int arg
1da0: 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b c, char **argv){
1db0: 0a 20 20 69 6e 74 20 69 2c 20 73 7a 3b 0a 20 20 . int i, sz;.
1dc0: 69 6e 74 20 6a 2c 20 6e 3b 0a 20 20 52 65 73 6f int j, n;. Reso
1dd0: 75 72 63 65 4c 69 73 74 20 72 65 73 4c 69 73 74 urceList resList
1de0: 3b 0a 20 20 52 65 73 6f 75 72 63 65 20 2a 61 52 ;. Resource *aR
1df0: 65 73 3b 0a 20 20 69 6e 74 20 6e 52 65 73 3b 0a es;. int nRes;.
1e00: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 unsigned char
1e10: 2a 70 44 61 74 61 3b 0a 20 20 69 6e 74 20 6e 45 *pData;. int nE
1e20: 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 53 rr = 0;. int nS
1e30: 6b 69 70 3b 0a 20 20 69 6e 74 20 6e 50 72 65 66 kip;. int nPref
1e40: 69 78 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 ix = 0;.#ifndef
1e50: 46 4f 53 53 49 4c 5f 44 45 42 55 47 0a 20 20 69 FOSSIL_DEBUG. i
1e60: 6e 74 20 6e 4e 61 6d 65 3b 0a 23 65 6e 64 69 66 nt nName;.#endif
1e70: 0a 0a 20 20 69 66 28 20 61 72 67 63 3d 3d 31 20 .. if( argc==1
1e80: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 ){. fprintf(s
1e90: 74 64 65 72 72 2c 20 22 75 73 61 67 65 5c 74 3a tderr, "usage\t:
1ea0: 25 73 20 22 0a 20 20 20 20 20 20 22 5b 2d 2d 70 %s ". "[--p
1eb0: 72 65 66 69 78 20 70 61 74 68 5d 20 5b 2d 2d 72 refix path] [--r
1ec0: 65 73 6c 69 73 74 20 66 69 6c 65 5d 20 5b 72 65 eslist file] [re
1ed0: 73 6f 75 72 63 65 2d 66 69 6c 65 31 20 2e 2e 2e source-file1 ...
1ee0: 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 61 72 67 ]\n",. arg
1ef0: 76 5b 30 5d 0a 20 20 20 20 29 3b 0a 20 20 20 20 v[0]. );.
1f00: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 return 1;. }.
1f10: 69 66 28 20 61 72 67 63 3e 33 20 26 26 20 73 74 if( argc>3 && st
1f20: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d 2d rcmp(argv[1],"--
1f30: 70 72 65 66 69 78 22 29 3d 3d 30 20 29 7b 0a 20 prefix")==0 ){.
1f40: 20 20 20 6e 50 72 65 66 69 78 20 3d 20 28 69 6e nPrefix = (in
1f50: 74 29 73 74 72 6c 65 6e 28 61 72 67 76 5b 32 5d t)strlen(argv[2]
1f60: 29 3b 0a 20 20 20 20 61 72 67 63 20 2d 3d 20 32 );. argc -= 2
1f70: 3b 0a 20 20 20 20 61 72 67 76 20 2b 3d 20 32 3b ;. argv += 2;
1f80: 0a 20 20 7d 0a 0a 20 20 6d 65 6d 73 65 74 28 26 . }.. memset(&
1f90: 72 65 73 4c 69 73 74 2c 20 30 2c 20 73 69 7a 65 resList, 0, size
1fa0: 6f 66 28 72 65 73 4c 69 73 74 29 29 3b 0a 20 20 of(resList));.
1fb0: 69 66 28 20 61 72 67 63 3e 32 20 26 26 20 73 74 if( argc>2 && st
1fc0: 72 63 6d 70 28 61 72 67 76 5b 31 5d 2c 22 2d 2d rcmp(argv[1],"--
1fd0: 72 65 73 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a reslist")==0 ){.
1fe0: 20 20 20 20 69 66 28 20 72 65 61 64 5f 72 65 73 if( read_res
1ff0: 6c 69 73 74 28 61 72 67 76 5b 32 5d 2c 20 26 72 list(argv[2], &r
2000: 65 73 4c 69 73 74 29 3d 3d 30 20 29 7b 0a 20 20 esList)==0 ){.
2010: 20 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 fprintf(stde
2020: 72 72 2c 20 22 46 61 69 6c 65 64 20 74 6f 20 6c rr, "Failed to l
2030: 6f 61 64 20 72 65 73 6f 75 72 63 65 20 6c 69 73 oad resource lis
2040: 74 20 66 72 6f 6d 20 5b 25 73 5d 22 2c 20 61 72 t from [%s]", ar
2050: 67 76 5b 32 5d 29 3b 0a 20 20 20 20 20 20 66 72 gv[2]);. fr
2060: 65 65 5f 72 65 73 6c 69 73 74 28 26 72 65 73 4c ee_reslist(&resL
2070: 69 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 ist);. retu
2080: 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 rn 1;. }.
2090: 61 72 67 63 20 2d 3d 20 32 3b 0a 20 20 20 20 61 argc -= 2;. a
20a0: 72 67 76 20 2b 3d 20 32 3b 0a 20 20 7d 0a 0a 20 rgv += 2;. }..
20b0: 20 69 66 28 20 61 72 67 63 3e 31 20 29 7b 0a 20 if( argc>1 ){.
20c0: 20 20 20 61 52 65 73 20 3d 20 72 65 61 6c 6c 6f aRes = reallo
20d0: 63 28 72 65 73 4c 69 73 74 2e 61 52 65 73 2c 20 c(resList.aRes,
20e0: 28 72 65 73 4c 69 73 74 2e 6e 52 65 73 2b 61 72 (resList.nRes+ar
20f0: 67 63 2d 31 29 2a 73 69 7a 65 6f 66 28 72 65 73 gc-1)*sizeof(res
2100: 4c 69 73 74 2e 61 52 65 73 5b 30 5d 29 29 3b 0a List.aRes[0]));.
2110: 20 20 20 20 69 66 28 20 61 52 65 73 3d 3d 30 20 if( aRes==0
2120: 7c 7c 20 61 52 65 73 3d 3d 72 65 73 4c 69 73 74 || aRes==resList
2130: 2e 61 52 65 73 20 29 7b 0a 20 20 20 20 20 20 66 .aRes ){. f
2140: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 printf(stderr, "
2150: 72 65 61 6c 6c 6f 63 20 66 61 69 6c 65 64 5c 6e realloc failed\n
2160: 22 29 3b 0a 20 20 20 20 20 20 66 72 65 65 5f 72 ");. free_r
2170: 65 73 6c 69 73 74 28 26 72 65 73 4c 69 73 74 29 eslist(&resList)
2180: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 ;. return 1
2190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 73 4c ;. }. resL
21a0: 69 73 74 2e 61 52 65 73 20 3d 20 61 52 65 73 3b ist.aRes = aRes;
21b0: 0a 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 .. for(i=0; i
21c0: 3c 61 72 67 63 2d 31 3b 20 69 2b 2b 29 7b 0a 20 <argc-1; i++){.
21d0: 20 20 20 20 20 72 65 73 4c 69 73 74 2e 61 52 65 resList.aRe
21e0: 73 5b 72 65 73 4c 69 73 74 2e 6e 52 65 73 5d 2e s[resList.nRes].
21f0: 7a 4e 61 6d 65 20 3d 20 61 72 67 76 5b 69 2b 31 zName = argv[i+1
2200: 5d 3b 0a 20 20 20 20 20 20 2b 2b 72 65 73 4c 69 ];. ++resLi
2210: 73 74 2e 6e 52 65 73 3b 0a 20 20 20 20 7d 0a 20 st.nRes;. }.
2220: 20 7d 0a 0a 20 20 69 66 28 20 72 65 73 4c 69 73 }.. if( resLis
2230: 74 2e 6e 52 65 73 3d 3d 30 20 29 7b 0a 20 20 20 t.nRes==0 ){.
2240: 20 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 fprintf(stder
2250: 72 2c 22 4e 6f 20 72 65 73 6f 75 72 63 65 20 66 r,"No resource f
2260: 69 6c 65 73 20 74 6f 20 70 72 6f 63 65 73 73 5c iles to process\
2270: 6e 22 29 3b 0a 20 20 20 20 20 20 66 72 65 65 5f n");. free_
2280: 72 65 73 6c 69 73 74 28 26 72 65 73 4c 69 73 74 reslist(&resList
2290: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 );. return
22a0: 31 3b 0a 20 20 7d 0a 20 20 72 65 6d 6f 76 65 5f 1;. }. remove_
22b0: 64 75 70 6c 69 63 61 74 65 73 28 26 72 65 73 4c duplicates(&resL
22c0: 69 73 74 29 3b 0a 0a 20 20 6e 52 65 73 20 3d 20 ist);.. nRes =
22d0: 72 65 73 4c 69 73 74 2e 6e 52 65 73 3b 0a 20 20 resList.nRes;.
22e0: 61 52 65 73 20 3d 20 72 65 73 4c 69 73 74 2e 61 aRes = resList.a
22f0: 52 65 73 3b 0a 20 20 71 73 6f 72 74 28 61 52 65 Res;. qsort(aRe
2300: 73 2c 20 6e 52 65 73 2c 20 73 69 7a 65 6f 66 28 s, nRes, sizeof(
2310: 61 52 65 73 5b 30 5d 29 2c 20 28 51 73 6f 72 74 aRes[0]), (Qsort
2320: 43 6f 6d 70 61 72 65 46 75 6e 63 29 63 6f 6d 70 CompareFunc)comp
2330: 61 72 65 52 65 73 6f 75 72 63 65 29 3b 0a 0a 20 areResource);..
2340: 20 70 72 69 6e 74 66 28 22 2f 2a 20 41 75 74 6f printf("/* Auto
2350: 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e 65 72 61 matically genera
2360: 74 65 64 20 63 6f 64 65 3a 20 20 44 6f 20 6e 6f ted code: Do no
2370: 74 20 65 64 69 74 2e 5c 6e 2a 2a 5c 6e 22 0a 20 t edit.\n**\n".
2380: 20 20 20 20 20 20 20 20 22 2a 2a 20 52 65 72 75 "** Reru
2390: 6e 20 74 68 65 20 5c 22 6d 6b 62 75 69 6c 74 69 n the \"mkbuilti
23a0: 6e 2e 63 5c 22 20 70 72 6f 67 72 61 6d 20 6f 72 n.c\" program or
23b0: 20 72 65 72 75 6e 20 74 68 65 20 46 6f 73 73 69 rerun the Fossi
23c0: 6c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 22 2a l\n". "*
23d0: 2a 20 6d 61 6b 65 66 69 6c 65 20 74 6f 20 75 70 * makefile to up
23e0: 64 61 74 65 20 74 68 69 73 20 73 6f 75 72 63 65 date this source
23f0: 20 66 69 6c 65 2e 5c 6e 22 0a 20 20 20 20 20 20 file.\n".
2400: 20 20 20 22 2a 2f 5c 6e 22 29 3b 0a 20 20 66 6f "*/\n");. fo
2410: 72 28 69 3d 30 3b 20 69 3c 6e 52 65 73 3b 20 69 r(i=0; i<nRes; i
2420: 2b 2b 29 7b 0a 20 20 20 20 70 44 61 74 61 20 3d ++){. pData =
2430: 20 72 65 61 64 5f 66 69 6c 65 28 61 52 65 73 5b read_file(aRes[
2440: 69 5d 2e 7a 4e 61 6d 65 2c 20 26 73 7a 29 3b 0a i].zName, &sz);.
2450: 20 20 20 20 69 66 28 20 70 44 61 74 61 3d 3d 30 if( pData==0
2460: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74 ){. fprint
2470: 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f f(stderr, "Canno
2480: 74 20 6f 70 65 6e 20 66 69 6c 65 20 5b 25 73 5d t open file [%s]
2490: 5c 6e 22 2c 20 61 52 65 73 5b 69 5d 2e 7a 4e 61 \n", aRes[i].zNa
24a0: 6d 65 29 3b 0a 20 20 20 20 20 20 6e 45 72 72 2b me);. nErr+
24b0: 2b 3b 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 +;. continu
24c0: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a e;. }.. /*
24d0: 20 53 6b 69 70 20 69 6e 69 74 69 61 6c 20 6c 69 Skip initial li
24e0: 6e 65 73 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 nes beginning wi
24f0: 74 68 20 23 20 2a 2f 0a 20 20 20 20 6e 53 6b 69 th # */. nSki
2500: 70 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 p = 0;. while
2510: 28 20 70 44 61 74 61 5b 6e 53 6b 69 70 5d 3d 3d ( pData[nSkip]==
2520: 27 23 27 20 29 7b 0a 20 20 20 20 20 20 77 68 69 '#' ){. whi
2530: 6c 65 28 20 70 44 61 74 61 5b 6e 53 6b 69 70 5d le( pData[nSkip]
2540: 21 3d 30 20 26 26 20 70 44 61 74 61 5b 6e 53 6b !=0 && pData[nSk
2550: 69 70 5d 21 3d 27 5c 6e 27 20 29 7b 20 6e 53 6b ip]!='\n' ){ nSk
2560: 69 70 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 ip++; }. if
2570: 28 20 70 44 61 74 61 5b 6e 53 6b 69 70 5d 3d 3d ( pData[nSkip]==
2580: 27 5c 6e 27 20 29 20 6e 53 6b 69 70 2b 2b 3b 0a '\n' ) nSkip++;.
2590: 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 46 }..#ifndef F
25a0: 4f 53 53 49 4c 5f 44 45 42 55 47 0a 20 20 20 20 OSSIL_DEBUG.
25b0: 2f 2a 20 43 6f 6d 70 72 65 73 73 20 6a 61 76 61 /* Compress java
25c0: 73 63 72 69 70 74 20 73 6f 75 72 63 65 20 66 69 script source fi
25d0: 6c 65 73 20 2a 2f 0a 20 20 20 20 6e 4e 61 6d 65 les */. nName
25e0: 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 = (int)strlen(a
25f0: 52 65 73 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 Res[i].zName);.
2600: 20 20 20 69 66 28 20 28 6e 4e 61 6d 65 3e 33 20 if( (nName>3
2610: 26 26 20 73 74 72 63 6d 70 28 26 61 52 65 73 5b && strcmp(&aRes[
2620: 69 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2d 33 i].zName[nName-3
2630: 5d 2c 22 2e 6a 73 22 29 3d 3d 30 29 0a 20 20 20 ],".js")==0).
2640: 20 20 7c 7c 20 28 6e 4e 61 6d 65 3e 37 20 20 26 || (nName>7 &
2650: 26 20 73 74 72 63 6d 70 28 26 61 52 65 73 5b 69 & strcmp(&aRes[i
2660: 5d 2e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 2d 37 5d ].zName[nName-7]
2670: 2c 20 22 2f 6a 73 2e 74 78 74 22 29 3d 3d 30 29 , "/js.txt")==0)
2680: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 69 6e . ){. in
2690: 74 20 78 20 3d 20 73 7a 2d 6e 53 6b 69 70 3b 0a t x = sz-nSkip;.
26a0: 20 20 20 20 20 20 63 6f 6d 70 72 65 73 73 4a 61 compressJa
26b0: 76 61 73 63 72 69 70 74 28 70 44 61 74 61 2b 6e vascript(pData+n
26c0: 53 6b 69 70 2c 20 26 78 29 3b 0a 20 20 20 20 20 Skip, &x);.
26d0: 20 73 7a 20 3d 20 78 20 2b 20 6e 53 6b 69 70 3b sz = x + nSkip;
26e0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 . }.#endif..
26f0: 20 20 20 61 52 65 73 5b 69 5d 2e 6e 42 79 74 65 aRes[i].nByte
2700: 20 3d 20 73 7a 20 2d 20 6e 53 6b 69 70 3b 0a 20 = sz - nSkip;.
2710: 20 20 20 61 52 65 73 5b 69 5d 2e 69 64 78 20 3d aRes[i].idx =
2720: 20 69 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 i;. printf("
2730: 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 66 69 /* Content of fi
2740: 6c 65 20 25 73 20 2a 2f 5c 6e 22 2c 20 61 52 65 le %s */\n", aRe
2750: 73 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 s[i].zName);.
2760: 20 70 72 69 6e 74 66 28 22 73 74 61 74 69 63 20 printf("static
2770: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 const unsigned c
2780: 68 61 72 20 62 69 64 61 74 61 25 64 5b 25 64 5d har bidata%d[%d]
2790: 20 3d 20 7b 5c 6e 20 20 22 2c 0a 20 20 20 20 20 = {\n ",.
27a0: 20 20 20 20 20 20 69 2c 20 73 7a 2b 31 2d 6e 53 i, sz+1-nS
27b0: 6b 69 70 29 3b 0a 20 20 20 20 66 6f 72 28 6a 3d kip);. for(j=
27c0: 6e 53 6b 69 70 2c 20 6e 3d 30 3b 20 6a 3c 3d 73 nSkip, n=0; j<=s
27d0: 7a 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70 z; j++){. p
27e0: 72 69 6e 74 66 28 22 25 33 64 22 2c 20 70 44 61 rintf("%3d", pDa
27f0: 74 61 5b 6a 5d 29 3b 0a 20 20 20 20 20 20 69 66 ta[j]);. if
2800: 28 20 6a 3d 3d 73 7a 20 29 7b 0a 20 20 20 20 20 ( j==sz ){.
2810: 20 20 20 70 72 69 6e 74 66 28 22 20 7d 3b 5c 6e printf(" };\n
2820: 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 ");. }else
2830: 69 66 28 20 6e 3d 3d 31 34 20 29 7b 0a 20 20 20 if( n==14 ){.
2840: 20 20 20 20 20 70 72 69 6e 74 66 28 22 2c 5c 6e printf(",\n
2850: 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 20 ");. n
2860: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 = 0;. }else
2870: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 {. printf
2880: 28 22 2c 20 22 29 3b 0a 20 20 20 20 20 20 20 20 (", ");.
2890: 6e 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 n++;. }.
28a0: 20 7d 0a 20 20 20 20 66 72 65 65 28 70 44 61 74 }. free(pDat
28b0: 61 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 a);. }. printf
28c0: 28 22 74 79 70 65 64 65 66 20 73 74 72 75 63 74 ("typedef struct
28d0: 20 42 75 69 6c 74 69 6e 46 69 6c 65 54 61 62 6c BuiltinFileTabl
28e0: 65 20 42 75 69 6c 74 69 6e 46 69 6c 65 54 61 62 e BuiltinFileTab
28f0: 6c 65 3b 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74 le;\n");. print
2900: 66 28 22 73 74 72 75 63 74 20 42 75 69 6c 74 69 f("struct Builti
2910: 6e 46 69 6c 65 54 61 62 6c 65 20 7b 5c 6e 22 29 nFileTable {\n")
2920: 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 63 6f ;. printf(" co
2930: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b nst char *zName;
2940: 5c 6e 22 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 \n");. printf("
2950: 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 const unsigned
2960: 20 63 68 61 72 20 2a 70 44 61 74 61 3b 5c 6e 22 char *pData;\n"
2970: 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 20 20 69 );. printf(" i
2980: 6e 74 20 6e 42 79 74 65 3b 5c 6e 22 29 3b 0a 20 nt nByte;\n");.
2990: 20 70 72 69 6e 74 66 28 22 7d 3b 5c 6e 22 29 3b printf("};\n");
29a0: 0a 20 20 70 72 69 6e 74 66 28 22 73 74 61 74 69 . printf("stati
29b0: 63 20 63 6f 6e 73 74 20 42 75 69 6c 74 69 6e 46 c const BuiltinF
29c0: 69 6c 65 54 61 62 6c 65 20 61 42 75 69 6c 74 69 ileTable aBuilti
29d0: 6e 46 69 6c 65 73 5b 5d 20 3d 20 7b 5c 6e 22 29 nFiles[] = {\n")
29e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e ;. for(i=0; i<n
29f0: 52 65 73 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 Res; i++){. c
2a00: 68 61 72 20 2a 7a 20 3d 20 61 52 65 73 5b 69 5d har *z = aRes[i]
2a10: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 69 66 28 20 .zName;. if(
2a20: 73 74 72 6c 65 6e 28 7a 29 3e 3d 6e 50 72 65 66 strlen(z)>=nPref
2a30: 69 78 20 29 20 7a 20 2b 3d 20 6e 50 72 65 66 69 ix ) z += nPrefi
2a40: 78 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b x;. while( z[
2a50: 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 5b 30 5d 3d 0]=='.' || z[0]=
2a60: 3d 27 2f 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 5c ='/' || z[0]=='\
2a70: 5c 27 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 \' ){ z++; }.
2a80: 20 61 52 65 73 5b 69 5d 2e 7a 4e 61 6d 65 20 3d aRes[i].zName =
2a90: 20 7a 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a z;. while( z
2aa0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 69 66 28 [0] ){. if(
2ab0: 20 7a 5b 30 5d 3d 3d 27 5c 5c 27 20 29 20 7a 5b z[0]=='\\' ) z[
2ac0: 30 5d 20 3d 20 27 2f 27 3b 0a 20 20 20 20 20 20 0] = '/';.
2ad0: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 z++;. }. }.
2ae0: 20 71 73 6f 72 74 28 61 52 65 73 2c 20 6e 52 65 qsort(aRes, nRe
2af0: 73 2c 20 73 69 7a 65 6f 66 28 61 52 65 73 5b 30 s, sizeof(aRes[0
2b00: 5d 29 2c 20 28 51 73 6f 72 74 43 6f 6d 70 61 72 ]), (QsortCompar
2b10: 65 46 75 6e 63 29 63 6f 6d 70 61 72 65 52 65 73 eFunc)compareRes
2b20: 6f 75 72 63 65 29 3b 0a 20 20 66 6f 72 28 69 3d ource);. for(i=
2b30: 30 3b 20 69 3c 6e 52 65 73 3b 20 69 2b 2b 29 7b 0; i<nRes; i++){
2b40: 0a 20 20 20 20 70 72 69 6e 74 66 28 22 20 20 7b . printf(" {
2b50: 20 5c 22 25 73 5c 22 2c 20 62 69 64 61 74 61 25 \"%s\", bidata%
2b60: 64 2c 20 25 64 20 7d 2c 5c 6e 22 2c 0a 20 20 20 d, %d },\n",.
2b70: 20 20 20 20 20 20 20 20 61 52 65 73 5b 69 5d 2e aRes[i].
2b80: 7a 4e 61 6d 65 2c 20 61 52 65 73 5b 69 5d 2e 69 zName, aRes[i].i
2b90: 64 78 2c 20 61 52 65 73 5b 69 5d 2e 6e 42 79 74 dx, aRes[i].nByt
2ba0: 65 29 3b 0a 20 20 7d 0a 20 20 70 72 69 6e 74 66 e);. }. printf
2bb0: 28 22 7d 3b 5c 6e 22 29 3b 0a 20 20 66 72 65 65 ("};\n");. free
2bc0: 5f 72 65 73 6c 69 73 74 28 26 72 65 73 4c 69 73 _reslist(&resLis
2bd0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 t);. return nEr
2be0: 72 3b 0a 7d 0a r;.}.