Fossil

Hex Artifact Content
Login

Artifact cc2165984ea592f6bb345041bc27d56b9513f03a84dec1445f254691c7ede36b:


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 32 20 44 2e 20 52 69 63 68  (c) 2002 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 53 59 4e 4f 50 53 49 53 3a 0a 2a  *.** SYNOPSIS:.*
0260: 2a 0a 2a 2a 20 49 6e 70 75 74 20 6c 69 6e 65 73  *.** Input lines
0270: 20 74 68 61 74 20 62 65 67 69 6e 20 77 69 74 68   that begin with
0280: 20 74 68 65 20 22 40 22 20 63 68 61 72 61 63 74   the "@" charact
0290: 65 72 20 61 72 65 20 74 72 61 6e 73 6c 61 74 65  er are translate
02a0: 64 20 69 6e 74 6f 0a 2a 2a 20 65 69 74 68 65 72  d into.** either
02b0: 20 63 67 69 5f 70 72 69 6e 74 66 28 29 20 73 74   cgi_printf() st
02c0: 61 74 65 6d 65 6e 74 73 20 6f 72 20 73 74 72 69  atements or stri
02d0: 6e 67 20 6c 69 74 65 72 61 6c 73 20 61 6e 64 20  ng literals and 
02e0: 74 68 65 0a 2a 2a 20 74 72 61 6e 73 6c 61 74 65  the.** translate
02f0: 64 20 63 6f 64 65 20 69 73 20 77 72 69 74 74 65  d code is writte
0300: 6e 20 6f 6e 20 73 74 61 6e 64 61 72 64 20 6f 75  n on standard ou
0310: 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tput..**.** The 
0320: 70 72 6f 62 6c 65 6d 20 74 68 69 73 20 70 72 6f  problem this pro
0330: 67 72 61 6d 20 69 73 20 61 74 74 65 6d 70 74 20  gram is attempt 
0340: 74 6f 20 73 6f 6c 76 65 20 69 73 20 61 73 20 66  to solve is as f
0350: 6f 6c 6c 6f 77 73 3a 20 20 57 68 65 6e 0a 2a 2a  ollows:  When.**
0360: 20 77 72 69 74 69 6e 67 20 43 47 49 20 70 72 6f   writing CGI pro
0370: 67 72 61 6d 73 20 69 6e 20 43 2c 20 77 65 20 74  grams in C, we t
0380: 79 70 69 63 61 6c 6c 79 20 77 61 6e 74 20 74 6f  ypically want to
0390: 20 6f 75 74 70 75 74 20 61 20 6c 6f 74 20 6f 66   output a lot of
03a0: 20 48 54 4d 4c 0a 2a 2a 20 74 65 78 74 20 74 6f   HTML.** text to
03b0: 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75 74   standard output
03c0: 2e 20 20 49 6e 20 70 75 72 65 20 43 20 63 6f 64  .  In pure C cod
03d0: 65 2c 20 74 68 69 73 20 69 6e 76 6f 6c 76 65 73  e, this involves
03e0: 20 64 6f 69 6e 67 20 61 0a 2a 2a 20 70 72 69 6e   doing a.** prin
03f0: 74 66 28 29 20 77 69 74 68 20 61 20 62 69 67 20  tf() with a big 
0400: 73 74 72 69 6e 67 20 63 6f 6e 74 61 69 6e 69 6e  string containin
0410: 67 20 61 6c 6c 20 74 68 61 74 20 74 65 78 74 2e  g all that text.
0420: 20 20 42 75 74 20 77 65 20 68 61 76 65 0a 2a 2a    But we have.**
0430: 20 74 6f 20 69 6e 73 65 72 74 20 73 70 65 63 69   to insert speci
0440: 61 6c 20 63 6f 64 65 73 20 28 65 78 3a 20 5c 6e  al codes (ex: \n
0450: 20 61 6e 64 20 5c 22 29 20 66 6f 72 20 6d 61 6e   and \") for man
0460: 79 20 63 6f 6d 6d 6f 6e 20 63 68 61 72 61 63 74  y common charact
0470: 65 72 73 2c 0a 2a 2a 20 77 68 69 63 68 20 69 6e  ers,.** which in
0480: 74 65 72 66 65 72 65 73 20 77 69 74 68 20 74 68  terferes with th
0490: 65 20 72 65 61 64 61 62 69 6c 69 74 79 20 6f 66  e readability of
04a0: 20 74 68 65 20 48 54 4d 4c 2e 0a 2a 2a 0a 2a 2a   the HTML..**.**
04b0: 20 54 68 69 73 20 74 6f 6f 6c 20 61 6c 6c 6f 77   This tool allow
04c0: 73 20 75 73 20 74 6f 20 70 75 74 20 72 61 77 20  s us to put raw 
04d0: 48 54 4d 4c 2c 20 77 69 74 68 6f 75 74 20 74 68  HTML, without th
04e0: 65 20 73 70 65 63 69 61 6c 20 63 6f 64 65 73 2c  e special codes,
04f0: 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 69 64 64 6c   in.** the middl
0500: 65 20 6f 66 20 61 20 43 20 70 72 6f 67 72 61 6d  e of a C program
0510: 2e 20 20 54 68 69 73 20 70 72 6f 67 72 61 6d 20  .  This program 
0520: 74 68 65 6e 20 74 72 61 6e 73 6c 61 74 65 73 20  then translates 
0530: 74 68 65 20 74 65 78 74 0a 2a 2a 20 69 6e 74 6f  the text.** into
0540: 20 73 74 61 6e 64 61 72 64 20 43 20 62 79 20 69   standard C by i
0550: 6e 73 65 72 74 69 6e 67 20 61 6c 6c 20 6e 65 63  nserting all nec
0560: 65 73 73 61 72 79 20 62 61 63 6b 73 6c 61 73 68  essary backslash
0570: 65 73 20 61 6e 64 20 6f 74 68 65 72 0a 2a 2a 20  es and other.** 
0580: 70 75 6e 63 74 75 61 74 69 6f 6e 2e 0a 2a 2a 0a  punctuation..**.
0590: 2a 2a 20 45 6e 68 61 6e 63 65 6d 65 6e 74 20 23  ** Enhancement #
05a0: 31 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  1:.**.** If the 
05b0: 6c 61 73 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70  last non-whitesp
05c0: 61 63 65 20 63 68 61 72 61 63 74 65 72 20 70 72  ace character pr
05d0: 69 6f 72 20 74 6f 20 74 68 65 20 66 69 72 73 74  ior to the first
05e0: 20 22 40 22 20 6f 66 20 61 0a 2a 2a 20 40 2d 62   "@" of a.** @-b
05f0: 6c 6f 63 6b 20 69 73 20 22 3d 22 20 6f 72 20 22  lock is "=" or "
0600: 2c 22 20 74 68 65 6e 20 74 68 65 20 40 2d 62 6c  ," then the @-bl
0610: 6f 63 6b 20 69 73 20 61 20 73 74 72 69 6e 67 20  ock is a string 
0620: 6c 69 74 65 72 61 6c 20 69 6e 69 74 69 61 6c 69  literal initiali
0630: 7a 65 72 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  zer.** rather th
0640: 61 6e 20 74 65 78 74 20 74 68 61 74 20 69 73 20  an text that is 
0650: 74 6f 20 62 65 20 6f 75 74 70 75 74 20 76 69 61  to be output via
0660: 20 63 67 69 5f 70 72 69 6e 74 66 28 29 2e 20 20   cgi_printf().  
0670: 52 65 6e 64 65 72 20 69 74 0a 2a 2a 20 61 73 20  Render it.** as 
0680: 73 75 63 68 2e 0a 2a 2a 0a 2a 2a 20 45 6e 68 61  such..**.** Enha
0690: 6e 63 65 6d 65 6e 74 20 23 32 3a 0a 2a 2a 0a 2a  ncement #2:.**.*
06a0: 2a 20 43 6f 6d 6d 65 6e 74 73 20 6f 66 20 74 68  * Comments of th
06b0: 65 20 66 6f 72 6d 3a 20 20 22 7c 2a 20 40 2d 63  e form:  "|* @-c
06c0: 6f 6d 6d 65 6e 74 3a 20 43 43 22 20 28 77 68 65  omment: CC" (whe
06d0: 72 65 20 22 7c 22 20 69 73 20 72 65 61 6c 6c 79  re "|" is really
06e0: 20 22 2f 22 29 0a 2a 2a 20 63 61 75 73 65 20 43   "/").** cause C
06f0: 43 20 74 6f 20 62 65 63 6f 6d 65 20 61 20 63 6f  C to become a co
0700: 6d 6d 65 6e 74 20 63 68 61 72 61 63 74 65 72 20  mment character 
0710: 66 6f 72 20 74 68 65 20 40 2d 73 75 62 73 74 69  for the @-substi
0720: 74 75 74 69 6f 6e 2e 0a 2a 2a 20 54 79 70 69 63  tution..** Typic
0730: 61 6c 20 76 61 6c 75 65 73 20 66 6f 72 20 43 43  al values for CC
0740: 20 61 72 65 20 22 2d 2d 22 20 28 66 6f 72 20 53   are "--" (for S
0750: 51 4c 20 74 65 78 74 29 20 6f 72 20 22 23 22 20  QL text) or "#" 
0760: 28 66 6f 72 20 54 63 6c 20 73 63 72 69 70 74 29  (for Tcl script)
0770: 0a 2a 2a 20 6f 72 20 22 2f 2f 22 20 28 66 6f 72  .** or "//" (for
0780: 20 43 2b 2b 20 63 6f 64 65 29 2e 20 20 4c 69 6e   C++ code).  Lin
0790: 65 73 20 6f 66 20 73 75 62 73 65 71 75 65 6e 74  es of subsequent
07a0: 20 40 2d 62 6c 6f 63 6b 73 20 74 68 61 74 20 62   @-blocks that b
07b0: 65 67 69 6e 20 77 69 74 68 0a 2a 2a 20 43 43 20  egin with.** CC 
07c0: 61 72 65 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  are omitted from
07d0: 20 74 68 65 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a   the output..**.
07e0: 2a 2a 20 45 6e 68 61 6e 63 65 6d 65 6e 74 20 23  ** Enhancement #
07f0: 33 3a 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 6f  3:.**.** If a no
0800: 6e 2d 65 6e 68 61 6e 63 65 6d 65 6e 74 20 23 31  n-enhancement #1
0810: 20 6c 69 6e 65 20 65 6e 64 73 20 69 6e 20 62 61   line ends in ba
0820: 63 6b 73 6c 61 73 68 2c 20 74 68 65 20 62 61 63  ckslash, the bac
0830: 6b 73 6c 61 73 68 20 61 6e 64 20 74 68 65 0a 2a  kslash and the.*
0840: 2a 20 6e 65 77 6c 69 6e 65 20 28 5c 6e 29 20 61  * newline (\n) a
0850: 72 65 20 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20  re not included 
0860: 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
0870: 74 6f 20 63 67 69 5f 70 72 69 6e 74 66 28 29 2e  to cgi_printf().
0880: 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 75 73 65    This.** is use
0890: 64 20 74 6f 20 73 70 6c 69 74 20 6f 6e 65 20 6c  d to split one l
08a0: 6f 6e 67 20 6f 75 74 70 75 74 20 6c 69 6e 65 20  ong output line 
08b0: 61 63 72 6f 73 73 20 6d 75 6c 74 69 70 6c 65 20  across multiple 
08c0: 73 6f 75 72 63 65 20 6c 69 6e 65 73 2e 0a 2a 2f  source lines..*/
08d0: 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f  .#include <stdio
08e0: 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 63 74  .h>.#include <ct
08f0: 79 70 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20  ype.h>.#include 
0900: 3c 73 74 64 6c 69 62 2e 68 3e 0a 23 69 6e 63 6c  <stdlib.h>.#incl
0910: 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a  ude <string.h>..
0920: 2f 2a 0a 2a 2a 20 53 70 61 63 65 20 74 6f 20 68  /*.** Space to h
0930: 6f 6c 64 20 61 72 67 75 6d 65 6e 74 73 20 61 74  old arguments at
0940: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
0950: 63 67 69 5f 70 72 69 6e 74 66 28 29 0a 2a 2f 0a  cgi_printf().*/.
0960: 23 64 65 66 69 6e 65 20 4d 58 5f 41 52 47 5f 53  #define MX_ARG_S
0970: 50 20 31 30 30 30 30 0a 73 74 61 74 69 63 20 63  P 10000.static c
0980: 68 61 72 20 7a 41 72 67 5b 4d 58 5f 41 52 47 5f  har zArg[MX_ARG_
0990: 53 50 5d 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  SP];.static int 
09a0: 6e 41 72 67 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  nArg = 0;../*.**
09b0: 20 54 72 75 65 20 69 66 20 77 65 20 61 72 65 20   True if we are 
09c0: 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 61 20 63  currently in a c
09d0: 67 69 5f 70 72 69 6e 74 66 28 29 0a 2a 2f 0a 73  gi_printf().*/.s
09e0: 74 61 74 69 63 20 69 6e 74 20 69 6e 50 72 69 6e  tatic int inPrin
09f0: 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  t = 0;../*.** Tr
0a00: 75 65 20 69 66 20 77 65 20 61 72 65 20 63 75 72  ue if we are cur
0a10: 72 65 6e 74 6c 79 20 64 6f 69 6e 67 20 61 20 66  rently doing a f
0a20: 72 65 65 20 73 74 72 69 6e 67 0a 2a 2f 0a 73 74  ree string.*/.st
0a30: 61 74 69 63 20 69 6e 74 20 69 6e 53 74 72 20 3d  atic int inStr =
0a40: 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20   0;../*.** Name 
0a50: 6f 66 20 66 69 6c 65 73 20 62 65 69 6e 67 20 70  of files being p
0a60: 72 6f 63 65 73 73 65 64 0a 2a 2f 0a 73 74 61 74  rocessed.*/.stat
0a70: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
0a80: 49 6e 46 69 6c 65 20 3d 20 22 28 73 74 64 69 6e  InFile = "(stdin
0a90: 29 22 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 60  )";../*.** The `
0aa0: 66 6f 73 73 69 6c 5f 69 73 73 70 61 63 65 28 29  fossil_isspace()
0ab0: 27 20 66 75 6e 63 74 69 6f 6e 20 63 6f 70 69 65  ' function copie
0ac0: 64 20 66 72 6f 6d 20 74 68 65 20 46 6f 73 73 69  d from the Fossi
0ad0: 6c 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 0a 2a  l source code..*
0ae0: 2a 20 53 6f 6d 65 20 4d 53 56 43 20 72 75 6e 74  * Some MSVC runt
0af0: 69 6d 65 20 6c 69 62 72 61 72 79 20 76 65 72 73  ime library vers
0b00: 69 6f 6e 73 20 6f 66 20 60 69 73 73 70 61 63 65  ions of `isspace
0b10: 28 29 27 20 62 72 65 61 6b 20 77 69 74 68 20 61  ()' break with a
0b20: 6e 20 60 61 73 73 65 72 74 28 29 27 20 69 66 0a  n `assert()' if.
0b30: 2a 2a 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  ** the input is 
0b40: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 2d 31 20  smaller than -1 
0b50: 6f 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  or greater than 
0b60: 32 35 35 20 69 6e 20 64 65 62 75 67 20 62 75 69  255 in debug bui
0b70: 6c 64 73 2c 20 64 75 65 20 74 6f 20 73 69 67 6e  lds, due to sign
0b80: 0a 2a 2a 20 65 78 74 65 6e 73 69 6f 6e 20 77 68  .** extension wh
0b90: 65 6e 20 70 72 6f 6d 6f 74 69 6e 67 20 60 73 69  en promoting `si
0ba0: 67 6e 65 64 20 63 68 61 72 27 20 74 6f 20 60 69  gned char' to `i
0bb0: 6e 74 27 20 66 6f 72 20 6e 6f 6e 2d 41 53 43 49  nt' for non-ASCI
0bc0: 49 20 63 68 61 72 61 63 74 65 72 73 2e 20 55 73  I characters. Us
0bd0: 65 0a 2a 2a 20 61 6e 20 60 69 73 73 70 61 63 65  e.** an `isspace
0be0: 28 29 27 20 72 65 70 6c 61 63 65 6d 65 6e 74 20  ()' replacement 
0bf0: 69 6e 73 74 65 61 64 20 6f 66 20 65 78 70 6c 69  instead of expli
0c00: 63 69 74 20 74 79 70 65 20 63 61 73 74 73 20 74  cit type casts t
0c10: 6f 20 60 75 6e 73 69 67 6e 65 64 20 63 68 61 72  o `unsigned char
0c20: 27 2e 0a 2a 2f 0a 69 6e 74 20 66 6f 73 73 69 6c  '..*/.int fossil
0c30: 5f 69 73 73 70 61 63 65 28 63 68 61 72 20 63 29  _isspace(char c)
0c40: 7b 0a 20 20 72 65 74 75 72 6e 20 63 3d 3d 27 20  {.  return c==' 
0c50: 27 20 7c 7c 20 28 63 3c 3d 27 5c 72 27 20 26 26  ' || (c<='\r' &&
0c60: 20 63 3e 3d 27 5c 74 27 29 3b 0a 7d 0a 0a 2f 2a   c>='\t');.}../*
0c70: 0a 2a 2a 20 54 65 72 6d 69 6e 61 74 65 20 61 6e  .** Terminate an
0c80: 20 61 63 74 69 76 65 20 63 67 69 5f 70 72 69 6e   active cgi_prin
0c90: 74 66 28 29 20 6f 72 20 66 72 65 65 20 73 74 72  tf() or free str
0ca0: 69 6e 67 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ing.*/.static vo
0cb0: 69 64 20 65 6e 64 5f 62 6c 6f 63 6b 28 46 49 4c  id end_block(FIL
0cc0: 45 20 2a 6f 75 74 29 7b 0a 20 20 69 66 28 20 69  E *out){.  if( i
0cd0: 6e 50 72 69 6e 74 20 29 7b 0a 20 20 20 20 7a 41  nPrint ){.    zA
0ce0: 72 67 5b 6e 41 72 67 5d 20 3d 20 30 3b 0a 20 20  rg[nArg] = 0;.  
0cf0: 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 20 22    fprintf(out, "
0d00: 25 73 29 3b 5c 6e 22 2c 20 7a 41 72 67 29 3b 0a  %s);\n", zArg);.
0d10: 20 20 20 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20      nArg = 0;.  
0d20: 20 20 69 6e 50 72 69 6e 74 20 3d 20 30 3b 0a 20    inPrint = 0;. 
0d30: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 61 6e   }.}../*.** Tran
0d40: 73 6c 61 74 65 20 74 68 65 20 69 6e 70 75 74 20  slate the input 
0d50: 73 74 72 65 61 6d 20 69 6e 74 6f 20 74 68 65 20  stream into the 
0d60: 6f 75 74 70 75 74 20 73 74 72 65 61 6d 0a 2a 2f  output stream.*/
0d70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 61  .static void tra
0d80: 6e 73 28 46 49 4c 45 20 2a 69 6e 2c 20 46 49 4c  ns(FILE *in, FIL
0d90: 45 20 2a 6f 75 74 29 7b 0a 20 20 69 6e 74 20 69  E *out){.  int i
0da0: 2c 20 6a 2c 20 6b 3b 20 20 20 20 20 20 20 20 20  , j, k;         
0db0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
0dc0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 63 31 2c 20  s */.  char c1, 
0dd0: 63 32 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c2;          /* 
0de0: 43 68 61 72 61 63 74 65 72 73 20 75 73 65 64 20  Characters used 
0df0: 74 6f 20 73 74 61 72 74 20 61 20 63 6f 6d 6d 65  to start a comme
0e00: 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 61 73 74  nt */.  int last
0e10: 57 61 73 45 71 20 3d 20 30 3b 20 20 20 20 2f 2a  WasEq = 0;    /*
0e20: 20 54 72 75 65 20 69 66 20 6c 61 73 74 20 6e 6f   True if last no
0e30: 6e 2d 77 68 69 74 65 73 70 61 63 65 20 63 68 61  n-whitespace cha
0e40: 72 61 63 74 65 72 20 77 61 73 20 22 3d 22 20 2a  racter was "=" *
0e50: 2f 0a 20 20 69 6e 74 20 6c 61 73 74 57 61 73 43  /.  int lastWasC
0e60: 6f 6d 6d 61 20 3d 20 30 3b 20 2f 2a 20 54 72 75  omma = 0; /* Tru
0e70: 65 20 69 66 20 6c 61 73 74 20 6e 6f 6e 2d 77 68  e if last non-wh
0e80: 69 74 65 73 70 61 63 65 20 63 68 61 72 61 63 74  itespace charact
0e90: 65 72 20 77 61 73 20 22 2c 22 20 2a 2f 0a 20 20  er was "," */.  
0ea0: 69 6e 74 20 6c 69 6e 65 4e 6f 20 3d 20 30 3b 20  int lineNo = 0; 
0eb0: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
0ec0: 6d 62 65 72 20 2a 2f 0a 20 20 63 68 61 72 20 7a  mber */.  char z
0ed0: 4c 69 6e 65 5b 32 30 30 30 5d 3b 20 20 20 20 20  Line[2000];     
0ee0: 2f 2a 20 41 20 73 69 6e 67 6c 65 20 6c 69 6e 65  /* A single line
0ef0: 20 6f 66 20 69 6e 70 75 74 20 2a 2f 0a 20 20 63   of input */.  c
0f00: 68 61 72 20 7a 4f 75 74 5b 34 30 30 30 5d 3b 20  har zOut[4000]; 
0f10: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 70 75       /* The inpu
0f20: 74 20 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74 65  t line translate
0f30: 64 20 69 6e 74 6f 20 61 70 70 72 6f 70 72 69 61  d into appropria
0f40: 74 65 20 6f 75 74 70 75 74 20 2a 2f 0a 0a 20 20  te output */..  
0f50: 63 31 20 3d 20 63 32 20 3d 20 27 2d 27 3b 0a 20  c1 = c2 = '-';. 
0f60: 20 77 68 69 6c 65 28 20 66 67 65 74 73 28 7a 4c   while( fgets(zL
0f70: 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e  ine, sizeof(zLin
0f80: 65 29 2c 20 69 6e 29 20 29 7b 0a 20 20 20 20 6c  e), in) ){.    l
0f90: 69 6e 65 4e 6f 2b 2b 3b 0a 20 20 20 20 66 6f 72  ineNo++;.    for
0fa0: 28 69 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d 20 26  (i=0; zLine[i] &
0fb0: 26 20 66 6f 73 73 69 6c 5f 69 73 73 70 61 63 65  & fossil_isspace
0fc0: 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69 2b 2b 29  (zLine[i]); i++)
0fd0: 7b 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  {}.    if( zLine
0fe0: 5b 69 5d 21 3d 27 40 27 20 29 7b 0a 20 20 20 20  [i]!='@' ){.    
0ff0: 20 20 69 66 28 20 69 6e 50 72 69 6e 74 20 7c 7c    if( inPrint ||
1000: 20 69 6e 53 74 72 20 29 20 65 6e 64 5f 62 6c 6f   inStr ) end_blo
1010: 63 6b 28 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ck(out);.      f
1020: 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c  printf(out,"%s",
1030: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1050: 2a 20 30 31 32 33 34 35 36 37 38 39 20 31 32 33  * 0123456789 123
1060: 34 35 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  45 */.      if( 
1070: 73 74 72 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22  strncmp(zLine, "
1080: 2f 2a 20 40 2d 63 6f 6d 6d 65 6e 74 3a 20 22 2c  /* @-comment: ",
1090: 20 31 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20   14)==0 ){.     
10a0: 20 20 20 63 31 20 3d 20 7a 4c 69 6e 65 5b 31 34     c1 = zLine[14
10b0: 5d 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  ];.        c2 = 
10c0: 7a 4c 69 6e 65 5b 31 35 5d 3b 0a 20 20 20 20 20  zLine[15];.     
10d0: 20 7d 0a 20 20 20 20 20 20 69 20 2b 3d 20 73 74   }.      i += st
10e0: 72 6c 65 6e 28 26 7a 4c 69 6e 65 5b 69 5d 29 3b  rlen(&zLine[i]);
10f0: 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3e  .      while( i>
1100: 30 20 26 26 20 66 6f 73 73 69 6c 5f 69 73 73 70  0 && fossil_issp
1110: 61 63 65 28 7a 4c 69 6e 65 5b 69 2d 31 5d 29 20  ace(zLine[i-1]) 
1120: 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ i--; }.      
1130: 6c 61 73 74 57 61 73 45 71 20 20 20 20 3d 20 69  lastWasEq    = i
1140: 3e 30 20 26 26 20 7a 4c 69 6e 65 5b 69 2d 31 5d  >0 && zLine[i-1]
1150: 3d 3d 27 3d 27 3b 0a 20 20 20 20 20 20 6c 61 73  =='=';.      las
1160: 74 57 61 73 43 6f 6d 6d 61 20 3d 20 69 3e 30 20  tWasComma = i>0 
1170: 26 26 20 7a 4c 69 6e 65 5b 69 2d 31 5d 3d 3d 27  && zLine[i-1]=='
1180: 2c 27 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ,';.    }else if
1190: 28 20 6c 61 73 74 57 61 73 45 71 20 7c 7c 20 6c  ( lastWasEq || l
11a0: 61 73 74 57 61 73 43 6f 6d 6d 61 29 7b 0a 20 20  astWasComma){.  
11b0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6c 61      /* If the la
11c0: 73 74 20 6e 6f 6e 2d 77 68 69 74 65 73 70 61 63  st non-whitespac
11d0: 65 20 63 68 61 72 61 63 74 65 72 20 62 65 66 6f  e character befo
11e0: 72 65 20 74 68 65 20 66 69 72 73 74 20 40 20 77  re the first @ w
11f0: 61 73 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20 22  as.      ** an "
1200: 3d 22 28 76 61 72 20 69 6e 69 74 2f 73 65 74 29  ="(var init/set)
1210: 20 6f 72 20 61 20 22 2c 22 28 63 6f 6e 73 74 20   or a ","(const 
1220: 64 65 66 69 6e 69 74 69 6f 6e 20 69 6e 20 6c 69  definition in li
1230: 73 74 29 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  st) then.      *
1240: 2a 20 67 65 6e 65 72 61 74 65 20 61 20 73 74 72  * generate a str
1250: 69 6e 67 20 6c 69 74 65 72 61 6c 2e 20 20 42 75  ing literal.  Bu
1260: 74 20 73 6b 69 70 20 63 6f 6d 6d 65 6e 74 73 0a  t skip comments.
1270: 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73 69 73 74        ** consist
1280: 69 6e 67 20 6f 66 20 61 6c 6c 20 74 65 78 74 20  ing of all text 
1290: 62 65 74 77 65 65 6e 20 63 31 20 61 6e 64 20 63  between c1 and c
12a0: 32 20 28 64 65 66 61 75 6c 74 20 22 2d 2d 22 29  2 (default "--")
12b0: 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 65 6e  .      ** and en
12c0: 64 20 6f 66 20 6c 69 6e 65 2e 0a 20 20 20 20 20  d of line..     
12d0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 6e   */.      int in
12e0: 64 65 6e 74 2c 20 6f 6d 69 74 6c 69 6e 65 3b 0a  dent, omitline;.
12f0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77        char *zNew
1300: 6c 69 6e 65 20 3d 20 22 5c 5c 6e 22 3b 0a 20 20  line = "\\n";.  
1310: 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69      i++;.      i
1320: 66 28 20 66 6f 73 73 69 6c 5f 69 73 73 70 61 63  f( fossil_isspac
1330: 65 28 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20 69  e(zLine[i]) ){ i
1340: 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 6e 64 65  ++; }.      inde
1350: 6e 74 20 3d 20 69 20 2d 20 32 3b 0a 20 20 20 20  nt = i - 2;.    
1360: 20 20 69 66 28 20 69 6e 64 65 6e 74 3c 30 20 29    if( indent<0 )
1370: 20 69 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 20   indent = 0;.   
1380: 20 20 20 6f 6d 69 74 6c 69 6e 65 20 3d 20 30 3b     omitline = 0;
1390: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
13a0: 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 7a 4c 69 6e  zLine[i] && zLin
13b0: 65 5b 69 5d 21 3d 27 5c 72 27 20 26 26 20 7a 4c  e[i]!='\r' && zL
13c0: 69 6e 65 5b 69 5d 21 3d 27 5c 6e 27 3b 20 69 2b  ine[i]!='\n'; i+
13d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
13e0: 7a 4c 69 6e 65 5b 69 5d 3d 3d 63 31 20 26 26 20  zLine[i]==c1 && 
13f0: 28 63 32 3d 3d 27 20 27 20 7c 7c 20 7a 4c 69 6e  (c2==' ' || zLin
1400: 65 5b 69 2b 31 5d 3d 3d 63 32 29 20 29 7b 0a 20  e[i+1]==c2) ){. 
1410: 20 20 20 20 20 20 20 20 20 20 6f 6d 69 74 6c 69            omitli
1420: 6e 65 20 3d 20 31 3b 20 62 72 65 61 6b 3b 0a 20  ne = 1; break;. 
1430: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1440: 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27   if( zLine[i]=='
1450: 5c 5c 27 20 26 26 20 28 7a 4c 69 6e 65 5b 69 2b  \\' && (zLine[i+
1460: 31 5d 3d 3d 30 20 7c 7c 20 7a 4c 69 6e 65 5b 69  1]==0 || zLine[i
1470: 2b 31 5d 3d 3d 27 5c 72 27 0a 20 20 20 20 20 20  +1]=='\r'.      
1480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1490: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 7a 4c             || zL
14a0: 69 6e 65 5b 69 2b 31 5d 3d 3d 27 5c 6e 27 29 20  ine[i+1]=='\n') 
14b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 4c 69  ){.          zLi
14c0: 6e 65 5b 69 5d 20 3d 20 30 3b 0a 20 20 20 20 20  ne[i] = 0;.     
14d0: 20 20 20 20 20 7a 4e 65 77 6c 69 6e 65 20 3d 20       zNewline = 
14e0: 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  "";.          /*
14f0: 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c   fprintf(stderr,
1500: 20 22 25 73 3a 25 64 3a 20 6f 6d 69 74 20 6e 65   "%s:%d: omit ne
1510: 77 6c 69 6e 65 5c 6e 22 2c 20 7a 49 6e 46 69 6c  wline\n", zInFil
1520: 65 2c 20 6c 69 6e 65 4e 6f 29 3b 20 2a 2f 0a 20  e, lineNo); */. 
1530: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1540: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1550: 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d 3d 3d    if( zLine[i]==
1560: 27 5c 5c 27 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d  '\\' || zLine[i]
1570: 3d 3d 27 22 27 20 29 7b 20 7a 4f 75 74 5b 6a 2b  =='"' ){ zOut[j+
1580: 2b 5d 20 3d 20 27 5c 5c 27 3b 20 7d 0a 20 20 20  +] = '\\'; }.   
1590: 20 20 20 20 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d       zOut[j++] =
15a0: 20 7a 4c 69 6e 65 5b 69 5d 3b 0a 20 20 20 20 20   zLine[i];.     
15b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 65   }.      if( zNe
15c0: 77 6c 69 6e 65 5b 30 5d 20 29 20 77 68 69 6c 65  wline[0] ) while
15d0: 28 20 6a 3e 30 20 26 26 20 66 6f 73 73 69 6c 5f  ( j>0 && fossil_
15e0: 69 73 73 70 61 63 65 28 7a 4f 75 74 5b 6a 2d 31  isspace(zOut[j-1
15f0: 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20  ]) ){ j--; }.   
1600: 20 20 20 7a 4f 75 74 5b 6a 5d 20 3d 20 30 3b 0a     zOut[j] = 0;.
1610: 20 20 20 20 20 20 69 66 28 20 6a 3c 3d 30 20 26        if( j<=0 &
1620: 26 20 6f 6d 69 74 6c 69 6e 65 20 29 7b 0a 20 20  & omitline ){.  
1630: 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75        fprintf(ou
1640: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d  t,"\n");.      }
1650: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 70  else{.        fp
1660: 72 69 6e 74 66 28 6f 75 74 2c 22 25 2a 73 5c 22  rintf(out,"%*s\"
1670: 25 73 25 73 5c 22 5c 6e 22 2c 69 6e 64 65 6e 74  %s%s\"\n",indent
1680: 2c 20 22 22 2c 20 7a 4f 75 74 2c 20 7a 4e 65 77  , "", zOut, zNew
1690: 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  line);.      }. 
16a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
16b0: 2f 2a 20 4f 74 68 65 72 77 69 73 65 20 28 69 66  /* Otherwise (if
16c0: 20 74 68 65 20 6c 61 73 74 20 6e 6f 6e 2d 77 68   the last non-wh
16d0: 69 74 65 73 70 61 63 65 20 77 61 73 20 6e 6f 74  itespace was not
16e0: 20 27 3d 27 29 20 74 68 65 6e 20 67 65 6e 65 72   '=') then gener
16f0: 61 74 65 20 61 0a 20 20 20 20 20 20 2a 2a 20 63  ate a.      ** c
1700: 67 69 5f 70 72 69 6e 74 66 28 29 20 73 74 61 74  gi_printf() stat
1710: 65 6d 65 6e 74 20 77 68 6f 73 65 20 66 6f 72 6d  ement whose form
1720: 61 74 20 69 73 20 74 68 65 20 74 65 78 74 20 66  at is the text f
1730: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 27 40 27  ollowing the '@'
1740: 2e 0a 20 20 20 20 20 20 2a 2a 20 53 75 62 73 74  ..      ** Subst
1750: 72 69 6e 67 73 20 6f 66 20 74 68 65 20 66 6f 72  rings of the for
1760: 6d 20 22 25 43 28 2e 2e 2e 29 22 20 28 77 68 65  m "%C(...)" (whe
1770: 72 65 20 43 20 69 73 20 61 6e 79 20 73 65 71 75  re C is any sequ
1780: 65 6e 63 65 20 6f 66 20 63 68 61 72 61 63 74 65  ence of characte
1790: 72 73 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65  rs.      ** othe
17a0: 72 20 74 68 61 6e 20 5c 30 30 30 20 61 6e 64 20  r than \000 and 
17b0: 27 28 27 29 20 77 69 6c 6c 20 70 75 74 20 22 25  '(') will put "%
17c0: 43 22 20 69 6e 20 74 68 65 20 66 6f 72 6d 61 74  C" in the format
17d0: 20 61 6e 64 20 61 64 64 20 74 68 65 0a 20 20 20   and add the.   
17e0: 20 20 20 2a 2a 20 22 28 2e 2e 2e 29 22 20 61 73     ** "(...)" as
17f0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20   an argument to 
1800: 74 68 65 20 63 67 69 5f 70 72 69 6e 74 66 20 63  the cgi_printf c
1810: 61 6c 6c 2e 20 20 45 61 63 68 20 27 2a 27 20 63  all.  Each '*' c
1820: 68 61 72 61 63 74 65 72 0a 20 20 20 20 20 20 2a  haracter.      *
1830: 2a 20 70 72 65 73 65 6e 74 20 69 6e 20 43 20 28  * present in C (
1840: 6d 61 78 20 74 77 6f 29 20 63 61 75 73 65 73 20  max two) causes 
1850: 6f 6e 65 20 6d 6f 72 65 20 22 28 2e 2e 2e 29 22  one more "(...)"
1860: 20 73 65 71 75 65 6e 63 65 20 74 6f 20 62 65 20   sequence to be 
1870: 63 6f 6e 73 75 6d 65 64 2e 0a 20 20 20 20 20 20  consumed..      
1880: 2a 2a 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  ** For example, 
1890: 22 25 2a 2e 2a 64 28 34 29 28 32 29 28 31 29 22  "%*.*d(4)(2)(1)"
18a0: 20 63 6f 6e 76 65 72 74 73 20 74 6f 20 22 25 2a   converts to "%*
18b0: 2e 2a 64 22 20 77 69 74 68 20 61 72 67 75 6d 65  .*d" with argume
18c0: 6e 74 73 20 22 34 22 2c 0a 20 20 20 20 20 20 2a  nts "4",.      *
18d0: 2a 20 22 32 22 2c 20 61 6e 64 20 22 31 22 2c 20  * "2", and "1", 
18e0: 77 68 69 63 68 20 77 69 6c 6c 20 62 65 20 75 73  which will be us
18f0: 65 64 20 61 73 20 74 68 65 20 66 69 65 6c 64 20  ed as the field 
1900: 77 69 64 74 68 2c 20 70 72 65 63 69 73 69 6f 6e  width, precision
1910: 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 76  , and.      ** v
1920: 61 6c 75 65 2c 20 72 65 73 70 65 63 74 69 76 65  alue, respective
1930: 6c 79 2c 20 70 72 6f 64 75 63 69 6e 67 20 61 20  ly, producing a 
1940: 66 69 6e 61 6c 20 66 6f 72 6d 61 74 74 65 64 20  final formatted 
1950: 72 65 73 75 6c 74 20 6f 66 20 22 20 20 30 31 22  result of "  01"
1960: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
1970: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
1980: 77 6c 69 6e 65 20 3d 20 22 5c 5c 6e 22 3b 0a 20  wline = "\\n";. 
1990: 20 20 20 20 20 69 6e 74 20 69 6e 64 65 6e 74 3b       int indent;
19a0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 43 3b 0a 20  .      int nC;. 
19b0: 20 20 20 20 20 69 6e 74 20 6e 50 61 72 61 6d 3b       int nParam;
19c0: 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b 0a 20  .      char c;. 
19d0: 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
19e0: 69 66 28 20 66 6f 73 73 69 6c 5f 69 73 73 70 61  if( fossil_isspa
19f0: 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 20 29 7b 20  ce(zLine[i]) ){ 
1a00: 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 6e 64  i++; }.      ind
1a10: 65 6e 74 20 3d 20 69 3b 0a 20 20 20 20 20 20 66  ent = i;.      f
1a20: 6f 72 28 6a 3d 30 3b 20 7a 4c 69 6e 65 5b 69 5d  or(j=0; zLine[i]
1a30: 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d 27 5c   && zLine[i]!='\
1a40: 72 27 20 26 26 20 7a 4c 69 6e 65 5b 69 5d 21 3d  r' && zLine[i]!=
1a50: 27 5c 6e 27 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  '\n'; i++){.    
1a60: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 5d      if( zLine[i]
1a70: 3d 3d 27 5c 5c 27 20 26 26 20 28 21 7a 4c 69 6e  =='\\' && (!zLin
1a80: 65 5b 69 2b 31 5d 20 7c 7c 20 7a 4c 69 6e 65 5b  e[i+1] || zLine[
1a90: 69 2b 31 5d 3d 3d 27 5c 72 27 0a 20 20 20 20 20  i+1]=='\r'.     
1aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 20 20 20 7c 7c 20 7a 4c 69 6e 65 5b 69        || zLine[i
1ad0: 2b 31 5d 3d 3d 27 5c 6e 27 29 20 29 7b 0a 20 20  +1]=='\n') ){.  
1ae0: 20 20 20 20 20 20 20 20 7a 4e 65 77 6c 69 6e 65          zNewline
1af0: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   = "";.         
1b00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
1b10: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c  }.        if( zL
1b20: 69 6e 65 5b 69 5d 3d 3d 27 22 27 20 7c 7c 20 7a  ine[i]=='"' || z
1b30: 4c 69 6e 65 5b 69 5d 3d 3d 27 5c 5c 27 20 29 7b  Line[i]=='\\' ){
1b40: 20 7a 4f 75 74 5b 6a 2b 2b 5d 20 3d 20 27 5c 5c   zOut[j++] = '\\
1b50: 27 3b 20 7d 0a 20 20 20 20 20 20 20 20 7a 4f 75  '; }.        zOu
1b60: 74 5b 6a 2b 2b 5d 20 3d 20 7a 4c 69 6e 65 5b 69  t[j++] = zLine[i
1b70: 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
1b80: 4c 69 6e 65 5b 69 5d 21 3d 27 25 27 20 7c 7c 20  Line[i]!='%' || 
1b90: 7a 4c 69 6e 65 5b 69 2b 31 5d 3d 3d 27 25 27 20  zLine[i+1]=='%' 
1ba0: 7c 7c 20 7a 4c 69 6e 65 5b 69 2b 31 5d 3d 3d 30  || zLine[i+1]==0
1bb0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
1bc0: 20 20 20 20 20 6e 50 61 72 61 6d 3d 31 3b 0a 20       nParam=1;. 
1bd0: 20 20 20 20 20 20 20 66 6f 72 28 6e 43 3d 31 3b         for(nC=1;
1be0: 20 7a 4c 69 6e 65 5b 69 2b 6e 43 5d 20 26 26 20   zLine[i+nC] && 
1bf0: 7a 4c 69 6e 65 5b 69 2b 6e 43 5d 21 3d 27 28 27  zLine[i+nC]!='('
1c00: 3b 20 6e 43 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; nC++){.       
1c10: 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 2b 6e     if( zLine[i+n
1c20: 43 5d 3d 3d 27 2a 27 20 26 26 20 6e 50 61 72 61  C]=='*' && nPara
1c30: 6d 20 3c 20 33 20 29 20 6e 50 61 72 61 6d 2b 2b  m < 3 ) nParam++
1c40: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1c50: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 69 2b      if( zLine[i+
1c60: 6e 43 5d 21 3d 27 28 27 20 7c 7c 20 21 69 73 61  nC]!='(' || !isa
1c70: 6c 70 68 61 28 7a 4c 69 6e 65 5b 69 2b 6e 43 2d  lpha(zLine[i+nC-
1c80: 31 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  1]) ) continue;.
1c90: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 2d          while( -
1ca0: 2d 6e 43 20 29 20 7a 4f 75 74 5b 6a 2b 2b 5d 20  -nC ) zOut[j++] 
1cb0: 3d 20 7a 4c 69 6e 65 5b 2b 2b 69 5d 3b 0a 20 20  = zLine[++i];.  
1cc0: 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20        do{.      
1cd0: 20 20 20 20 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d      zArg[nArg++]
1ce0: 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
1cf0: 20 20 6b 20 3d 20 30 3b 20 69 2b 2b 3b 0a 20 20    k = 0; i++;.  
1d00: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
1d10: 65 5b 69 5d 21 3d 27 28 27 20 29 20 62 72 65 61  e[i]!='(' ) brea
1d20: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69  k;.          whi
1d30: 6c 65 28 20 28 63 20 3d 20 7a 4c 69 6e 65 5b 69  le( (c = zLine[i
1d40: 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])!=0 ){.       
1d50: 20 20 20 20 20 7a 41 72 67 5b 6e 41 72 67 2b 2b       zArg[nArg++
1d60: 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  ] = c;.         
1d70: 20 20 20 69 66 28 20 63 3d 3d 27 29 27 20 29 7b     if( c==')' ){
1d80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6b  .              k
1d90: 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  --;.            
1da0: 20 20 69 66 28 20 6b 3d 3d 30 20 29 20 62 72 65    if( k==0 ) bre
1db0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
1dc0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 28 27  }else if( c=='('
1dd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1de0: 20 20 6b 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    k++;.         
1df0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
1e00: 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20   i++;.          
1e10: 7d 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c 65  }.        }while
1e20: 28 20 2d 2d 6e 50 61 72 61 6d 20 29 3b 0a 20 20  ( --nParam );.  
1e30: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4f 75 74      }.      zOut
1e40: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  [j] = 0;.      i
1e50: 66 28 20 21 69 6e 50 72 69 6e 74 20 29 7b 0a 20  f( !inPrint ){. 
1e60: 20 20 20 20 20 20 20 66 70 72 69 6e 74 66 28 6f         fprintf(o
1e70: 75 74 2c 22 25 2a 73 63 67 69 5f 70 72 69 6e 74  ut,"%*scgi_print
1e80: 66 28 5c 22 25 73 25 73 5c 22 22 2c 69 6e 64 65  f(\"%s%s\"",inde
1e90: 6e 74 2d 32 2c 22 22 2c 20 7a 4f 75 74 2c 20 7a  nt-2,"", zOut, z
1ea0: 4e 65 77 6c 69 6e 65 29 3b 0a 20 20 20 20 20 20  Newline);.      
1eb0: 20 20 69 6e 50 72 69 6e 74 20 3d 20 31 3b 0a 20    inPrint = 1;. 
1ec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1ed0: 20 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c      fprintf(out,
1ee0: 22 5c 6e 25 2a 73 5c 22 25 73 25 73 5c 22 22 2c  "\n%*s\"%s%s\"",
1ef0: 69 6e 64 65 6e 74 2b 35 2c 20 22 22 2c 20 7a 4f  indent+5, "", zO
1f00: 75 74 2c 20 7a 4e 65 77 6c 69 6e 65 29 3b 0a 20  ut, zNewline);. 
1f10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1f20: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
1f30: 70 72 69 6e 74 5f 73 6f 75 72 63 65 5f 72 65 66  print_source_ref
1f40: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72  (const char *zSr
1f50: 63 46 69 6c 65 2c 20 46 49 4c 45 20 2a 6f 75 74  cFile, FILE *out
1f60: 29 7b 0a 2f 2a 20 53 65 74 20 73 6f 75 72 63 65  ){./* Set source
1f70: 20 6c 69 6e 65 20 72 65 66 65 72 65 6e 63 65 20   line reference 
1f80: 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
1f90: 73 6f 75 72 63 65 20 66 69 6c 65 2e 0a 20 2a 20  source file.. * 
1fa0: 54 68 69 73 20 6d 61 6b 65 73 20 63 6f 6d 70 69  This makes compi
1fb0: 6c 65 72 20 73 68 6f 77 20 74 68 65 20 6f 72 69  ler show the ori
1fc0: 67 69 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  ginal file name 
1fd0: 69 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 20 65  in the compile e
1fe0: 72 72 6f 72 0a 20 2a 20 6d 65 73 73 61 67 65 73  rror. * messages
1ff0: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 72 65 66  , instead of ref
2000: 65 72 72 69 6e 67 20 74 6f 20 74 68 65 20 74 72  erring to the tr
2010: 61 6e 73 6c 61 74 65 64 20 66 69 6c 65 2e 0a 20  anslated file.. 
2020: 2a 20 4e 4f 54 45 3a 20 54 68 69 73 20 73 6f 6d  * NOTE: This som
2030: 65 77 68 61 74 20 63 6f 6d 70 6c 69 63 61 74 65  ewhat complicate
2040: 73 20 73 74 65 70 70 69 6e 67 20 69 6e 20 64 65  s stepping in de
2050: 62 75 67 67 65 72 2c 20 61 73 20 74 68 65 20 72  bugger, as the r
2060: 65 73 75 6c 69 6e 67 0a 20 2a 20 63 6f 64 65 20  esuling. * code 
2070: 77 6f 75 6c 64 20 6e 6f 74 20 6d 61 74 63 68 20  would not match 
2080: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 73  the referenced s
2090: 6f 75 72 63 65 73 2e 0a 20 2a 2f 0a 23 69 66 6e  ources.. */.#ifn
20a0: 64 65 66 20 46 4f 53 53 49 4c 5f 44 45 42 55 47  def FOSSIL_DEBUG
20b0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
20c0: 72 67 3b 0a 20 20 69 66 28 20 21 2a 7a 53 72 63  rg;.  if( !*zSrc
20d0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 72 65 74 75  File ){.    retu
20e0: 72 6e 3b 0a 20 20 7d 0a 20 20 66 70 72 69 6e 74  rn;.  }.  fprint
20f0: 66 28 6f 75 74 2c 22 23 6c 69 6e 65 20 31 20 5c  f(out,"#line 1 \
2100: 22 22 29 3b 0a 20 20 66 6f 72 28 61 72 67 3d 7a  "");.  for(arg=z
2110: 53 72 63 46 69 6c 65 3b 20 2a 61 72 67 3b 20 61  SrcFile; *arg; a
2120: 72 67 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 2a  rg++){.    if( *
2130: 61 72 67 21 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  arg!='\\' ){.   
2140: 20 20 20 66 70 72 69 6e 74 66 28 6f 75 74 2c 22     fprintf(out,"
2150: 25 63 22 2c 20 2a 61 72 67 29 3b 0a 20 20 20 20  %c", *arg);.    
2160: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 72  }else{.      fpr
2170: 69 6e 74 66 28 6f 75 74 2c 22 5c 5c 5c 5c 22 29  intf(out,"\\\\")
2180: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70  ;.    }.  }.  fp
2190: 72 69 6e 74 66 28 6f 75 74 2c 22 5c 22 5c 6e 22  rintf(out,"\"\n"
21a0: 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 69 6e 74  );.#endif.}..int
21b0: 20 6d 61 69 6e 28 69 6e 74 20 61 72 67 63 2c 20   main(int argc, 
21c0: 63 68 61 72 20 2a 2a 61 72 67 76 29 7b 0a 20 20  char **argv){.  
21d0: 69 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20  if( argc==2 ){. 
21e0: 20 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f     FILE *in = fo
21f0: 70 65 6e 28 61 72 67 76 5b 31 5d 2c 20 22 72 22  pen(argv[1], "r"
2200: 29 3b 0a 20 20 20 20 69 66 28 20 69 6e 3d 3d 30  );.    if( in==0
2210: 20 29 7b 0a 20 20 20 20 20 20 66 70 72 69 6e 74   ){.      fprint
2220: 66 28 73 74 64 65 72 72 2c 22 63 61 6e 20 6e 6f  f(stderr,"can no
2230: 74 20 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 61 72  t open %s\n", ar
2240: 67 76 5b 31 5d 29 3b 0a 20 20 20 20 20 20 65 78  gv[1]);.      ex
2250: 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20  it(1);.    }.   
2260: 20 7a 49 6e 46 69 6c 65 20 3d 20 61 72 67 76 5b   zInFile = argv[
2270: 31 5d 3b 0a 20 20 20 20 70 72 69 6e 74 5f 73 6f  1];.    print_so
2280: 75 72 63 65 5f 72 65 66 28 7a 49 6e 46 69 6c 65  urce_ref(zInFile
2290: 2c 20 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 74  , stdout);.    t
22a0: 72 61 6e 73 28 69 6e 2c 20 73 74 64 6f 75 74 29  rans(in, stdout)
22b0: 3b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  ;.    fclose(in)
22c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 74  ;.  }else{.    t
22d0: 72 61 6e 73 28 73 74 64 69 6e 2c 20 73 74 64 6f  rans(stdin, stdo
22e0: 75 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ut);.  }.  retur
22f0: 6e 20 30 3b 0a 7d 0a                             n 0;.}.