c-snippets  Hex Artifact Content

Artifact 77c507c1e2036383dfb581293e656cf4352e106b:

Wiki page [vappendf] by stephan 2008-09-22 06:43:03.
0000: 44 20 32 30 30 38 2d 30 39 2d 32 32 54 30 36 3a  D 2008-09-22T06:
0010: 34 33 3a 30 33 0a 4c 20 76 61 70 70 65 6e 64 66  43:03.L vappendf
0020: 0a 50 20 62 39 37 34 33 38 37 64 64 38 36 38 37  .P b974387dd8687
0030: 66 39 37 33 39 36 65 30 39 65 30 65 33 65 39 37  f97396e09e0e3e97
0040: 38 39 39 36 64 64 30 30 63 62 31 0a 55 20 73 74  8996dd00cb1.U st
0050: 65 70 68 61 6e 0a 57 20 33 33 36 36 0a 3c 68 32  ephan.W 3366.<h2
0060: 3e 76 61 70 70 65 6e 64 66 28 29 20 61 6e 64 20  >vappendf() and 
0070: 43 6f 2e 3c 2f 68 32 3e 0d 0a 54 68 65 20 3c 74  Co.</h2>..The <t
0080: 74 3e 76 61 70 70 65 6e 64 66 28 29 3c 2f 74 74  t>vappendf()</tt
0090: 3e 20 66 61 6d 69 6c 79 20 6f 66 20 66 75 6e 63  > family of func
00a0: 74 69 6f 6e 73 20 61 72 65 20 70 72 69 6e 74 66  tions are printf
00b0: 2d 77 6f 72 6b 61 6c 69 6b 65 73 20 77 68 69 63  -workalikes whic
00c0: 68 0d 0a 61 72 65 20 67 65 6e 65 72 69 63 2c 20  h..are generic, 
00d0: 69 6e 20 74 68 61 74 20 74 68 65 79 20 75 73 65  in that they use
00e0: 20 61 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63   a callback func
00f0: 74 69 6f 6e 20 74 6f 20 73 65 6e 64 20 74 68 65  tion to send the
0100: 69 72 20 6f 75 74 70 75 74 0d 0a 74 6f 20 61 72  ir output..to ar
0110: 62 69 74 72 61 72 79 20 63 68 61 6e 6e 65 6c 73  bitrary channels
0120: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
0130: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
0140: 20 73 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 0d   send output to.
0150: 0a 61 20 47 55 49 20 77 69 64 67 65 74 2c 20 72  .a GUI widget, r
0160: 65 64 69 72 65 63 74 20 69 74 20 74 6f 20 61 20  edirect it to a 
0170: 43 2b 2b 20 73 74 72 65 61 6d 2c 20 61 20 66 69  C++ stream, a fi
0180: 6c 65 2c 20 61 20 70 72 65 2d 61 6c 6c 6f 63 61  le, a pre-alloca
0190: 74 65 64 0d 0a 73 74 72 69 6e 67 2c 20 6f 72 20  ted..string, or 
01a0: 61 20 64 79 6e 61 6d 69 63 61 6c 6c 79 2d 67 72  a dynamically-gr
01b0: 6f 77 69 6e 67 20 73 74 72 69 6e 67 2e 0d 0a 0d  owing string....
01c0: 0a 3c 68 32 3e 70 72 69 6e 74 66 20 65 78 74 65  .<h2>printf exte
01d0: 6e 73 69 6f 6e 73 3c 2f 68 32 3e 0d 0a 0d 0a 76  nsions</h2>....v
01e0: 61 70 70 65 6e 64 66 28 29 20 68 61 73 20 74 68  appendf() has th
01f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 66 6f 72 6d  e following form
0200: 61 74 20 65 78 74 65 6e 73 69 6f 6e 73 20 6f 76  at extensions ov
0210: 65 72 20 61 6e 64 20 61 62 6f 76 65 20 70 72 69  er and above pri
0220: 6e 74 66 27 73 0d 0a 73 74 61 6e 64 61 72 64 20  ntf's..standard 
0230: 6f 6e 65 73 3a 0d 0a 0d 0a 3c 75 6c 3e 0d 0a 3c  ones:....<ul>..<
0240: 6c 69 3e 3c 74 74 3e 25 7a 3c 2f 74 74 3e 20 69  li><tt>%z</tt> i
0250: 73 20 6a 75 73 74 20 6c 69 6b 65 20 3c 74 74 3e  s just like <tt>
0260: 25 73 3c 2f 74 74 3e 20 62 75 74 20 74 68 65 20  %s</tt> but the 
0270: 73 74 72 69 6e 67 20 69 73 20 61 73 73 75 6d 65  string is assume
0280: 64 20 74 6f 20 62 65 0d 0a 64 79 6e 61 6d 69 63  d to be..dynamic
0290: 61 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 61  ally allocated a
02a0: 6e 64 20 76 61 70 70 65 6e 64 66 28 29 20 77 69  nd vappendf() wi
02b0: 6c 6c 20 63 61 6c 6c 20 66 72 65 65 28 29 20 6f  ll call free() o
02c0: 6e 20 74 68 61 74 20 73 74 72 69 6e 67 2e 3c 2f  n that string.</
02d0: 6c 69 3e 0d 0a 3c 6c 69 3e 3c 74 74 3e 25 6e 3c  li>..<li><tt>%n<
02e0: 2f 74 74 3e 20 65 78 70 65 63 74 73 20 61 6e 20  /tt> expects an 
02f0: 28 69 6e 74 2a 29 20 61 6e 64 20 73 65 74 73 20  (int*) and sets 
0300: 69 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  it to the number
0310: 20 6f 66 20 62 79 74 65 73 0d 0a 77 68 69 63 68   of bytes..which
0320: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
0330: 65 6e 20 74 6f 20 74 68 65 20 73 74 72 69 6e 67  en to the string
0340: 20 62 79 20 74 68 69 73 20 63 61 6c 6c 20 74 6f   by this call to
0350: 20 76 61 70 70 65 6e 64 66 28 29 2e 20 4e 6f 74   vappendf(). Not
0360: 0d 0a 65 6e 74 69 72 65 6c 79 20 73 75 72 65 20  ..entirely sure 
0370: 77 68 79 20 74 68 61 74 27 73 20 75 73 65 66 75  why that's usefu
0380: 6c 2c 20 62 75 74 20 69 74 27 73 20 61 20 66 65  l, but it's a fe
0390: 61 74 75 72 65 20 69 6e 68 65 72 69 74 65 64 20  ature inherited 
03a0: 66 72 6f 6d 0d 0a 6d 75 63 68 20 6f 6c 64 65 72  from..much older
03b0: 20 63 6f 64 65 2e 0d 0a 3c 2f 6c 69 3e 0d 0a 3c   code...</li>..<
03c0: 6c 69 3e 3c 74 74 3e 25 71 3c 2f 74 74 3e 20 28  li><tt>%q</tt> (
03d0: 53 51 4c 20 73 74 72 69 6e 67 20 65 73 63 61 70  SQL string escap
03e0: 65 29 20 69 73 20 6c 69 6b 65 20 25 73 20 62 75  e) is like %s bu
03f0: 74 20 65 73 63 61 70 65 73 20 61 6c 6c 20 26 61  t escapes all &a
0400: 70 6f 73 3b 0d 0a 63 68 61 72 61 63 74 65 72 73  pos;..characters
0410: 20 62 79 20 64 6f 75 62 6c 69 6e 67 20 74 68 65   by doubling the
0420: 6d 2e 0d 0a 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 3c  m...</li>..<li><
0430: 74 74 3e 25 51 3c 2f 74 74 3e 20 69 73 20 6c 69  tt>%Q</tt> is li
0440: 6b 65 20 3c 74 74 3e 25 71 3c 2f 74 74 3e 20 62  ke <tt>%q</tt> b
0450: 75 74 20 61 6c 73 6f 20 77 72 61 70 73 20 74 68  ut also wraps th
0460: 65 20 73 74 72 69 6e 67 20 69 74 73 65 6c 66 0d  e string itself.
0470: 0a 69 6e 20 26 61 70 6f 73 3b 20 63 68 61 72 61  .in &apos; chara
0480: 63 74 65 72 73 20 61 6e 64 20 72 65 70 6c 61 63  cters and replac
0490: 65 73 20 6e 75 6c 6c 20 70 6f 69 6e 74 65 72 73  es null pointers
04a0: 20 77 69 74 68 20 61 6e 20 53 51 4c 20 4e 55 4c   with an SQL NUL
04b0: 4c 2e 0d 0a 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 3c  L...</li>..<li><
04c0: 74 74 3e 25 77 3c 2f 74 74 3e 20 69 73 20 6c 69  tt>%w</tt> is li
04d0: 6b 65 20 25 71 2c 20 62 75 74 20 64 6f 75 62 6c  ke %q, but doubl
04e0: 65 73 20 22 20 63 68 61 72 61 63 74 65 72 73 20  es " characters 
04f0: 69 6e 73 74 65 61 64 20 6f 66 20 26 61 70 6f 73  instead of &apos
0500: 3b 0d 0a 63 68 61 72 61 63 74 65 72 73 2e 20 28  ;..characters. (
0510: 41 67 61 69 6e 2c 20 61 6e 20 69 6e 68 65 72 69  Again, an inheri
0520: 74 65 64 20 66 65 61 74 75 72 65 2e 29 0d 0a 3c  ted feature.)..<
0530: 2f 6c 69 3e 0d 0a 3c 6c 69 3e 3c 74 74 3e 25 72  /li>..<li><tt>%r
0540: 3c 2f 74 74 3e 20 65 78 70 65 63 74 73 20 61 6e  </tt> expects an
0550: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 65 78 70   integer and exp
0560: 61 6e 64 73 20 69 74 20 74 6f 20 69 74 73 20 22  ands it to its "
0570: 6f 72 64 69 6e 61 6c 20 66 6f 72 6d 22 2e 0d 0a  ordinal form"...
0580: 54 68 61 74 20 69 73 2c 20 74 68 65 20 6e 75 6d  That is, the num
0590: 62 65 72 20 31 20 65 78 70 61 6e 64 73 20 74 6f  ber 1 expands to
05a0: 20 22 31 73 74 22 20 61 6e 64 20 33 37 35 20 65   "1st" and 375 e
05b0: 78 70 61 6e 64 73 20 74 6f 20 22 33 37 35 74 68  xpands to "375th
05c0: 22 2e 0d 0a 3c 2f 6c 69 3e 0d 0a 3c 6c 69 3e 3c  "...</li>..<li><
05d0: 74 74 3e 25 68 3c 2f 74 74 3e 20 69 73 20 6c 69  tt>%h</tt> is li
05e0: 6b 65 20 25 73 20 62 75 74 20 64 6f 65 73 20 62  ke %s but does b
05f0: 61 73 69 63 20 48 54 4d 4c 20 65 73 63 61 70 69  asic HTML escapi
0600: 6e 67 2c 20 65 2e 67 2e 0d 0a 63 6f 6e 76 65 72  ng, e.g...conver
0610: 74 69 6e 67 20 3c 74 74 3e 26 6c 74 3b 3c 2f 74  ting <tt>&lt;</t
0620: 74 3e 20 74 6f 20 3c 74 74 3e 26 61 6d 70 3b 6c  t> to <tt>&amp;l
0630: 74 3b 3c 2f 74 74 3e 0d 0a 3c 2f 6c 69 3e 0d 0a  t;</tt>..</li>..
0640: 3c 6c 69 3e 3c 74 74 3e 25 74 3c 2f 74 74 3e 20  <li><tt>%t</tt> 
0650: 69 73 20 6c 69 6b 65 20 25 73 20 62 75 74 20 55  is like %s but U
0660: 52 4c 2d 65 6e 63 6f 64 65 73 20 74 68 65 20 73  RL-encodes the s
0670: 74 72 69 6e 67 2e 0d 0a 3c 2f 6c 69 3e 0d 0a 3c  tring...</li>..<
0680: 6c 69 3e 3c 74 74 3e 25 54 3c 2f 74 74 3e 20 69  li><tt>%T</tt> i
0690: 73 20 6c 69 6b 65 20 25 73 20 62 75 74 20 55 52  s like %s but UR
06a0: 4c 2d 64 65 63 6f 64 65 73 20 74 68 65 20 73 74  L-decodes the st
06b0: 72 69 6e 67 2e 0d 0a 3c 2f 6c 69 3e 0d 0a 3c 2f  ring...</li>..</
06c0: 75 6c 3e 0d 0a 0d 0a 4d 6f 73 74 20 6f 66 20 74  ul>....Most of t
06d0: 68 65 73 65 20 65 78 74 65 6e 73 69 6f 6e 73 20  hese extensions 
06e0: 63 61 6e 20 65 61 73 69 6c 79 20 62 65 20 64 69  can easily be di
06f0: 73 61 62 6c 65 64 20 69 6e 20 76 61 70 70 65 6e  sabled in vappen
0700: 64 66 28 29 20 62 79 20 73 65 74 74 69 6e 67 20  df() by setting 
0710: 61 20 6d 61 63 72 6f 20 28 73 65 65 20 3c 74 74  a macro (see <tt
0720: 3e 76 61 70 70 65 6e 64 66 2e 63 3c 2f 74 74 3e  >vappendf.c</tt>
0730: 29 2e 0d 0a 0d 0a 3c 68 32 3e 55 73 69 6e 67 20  ).....<h2>Using 
0740: 69 74 2e 2e 2e 3c 2f 68 32 3e 0d 0a 0d 0a 43 61  it...</h2>....Ca
0750: 6c 6c 69 6e 67 20 76 61 70 70 65 6e 64 66 28 29  lling vappendf()
0760: 20 69 73 20 6a 75 73 74 20 6c 69 6b 65 20 63 61   is just like ca
0770: 6c 6c 69 6e 67 20 70 72 69 6e 74 66 28 29 20 28  lling printf() (
0780: 61 6e 64 20 66 72 69 65 6e 64 73 29 2c 20 62 75  and friends), bu
0790: 74 0d 0a 69 74 20 68 61 73 20 74 77 6f 20 65 78  t..it has two ex
07a0: 74 72 61 20 28 6c 65 61 64 69 6e 67 29 20 61 72  tra (leading) ar
07b0: 67 75 6d 65 6e 74 73 2e 20 4f 6e 65 20 69 73 20  guments. One is 
07c0: 61 20 63 61 6c 6c 62 61 63 6b 20 66 75 6e 63 74  a callback funct
07d0: 69 6f 6e 20 61 6e 64 20 6f 6e 65 0d 0a 69 73 20  ion and one..is 
07e0: 61 20 28 76 6f 69 64 20 2a 29 20 74 6f 20 70 61  a (void *) to pa
07f0: 73 73 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ss as an argumen
0800: 74 20 66 6f 72 20 74 68 65 20 66 75 6e 63 74 69  t for the functi
0810: 6f 6e 2e 20 54 68 65 20 70 75 72 70 6f 73 65 20  on. The purpose 
0820: 6f 66 0d 0a 74 68 65 20 63 61 6c 6c 62 61 63 6b  of..the callback
0830: 20 69 73 20 74 6f 20 74 61 6b 65 20 74 68 65 20   is to take the 
0840: 67 65 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67  generated string
0850: 20 6f 75 74 70 75 74 20 61 6e 64 20 73 65 6e 64   output and send
0860: 20 69 74 20 74 6f 0d 0a 73 6f 6d 65 20 61 72 62   it to..some arb
0870: 69 74 72 61 72 79 20 6f 75 74 70 75 74 20 63 68  itrary output ch
0880: 61 6e 6e 65 6c 2e 20 54 68 65 20 28 76 6f 69 64  annel. The (void
0890: 2a 29 20 61 72 67 75 6d 65 6e 74 20 69 73 20 69  *) argument is i
08a0: 67 6e 6f 72 65 64 20 62 79 0d 0a 76 61 70 70 65  gnored by..vappe
08b0: 6e 64 66 28 29 20 62 75 74 20 69 73 20 70 61 73  ndf() but is pas
08c0: 73 65 64 20 6f 6e 20 74 6f 20 74 68 65 20 63 61  sed on to the ca
08d0: 6c 6c 62 61 63 6b 20 73 6f 20 74 68 61 74 20 74  llback so that t
08e0: 68 65 20 63 61 6c 6c 62 61 63 6b 0d 0a 63 61 6e  he callback..can
08f0: 20 61 63 63 65 73 73 20 6c 6f 63 61 6c 20 64 61   access local da
0900: 74 61 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c  ta. For example,
0910: 20 79 6f 75 20 6d 69 67 68 74 0d 0a 70 61 73 73   you might..pass
0920: 20 61 20 28 46 49 4c 45 2a 29 20 68 61 6e 64 6c   a (FILE*) handl
0930: 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 63 61  e and write a ca
0940: 6c 6c 62 61 63 6b 20 77 68 69 63 68 20 77 72 69  llback which wri
0950: 74 65 73 20 74 6f 20 61 6e 20 6f 70 65 6e 20 66  tes to an open f
0960: 69 6c 65 2c 0d 0a 6f 72 20 79 6f 75 20 6d 69 67  ile,..or you mig
0970: 68 74 20 70 61 73 73 20 61 20 47 55 49 20 77 69  ht pass a GUI wi
0980: 64 67 65 74 20 77 68 69 63 68 20 61 63 74 73 20  dget which acts 
0990: 61 73 20 74 68 65 20 74 61 72 67 65 74 2e 0d 0a  as the target...
09a0: 0d 0a 49 74 20 69 73 20 65 61 73 79 20 74 6f 20  ..It is easy to 
09b0: 77 72 69 74 65 20 73 70 65 63 69 61 6c 2d 70 75  write special-pu
09c0: 72 70 6f 73 65 20 77 72 61 70 70 65 72 73 20 66  rpose wrappers f
09d0: 6f 72 20 76 61 70 70 65 6e 64 66 28 29 2c 20 73  or vappendf(), s
09e0: 75 63 68 20 61 73 0d 0a 74 68 65 20 69 6e 63 6c  uch as..the incl
09f0: 75 64 65 64 20 6d 70 72 69 6e 74 66 28 29 2c 20  uded mprintf(), 
0a00: 77 68 69 63 68 20 61 6c 6c 6f 63 61 74 65 73 20  which allocates 
0a10: 74 68 65 20 72 65 74 75 72 6e 20 73 74 72 69 6e  the return strin
0a20: 67 20 6f 6e 20 74 68 65 20 68 65 61 70 20 61 6e  g on the heap an
0a30: 64 20 72 65 74 75 72 6e 73 0d 0a 69 74 20 74 6f  d returns..it to
0a40: 20 74 68 65 20 63 61 6c 6c 65 72 20 28 77 68 6f   the caller (who
0a50: 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20   is responsible 
0a60: 66 6f 72 20 64 65 6c 65 74 69 6e 67 20 69 74 29  for deleting it)
0a70: 2e 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  . The callback r
0a80: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
0a90: 72 20 6f 66 20 62 79 74 65 73 20 69 74 20 6f 75  r of bytes it ou
0aa0: 74 70 75 74 73 2c 20 61 6c 6c 6f 77 69 6e 67 20  tputs, allowing 
0ab0: 76 61 70 70 65 6e 64 66 28 29 20 74 6f 20 6b 65  vappendf() to ke
0ac0: 65 70 20 61 20 72 75 6e 6e 69 6e 67 20 63 6f 75  ep a running cou
0ad0: 6e 74 20 74 6f 20 72 65 74 75 72 6e 20 74 6f 20  nt to return to 
0ae0: 69 74 73 20 63 61 6c 6c 65 72 2e 0d 0a 0d 0a 54  its caller.....T
0af0: 68 65 20 63 6f 64 65 20 63 6f 6d 65 73 20 77 69  he code comes wi
0b00: 74 68 20 73 65 76 65 72 61 6c 20 75 73 65 66 75  th several usefu
0b10: 6c 20 77 72 61 70 70 65 72 73 2c 20 65 2e 67 2e  l wrappers, e.g.
0b20: 20 66 6f 72 20 77 72 69 74 69 6e 67 20 74 6f 20   for writing to 
0b30: 61 20 46 49 4c 45 20 68 61 6e 64 6c 65 2c 20 61  a FILE handle, a
0b40: 20 66 69 6c 65 20 62 79 20 6e 61 6d 65 2c 20 61   file by name, a
0b50: 6e 64 20 64 79 6e 61 6d 69 63 61 6c 6c 79 2d 61  nd dynamically-a
0b60: 6c 6c 6f 63 61 74 65 64 20 73 74 72 69 6e 67 73  llocated strings
0b70: 2e 20 53 65 65 20 76 61 70 70 65 6e 64 66 2e 63  . See vappendf.c
0b80: 20 66 6f 72 20 65 78 61 6d 70 6c 65 73 20 6f 66   for examples of
0b90: 20 77 72 69 74 69 6e 67 20 79 6f 75 72 20 6f 77   writing your ow
0ba0: 6e 20 63 61 6c 6c 62 61 63 6b 73 20 66 6f 72 20  n callbacks for 
0bb0: 75 73 65 20 77 69 74 68 20 76 61 70 70 65 6e 64  use with vappend
0bc0: 66 28 29 2e 20 53 69 6e 63 65 20 76 61 70 70 65  f(). Since vappe
0bd0: 6e 64 66 28 29 20 66 6f 72 77 61 72 64 73 20 61  ndf() forwards a
0be0: 6e 20 61 72 62 69 74 72 61 72 79 20 63 6c 69 65  n arbitrary clie
0bf0: 6e 74 2d 64 65 74 65 72 6d 69 6e 65 64 20 61 72  nt-determined ar
0c00: 67 75 6d 65 6e 74 20 74 6f 20 79 6f 75 72 20 63  gument to your c
0c10: 61 6c 6c 62 61 63 6b 2c 20 79 6f 75 20 63 61 6e  allback, you can
0c20: 20 73 65 6e 64 20 74 68 65 20 6f 75 74 70 75 74   send the output
0c30: 20 6a 75 73 74 20 61 62 6f 75 74 20 61 6e 79 77   just about anyw
0c40: 68 65 72 65 2e 0d 0a 0d 0a 49 6e 20 74 68 65 20  here.....In the 
0c50: 6d 61 69 6e 20 73 6f 75 72 63 65 20 74 72 65 65  main source tree
0c60: 20 69 73 20 61 20 63 6c 61 73 73 20 63 61 6c 6c   is a class call
0c70: 65 64 20 3c 74 74 3e 63 6c 6f 62 3c 2f 74 74 3e  ed <tt>clob</tt>
0c80: 20 77 68 69 63 68 20 69 73 20 65 73 73 65 6e 74   which is essent
0c90: 69 61 6c 6c 79 20 61 20 64 79 6e 61 6d 69 63 61  ially a dynamica
0ca0: 6c 6c 79 2d 72 65 73 69 7a 69 6e 67 20 73 74 72  lly-resizing str
0cb0: 69 6e 67 20 63 6c 61 73 73 2e 20 49 74 20 63 6f  ing class. It co
0cc0: 6d 65 73 20 77 69 74 68 20 63 6c 6f 62 5f 61 70  mes with clob_ap
0cd0: 70 65 6e 64 66 28 29 2c 20 61 20 77 72 61 70 70  pendf(), a wrapp
0ce0: 65 72 20 66 6f 72 20 76 61 70 70 65 6e 64 66 28  er for vappendf(
0cf0: 29 20 77 68 69 63 68 20 61 70 70 65 6e 64 73 20  ) which appends 
0d00: 74 68 65 20 6f 75 74 70 75 74 20 74 6f 20 61 20  the output to a 
0d10: 63 6c 6f 62 20 6f 62 6a 65 63 74 2e 20 54 68 61  clob object. Tha
0d20: 74 20 6d 61 79 20 61 6c 73 6f 20 62 65 20 75 73  t may also be us
0d30: 65 66 75 6c 20 65 78 61 6d 70 6c 65 20 66 6f 72  eful example for
0d40: 20 61 6e 79 6f 6e 65 20 77 61 6e 74 69 6e 67 20   anyone wanting 
0d50: 74 6f 20 77 72 69 74 65 20 61 20 63 61 6c 6c 62  to write a callb
0d60: 61 63 6b 20 28 73 65 65 20 63 6c 6f 62 2e 63 3a  ack (see clob.c:
0d70: 63 6c 6f 62 5f 76 61 70 70 65 6e 64 66 28 29 29  clob_vappendf())
0d80: 2e 0d 0a 0a 5a 20 35 64 34 63 33 37 65 31 39 37  ....Z 5d4c37e197
0d90: 63 66 33 31 31 66 65 66 61 30 63 65 62 36 64 37  cf311fefa0ceb6d7
0da0: 63 65 35 33 38 62 0a                             ce538b.